2016-04-10 20 views
1

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(); 
     } 
    } 
} 

。なぜ私の最初の接続試行でしか起こっていないのか分かりません。その後の接続試行はすべて正常に動作します。ライブラリのコードでエラーが発生した場合は、ソケットに精通している人から教えてもらえますか?そうでなければ、サーバー側でエラーが発生していると仮定しなければなりません。ありがとう。


+0

どのサーバーに接続していますか?サーバーが切断されていないことをどうやって確認しましたか? – usr

+0

@usrそれはまさに私が不思議に思っていたものです。私はサーバーが私を切断しているかどうかを知る方法がありません。そのため、図書館に問題がないことが分かった場合、私はその問題が私のコントロール外であると結論づけることができます。 – Andrew

+0

OK、それを行うための独自のソケットプログラムを書いてください。同期IOを使用してください。正確さを求める必要はなく、テストだけを行う必要がある場合は、それを行うのは非常に簡単です。 – usr

答えて

-1

ソケットヘルパーは使用しないでください。ソケットは.netで非常に使いやすいです。

は、このMSDNの例を見てみましょう:https://msdn.microsoft.com/en-us/library/bew39x2a(v=vs.110).aspx

は、上記のリンクのコードを使用してください。それがあなたのために働くことを願っています。

+0

を掲示???ソケットは使いにくいです。無数の間違いがあります、私は毎日大虐殺を見る。この答えは、正しいソケットアプリケーションを書かなかったことを示しています。また、それは答えではありません。 – usr

+0

このMSDNサンプルを見るこれはMSDNサンプルの中で最も恐ろしいものの1つです。このコードは間違いです。 – usr

+0

ソケットが.net上で非常に難しいとは思わない。 scoketsには多くの助けがあります。超硬はあなたがそれのための助けを見つけることができないものです:) – Saif

関連する問題