首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >非阻塞Winsockets c++奇怪的延迟

非阻塞Winsockets c++奇怪的延迟
EN

Stack Overflow用户
提问于 2012-04-01 23:45:08
回答 1查看 261关注 0票数 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算法。

下面是一些客户端代码:

代码语言:javascript
复制
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 to经常有关吗?我正在考虑将网络代码分离到单独的线程中,也许这会有所帮助……

EN

回答 1

Stack Overflow用户

发布于 2012-04-02 00:55:59

当使用非阻塞套接字时,不要使用recv()来查看查找数据的字节。使用select()WSAAsyncSelect()WSAAsyncEvent()在数据可用时收到通知,然后调用recv()读取数据。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9965758

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档