クライアントから、私が理解できないエラーが報告されました。TCPベースのクライアントは、データを受信するサーバーに接続されており、ほとんど何も送信しません。通常、すべてが正常に機能しますが、ブルームーンに入ると、次のような状況が発生します。
- サーバーはいくつかのデータを送信します
- クライアントがデータを受信する
- クライアントがデータを処理しています
- ...そしてその間にサーバーはより多くのデータを送信します
- クライアントが処理を終了します
- クライアントがソケットからデータを読み取ろうとします
- クライアントは、処理後の最初のread()ステートメントで永久にハングします
- サーバーが接続を閉じます
- クライアントはまだハングしています
これがtcp接続が確立される方法です(すべてのログ、リターンチェックなどが削除されます)
ret = inet_pton(AF_INET, conn->address, &addr.sin_addr);
addr.sin_port = htons(conn->port); /* Server port */
addr.sin_family = AF_INET;
sock = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP);
connect(sock, (struct sockaddr *) &addr, sizeof(addr));
そして、これが読み取りラッパーです。
int32_t _readn ( int fd, uint8_t *vptr, int32_t n )
{
int32_t nleft;
int32_t nread;
uint8_t* ptr;
ptr = vptr;
nleft = n;
while (nleft > 0) {
if ((nread = read (fd, ptr, nleft)) < 0) {
if (errno == EINTR) {
nread = 0;
} else {
return E_NETWORK_ERROR;
}
} else if ( nread == 0 ) {
break;
}
nleft -= nread;
ptr += nread;
}
return (n-nleft);
}
接続が閉じられた後でも、読み取り呼び出しが永久にブロックされる可能性はありますか?
これを引き起こす可能性があることに気づかなかった、ラッパーにある種のトリッキーなエラーがありますか?接続時にソケットにいくつかのフラグを設定する必要がありますか?