2012-04-01 25 views
0

私はLinuxからWindowsへのオンラインゲームを移植しています。 Linuxではすべてうまくいくが、Windowsでは奇妙な動作がある。クライアントとサーバは、一定のTCP接続で通信します。サーバーは0.5秒ごとにパケットを送信します。そしてLinuxでは0.5秒ごとにパケットを受信しますが、Windowsでは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

ノンブロッキングソケットを扱うときは、データを探すpeekバイトにrecv()を使用しないでください。データが利用可能になったときに通知するには、select()WSAAsyncSelect()、またはWSAAsyncEvent()を使用し、次にrecv()を呼び出して読み取ります。

+0

私はすでにselectとWSAPoll()を使用して、読み込むデータがあるかどうかを確認しようとしましたが、役に立たなかった。 – Rulk

+0

それからそれらを正しく使用していません。あなたの実際の読書コードを示してください。 –