我正在開發機器人控制項目,主要應該(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