这种方法有用吗?
我将简单地以简化形式呈现我的代码,以便于阅读。 我正在尝试实现多个客户端/一个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;
删除套接字。这是一个好方法吗?如果不是那么问题是什么?
答案 0 :(得分:0)
我发现你正在做的事情有几个问题:
一种方法是使用事件循环:
参考文献: http://instagram-engineering.tumblr.com/post/121930298932/c-futures-at-instagram(参见非阻塞IO部分)