【发布时间】:2016-08-24 08:07:29
【问题描述】:
我在服务器和客户端之间有一个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();
}
}
【问题讨论】:
-
在关闭连接之前,发送一个“嘿服务器!我想关闭连接!”或类似的东西。所以服务器也可以处理它关闭它的连接并且不需要听取反馈
-
@TE:创建一个列表
,您可以在其中将委托添加到处理当前连接的函数 -
@Radinator 我接受了 MarcGravell 的回答,但我也想试试这个。对于第一条评论,如果连接被 android 强制关闭,比如关闭应用程序或断开 wifi,该怎么办?
-
@Pareidolia 然后它可能干净地关闭服务器套接字;它可能在几秒钟后关闭,或者它可能永远不会被检测为已关闭。像这样的套接字很有趣。因此:握手关闭是很好(应该鼓励),但不应该依赖。