gpt4 book ai didi

c - 套接字:为什么阻塞 read() 因 ENOTCONN 而失败?

转载 作者:行者123 更新时间:2023-12-04 16:47:30 27 4
gpt4 key购买 nike

我正在尝试从阻塞套接字中读取,但我想知道 read() 返回 -1,我认为这意味着当前没有数据可读 - 我希望它会阻塞直到它可以读取字节数。

我还尝试确保套接字处于阻塞模式并且使用以下方法设置了高超时:

int setBlockingIO(int fd)
{
int flags = fcntl(fd, F_GETFL);
fcntl(fd, F_SETFL, flags & (~O_NONBLOCK));
int nTimeout = 30000; // 30 seconds
setsockopt(fd, SOL_SOCKET, SO_RCVTIMEO, (const char*)&nTimeout, sizeof(int));
}

但这并没有改变任何东西。

我的问题:

  • 我该怎么做才能让 read() 真正阻止
  • 我可能会遇到一些陷阱吗? (我的程序中有错误?)

我知道有 another question关于这个主题,但我找不到问题的答案。

更新

如果不设置超时,read() 也会立即(主观地)返回 -1

更新 2

errno 为 107(ENOTCONN,传输端点未连接)。但客户端并没有同时关闭连接(由 write() 之后的长 sleep() 确保)

最佳答案

你期待什么?你说你有一个非阻塞套接字,所以它当然不会阻塞。 read 上的非阻塞套接字的行为是,如果有数据可供读取,则立即返回一些数据(可能比请求的数量短),并返回 -1 和 errno 设置为 EAGAINEWOULDBLOCK 如果没有数据可用。

如果您不想要非阻塞行为,为什么要将套接字设置为非阻塞?

编辑:哎呀,你已经改变了你的问题。 ENOTCONN 的原因是您试图从未连接的套接字中读取。除非通过 acceptsocketpair 获得套接字,否则您必须在 read< 之前对其调用 connect 以将其连接到远程地址 将起作用。

关于c - 套接字:为什么阻塞 read() 因 ENOTCONN 而失败?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6018305/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com