예제 #1
0
func main() {

	if len(os.Args) < 3 {
		fmt.Printf("usage ./transferclient <filename> <savefilename\n")
		return
	}
	service := "127.0.0.1:8010"
	tcpAddr, err := net.ResolveTCPAddr("tcp4", service)
	if err != nil {
		fmt.Printf("ResolveTCPAddr")
	}
	conn, err := net.DialTCP("tcp", nil, tcpAddr)
	if err != nil {
		fmt.Printf("DialTcp error,%s\n", err)
	} else {
		session := socket.NewTcpSession(conn)
		fmt.Printf("connect sucessful\n")
		//发出文件请求
		wpk := packet.NewWPacket(packet.NewByteBuffer(64))
		wpk.PutUint16(request_file)
		wpk.PutString(os.Args[1])
		session.Send(wpk)
		tsession := &transfer_session{filename: os.Args[2]}
		session.SetUd(tsession)
		socket.ProcessSession(session, packet.NewRPacketDecoder(65535), process_client)
	}
}
예제 #2
0
func process_client(session *socket.Tcpsession, p packet.Packet, _ error) {
	rpk := p.(*packet.RPacket)
	cmd, _ := rpk.Uint16()
	if cmd == request_file {
		if session.Ud() != nil {
			fmt.Printf("already in transfer session\n")
		} else {
			filename, _ := rpk.String()
			filecontent := filemap[filename]
			if filecontent == nil {
				fmt.Printf("%s not found\n", filename)
				session.Close()
			} else {
				fmt.Printf("request file %s\n", filename)
				tsession := &transfer_session{filecontent: filecontent, ridx: 0}
				session.SetUd(tsession)
				wpk := packet.NewWPacket(packet.NewByteBuffer(64))
				wpk.PutUint16(file_size)
				wpk.PutUint32(uint32(len(filecontent)))
				if nil == session.Send(wpk) {
					tsession.send_file(session)
				}
			}
		}
	}
	session.Close()
}
예제 #3
0
func main() {

	wpk := packet.NewWPacket(packet.NewByteBuffer(64))
	wpk.PutString("中国")
	wpk.PutUint32(100)
	wpk.PutString("韶关")

	rpk1 := (*packet.RPacket)(unsafe.Pointer(wpk.MakeRead()))

	fmt.Printf("----------------rpk1-----------------\n")

	str, _ := rpk1.String()
	fmt.Printf("%s\n", str)

	rpk2 := (*packet.RPacket)(unsafe.Pointer(rpk1.Clone()))

	v, _ := rpk1.Uint32()
	fmt.Printf("%d\n", v)

	str, _ = rpk1.String()
	fmt.Printf("%s\n", str)

	fmt.Printf("----------------rpk2-----------------\n")

	v, _ = rpk2.Uint32()
	fmt.Printf("%d\n", v)

	str, _ = rpk2.String()
	fmt.Printf("%s\n", str)

}
예제 #4
0
func (this *transfer_session) send_file(session *socket.Tcpsession) {
	for {
		remain := len(this.filecontent) - this.ridx
		sendsize := 0
		if remain >= 16000 {
			sendsize = 16000
		} else {
			sendsize = remain
		}
		wpk := packet.NewWPacket(packet.NewByteBuffer(uint32(sendsize)))
		wpk.PutUint16(transfering)
		wpk.PutBinary(this.filecontent[this.ridx : this.ridx+sendsize])
		if nil == session.Send(wpk) {
			this.ridx += sendsize
			if this.ridx >= len(this.filecontent) {
				break
			}
		} else {
			break
		}
	}
}
예제 #5
0
func main() {
	var i uint32
	for i = 1; i <= 100; i++ {
		service := "127.0.0.1:8010"
		tcpAddr, err := net.ResolveTCPAddr("tcp4", service)
		if err != nil {
			fmt.Printf("ResolveTCPAddr")
		}
		conn, err := net.DialTCP("tcp", nil, tcpAddr)
		if err != nil {
			fmt.Printf("DialTcp error,%s\n", err)
		} else {
			session := socket.NewTcpSession(conn)
			wpk := packet.NewWPacket(packet.NewByteBuffer(uint32(64)))
			wpk.PutUint32(uint32(i))
			session.Send(wpk)
			idx := i
			go socket.ProcessSession(session, packet.NewRPacketDecoder(1024),
				func(session *socket.Tcpsession, rpk packet.Packet, errno error) {
					if rpk == nil {
						fmt.Printf("error:%s\n", errno)
						session.Close()
						return
					}
					r := rpk.(*packet.RPacket)
					id, _ := r.Uint32()
					if id == idx {
						session.Send(r.MakeWrite())
					}
				})
		}
	}

	for {
		time.Sleep(10000000)
	}
}