예제 #1
0
파일: Socket.go 프로젝트: snuk182/fntp
//Read UDP data, right after UDP data recieve from UDP Socket
func (socket *Socket) ReadUDP(rlen int, buf_receive []byte, remote *net.UDPAddr) bool {
	if rlen != UdpPocketLength {
		return false
	}
	buf := buf_receive[:rlen]
	var (
		converted    bool
		data_id      uint32
		pocket_index uint32
	)
	data_id, converted = lib.BytesToUint32(buf[0:4])
	if !converted {
		lib.Log("Unable to convert data_id from UDP")
		return false
	}
	//If socket incoming data doesn't contains data_id return
	if _, ok := socket.DataIn[data_id]; !ok {
		return false
	}
	socket.RemoteUDP = remote //if DataID is same so maybe Remote address will change
	//If UDP data received for this data_id return
	if socket.DataIn[data_id].StopUDP {
		return true
	}

	pocket_index, converted = lib.BytesToUint32(buf[4:8])
	if !converted {
		lib.Log("Unable to convert pocket_index from UDP")
		return true
	}

	//If all data received
	if len(socket.DataIn[data_id].DataStack) == int(socket.DataIn[data_id].PocketCount) {
		m := socket.DataIn[data_id]
		m.StopUDP = true
		socket.DataIn[data_id] = m
		var stop_data []byte
		stop_data = append(stop_data, buf[0:4]...)
		stop_data = append(stop_data, StopBytes...)
		socket.WriteTCP(stop_data)
		all_data := lib.CombineBytesMap(socket.DataIn[data_id].DataStack)
		go socket.DataReceived(all_data[:socket.DataIn[data_id].Length])
		delete(socket.DataIn, data_id)
		return true
	}

	//if index already received return
	if _, ok := socket.DataIn[data_id].DataStack[pocket_index]; ok {
		return true
	}
	if socket.DataIn[data_id].DataStack == nil {
		m := socket.DataIn[data_id]
		m.DataStack = make(map[uint32][]byte)
		socket.DataIn[data_id] = m
	}
	socket.DataIn[data_id].DataStack[pocket_index] = append(socket.DataIn[data_id].DataStack[pocket_index], buf[8:]...)
	return true
}
예제 #2
0
파일: Socket.go 프로젝트: snuk182/fntp
//Crates MetaData from TCP received headers
func CreateMetaData(data []byte) (meta MetaData, converted bool) {
	converted = true
	meta.DataId, converted = lib.BytesToUint32(data[0:4])
	if !converted {
		lib.Log("Error Converting DataID !!")
		return
	}
	meta.Length, converted = lib.BytesToUint32(data[4:8])
	if !converted {
		lib.Log("Error Converting Length !!")
		return
	}
	meta.PocketCount = lib.CalcPocketCount(meta.Length, uint32(PocketLength))
	meta.StopUDP = false
	meta.DataStack = make(map[uint32][]byte)
	return
}
예제 #3
0
파일: Socket.go 프로젝트: snuk182/fntp
func CreateSocket(tcp_connection *net.TCPConn, remote_udp *net.UDPAddr, udp_socket *net.UDPConn) (socket Socket, err error) {
	socket.TCPSocket = tcp_connection //this must be alive connection
	socket.TCPSocket.SetNoDelay(true)
	socket.RemoteUDP = remote_udp
	socket.UdpSocket = udp_socket
	socket.Error = func(e error) {
		lib.Log(e.Error())
	}
	socket.closed = false
	socket.DataReceived = func(data []byte) {}
	socket.DataIn = make(map[uint32]MetaData)
	socket.DataOut = make(map[uint32]MetaData)
	socket.Disconnected = func(err error) {}
	socket.StoppedUDP = func(m MetaData) {}
	return
}
예제 #4
0
파일: Socket.go 프로젝트: snuk182/fntp
//Reading Data from TCP connection, must be started concurrently and MAYBE WILL RUN IN EVENT LOOP
func (socket *Socket) ReadTCP() {
	buf_receive := make([]byte, 8) //If I'm typing 8 byte it's alwase giving EOF error from TCP
	for {
		if socket.closed {
			return
		}
		rlen, err := socket.TCPSocket.Read(buf_receive)
		if err != nil {
			socket.TCPSocket.Close()
			go socket.Disconnected(err)
			return
		}
		var buf []byte
		buf = append(buf, buf_receive[:rlen]...)
		if rlen != 8 {
			continue
		}

		data_id, converted := lib.BytesToUint32(buf[0:4])
		if !converted {
			lib.Log("Unable to convert data_id in TCP END DATA block")
			continue
		}
		if _, ok := socket.DataOut[data_id]; ok && string(buf[4:5]) == "$" {
			m := socket.DataOut[data_id]
			m.StopUDP = true
			socket.DataOut[data_id] = m
			continue
		}

		meta, converted := CreateMetaData(buf)
		if !converted {
			continue
		}
		socket.DataIn[meta.DataId] = meta
	}
}