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