多客户端和单服务器处理
Multiple client and single server handling
这种方法行得通吗?
我将简单地以简化的形式呈现我的代码,以便于阅读。我正在尝试实现多个客户端/一个TCP服务器。
我的侦听器将像这样循环(作为线程)来处理连接
void WaitAndAcceptConnection(){
if(socket_TEMP = accept(sock_LISTEN, (SOCKADDR*)&ADDRESS, &AddressSize))
{
socketsManager.push_back(socket_TEMP);
currCount++;
std::cout<<"n A connection was found!"<<std::endl;
send(socketsManager[currCount], "Welcome! you have connected to Athena Server", 46,NULL);
// cond.notify_one(); //notify the waiting thread
}
}
其中我有..
std::vector<SOCKET> socketsManager; //handles socket
int currCount=-1; //keep track on the number of connections
如果连接了一个客户端,那么currCount将增加1,在我们的例子中,它将currCount = 0
,然后socketsManager[0]
将存储接受的返回。如果另一个连接,那么currCount = 1
那么socketsManager[1]
将是它的处理程序。
用于发送和接收数据。
我将创建一个 for 循环,该循环将继续迭代以检查我的程序正在处理的每个套接字是否有一个 recv'd 数据(-1 或 0)。
void WaitAndAcceptCommands(){
for(int i = 0; i<= currCount;i++){
int result = recv(socketsManager[i],&command,1,0);
if(result ==-1){
}
else if(result == 0){
}
else{
//process commands
}
}
}
主要将是这样的
Athena ath2; //instance of the server
std::cout<<"n >Waiting for incoming connections..."<<std::endl;
//listener thread, just keep on LOOPING
std::thread connectionThread([&](){
while(1){
ath2.WaitAndAcceptConnection();
}
});
//handles all the inputs, JUST KEEP ON LOOPING
std::thread commandsThread([&](){
while(1){
ath2.WaitAndAcceptCommands();
}
});
connectionThread.join(); //stop
commandsThread.join(); //stop
我很乐意展示我的其余代码,但它们现在完全一团糟。我只想提出这个想法,如果这可行,然后我会继续下去,如果没有,那么我将重新考虑另一种方法。我计划通过timeouts
处理我的连接,如果我必须使用 remove 从std::vector<SOCKET> socketsManager;
中删除套接字。这是个好方法吗?如果不是,那么问题是什么?
我看到你正在做的事情有几个问题:
- 您正在无限期地推送到套接字管理器向量。用不了多久,您的内存/文件描述符就会用完。
- 使用一些锁保护对套接字管理器的访问,否则可能会出现争用条件。
执行此操作的一种方法是使用事件循环:
- 具有一个或多个用于执行 I/O 的线程。
- 每个 I/O 线程都对打开的套接字列表进行操作。
- 它使用 select() 或 poll() 来确定它正在操作的集合中的哪个套接字有可用的数据。使用读取的数据调用必要的回调。
- 处理数据由工作线程处理。回调调用了处理数据的工作线程之一。
引用:http://instagram-engineering.tumblr.com/post/121930298932/c-futures-at-instagram(请参阅非阻塞 IO 部分)
相关文章:
- 提升 Asio TCP 服务器 处理多个客户端
- grpcc++异步服务器示例,在处理状态下是否需要互斥
- ESP-CoAP 服务器调用资源处理程序,不接收包
- 将 URL/href 从网络服务器重新派生到ESP8266(以处理它)
- 如何处理在 CPP 中连接到服务器的多个客户端?
- 如果C/C Python3扩展托管HTTP服务器并将Python代码称为请求处理程序,则如何处理并发
- 在 Boost ASIO 服务器中处理生命周期
- GPRC服务器在处理的第二请求下崩溃
- 从QT Web服务器处理多个客户端
- 服务器在请求已经处理请求时收到请求时会崩溃
- 在多线程c++服务器应用程序中处理非常量全局配置
- 多线程服务器在一个线程中处理多个客户端
- c++tcp多线程客户端/服务器-如何与线程套接字处理程序进行通信
- 带有libpion的服务器在处理请求时崩溃
- 改进服务器以处理多个客户端
- 在没有连接的情况下调用C++Boost异步服务器处理程序
- 什么OOD设计模式应该用于服务器-处理-客户端请求
- 如何为服务器处理标记TCP
- 多客户端和单服务器处理
- 服务器处理的客户端命令C