我正在开发机器人控制项目,主要应该(1)向机器人发送一些关于速度和固定位置的数据,然后(2)使用我的PC启动实时控制并重复。 我选择使用TCP/IP作为第一步和实时UDP/IP。 我试图编码这个,但我相信缺少一些东西。同时在TCP和UDP之间切换
我有一些问题:
1-当不存在输入的(客户机)的连接接受功能没有返回有效的套接字也不消息[10]印刷!!
2-使用相同的服务器IP和端口Sendto可以吗?
3-这是在UDP和TCP之间来回切换的正确方法,还是应该进行一些考虑?
while(Comm_Loop)
{
while (TCP_Loop)
{
TCP_Client = accept(TCP_Server, (struct sockaddr*) &Client_Address, &Client_Address_Length) ;
if (TCP_Client != INVALID_SOCKET)
{
if (Data_Trans)
{
State = send(TCP_Client, Msg, sizeof(Msg), 0) ;
if (State != SOCKET_ERROR)
TCP_Loop = 0 ;
else
cout << Message[8] ;
}
}
else cout << Message[10] ;
}
Check_Send = sendto(UDP_Socket,
UDP_Send_Packet,
sizeof(UDP_Send_Packet),
0,
(LPSOCKADDR) &Socket_Address,
sizeof(Socket_Address));
fd_set SockSet ;
timeval Time_Out ;
FD_ZERO(&SockSet) ;
FD_SET(UDP_Socket, &SockSet);
Time_Out.tv_sec = 5;
Time_Out.tv_usec = 0 ;
State = select(0, &SockSet, (fd_set *)NULL, (fd_set *)NULL, &Time_Out) ;
if((State > 0) && (FD_ISSET(UDP_Socket, &SockSet) != 0))
{
Check_Recieve = recvfrom(UDP_Socket,
UDP_Recieve_Packet,
Buffer_Length,
0,
NULL,
NULL);
TCP_Loop = 1 ;
}
else
{
// Reception timeout
Comm_Loop = 0;
}
}
closesocket(TCP_Client) ;
closesocket(TCP_Server) ;
closesocket(UDP_Socket) ;
WSACleanup() ;
return 0;
}
你关心丢包吗?如果是坚持TCP/IP。如果没有使用UDP。如果您觉得需要实施UDP包重新发送(如果丢失),然后使用TCP/IP。大部分TCP/IP开销都是打开初始连接。一旦打开,通过可靠连接的速度差别很小。 –
我会尝试这两种技术,但我认为TCP/IP是非实时的 – Mahjob