2016-07-15 33 views
0

Ich habe eine System.Net.Sockets.Socket eingerichtet. Ich starte den Socket, der auf eingehende Verbindungen hört, um Socket-Anfragen zu nehmen. Dieselbe Buchse sollte aufhören können zu hören und schreiben und eine Verbindung zu anderen Sockets herstellen. Nachdem ich den Socket auf Listen gesetzt habe, kann ich keinen Verbindungsbefehl senden. Ich erhalte diese Ausnahme:Socket Listen und Connect

Eine nicht behandelte Ausnahme des Typs ‚System.InvalidOperationException‘ aufgetreten in System.dll Zusätzliche Informationen: Sie können diese Operation nicht durchführen, nachdem die Listen-Methode aufrufen.

Wie kann ich den Status ändern und zulassen, dass er die Verbindungen wechselt und zum Abhören zurückkehrt? Ich verwende TCP localhost

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 
+0

** A) ** Welche Art von Protokoll verwenden Sie? ** B) ** Wo tritt dieser Fehler auf? ** C) ** Zeigen Sie uns Ihren Code. –

+0

@VisualVincent hilft das? –

+0

Zusätzlich zu meinen Kommentaren zur x82-Antwort empfehle ich, eine meiner vorherigen Antworten zu sehen. ** Wenn Sie _ _ sind, erreichen Sie die Daten zwischen den beiden Endpunkten: [** TCP-Client-zu-Server-Kommunikation **] (http://stackoverflow.com/a/35240061/3740093). –

Antwort

1

Ihre Methode ist falsch. Server-Sockets überwachen einen Port und Clients versuchen, eine Verbindung herzustellen. Wenn eine Verbindung von einem Client empfangen wird, erstellt der Server einen anderen Socket (wenn server.Accept() auf einem blockierenden Socket zurückgegeben wird).

Der Rückgabewert dieses Annahmerufs ist ebenfalls ein Socket, und das sollten Sie verwenden, um mit dem Client zu kommunizieren. Ich bin nicht so gut mit VB, aber was Sie Code haben, ist, dass Sie den Rückgabewert von socket.Accept() zu retten:

clientSocket = server.Accept() 

dann können Sie anrufen Senden/Empfangen von Methoden auf Ihren clientSocket Variable.

+0

Jeder Socket in meiner Klasse ist ein Server und ein Client. Es fügt den Socket zu einer Liste hinzu und behält sie als Referenz bei, bis eine Verbindung zu einem bestimmten Socket gesendet werden soll. –

+0

Sie sagen uns besser, was Sie auf eine klarere Weise erreichen wollen, damit wir Vorschläge machen können. Ihre derzeitige Lösung des Problems ist meiner Meinung nach kompliziert. Der entscheidende Punkt ist, dass Sie keine Verbindung von der Serverseite zum Client herstellen müssen. Zu dem Zeitpunkt, zu dem der Socket vom Annahmeruf zurückgegeben wird, ist bereits ein Comm-Kanal zwischen dem Server und dem Client eingerichtet. Warum beschäftigen Sie sich wieder mit der Verbindung vom Server zu diesem Client (Sie können nicht), sollten Sie den Socket in Ihrer Kundenliste verwenden. – x82

+0

@DotNetProgrammer: Was x82 sagt, ist korrekt. Es ist auch gut, darauf hinzuweisen, dass ein TCP-Socket (ich weiß nicht über UDP oder die anderen) kann nur für eingehende Verbindungen _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ .. –