【发布时间】:2017-02-06 03:07:20
【问题描述】:
我正在从事机器人控制项目,我应该主要 (1) 向机器人发送一些有关速度和固定位置的数据,然后 (2) 使用我的 PC 启动实时控制并重复。 我选择使用 TCP/IP 作为第一步和实时 UDP/IP。 我尝试编写此代码,但我认为缺少某些内容。
我有一些问题:
1- 当没有传入(客户端)连接时,接受函数没有返回有效的套接字,也没有打印 Message[10]!!
2- Sendto 可以使用相同的服务器 IP 和端口吗?
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 是非实时的