Bum*_*bee 1 c++ multithreading mutex winsock c++17
所以我试图在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(...);
}
}
Run Code Online (Sandbox Code Playgroud)
问题是,如果我包含线程或互斥锁,即使没有连接,newConnection也将全天候接受连接,并且它将始终位于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);
Run Code Online (Sandbox Code Playgroud)
编辑2:我认为问题是,如果我不包括<thread>或<mutex>接受实际上等待客户端连接之前,如果我包括它,它只返回INVALID_SOCKET,它似乎等于4294967295.
thread标头的大多数实现将包括(直接或以其他方式)functional标头.那个标题声明了std::bind.不幸的是,如果你还有...
using namespace std;
Run Code Online (Sandbox Code Playgroud)
然后有机会std::bind优先选择bind您感兴趣的网络.