我可以在阻塞和非阻塞行为之间反复切换吗?

标签 c linux sockets blocking nonblocking

我有两个进程在主/副本设置中通过 Unix 域套接字进行通信。副本需要定期向主副本请求指导,但只有当主副本表明它准备好提供所述指导时,它才应该这样做。如果主准备就绪,副本应该查询主并等待响应;否则,它应该继续当前的任务。

通常,无论主服务器是否准备就绪,我都会使用 POSIX 信号量与副本通信——它既快速又轻便。不幸的是,我碰巧在研究一个不支持 POSIX 共享内存的系统。因此,我只有 Unix 套接字。

我知道非阻塞读取非常快,所以我想知道我是否可以做这样的事情:

  • 打开副本和主副本之间的连接。
  • 将副本的末端设置为非阻塞。
  • 定期检查副本是否可以从主副本读取。
  • 如果读取成功,将套接字切换为阻塞并查询主套接字。查询完成后,将套接字返回到非阻塞状态
  • 如果读取失败,则继续直到下一次检查。

我能否在阻塞和非阻塞行为之间重复切换套接字?

最佳答案

You can使用 fcntl:

int file_descriptor;
int flags;

// open file_descriptor

flags = fcntl(file_descriptor, F_GETFL, 0);
flags &= ~O_NONBLOCK;           // set blocking
flags |= O_NONBLOCK;            // set non-blocking
fcntl(file_descriptor, F_SETFL, flags);

但我认为如果你只使用两个套接字,你的程序会更简单。一个用于控制(非阻塞),一个用于数据(阻塞)。使用控制套接字传递“就绪”/“未准备好”消息,使用数据套接字为您提供“指导”。

这消除了打开/关闭套接字或重复修改其配置的需要,并且应该简化程序中的控制流。它还将程序中的数据流和控制流分开,这通常是一种很好的做法。

关于我可以在阻塞和非阻塞行为之间反复切换吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50575506/

相关文章:

python - Scapy TCP 握手 - Windows

javascript - Node.js Socket.io 错误 : disconnect event is triggered after connect

java SocketException : Connection reset

使用指针比较字符串?

c - connect() 因 WSAETIMEDOUT 失败后重用套接字?

c - fork 从哪里开始执行表单?

linux - Bash 帮助删除嵌套目录

c++ - 用C/C++程序获取串口ARM CPU信息

c - iup, IupParamBox 问题

linux - 如何将源服务器中文件的 md5checksum 与 shell 脚本中的目标服务器进行比较?