1

時々奇妙な問題が発生します。接続してデータを送信する同期ソケットがあります。

do
{
    try
    {
        // blocking
        int bytesRead = sender.Receive(bytesReceived);

        // process the received bytes
    }
    catch (SocketException soex)
    {
        throw new Exception(String.Format("Socket exception..." +Environment.NewLine+"[Code: {0}] {1}",soex.ErrorCode,soex.Message));
    }
}
while (sender.Poll(1500, SelectMode.SelectRead) && sender.Available > 0);

ブロックされているため、Receive に永遠にとどまりたくありません。そのため、パケットがネットワークに到達する時間を取得するための応答を待機する時間でポーリングを行い、Available とともに、私は実際のデータがなくなると壊れる可能性があります。

私が得ている問題は、(do-while で) while が false を返すことです。番号を取得します。

何か案が?私は困惑しています。

4

1 に答える 1

0

たぶんsender.Pollfalse を返しますが、それでも読み取るデータを返します。たぶん、 while条件を変更して、ループ内sender.Available > 0で呼び出すことができます。sender.Poll

編集:多分これで十分です(疑似コード):

int length;
do {
  length = socket.Read(buffer);
  // process "buffer"
} while (length > 0);

Read 呼び出しが長時間ブロックされないように、ソケット タイムアウトを設定する必要がある場合があります。

于 2012-08-27T16:45:05.563 に答える