a飞翔的野猪 2016-08-17 16:15 采纳率: 100%
浏览 1988
已采纳

为什么c++11 thread多线程造成 socket 中accept函数不阻塞?

求大神帮忙看看为什么这里总是运行错误,总是报10022,无效socket的错误
弄了很长时间就是搞不明白,小白一枚,求解,感激

#include
#include
#include
#include
#include
using namespace std;
#pragma comment(lib,"ws2_32.lib")
const short ServerPort=10080;
vector ClientList;
SOCKET StartServer();
int AcceptClient(SOCKET serversock);
int RecvClientInfo(SOCKET client);

//主函数
int main()
{
SOCKET serversock = StartServer();
cout << "启动服务器" << endl;
if (serversock==INVALID_SOCKET)
{
cout << "服务器启动失败" << endl;
closesocket(serversock);
WSACleanup();
return -1;
}
std::thread t1(AcceptClient, serversock);//创建线程接收客户端连接
string cmd;
while (true)
{
cout << "please input cmd:\n";
cin >> cmd;
if (cmd=="exit")
{
closesocket(serversock);
WSACleanup();
break;
}
}
return(0);
}

SOCKET StartServer()
{
WSADATA wsaData;
int nRet = WSAStartup(MAKEWORD(2, 2), &wsaData);
if (nRet != 0)
{
cout << "loading sock field" << endl;
return -1;
}
SOCKET Server = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
sockaddr_in addr_Server = { 0 };
addr_Server.sin_family = AF_INET;
addr_Server.sin_port = htons(10080);
addr_Server.sin_addr.S_un.S_addr = htonl(INADDR_ANY);
bind(Server, (SOCKADDR*)&addr_Server, sizeof(addr_Server)); //绑定
listen(Server, SOMAXCONN);//监听
return Server;
}
int AcceptClient(SOCKET serversock)
{
do
{
SOCKET Client ;
SOCKADDR addr_Client = { 0 };
int len = sizeof(addr_Client);
Client = accept(serversock, (SOCKADDR*)&addr_Client, &len);//接受clientSock
/*
这里accept函数本应该阻塞,但是没有阻塞
*/
if (Client == INVALID_SOCKET)
{
cout << "accept client field"<<GetLastError()<<endl;
break;
}
ClientList.push_back(Client);
} while (true);
return 0;
}

  • 写回答

2条回答 默认 最新

  • 某某郁郁 2016-08-17 23:44
    关注

    如果可以的话你尝试一下下Windows的 CreateThread。
    有时候 用CreateThread创建的线程实际效果发现比 C++11创建的线程要好,我写另外的一个 C++程序的时候就是这样,Thread创建的线程总是失效,CreateThread反而好了

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

悬赏问题

  • ¥15 执行 virtuoso 命令后,界面没有,cadence 启动不起来
  • ¥50 comfyui下连接animatediff节点生成视频质量非常差的原因
  • ¥20 有关区间dp的问题求解
  • ¥15 多电路系统共用电源的串扰问题
  • ¥15 slam rangenet++配置
  • ¥15 有没有研究水声通信方面的帮我改俩matlab代码
  • ¥15 ubuntu子系统密码忘记
  • ¥15 保护模式-系统加载-段寄存器
  • ¥15 电脑桌面设定一个区域禁止鼠标操作
  • ¥15 求NPF226060磁芯的详细资料