【发布时间】:2016-11-19 00:02:31
【问题描述】:
我设置了一个 System.Net.Sockets.Socket。我启动套接字侦听传入连接以接受套接字请求。这个相同的套接字应该能够停止监听和写入并连接到其他套接字。将套接字设置为 Listen 后,我无法让它发送连接命令。我得到这个例外:
“System.InvalidOperationException”类型的未处理异常发生在 系统.dll 附加信息:调用 Listen 方法后,您可能无法执行此操作。
如何更改其状态并允许其更改连接并返回监听?我正在使用 TCP 本地主机
Public Class SocketHandler
Private Socke As Sockets
Private connectThread As Thread
Private listenThread As Thread
Private listening As Boolean = False
Public Sub New()
listenThread = New Thread(Address of Listen)
listenThread.IsBackground = True
listenThread.Start()
End New
Private Sub Listen()
Socke.Bind(New IPEndPoint(IPAddress.Any, Socke.Port))
Socke.Listen(5)
While Listening
Dim Sock As Sockets = DirectCast(Socke.Accept(), Sockets)
If Not Socke.Clients.Contains(Sock) Then
Socke.Clients.Add(Sock)
End If
End While
End Sub
Private Connect(ByVal sock As Sockets)
connectThread = New Thread(Sub() Connecting(sock))
connectThread.IsBackground = True
connectThread.Start()
End If
Private Sub Connecting(Byval sock As Sockets)
'Right Here is where I need to stop Listening and have the Socket connect
Socke.Connect(sock) 'Here is where I get the Exception
connectThread.Abort()
'Here I need to turn the Listening back on
End Sub
Public Class Sockets : Inherits Socket
Public Port As Integer
Public IPAddress As IPAddress
Public Clients As New List(Of Sockets)
Public Overloads Sub Connect(Byval sock as Sockets)
Dim point As New IPEndPoint(DirectCast(socket.LocalEndPoint), IPEndPoint)
connectDone.Reset()
BeginConnect(point, AddressOf Callback, sock)
connectDone.WaitOne()
End Sub
Private Sub Callback(ByVal r As IAsyncResult)
EndConnect(r)
connectDone.Set()
End Sub
End Class
【问题讨论】:
-
A) 您使用的是哪种协议? B) 这个错误发生在哪里? C) 向我们展示您的代码。
-
@VisualVincent 有帮助吗?
-
除了我对 x82 的答案的 cmets 之外,我建议您查看我以前的答案之一当您到达在两个端点:TCP Client to Server communication.
标签: vb.net sockets connect listen