- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我正在将一些(套接字相关的)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) = ?
最佳答案
Linux 在监听套接字上不支持 FIONREAD/SIOCINQ
。参见 tcp(7)
:
SIOCINQ Returns the amount of queued unread data in the receive buffer. The socket must not be in LISTEN state, otherwise an error (EINVAL) is returned. SIOCINQ is defined in <linux/sockios.h>. Alternatively, you can use the synonymous FIONREAD, defined in <sys/ioctl.h>.
关于Android/Linux ioctl FIONREAD 失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13353146/
我正在将一些(套接字相关的)Windows C 代码移植到 Linux/Android,我遇到了 ioctl 命令的问题: unsigned long u; if(sockfd != -1 &&
这个问题与What does FIONREAD of udp socket return?有关 我尝试在 Mac 上使用下一个代码: if( ioctl(socketId, FIONREAD, &to
这个问题在这里已经有了答案: How do I get amount of queued data for UDP socket? (2 个回答) 3年前关闭。 哪一个ioctl的 FIONREAD返
我正在编写一个并行神经网络模拟器,我最近在我的代码中遇到了一个让我很困惑的问题(假设我只是一个中级 C++ 程序员,所以也许我遗漏了一些明显的东西?)。 .. 我的代码涉及一个“服务器”和许多客户端(
我在以下代码中看到了奇怪的行为: int len; ioctl(conn_fd, FIONREAD, &len); 您可能想象到的常见代码在此之前(它是一个玩具网络服务器): ... int sock
我遇到了一个非常奇怪的问题,我无法解决。我想使用 c++ 在 Mac Os X 上读取(仅读取)微 Controller 通过 USB 作为串口(FTDI)收集和发送的数据。一个完整数据序列的大小始终
我想知道我的 TCP 套接字中有多少字节可读。我正在使用标志“FIONREAD”调用 ioctl,它实际上应该给我这个值。 当我调用该函数时,我得到 return val 0 (所以没有 Error
打开文件描述符 fd 和/dev/random 的其他健全性检查后,我试图读取设备可读的字节数,以便在需要时提取此数量我的程序。 我的基本代码是这样的: if (fd = open("/dev/ran
我是一名优秀的程序员,十分优秀!