在 C++ 中接受基于线程表现不同的套接字包括

Accepting a socket in C++ behaving differently based on thread include

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

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

但它几乎把我的东西搞砸了,我不知道如何修复它。 (请注意,我目前正在本地服务器上尝试此操作,"server" 和 "client" 运行ning 在同一台机器上)。

所以最初系统看起来像:

//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 连接,即使存在 none,它也将始终进入 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>,接受实际上会等待客户端连接,然后再继续,而如果我包含它,它只是 returns INVALID_SOCKET 似乎等于 4294967295.

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

using namespace std;

那么 std::bind 可能会优先于您感兴趣的网络相关 bind

另见 Why is “using namespace std” considered bad practice?