多客户端和单服务器处理

时间:2015-06-18 22:19:38

标签: c++ sockets

这种方法有用吗?

我将简单地以简化形式呈现我的代码,以便于阅读。 我正在尝试实现多个客户端/一个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数据(-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处理我的连接,如果我将不得不使用删除从我的std::vector<SOCKET> socketsManager;删除套接字。这是一个好方法吗?如果不是那么问题是什么?

1 个答案:

答案 0 :(得分:0)

我发现你正在做的事情有几个问题:

  1. 您无限期地推送到套接字管理器向量。在用完内存/文件描述符之前不久就已经过了。
  2. 使用某种锁保护对socketsManager的访问,否则您可能会遇到竞争条件。
  3. 一种方法是使用事件循环:

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

    参考文献: http://instagram-engineering.tumblr.com/post/121930298932/c-futures-at-instagram(参见非阻塞IO部分)