2016-04-10 13 views
1

Ich verwende eine Bibliothek unter Github, um eine Verbindung zu einem Server herzustellen, da ich nicht mit Sockets in C# vertraut bin. Die Syntax für eine Verbindung herzustellen ist einfach:Socket beim ersten Mal trennen

Connector con = new Connector(ip, port, cipher); 
con.Connect(); 

Die Chiffre-Parameter ist nur Form der Verschlüsselung, die der Server verwendet und ist irrelevant für meine Frage, denke ich.

Nachdem ich die Connect() Methode aufgerufen habe, macht die Bibliothek eine asynchrone Socket und ich bin mir nicht sicher, was danach passiert. Meine Frage ist, dass wenn ich meine Anwendung häufig baue und versuche, mich mit dem Server zu verbinden, die Verbindung beim ersten Versuch unterbrochen wird. Dann, wenn ich versuche, wieder zu verbinden, funktioniert das Programm gut. Ich war in der Lage, die Ursache des Problems an die Callback-Methode von socket.BeginReceive hier zu verfolgen:

private void Receive() { 
    if (m_connected) { 
     var error = SocketError.Success; 

     m_socket.BeginReceive(m_recvBuffer, 0, ReceiveSize, SocketFlags.None, out error, PacketCallback, null); 

     if (error != SocketError.Success) { 
      Disconnect(); 
     } 
    } 
} 

private void PacketCallback(IAsyncResult iar) { 
    if (m_connected) { 
     var error = SocketError.Success; 
     int length = m_socket.EndReceive(iar, out error); 

     if (length == 0 || error != SocketError.Success) { 
      Disconnect(); 
     } 
     else { 
      Append(length); 
      ManipulateBuffer(); 
      Receive(); 
     } 
    } 
} 

socket.EndReceive wird eine Länge von 0 Rückkehr, die das Programm verursacht mit SocketError.ConnectionReset zu trennen. Ich kann einfach nicht herausfinden, warum es nur bei meinem ersten Verbindungsversuch passiert. Jeder weitere Verbindungsversuch funktioniert einwandfrei. Kann jemand, der mit Sockets vertraut ist, mir sagen, ob es ein Fehler im Bibliothekscode ist, und eine Behebung? Wenn nicht, müsste ich nur annehmen, dass es ein Fehler am serverseitigen Ende ist. Vielen Dank.


+0

Mit welchem ​​Server verbinden Sie sich? Wie haben Sie sichergestellt, dass der Server nicht getrennt wird? – usr

+0

@usr Genau das habe ich mich gefragt. Ich habe keine Möglichkeit zu wissen, ob der Server mich trennt oder nicht. Wenn ich weiß, dass die Bibliothek keine Probleme hat, kann ich daraus schließen, dass das Problem einfach außerhalb meiner Kontrolle liegt. – Andrew

+0

OK, schreibe dein eigenes Socket-Programm, um das zu tun. Verwenden Sie synchrone IO. Es ist ganz einfach, das zu tun, wenn Sie nicht absolute Korrektheit, sondern nur einen Test benötigen. – usr

Antwort

-1

Keine Steckdosenhilfen verwenden. Socket ist sehr einfach in .net zu verwenden.

Werfen Sie einen Blick auf dieses Msdn Beispiel: https://msdn.microsoft.com/en-us/library/bew39x2a(v=vs.110).aspx

den Code in den obigen Link verwenden. Hoffe, es wird für dich arbeiten.

+0

??? Steckdosen sind sehr schwer zu benutzen. Es gibt unzählige mögliche Fehler, ich sehe das Gemetzel jeden Tag. Diese Antwort sagt mir, dass Sie noch nie eine korrekte Socket-Anwendung geschrieben haben. Es ist auch keine Antwort. – usr

+0

Sehen Sie sich dieses MSDN-Beispiel jetzt an. Dies ist eines der schrecklichsten MSDN-Beispiele, die es gibt. Dieser Code ist ein Greuel. – usr

+0

Ich glaube nicht, dass die Buchse ist super hart auf .net. Es gibt eine Menge Hilfe für Scokets. Superhard ist etwas, für das du keine Hilfe finden kannst :) – Saif