0

1 つはデータの受信用で、もう 1 つは送信用の Csocketクライアント プログラムを持っています。threadserverシャットダウンすると、送信者はEPIPE. 同じsocketものを再接続すると、データを受信できますが、送信者はまだEPIPE.

これを修正する方法は?

更新:送信されたバイト数を見ると、実際には送信者がデータを送信しているようです。しかし、errno はまだ壊れたパイプに設定されています。errnoだけをチェックする前に。成功に変更すべきではありませんか?

4

1 に答える 1

1

同じソケットを再接続すると、データを受信できますが、送信者は引き続き EPIPE を取得します。

これは、送信者がまだ古いソケット経由で送信していることを意味するだけです。また、古いソケットを閉じていないことにも注意してください。

送信されたバイト数を見ると、送信者はデータを送信しているようです。しかしerrno、まだ壊れたパイプに設定されています。チェックだけする前にerrno.成功に変更すべきではないでしょうか?

errnoいいえ。直前のシステム コールが -1 を返したときのチェックだけが有効です。例:

int rc = send(...);
if (rc < 0)
{
    if (errno == EWOULDBLOCK) // or EAGAIN *and* we are in non-blocking mode
    {
        // queue the write and return to the select() loop
    }
    else
    {
        perror("send"); // for example
    }
}
else
{
    // write succeeded ...
}
于 2015-11-30T05:30:26.370 に答える