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.
Mit welchem Server verbinden Sie sich? Wie haben Sie sichergestellt, dass der Server nicht getrennt wird? – usr
@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
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