- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我必须使用 unix 套接字(没有 O_NONBLOCK)为一个类编写一个聊天客户端-服务器,并在它们上选择异步 I/O。目前,在服务器上,我从客户端读取了1024字节,并直接处理。
例如,在消息的情况下,我将收到格式为 MSG <msg>
的命令(代表客户端发送消息),我将遍历连接的客户端的所有套接字并将消息写入它们。
这种方法确实有效,但我最近通过阅读 send
的人发现如果套接字缓冲区已满并且未在套接字上设置标志 O_NONBLOCK,它可以阻塞。
我认为当客户端由于某些原因(崩溃、窃听等)没有读取时可能会发生此问题,这对我的服务器至关重要,因为它基本上会阻塞,直到该客户端再次读取。
所以这是我的问题:
如果套接字缓冲区已满,在潜在阻塞套接字上避免 send to 阻塞的正确方法是什么?
我目前仅使用 select 来检查套接字上是否有可读取的内容,但也许我也应该使用它来查看我是否也可以在特定套接字上写入?而且,我能知道 select 返回时我可以读/写多少字节吗?例如,如果 select“告诉”我可以在此套接字上写入,我怎么知道在在此套接字上写入实际上变成阻塞之前我最多可以写入多少字节?
谢谢。
最佳答案
您可以将 setsockopt()
与 SO_SNDTIMEO
一起使用来设置 send()
将尝试完成其工作的最长时间.
有关详细信息,请参阅 man setsockopt
和 man 7 socket
。
关于c - 避免在不使用 O_NONBLOCK 时发送到 block ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16211428/
我正在使用套接字并使用 fcntl 设置 O_NONBLOCK,但应用程序仍然占用 100% 的 CPU。即使我正在使用等待时间为 1 毫秒的选择。 出于阅读目的,我正在使用 recv。 我在没有 O
根据我在 The Open Group 网站上阅读的内容 fcntl , open , read , 和 write , 我得到的印象是 O_NONBLOCK 是否设置在文件描述符上,因此非阻塞 I/
情况:在 POSIX 环境中,我使用串行端口库,该库通过设置了 O_NONBLOCK 标志的 open(...) 打开设备。正如 open 调用的手册页所述,open 本身不会因该标志而阻塞。 问题:
我实现了套接字超时并重试,但为了做到这一点,我必须将套接字设置为非阻塞套接字。但是,我需要套接字来阻止。这是我尝试解决这两个问题。这是行不通的。随后的发送调用会阻塞但从不发送任何数据。当我在没有选择和
我正在学习小型 http 客户端的开发,特别是 NONBLOCKING tcp 套接字与 http/1.1 客户端的整体复杂性。 下面的小代码似乎可以在 linux 上运行,但不能在我的 mac os
我正在我的 C 程序中打开一个文件: pcm->dfd = open(fname, O_RDONLY|O_NONBLOCK); 然后在其上调用 select() 和 read()。 但我的问题是,O_
Strace 摘录(请忽略将 xml 发送到 ssh): dup(12) = 13 getsockname(13, {sa_family
我正在尝试编写一个“更干净”的程序来释放在命名管道处被阻塞的潜在编写器(因为没有读取器正在从管道读取)。但是,当没有写入器被阻塞写入管道时,清理器本身不应阻塞。换句话说,“清理器”必须立即返回/终止,
我一直在使用进程间通信用 C++ 为 linux 编写一个小程序。我在尝试以非阻塞方式读取一个进程并写入(阻塞)另一个进程时遇到问题。问题看起来像这样,当父级尝试使用 O_NONBLOCK(或 O_N
我有一个关于 Clozure CL 的问题。当我试图从 quicklisp 快速加载一个包时。它抛出一个错误。用谷歌搜索,但没有找到任何有用的东西。 这是错误信息: (ql:quickload :dr
我必须使用 unix 套接字(没有 O_NONBLOCK)为一个类编写一个聊天客户端-服务器,并在它们上选择异步 I/O。目前,在服务器上,我从客户端读取了1024字节,并直接处理。 例如,在消息的情
我正在从 C 程序写入 SOCK_STREAM正在从 go 程序监听的 Unix 域套接字,使用 net.Listen("unix", sockname) .当我将套接字设置为 O_NONBLOCK使
如果我使用 fcntl(sockfd, F_SETFL, O_NONBLOCK); 使 TCP 套接字描述符成为非阻塞的,这是否会使所有后续套接字 API 都像 read()/listen()/acc
发送到 mq_timedreceive 的 timespec 设置为 20 秒。 20 秒过去后,errno 返回“资源暂时不可用”(EAGAIN)。此外,这会发送一个信号并使进程崩溃。我期望发生的是
我正在为类编写一个发送器/读取器 IPC C 程序,但我无法将 O_NONBLOCK 标志设置为 0,以便我的读取器在尝试读取的缓冲区为空时阻塞。以下是我正在使用的功能: int set_nonblo
当我在阻塞模式下使用套接字时,我可以有一个简单的系统来做这样的事情: client server A -------------------> B register
是否可以实现非阻塞客户端套接字?我试过使用 sockfd = socket(AF_INET, SOCK_STREAM, 0); fcntl(sockfd, F_SETFL, O_NONBLOCK);
我正在使用 select() 和 NONBLOCKING 连接 fd 来接受连接并处理输入和输出。我在处理超过缓冲区大小的大数据传输时遇到一些问题。例如这里: readCount = 1; while
如果我有一个文件描述符,它已使用 open (2) 打开,随后使用 fcntl (2) 设置为 O_NONBLOCK 使用FFI(外部函数接口(interface))。 这意味着几乎每次调用read(
aio_write() 和 O_NONBLOCK write() 有什么区别?此外,我使用 O_NONBLOCK 函数将 write() 用于使用文件描述符的文本文件,并通过在函数前后放置一个计时器来
我是一名优秀的程序员,十分优秀!