多客户端和单服务器处理

Multiple client and single server handling

本文关键字:服务器 处理 客户端      更新时间:2023-10-16

这种方法行得通吗?

我将简单地以简化的形式呈现我的代码,以便于阅读。我正在尝试实现多个客户端/一个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;中删除套接字。这是个好方法吗?如果不是,那么问题是什么?

我看到你正在做的事情有几个问题:

  1. 您正在无限期地推送到套接字管理器向量。用不了多久,您的内存/文件描述符就会用完。
  2. 使用一些锁保护对套接字管理器的访问,否则可能会出现争用条件。

执行此操作的一种方法是使用事件循环:

  • 具有一个或多个用于执行 I/O 的线程。
  • 每个 I/O 线程都对打开的套接字列表进行操作。
  • 它使用 select() 或 poll() 来确定它正在操作的集合中的哪个套接字有可用的数据。使用读取的数据调用必要的回调。
  • 处理数据由工作线程处理。回调调用了处理数据的工作线程之一。

引用:http://instagram-engineering.tumblr.com/post/121930298932/c-futures-at-instagram(请参阅非阻塞 IO 部分)