在 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
。
所以我正在尝试在 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
。