为什么我每次交易后都被迫关闭()C#异步客户端套接字?

时间:2012-09-09 00:19:41

标签: c# sockets asyncsocket

我正在尝试编写一个异步套接字应用程序,它可以跨越两侧传输复杂的对象。

我使用了示例here ...

一切都很好,直到我尝试发送多包数据。当传输的数据需要多个包传输服务器应用程序暂停并且服务器失控而没有任何错误...

几个小时后,我找到了解决方案;如果我在每次EndSend回调后关闭客户端发送方套接字,问题就在于解决。但我不明白为什么这是必要的?或者还有其他解决方案吗?

My(2)项目与示例above相同,只是我更改了EndSend回调方法,如下所示:

    public void EndSendCallback(IAsyncResult result)
    {
        Status status = (Status)result.AsyncState;
        int size = status.Socket.EndSend(result);
        status.Socket.Close(); // <--------------- This line solved the situation
        Console.Out.WriteLine("Send data: " + size + " bytes.");
        Console.ReadLine();
        allDone.Set(); 
    }

谢谢..

1 个答案:

答案 0 :(得分:0)

这是由于示例代码没有处理多个包(并且被破坏)。

一些观察结果:

  • 服务器一次只能处理1个客户端。
  • 服务器只检查进入的数据是否小于所请求的数据,如果是,则假定这是最后一部分。
  • 服务器然后忽略客户端套接字,同时保持连接打开。这使得在客户端关闭连接的责任可能会造成混淆,并且会浪费服务器上的资源。

现在第一个观察是一个实现细节,在您的情况下并不真正相关。第二个观察结果与您相关,因为它可能会导致无法解释的错误 - 可能不会在开发中 - 但是当此代码实际在某个实际场景中运行时。套接字没有简化。当客户端超过1000个字节。这可能需要1次调用来读取服务器或10.只要有“某些”数据可用,就会立即返回read。您需要做的是实现某种协议,该协议可以传输多少数据,或者传输所有数据。我真的建议坚持使用HTTP协议,因为这是一个经过良好测试且支持良好的协议,适合大多数情况。

第三个观察结果也可能导致服务器资源不足的错误,因为它会打开所有连接。