Sockets 异常,但仅在第3次-IAsyncResult对象未从此类上相应的异步方法返回
我有一个遗留的(2008年)Windows服务应用程序(使用System.ServiceProcess.ServiceBase),我需要以一种与它现在的工作方式略有不同的方式来使用它。此时,它启动并在特定端口上创建一个TCPLISTENER,供客户端应用程序连接(它只连接一次),以便向侦听端口发送/接收请求。这一切都很好。但是,自适应需要使用web应用程序连接到侦听器端口,然后正常发送/rcv,但在接收之后必须断开(*) (*-如果每次测试后web应用程序都不必断开与侦听套接字的连接,那就更好了,但我无法理解如何实现这一点。我可以将TCP连接保持在会话状态以供重复使用吗?) 无论如何,对于第一个两个连接/发送/rcv/断开连接测试,自适应都可以正常工作,但是在第三个上,服务在套接字类的EndAccept中抛出ArgumentException 我不明白为什么第三次考试不及格Sockets 异常,但仅在第3次-IAsyncResult对象未从此类上相应的异步方法返回,sockets,exception,delegates,tcpclient,iasyncresult,Sockets,Exception,Delegates,Tcpclient,Iasyncresult,我有一个遗留的(2008年)Windows服务应用程序(使用System.ServiceProcess.ServiceBase),我需要以一种与它现在的工作方式略有不同的方式来使用它。此时,它启动并在特定端口上创建一个TCPLISTENER,供客户端应用程序连接(它只连接一次),以便向侦听端口发送/接收请求。这一切都很好。但是,自适应需要使用web应用程序连接到侦听器端口,然后正常发送/rcv,但在接收之后必须断开(*) (*-如果每次测试后web应用程序都不必断开与侦听套接字的连接,那就更好了
这是一个简单的测试客户端
公共类ConnectDisconnectTCP
继承System.Web.UI.Page
私有IP为String=“127.0.0.1”
专用端口为Int32=10002
专用mTCP作为System.Net.Sockets.TCP客户端
专用netStrm作为NetworkStream
受保护的子页加载(ByVal sender作为对象,ByVal e作为System.EventArgs)处理Me.Load
端接头
受保护的子按钮1\u单击(发送者作为对象,e作为事件参数)处理按钮1。单击
Dim oEnc作为新的ASciencoding
尺寸扫描文本为String=“100000000093001X”+vbLf
Dim mTCP作为System.Net.Sockets.TCP客户端
'连接并创建TCP客户端
mTCP=新系统.Net.Sockets.TCP客户端(IP,端口)
netStrm=mTCP.GetStream()
netStrm.WriteAsync(oEnc.GetBytes(ScanText.ToString),0,ScanText.ToString.Length)
如果netStrm.CanRead,则
将myReadBuffer(1024)设置为字节
Dim myCompleteMessage As StringBuilder=新建StringBuilder()
Dim NumberOfBytes读取为整数=0
'传入消息可能大于缓冲区大小。
做
numberOfBytesRead=netStrm.Read(myReadBuffer,0,myReadBuffer.Length)
myCompleteMessage.AppendFormat(“{0}”,Encoding.ASCII.GetString(myReadBuffer,0,numberOfBytesRead))
netStrm.database可用时循环
如果结束
“接近
netStrm.Close()
mTCP.Close()'处理此TcpClient实例并请求关闭底层TCP连接。
mTCP=无
Label1.Text=“已关闭”
端子端类
这是服务上的TCPListener类,它完成了所有的工作
导入系统
导入System.IO
导入系统.Net
导入System.Net.Sockets
导入系统线程
导入系统文本
公共类TCPListenerPort
私有currentAsynchResult作为IAsyncResult
作为客户端状态的私有cState
私有servSock作为新套接字(AddressFamily.InterNetwork、SocketType.Stream、ProtocolType.Tcp)
专用m_连接状态为Int32=0
Dim sData As String=String.Empty
“柜台
公共cnt作为Int32=0
公共rcvcnt作为Int32=0
作为Int32的公共帐户=0
公共sndcnt作为Int32=0
公共sndcal作为Int32=0
公共cncnt作为Int32=0
"公共事件",
公共事件连接状态(ByVal enmState作为Int32)
公共事件数据到达(ByVal strData作为对象)
公共分新()
端接头
公共子新建(ByVal dr作为数据行)
端接头
受保护的覆盖子完成()
尝试
如果不是cState,那么什么都不是
cState.ClntSock.Close()
如果结束
如果不是servSock,那就什么都不是了
servSock.Close()
如果结束
特例
投手
最后
MyBase.Finalize()
结束尝试
端接头
私有类客户端状态
Public Const BUFSIZE As Integer=1024
Public mrcvBuffer As Byte()=新字节(BUFSIZE-1){}
Public mSendBuffer As Byte()=新字节(BUFSIZE-1){}
专用mclntSock作为套接字=无
Public Sub New(ByRef clntSock作为套接字)
mclntSock=clntSock
ReDim mrcvBuffer(BUFSIZE)
重拨mSendBuffer(BUFSIZE)
端接头
公共只读属性SckConnected()为布尔值
得到
SckConnected=mclntSock.已连接
结束
端属性
公共只读属性RcvBuffer()作为字节()
得到
RcvBuffer=mrcvBuffer
结束
端属性
公共只读属性SendBuffer()作为字节()
得到
SendBuffer=mSendBuffer
结束
端属性
公共只读属性ClntSock()作为套接字
得到
ClntSock=mclntSock
结束
端属性
末级
公共子连接(ByVal TCPPort为Int32,ByVal积压为Int32)
尝试
cState=newclientstate(servSock)
cState.ClntSock.Bind(新的IPEndPoint(System.Net.IPAddress.Any,TCPPort))
cState.ClntSock.听(100)'5
虽然是真的
cncnt=cncnt+1
System.Diagnostics.Debug.WriteLine(“连接时”+cncncnt.ToString)
currentAsynchResult=servSock.BeginAccept(新的AsyncCallback(AddressOf AcceptCallback),cState)
currentAsynchResult.AsyncWaitHandle.WaitOne()
结束时
捕获未使用的ObjectDisposedException 1作为ObjectDisposedException
捕获e作为例外
结束尝试
端接头
专用子AcceptCallback(ByVal asyncResult作为IAsyncResult)
尝试
acccnt=a
[12572] TcpClient#57416410::TcpClient(AddressFamily#2)
[12572] Socket#61940669::Socket(AddressFamily#2)
[12572] Exiting Socket#61940669::Socket()
[12572] Exiting TcpClient#57416410::TcpClient()
[12572] TcpClient#57416410::TcpClient()
[12572] Exiting TcpClient#57416410::TcpClient()
[12572] Socket#15193904::Socket(AddressFamily#2)
[12572] Exiting Socket#15193904::Socket()
[17872] Socket#40528290::Socket(AddressFamily#2)
[17872] Exiting Socket#40528290::Socket()
[17872] Socket#40528290::Bind(0.0.0.0:10002#10002)
[17872] Exiting Socket#40528290::Bind()
[17872] Socket#40528290::Listen(Int32#100)
[17872] Exiting Socket#40528290::Listen()
in connect WHILE 1
[17872] Socket#40528290::BeginAccept()
[17872] Exiting Socket#40528290::BeginAccept() -> AcceptAsyncResult#515737
The thread '1' (0x6674) has exited with code 0 (0x0).
The thread '<No Name>' (0x1df8) has exited with code 0 (0x0).
The thread '<No Name>' (0x5dac) has exited with code 0 (0x0).
[7984] Socket#49538252::Socket()
[7984] Exiting Socket#49538252::Socket()
in connect WHILE 2
AcceptCallback Start1
[17872] Socket#40528290::BeginAccept()
[7984] Socket#40528290::EndAccept(AcceptAsyncResult#515737)
[17872] Exiting Socket#40528290::BeginAccept() -> AcceptAsyncResult#27334100
System.Net.Sockets Information: 0 : [7984] Socket#49538252 - Accepted connection from 127.0.0.1:63817 to 127.0.0.1:10002.
[7984] Exiting Socket#40528290::EndAccept() -> Socket#49538252
127.0.0.1:63817
[7984] Socket#49538252::BeginReceive()
[7984] Exiting Socket#49538252::BeginReceive() -> OverlappedAsyncResult#62696216
AcceptCallback End 1
[22168] Data from Socket#49538252::PostCompletion
[22168] 00000000 : 32 30 30 30 30 30 30 30-30 30 38 33 30 30 31 58 : 100000000093001X <-- SCANTEXT RECEIVED, TEST1
[22168] 00000010 : 0A : .
ReceiveCallback In 1
[22168] Socket#49538252::EndReceive(OverlappedAsyncResult#62696216)
[22168] Exiting Socket#49538252::EndReceive() -> Int32#17
ReceiveCallback receiveMsgSize 17
[22168] Socket#49538252::BeginSend()
[22168] Exiting Socket#49538252::BeginSend() -> OverlappedAsyncResult#13462887
A first chance exception of type 'System.FormatException' occurred in Microsoft.VisualBasic.dll
[19228] Data from Socket#49538252::PostCompletion
[19228] 00000000 : 07 : . <-- RESPONSE RECEIVED, TEST1
[19228] Socket#49538252::EndSend(OverlappedAsyncResult#13462887)
[19228] Exiting Socket#49538252::EndSend() -> Int32#1
[19228] Socket#49538252::BeginReceive()
[19228] Exiting Socket#49538252::BeginReceive() -> OverlappedAsyncResult#25961440
SendCallBack 1 1
[7984] Data from Socket#49538252::PostCompletion
[7984] 00000000 : :
ReceiveCallback In 2
[7984] Socket#49538252::EndReceive(OverlappedAsyncResult#25961440)
[7984] Exiting Socket#49538252::EndReceive() -> Int32#0
ReceiveCallback Exit 2
ReceiveCallback Exit 2
[22168] Socket#31352595::Socket()
[22168] Exiting Socket#31352595::Socket()
AcceptCallback Start2
in connect WHILE 3
[17872] Socket#40528290::BeginAccept()
[22168] Socket#40528290::EndAccept(AcceptAsyncResult#27334100)
[17872] Exiting Socket#40528290::BeginAccept() -> AcceptAsyncResult#39421196
System.Net.Sockets Information: 0 : [22168] Socket#31352595 - Accepted connection from 127.0.0.1:63820 to 127.0.0.1:10002.
[22168] Exiting Socket#40528290::EndAccept() -> Socket#31352595
127.0.0.1:63820
[22168] Socket#31352595::BeginReceive()
[22168] Exiting Socket#31352595::BeginReceive() -> OverlappedAsyncResult#28002689
AcceptCallback End 2
[7984] Data from Socket#31352595::PostCompletion
[7984] 00000000 : 32 30 30 30 30 30 30 30-30 30 38 33 30 30 31 58 : 100000000093001X <-- SCANTEXT RECEIVED, TEST2
[7984] 00000010 : 0A : .
ReceiveCallback In 3
[7984] Socket#31352595::EndReceive(OverlappedAsyncResult#28002689)
[7984] Exiting Socket#31352595::EndReceive() -> Int32#17
ReceiveCallback receiveMsgSize 17
[7984] Socket#31352595::BeginSend()
[7984] Exiting Socket#31352595::BeginSend() -> OverlappedAsyncResult#31071611
[22168] Data from Socket#31352595::PostCompletion
A first chance exception of type 'System.FormatException' occurred in Microsoft.VisualBasic.dll
[22168] 00000000 : 07 : . <-- RESULT RECEIVED, TEST2
[22168] Socket#31352595::EndSend(OverlappedAsyncResult#31071611)
[22168] Exiting Socket#31352595::EndSend() -> Int32#1
[22168] Socket#31352595::BeginReceive()
[22168] Exiting Socket#31352595::BeginReceive() -> OverlappedAsyncResult#51673536
SendCallBack 2 1
[4640] Data from Socket#31352595::PostCompletion
[4640] 00000000 : :
ReceiveCallback Exit 3
The thread '<No Name>' (0x4b1c) has exited with code 0 (0x0).
ReceiveCallback In 4
[4640] Socket#31352595::EndReceive(OverlappedAsyncResult#51673536)
[4640] Exiting Socket#31352595::EndReceive() -> Int32#0
ReceiveCallback Exit 4
[4640] Socket#37088038::Socket()
[4640] Exiting Socket#37088038::Socket()
AcceptCallback Start3
[4640] Socket#49538252::EndAccept(AcceptAsyncResult#39421196)
in connect WHILE 4
[17872] Socket#40528290::BeginAccept()
[17872] Exiting Socket#40528290::BeginAccept() -> AcceptAsyncResult#8948635
//ERROR THROWN HERE
AcceptCallback End 3
TCP 0.0.0.0:10002 LON-WKS-ZER01:0 LISTENING
TCP 0.0.0.0:10002 LON-WKS-ZER01:0 LISTENING
TCP 127.0.0.1:10002 apps:59574 ESTABLISHED
TCP 127.0.0.1:59574 apps:10002 ESTABLISHED
TCP 0.0.0.0:10002 LON-WKS-ZER01:0 LISTENING
TCP 127.0.0.1:10002 apps:59574 CLOSE_WAIT
TCP 127.0.0.1:59574 apps:10002 FIN_WAIT_2
TCP 0.0.0.0:10002 LON-WKS-ZER01:0 LISTENING
clntSock = servSock.ClntSock.EndAccept(asyncResult)
Dim clientState As New ClientState(servSock)
clientState.ClntSock.Bind(New IPEndPoint(System.Net.IPAddress.Any, TCPPort))
clientState.ClntSock.Listen(Backlog)
While True
Dim result As IAsyncResult = servSock.BeginAccept(New AsyncCallback(AddressOf AcceptCallback), clientState)
result.AsyncWaitHandle.WaitOne()
End While