我TCP
在服务器和客户端之间建立了连接。服务器发送数据,客户端接收数据,客户端反馈服务器。但是,如果客户端关闭套接字并再次创建,则服务器永远不会接受它,因为它正在等待客户端的反馈。那么我该如何解决呢?
服务器
byte[] buffer = new byte[1000];
string ip = "192.168.1.17";
int port = 15500;
IPAddress ipAddress = IPAddress.Parse(ip);
IPEndPoint localEndpoint = new IPEndPoint(ipAddress, port);
Socket sock = new Socket(ipAddress.AddressFamily, SocketType.Stream, ProtocolType.Tcp);
Console.WriteLine("Waiting client...");
sock.Bind(localEndpoint);
sock.Listen(5);
Socket confd = sock.Accept();
Console.WriteLine("Connected with {0} at port {1}", ip, port);
Sender sender = new Sender();
Receiver receiver = new Receiver();
while (true) {
if (confd.Connected) {
sender.SendData(confd);
receiver.ReceiveData(confd); //Waiting here
}
else {
confd.Close();
Console.WriteLine("Waiting client...");
confd = sock.Accept();
}
}
每个套接字都有一个线程通常是一个坏主意。具有处理套接字IO并接受连接的单个线程通常是一个糟糕的主意。导致套接字断开连接被忽略的原因有很多种-有一段时间,或者在某些情况下:无限期。避免此问题的方法通常是使一个线程(或这些天:async
循环)专用于接受连接和初始化连接,然后而不是为每个套接字创建线程,而是使用异步IO来读取/写入而不需要线程。尽管如果插槽数量很少,您可能会能够摆脱“每插槽线程数”的困扰。最后,要么使用读/写超时,要么定期进行“我最近看过这个套接字了吗?” 检查(通过所有套接字),以帮助关闭静默失败的套接字。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句