无法向同一TCP客户端发出2个并行TCP请求

时间:2009-10-09 01:51:04

标签: c# visual-studio-2005 tcp

错误: 无法从传输连接读取数据:通过调用WSACancelBlockingCall中断阻塞操作

情况

  1. 有一个TCP服务器
  2. 我的Web应用程序连接到此TCP服务器

    使用以下代码:

    TcpClientInfo = new TcpClient();
    _result = TcpClientInfo.BeginConnect(<serverAddress>,<portNumber>, null, null);
    bool success = _result.AsyncWaitHandle.WaitOne(20000, true);
    
    if (!success)
    {
        TcpClientInfo.Close();
        throw new Exception("Connection Timeout: Failed to establish connection.");
    }
    
    NetworkStreamInfo = TcpClientInfo.GetStream();
    NetworkStreamInfo.ReadTimeout = 20000;
    
  3. 2用户使用同一个应用程序从两个不同的位置同时访问此服务器的信息

  4. 服务器需要大约2秒才能回复
  5. 两个连接
  6. 但其中一位用户遇到上述错误 “无法从传输连接读取数据:通过调用WSACancelBlockingCall中断阻塞操作” 尝试从流中读取数据时
  7. 如何解决此问题?

    1. 使用更好的方式连接服务器
    2. 不能,因为这是服务器问题
      • 如果服务器出现问题,服务器应如何处理请求以避免此问题

2 个答案:

答案 0 :(得分:0)

只是一个想法。

如果您的服务器响应时间为2秒,那么Timeout值不应该是2000而不是20000(这是20秒)吗? AsyncWaitHandle.WaitOne()的第一个参数是毫秒。

如果您等待20秒,可能是您的服务器因疏忽而断开连接?

答案 1 :(得分:0)

这看起来像Windows特定于我,这不是我的强项,但是......

您没有向我们展示服务器代码,只显示客户端代码。那么,我只能假设您的服务器代码接受套接字连接,它的魔力,发回一些东西,并关闭客户端连接。如果这是你的情况,那就是问题。

accept()调用是一个阻塞调用,它等待下一次客户端连接尝试并绑定到它。可能存在由OS创建和管理的连接尝试队列,但它仍然只能一次接受一个连接。

如果您希望能够处理多个并发请求,则必须更改服务器以调用accept(),并在新连接进入时,启动工作线程/进程来处理请求并返回到在accept()所在的循环顶部。因此,主循环将实际工作交给另一个线程/进程,以便它可以返回到等待下一次连接尝试的业务。

真正的服务器应用程序比这更复杂。他们在池中启动了一堆“工蜂”线程/进程,并将其重用于将来的请求。例如,Web服务器就是这样做的。

如果我对您的服务器代码的假设是错误的,请告诉我们它的外观。