繁体   English   中英

TCP Socket发送/接收总是在等待

[英]TCP Socket send/receive always waiting

我在服务器和客户端之间有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来读/写而不需要线程。 虽然如果你的套接字数量非常少,你可能可以通过每个插槽的线程来逃避。 最后,要么使用读/写超时,要么定期“我最近看过这个插座吗?” 检查(通过所有套接字),以帮助关闭静默失败的套接字。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM