+ -
当前位置:首页 → 问答吧 → 多线程中网络通信为什么卡死?

多线程中网络通信为什么卡死?

时间:2011-12-26

来源:互联网

在多线程中,主要代码:

C/C++ code

while(1){
         theApp.m_thread_count += 1;
    int retval = recv(sock_conn, recvBuf , buffersize ,0);                    send(sock_conn, "123", 4 ,0);
    closesocket(sock_conn);
    theApp.m_thread_count -= 1;
}




每一段时间,根据 theApp.m_thread_count 计数是否等于0 ,看是否卡死。
连接10000次后,theApp.m_thread_count 等于2,说明有2个线程进入后没退出。
用procexp查看,确实多出两个线程。

为什么会出现这个问题呢?

作者: DDXASP   发布时间: 2011-12-26

你这是阻塞模式??

那卡死不是很正常么

作者: zhanshen2891   发布时间: 2011-12-26

int retval = recv(sock_conn, recvBuf , buffersize ,0);  
send(sock_conn, "123", 4 ,0);

如果没有消息发送到本机,那么recv函数会一直阻塞到有消息来为止,肯定卡斯了撒

楼主用多线程吧,或者使用异步的socket

作者: RabbitLBJ   发布时间: 2011-12-26

貌似正常
引用 2 楼 rabbitlbj 的回复:

int retval = recv(sock_conn, recvBuf , buffersize ,0);
send(sock_conn, "123", 4 ,0);

如果没有消息发送到本机,那么recv函数会一直阻塞到有消息来为止,肯定卡斯了撒

楼主用多线程吧,或者使用异步的socket

作者: onlycs   发布时间: 2011-12-26

楼主可以在recv这行代码前加上如下代码:
C/C++ code

int timeVal = 1000; 
ret = setsockopt(acceptSock, SOL_SOCKET, SO_RCVTIMEO, (char *)&timeO, sizeof(timeVal));


这样就不会卡死啦,哈哈,不过最好还是听楼上大侠们的意见

作者: wutaozhao   发布时间: 2011-12-26