2

一部の(ソケット関連の)WindowsCコードをLinux/ Androidに移植している最中であり、ioctlコマンドで問題が発生しています。

unsigned long   u;

if(sockfd != -1 && !ioctl(sockfd, FIONREAD, &u))

{
    return((long) u);
}
    ...
// throw exception

errnoをチェックすると、EINVALが表示されますが、ioctlの呼び出しがこれらの引数で失敗した理由がわかりません。代わりにuをintとして宣言しようとしましたが、それでも失敗しました。何が悪いのかわかりません。このコードはWindowsで完全に正常に機能します(ioctlの代わりにioctlsocket)。

Linuxからのstraceは次のとおりです。

socket(PF_INET, SOCK_STREAM, IPPROTO_TCP) = 3
bind(3, {sa_family=AF_INET, sin_port=htons(9099), sin_addr=inet_addr("0.0.0.0")}, 16) = 0
listen(3, 5)                            = 0
ioctl(3, FIONREAD, [1])                 = -1 EINVAL (Invalid argument)
write(2, "Exception code: 00000503, data: "..., 52Exception code: 00000503, data: 00000000 ((null):0)
) = 52
shutdown(3, 2 /* send and receive */)   = 0
close(3)                                = 0
exit_group(1)                           = ?
4

1 に答える 1

3

FIONREAD/SIOCINQLinux はon listen ソケットをサポートしていません。参照tcp(7):

シオシンク
       受信バッファ内のキューに入れられた未読データの量を返します。の
       ソケットは LISTEN 状態であってはなりません。それ以外の場合、エラー ( EINVAL ) が発生します。
       戻ってきた。  SIOCINQ<linux/sockios.h>で定義されています。あるいは、あなた<sys/ioctl.h>で定義され
       ている同義のFIONREADを使用できます。
于 2012-11-13T00:59:23.280 に答える