1

select()を使用して、recv()の呼び出しがブロックされるかどうかを判断できますが、読み取り対象のバイトであると判断したら、実際にrecv()を呼び出す前に、現在使用可能なバイト数を照会する方法です。 )?

4

2 に答える 2

4

OSがそれを提供している(そしてほとんどが提供している)場合は、ioctl(..、FIONREAD、..)を使用できます。

int get_n_readable_bytes(int fd) {
    int n = -1;
    if (ioctl(fd, FIONREAD, &n) < 0) {
        perror("ioctl failed");
        return -1;
    }
    return n;
}

Windowsは、類似のioctlsocket(..、FIONREAD、..)を提供します。これは、unsignedlongへのポインターを想定しています。

unsigned long get_n_readable_bytes(SOCKET sock) {
    unsigned long n = -1;
   if (ioctlsocket(sock, FIONREAD, &n) < 0) {
       /* look in WSAGetLastError() for the error code */
       return 0;
   }
   return n;
}

ioctl呼び出しは、すべてのfdsで機能するわけではありませんが、ソケットおよびその他のいくつかのfdで機能するはずです。使用する可能性のあるほぼすべての無料のUNIXライクなOSのTCPソケットで正常に動作すると思います。そのセマンティクスは、UDPソケットでは少し異なります。それらの場合、次のデータグラムのバイト数を示します。

Windowsでのioctlsocket呼び出しは、(明らかに)ソケットでのみ機能します。

于 2010-10-15T06:06:52.590 に答える
2

いいえ、プロトコルはそれを決定する必要があります。例えば:

  • 固定サイズのメッセージを使用する場合は、Xバイトを読み取る必要があることがわかります。
  • 読み取るXバイトを示すメッセージヘッダーを読み取ることができます。
  • ターミナル文字/シーケンスが見つかるまで読むことができます。
于 2010-10-13T17:33:08.593 に答える