首页 > 解决方案 > 接受 C++ 中基于线程行为不同的套接字包括

问题描述

所以我试图在 C++17 中实现一个服务器-客户端系统,它也使用多线程来处理客户端。到目前为止,我设法使用 Winsock2 为服务器连接和 Windows 特定线程(CreateThread(...) 等)实现了它的基本大纲。它工作正常。

虽然由于 C++11 实现了它自己的线程,并且我们也希望能够在 Linux 上运行系统,但我决定以这种方式实现线程,所以我没有处理 possix 的麻烦。

但它几乎把我的东西搞砸了,我不知道如何解决它。(注意我目前正在本地服务器上尝试这个,“服务器”和“客户端”都在同一台机器上运行)。

所以最初系统看起来像:

//set up connection / server details
while(true){
    newConnection = accept(sListen, (SOCKADDR*)&addr, &addrlen);
    if (newConnection == 0)
        {
         std::cout<<"Failed to accept the client's connection."" <<std::endl;
        }
        else
        {
        CreateThread(...);
        }
}

问题是,如果我包含线程或互斥体 newConnection 将接受 24/7 连接,即使没有连接,它也将始终进入 if 的 else 中。如果我不包括线程和互斥锁,则只有当客户端连接到服务器时才会激活 if 的 else。

关于如何解决此问题或可能导致此问题的任何想法?

干杯

编辑 :

SOCKADDR_IN addr;
int addrlen = sizeof(addr); 

inet_pton(AF_INET, "127.0.0.1", &ip_address);
addr.sin_addr.s_addr = ip_address;
addr.sin_port = htons(1111); //Port
addr.sin_family = AF_INET; //IPv4 Socket

SOCKET sListen = socket(AF_INET, SOCK_STREAM, NULL); 
bind(sListen, (SOCKADDR*)&addr, sizeof(addr)); 
listen(sListen, SOMAXCONN);

编辑 2:我认为问题在于,如果我不包含<thread><mutex>接受实际上等待客户端连接,然后再继续,而如果我包含它,它只会返回 INVALID_SOCKET,它似乎等于 4294967295。

标签: c++multithreadingmutexc++17winsock

解决方案


标头的大多数实现thread将包括(直接或以其他方式)functional标头。该标头声明std::bind. 不幸的是,如果你也有...

using namespace std;

那么就有机会std::bind优先于bind您感兴趣的相关网络。

另请参阅为什么“使用命名空间 std”被认为是不好的做法?.


推荐阅读