Android / Linux ioctl FIONREAD失败

我正在将一些(与套接字有关的)Windows C代码移植到Linux / Android,我遇到了ioctl命令的问题:

unsigned long u; if(sockfd != -1 && !ioctl(sockfd, FIONREAD, &u)) { return((long) u); } ... // throw exception 

当我检查errno,我看到EINVAL,但我不明白为什么调用ioctl失败的这些论点。 我甚至试图宣布你是一个int,而它仍然失败。 我不知道什么是错的。 这个代码在Windows(ioctlsocket而不是ioctl)上工作得很好。

这里是Linux的一个分支:

 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) = ? 

Linux在侦听套接字上不支持FIONREAD/SIOCINQ 。 看tcp(7)

 SIOCINQ
       返回接收缓冲区中排队的未读数据量。 该
       套接字不能处于LISTEN状态,否则会出现错误( EINVAL )
       回。  SIOCINQ<linux / sockios.h>中定义 。 或者,你
       可以使用<sys / ioctl.h>中定义的同义FIONREAD