c# - TCP 套接字发送/接收总是在等待

标签 c# sockets tcp

我在服务器和客户端之间有一个 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 loop)专用于接受连接和初始化连接,然后不是为每个套接字创建一个线程,而是使用异步 IO 来无需线程即可读/写。虽然如果您的套接字数量非常少,您可能能够摆脱每个套接字线程的问题。最后,要么使用读/写超时,要么定期“我最近见过这个套接字吗?”检查(在所有套接字上),以帮助关闭无提示失败的套接字。

关于c# - TCP 套接字发送/接收总是在等待,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39117765/

相关文章:

java - 如何通过发送和接收数据包手动获取网站的 IP 地址抛出 Google DNS、OpenDNS...

c# - 导出托管 C# 函数以将更改的 char* 参数返回到非托管代码

c# - 如何绕过 dll 中的 VC++ 运行时要求?

c# - 静态方法是线程安全的吗

Php 套接字无法正常工作 (CentOS 7)

Perl 套接字作为(伪)http 服务器与 ftp 请求中断!

c# - Entity Framework 6 code first - 通过注解实现多对多的一种方式

c - Send() 消息包含 TCP 套接字中的某些字段 (C Linux)

networking - shutdown(sock, SHUT_RD) 与 TCP 的行为

用于 TCP/IP 的 C++ 库 类似于 C# 中的 WebClient/HttpWebRequest