【问题标题】:Android/Linux ioctl FIONREAD failingAndroid/Linux ioctl FIONREAD 失败
【发布时间】:2012-11-01 10:24:12
【问题描述】:

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

unsigned long   u;

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

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

当我检查 errno 时,我看到了 EINVAL,但我不明白为什么对 ioctl 的调用因这些参数而失败。我什至试图将 u 声明为 int ,但它仍然失败。我不知道出了什么问题。此代码在 Windows 上运行良好(ioctlsocket 而不是 ioctl)。

这是来自 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)                           = ?

【问题讨论】:

    标签: android linux windows porting


    【解决方案1】:

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

    SIOCINQ 返回接收缓冲区中排队的未读数据量。这 套接字不能处于 LISTEN 状态,否则会出现错误 (EINVAL) 回来。 SIOCINQ 中定义。或者,你 可以使用在 中定义的同义词 FIONREAD

    【讨论】:

    • 简单地忽略 EINVAL 是否安全?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-17
    • 2013-09-25
    • 2019-07-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多