我正在学习Winsock并尝试创建一些简单的程序来了解它。我设法创建了可以处理多个连接的服务器,并根据所有教程管理它们和客户端,它正在运行它应该如何但是:
我尝试制作循环,检查是否有任何客户端断开连接,如果有,我想关闭它。
我设法写了一些可以检查套接字是否断开连接但是一次不连接2个或更多套接字的东西
任何人都可以回复如何在每个客户端断开连接并关闭套接字时如何进行工作循环检查?这一切都是为了使像max客户端一次连接到服务器。提前谢谢。
while (true)
{
ConnectingSocket = accept (ListeningSocket, (SOCKADDR*)&addr, &addrlen);
if (ConnectingSocket!=INVALID_SOCKET)
{
Connections[ConnectionsCounter] = ConnectingSocket;
char *Name = new char[64];
ZeroMemory (Name,64);
sprintf (Name, "%i",ConnectionsCounter);
send (Connections[ConnectionsCounter],Name,64,0);
cout<<"New connection !\n";
ConnectionsCounter++;
char data;
if (ConnectionsCounter>0)
{
for (int i=0;i<ConnectionsCounter;i++)
{
if (recv(Connections[i],&data,1, MSG_PEEK))
{
closesocket(Connections[i]);
cout<<"Connection closed.\n";
ConnectionsCounter=ConnectionsCounter-1;
}
}
}
}
Sleep(50);
}
答案 0 :(得分:0)
您似乎想要使用单个线程管理多个连接。对? 简而言之,套接字通信有两种模式,块和非块。默认值为块模式。让我们关注你的代码:
for (int i=0;i<ConnectionsCounter;i++)
{
if (recv(Connections[i],&data,1, MSG_PEEK))
{
closesocket(Connections[i]);
cout<<"Connection closed.\n";
ConnectionsCounter=ConnectionsCounter-1;
}
}
在上面的代码中,您调用了recv函数。并且它将阻塞,直到对等方向您发送了msg,或者对等方关闭了链接。所以,如果你现在有两个连接,即Connections [0]和Connections [1]。如果你是recv Connections [0],同时,Connections [1]已经断开连接,你就不知道了。因为你在recv时阻塞了(Connections [0])。当Connections [0]向您发送消息或关闭套接字时,然后循环继续,最后您检查它是断开连接,即使它在10分钟前断开连接。
要解决此问题,我认为您需要一本书 Microsoft Windows网络编程。有一些方法,如一个线程一个套接字模式,异步通信模式,非阻塞模式等。
忘了指出错误,请注意:
closesocket(Connectons[i]);
cout<<"Connection closed.\n";
ConnectionsCounter=ConnectionsCounter-1;
让我举一个例子来说明它。现在我们有两个索引为0和1的连接,然后ConnectionsCount应为2,对吧?当Connections [0]断开连接时,ConnectionsCounter从2更改为1.并循环退出,连接新客户端,将新客户端套接字保存为Connections [ConnectionsCounter(= 1)] = ConnectingSocket;哎呀,得到了一个bug。因为断开连接的套接字的索引是0,而索引1被另一个链接使用。你正在重用索引1.
为什么不尝试使用vector来保存套接字。
希望它有所帮助〜