【问题标题】:TCP Socket send/receive always waitingTCP Socket 发送/接收总是等待
【发布时间】: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 然后它可能干净地关闭服务器套接字;它可能在几秒钟后关闭,或者它可能永远不会被检测为已关闭。像这样的套接字很有趣。因此:握手关闭是很好(应该鼓励),但不应该依赖

标签: c# sockets tcp


【解决方案1】:

每个套接字都有一个线程通常是个坏主意。拥有一个处理套接字 IO 和接受连接的单个线程通常是一个糟糕的主意。套接字断开连接可能会被忽视的原因有很多——要么是一段时间,要么在某些情况下:无限期地。避免这个问题的方法通常是让一个线程(或这些天:async 循环)专门用于接受连接和初始化连接,然后不是为每个套接字创建一个线程,而是使用异步 IO 来读取/写入而不需要线程。虽然如果您的套接字数量非常少,您可能能够摆脱每个套接字线程。最后,要么使用读/写超时,要么定期“我最近见过这个套接字吗?”检查(在所有套接字上),以帮助关闭静默失败的套接字。

【讨论】:

  • @TE:创建一个列表,您可以在其中将委托添加到处理当前连接的函数
  • @Radinator 这是你要评论的帖子吗?
  • @Radinator 但是.... 谁是 TE?那条评论在回应什么?困惑...
  • 看起来像复制粘贴 =)
  • @MarcGravell:sry...TE 是线程创建者的德语(“线程 Ersteller”)
猜你喜欢
  • 2016-07-28
  • 2017-09-04
  • 2019-11-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-06-27
  • 1970-01-01
相关资源
最近更新 更多