2012-04-01 147 views
0

我将从Linux到Linux的在线游戏移植到windows。在Linux上一切都很好,但在Windows上我有一些奇怪的行为。客户端和服务器通过不断的TCP连接通信。服务器每0.5秒发送一次数据包。在Linux上,我每0.5秒接收一次数据包,但是在窗口中我有这样的内容:0.9,0.3,0.3,0.3,0.9等等(间隔实际上取决于对服务器间隔的ping可能是类似于0.7,0.2 0.7)。 我使用非阻塞套接字。我试过禁用tcp nagle算法。非阻塞Winsockets C++奇怪的延迟

下面是一些客户端的代码:

memset(&hints, 0, sizeof hints); 
hints.ai_family = AF_UNSPEC; 
hints.ai_socktype = SOCK_STREAM; 
hints.ai_flags = AI_PASSIVE; 
int iStatus = getaddrinfo(Settings->GetDnSAddr().c_str(), 
Settings->GetPortStr().c_str(), &hints, &servinfo); 
if(iStatus != 0 || servinfo == NULL) 
{ 
    iState = L_CONNECT_DOWN; 
    throw ExeptionNetwork(903,__FILE__,__LINE__,iStatus); 
    return 0; 
} 

iSocketFD = socket(servinfo->ai_family,servinfo->ai_socktype,servinfo->ai_protocol); 
if (iSocketFD == INVALID_SOCKET) 
{ 
    THROWNETWORK(901); 
} 

cout<<"Connecting to server:"<<Settings->GetIPv4Addr()<<":"<<Settings->GetPort()<<endl; 
if (connect(iSocketFD,servinfo->ai_addr,servinfo->ai_addrlen) == SOCKET_ERROR) 
{ 
    cout<<"Connection failed:"<<errno<<endl; 
    iState = L_CONNECT_DOWN; 
    THROWNETWORK(902); 
    return 0; 
} 
cout<<"Connected"<<endl; 

#if (defined WIN32)||(defined WINCE) 
unsigned long iMode = 1; 
if (SOCKET_ERROR == ioctlsocket(iSocketFD, FIONBIO, &iMode)) 
{ 
    THROWNETWORK(903); 
} 
#else 
fcntl(iSocketFD, F_SETFL, O_NONBLOCK); 
#endif 


char flag =1; 
setsockopt(iSocketFD, IPPROTO_TCP, TCP_NODELAY, &flag, sizeof(flag)); 

然后读我偷看用的recv(),如果有东西可以读我读。

任何想法? 可能它以某种方式连接到经常调用recv?我正在考虑将网络代码分离到单独的线程,也许它会帮助...

回答

2

使用非阻塞套接字时,请勿使用recv()来查看查找数据的字节。当数据变为可用时,使用select(),WSAAsyncSelect()WSAAsyncEvent(),然后调用recv()来读取它。

+0

我已经尝试过使用select和WSAPoll()来检查是否有一些数据要读取,但它没有帮助。 – Rulk 2012-04-01 18:58:10

+0

然后你没有正确使用它们。请显示您的实际阅读代码。 – 2012-04-02 18:48:15