c++ - 接受 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。
解决方案
标头的大多数实现thread
将包括(直接或以其他方式)functional
标头。该标头声明std::bind
. 不幸的是,如果你也有...
using namespace std;
那么就有机会std::bind
优先于bind
您感兴趣的相关网络。
推荐阅读
- python - 每次我运行我的代码时,只有几个按钮被点击,然后我被一个 Element Click Intercepted Exception - Selenium Python 击中
- python - 我在尝试制作简单的纸牌游戏时遇到了问题
- three.js - GLTF 和分层 - 层上移动的对象被剪切/隐藏
- javascript - Select2 字段 .value 属性不会在 .onchange 函数内更改
- stripe-payments - 条带发送量自动除以100
- python - 如何加快熊猫系列中的排名功能?
- c++ - 具有依赖类型的 CRTP,类型名称查找
- javascript - 笑话:模拟构造函数返回错误
- firebase - 如何通过规则为特定用户授予对多个 Firestore 文档的访问权限
- java - 在spring-boot @Scheduled中使用fixedDelayString而不直接放置配置属性