socket accept()多线程连接 详解

转载请标明出处:http://blog.csdn.net/xx326664162/article/details/49704295 文章出自:薛瑄的博客

你也可以查看我的其他同类文章,也会让你有一定的收货!

socket协议详解:https://software.intel.com/zh-cn/blogs/2012/12/18/java-socket-socket

在使用accept函数的时候,如果服务器面向多个客户的连接,

  1. 必须使用while循环,每次循环阻塞在accept函数,等待新的连接到来,这样才能返回新的socket。如果不使用while死循环每次阻塞在accept函数,也可以面向多个客户连接,此时将在socket抽象层,自动建立socket,并且该socket不受控制
  2. 必须使用数组(或其他数据结构)保存当前accept创建的socket,否则下次新的socket建立后,当前的socket将不受控制。
 while (true) {
                 socket  s = ss.accept();
                }
发布了244 篇原创文章 · 获赞 799 · 访问量 234万+
展开阅读全文

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

08-17

求大神帮忙看看为什么这里总是运行错误,总是报10022,无效socket的错误 弄了很长时间就是搞不明白,小白一枚,求解,感激 #include <iostream> #include <WinSock2.h> #include <vector> #include <thread> #include <string> using namespace std; #pragma comment(lib,"ws2_32.lib") const short ServerPort=10080; vector<SOCKET> 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; } 问答

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 代码科技 设计师: Amelia_0503

分享到微信朋友圈

×

扫一扫,手机浏览