Githubのライブラリを使用してサーバに接続しています。これはC#のソケットに慣れていないためです。接続を行うための構文はちょうどです:ソケットが初めて切断される
Connector con = new Connector(ip, port, cipher);
con.Connect();
暗号パラメータは、サーバが使用して私の質問には無関係である暗号化の単なる形式ですが、私は思います。
私はConnect()メソッドを呼び出した後、ライブラリは非同期化されたsockedを作成し、後で何が起こるのかは分かりません。私の質問は、私がアプリケーションを構築してサーバーに接続しようとすると、最初の試みでのみ切断されることが多いということです。その後、私が再び接続しようとすると、プログラムは正常に動作します。私はここsocket.BeginReceiveのコールバックメソッドに問題の原因を追跡することができました:socket.EndReceiveはSocketError.ConnectionResetで切断するプログラムを引き起こしている0の長さを返して
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();
}
}
}
。なぜ私の最初の接続試行でしか起こっていないのか分かりません。その後の接続試行はすべて正常に動作します。ライブラリのコードでエラーが発生した場合は、ソケットに精通している人から教えてもらえますか?そうでなければ、サーバー側でエラーが発生していると仮定しなければなりません。ありがとう。
どのサーバーに接続していますか?サーバーが切断されていないことをどうやって確認しましたか? – usr
@usrそれはまさに私が不思議に思っていたものです。私はサーバーが私を切断しているかどうかを知る方法がありません。そのため、図書館に問題がないことが分かった場合、私はその問題が私のコントロール外であると結論づけることができます。 – Andrew
OK、それを行うための独自のソケットプログラムを書いてください。同期IOを使用してください。正確さを求める必要はなく、テストだけを行う必要がある場合は、それを行うのは非常に簡単です。 – usr