qq_17496071
a飞翔的野猪
采纳率100%
2016-08-17 16:15

为什么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条回答

  • u014287382 Suwings 5年前

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

    点赞 评论 复制链接分享
  • weixin_41240692 weixin_41240692 2年前

    你这种情况就是bind函数出问题了,服务器套接字都绑定不了,更别说listen和accept了。。。
    C++11thread也存在bind函数 当你用了using namespace std的时候,bind是优先调用thread里面的,如果你要用socket的bind,要用全局作用域符号::bind来区分
    具体参见这篇博客
    https://blog.csdn.net/qq_32563917/article/details/85156757

    点赞 评论 复制链接分享