Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/320.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# TCP套接字发送/接收始终等待_C#_Sockets_Tcp - Fatal编程技术网

C# TCP套接字发送/接收始终等待

C# TCP套接字发送/接收始终等待,c#,sockets,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 = n

我在服务器和客户端之间有一个
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进行读/写而不需要线程,而不是为每个套接字创建线程。虽然如果您的套接字数量非常少,但您可能可以不使用每个套接字的线程。最后,使用读/写超时,或定期检查(所有套接字)是否最近看到此套接字,以帮助关闭无声失败的套接字。

@TE:创建一个列表,在该列表中,您可以向处理当前套接字的函数添加委托connection@Radinator这是你想评论的帖子吗?@Radinator但是。。。。他是谁?那么,这一评论的回应是什么?困惑…看起来像是复制粘贴=)@MarcGravell:sry…TE是德语(“Thread Ersteller”)用于线程创建者在关闭连接之前,发送一个“嘿,服务器!我想关闭连接!”之类的消息。因此,服务器也可以通过关闭连接来处理它,而不需要监听feedback@TE:创建一个列表,在该列表中,您可以将委托添加到处理当前任务的函数中connection@Radinator我接受了MarcGravel的回答,但我也想试试这个。对于第一条评论,如果android强制关闭连接,比如关闭应用程序或断开wifi连接,该怎么办?@Pareidoria可能会干净地关闭服务器插座;它可能会在几秒钟后关闭,也可能永远不会被检测为已关闭。插座就是这样有趣。因此:握手关机很好(应该鼓励),但不应该依赖它。