2012-04-01 4 views
0

리눅스에서 Windows로 온라인 게임을 이식하고 있습니다. 리눅스에서는 모든 것이 잘 작동하지만, 윈도우에서는 이상한 행동을합니다. 클라이언트와 서버는 지속적인 TCP 연결을 통해 통신합니다. 서버는 0.5 초마다 패킷을 보냅니다. 그리고 리눅스에서는 0.5 초마다 패킷을 받지만, 윈도우에서는 0.9,0.3,0.3,0.3,0.9 등의 값을 갖습니다. (간격은 실제로 서버 간격에 따라 달라집니다. 간격은 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

+0

그런 다음 올바르게 사용하지 않습니다. 귀하의 실제 독서 코드를 보여주십시오. –