【问题标题】:Solving : Insufficient winsock resources available to complete socket connection initiation解决:winsock资源不足,无法完成socket连接发起
【发布时间】:2023-03-22 04:05:01
【问题描述】:

我有两个系统,一个是通过网络服务发送大量数据(大约 1GB)。首先它将数据拆分成块,然后在需要额外信息时将其发送给客户端。

数据不直接作为字节数组发送,而是放入我创建的具有两个成员的特殊类中:

1) 消息:我使用它指定如何处理块 2) Obj : 表示数据的字节数组

所以基本上服务器填充这个结构然后它序列化整个对象,最后将它发送给客户端。每个块大约 4KB

再次重复多次,因此数据传输量可能为 1GB 或 2GB。当我尝试运行它时,我得到了这个错误:

System.InsufficientMemoryException 被捕获 Message="Winsock 资源不足,无法完成套接字连接初始化。"

当我尝试:netstat -an -p TCP

我得到了这样的东西......

TCP 127.0.0.1:58759 127.0.0.1:57469 TIME_WAIT

TCP 127.0.0.1:58760 127.0.0.1:57469 TIME_WAIT

TCP 127.0.0.1:58761 127.0.0.1:57469 TIME_WAIT

TCP 127.0.0.1:58762 127.0.0.1:57469 TIME_WAIT

TCP 127.0.0.1:58763 127.0.0.1:57469 TIME_WAIT

TCP 127.0.0.1:58764 127.0.0.1:57469 TIME_WAIT

TCP 127.0.0.1:58765 127.0.0.1:57469 TIME_WAIT

TCP 127.0.0.1:58766 127.0.0.1:57469 TIME_WAIT

...

增加到大约:

...

TCP 127.0.0.1:65531 127.0.0.1:57469 TIME_WAIT

TCP 127.0.0.1:65532 127.0.0.1:57469 TIME_WAIT

TCP 127.0.0.1:65533 127.0.0.1:57469 TIME_WAIT

应该有一个热修复 - 在以前的答案中,但它不起作用。热修复在这里:

http://support.microsoft.com/kb/2577795

我之前使用过类似的代码,但我没有进行序列化,而是直接将数据作为字节数组发送,并且效果很好。除了使用我创建的封装类和序列化过程之外,我发现代码之间没有区别。

谁能解释我做错了什么?

谢谢。

=============================================

我找到了一种复制此问题的简单方法:

首先创建一个具有以下方法的 VB.NET 网络服务:

<WebMethod(enablesession:=False)> _
Public Function HelloWorld() As Byte()
    Dim B(0 To 1000) As Byte
    Return B
End Function

接下来为它创建一个客户端,如下所示:

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    Dim T As New ServiceReference1.Service1SoapClient
    T.Open()
    Dim I As Integer
    For I = 0 To 1000000
        T.HelloWorld()
        Me.Text = I
        Application.DoEvents()
    Next
End Sub

你会得到这个错误。希望有人对此有解决方案。

【问题讨论】:

  • 嗯,也许您将新数据包发送到服务器,但由于互联网速度,服务器无法获取它们?您是否在发送新数据包之前检查先前的数据包是否已到达服务器(例如,服务器发送一条小消息表明先前的数据包已被接受)?

标签: vb.net web-services iis


【解决方案1】:

尝试在调用之间关闭/释放客户端。

For I as Integer = 0 To 1000000 Using T As New ServiceReference1.Service1SoapClient T.Open() T.HelloWorld() Me.Text = I End Using Application.DoEvents() Next

【讨论】:

  • 不确定该类是否实现了 IDisposable。如果不使用 .Close() 方法。
猜你喜欢
  • 2014-08-02
  • 1970-01-01
  • 2018-06-21
  • 2019-12-13
  • 1970-01-01
  • 1970-01-01
  • 2020-05-04
  • 1970-01-01
相关资源
最近更新 更多