外部控制器通过TCP/IP套接字每30毫秒发送120字节的消息。应用程序通过标准的tcp/ip套接字recv函数接收这些消息。在Linux和OSX下完美运行(recv每30毫秒返回120字节的消息)。在Windows下,recv返回大约每1秒钟~3500个字节的缓冲区。其余时间返回0。在Windows下,Wireshark显示消息确实每30毫秒到来。
如何使Windows tcp socket正常工作(无延迟)?
PS:我已经尝试过TCP_NODELAY和TcpAckFrequency。 Wireshark显示一切正常。因此,我认为这是某种应该被关闭的Windows优化。
阅读--
如何使Windows tcp socket正常工作(无延迟)?
PS:我已经尝试过TCP_NODELAY和TcpAckFrequency。 Wireshark显示一切正常。因此,我认为这是某种应该被关闭的Windows优化。
阅读--
int WMaster::DataRead(void)
{
if (!open_ok) return 0;
if (!CheckSocket())
{
PrintErrNo();
return 0;
}
iResult = recv(ConnectSocket, (char *)input_buff,sizeof(input_buff),0);
nError=WSAGetLastError();
if(nError==0) return iResult;
if(nError==WSAEWOULDBLOCK) return iResult;
PrintErrNo();
return 0;
}
初始化-
ConnectSocket = INVALID_SOCKET;
iResult = WSAStartup(MAKEWORD(2,2), &wsaData);
ConnectSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
ZeroMemory(&clientService, sizeof(clientService));
clientService.sin_family = AF_INET;
clientService.sin_addr.s_addr = inet_addr( deviceName.toLatin1().constData() );
clientService.sin_port = htons( port);
iResult = setsockopt(ConnectSocket, IPPROTO_TCP, TCP_NODELAY, (char *) &flag,
sizeof (int));
u_long iMode=1;
iResult=ioctlsocket(ConnectSocket,FIONBIO,&iMode);
iResult = ::connect( ConnectSocket, (SOCKADDR*) &clientService,
sizeof(clientService) );
CheckSocket -
bool WMaster::CheckSocket(void)
{
socklen_t len = sizeof (int);
int retval = getsockopt (ConnectSocket, SOL_SOCKET, SO_ERROR, (char*)(&valopt), &len );
if (retval!=0)
{
open_ok=false;
return false;
};
return true;
}