当前位置: 首页 > 知识库问答 >
问题:

c套接字sendmsg msg_dontwait-buffer重用

陈正业
2023-03-14

我使用C套接字发送设置了MSG_DONTWAIT标志的ICMP数据包。我的程序是单线程的,但它希望以高频率发送消息,所以我将消息发送设置为非阻塞。在每次调用后共享/修改/重用消息缓冲区是否安全?(除非返回EAGAIN或EWOULDBLOCK)。

重用msg_control(辅助数据),并在调用之间修改msg_control->struct in_pktinfo->ipi_ifindex(出站接口ifindex)。

iov.iov_base缓冲区内容(不是指针!)并且iov.iov_len也可以在调用之间进行更改。(不太可能,但仍有可能)。

共有1个答案

蔺昊穹
2023-03-14

是的,很安全。在Linux上,在send返回之前,您指定的所有数据都会立即复制到内核的缓冲区中。如果内核的缓冲区已满,它将返回EAGAIN或EWOULDBLOCK(显然在Linux中是相同的),并且什么也不会发生。您不必担心内核会在您更改了缓冲区中的数据后发送数据包。

在Windows上,非阻塞“重叠”操作会记住您的缓冲区并在以后使用它--因此,如果您在Windows上执行非阻塞I/O操作,请注意这一点。(如果这样做,您就会知道,因为这与阻止I/O完全不同)

 类似资料:
  • 在我的客户端/服务器应用程序中,我的客户端wiil与服务器通信有两个功能:客户端要么向服务器请求数据,要么发送数据,以便服务器保存。我对这两种方法都使用一个套接字,要使用的方法由发送的第一个字节定义。如果第一个字节是“1”,它将请求数据。如果是“2”,它将发送数据(数据字节在“2”字节之后发送)。它非常适合发送数据。但是当我请求数据时,只要我不读取客户端中的套接字流,它就可以工作。这就像如果我在发

  • 问题内容: 调用一次后如何重新连接到套接字io ? 这是代码 如果我这样做,它会起作用。如果我这样做,它将断开连接。但是,如果我尝试使用重新连接,则连接不再起作用。我如何才能建立连接? 问题答案: 好吧,您可以在这里选择… 首次初始化套接字值时,应使用, 下次(调用一次断开连接后),您应使用再次连接。 所以你的应该是这样的

  • 可能还值得注意的是,我使用了的修改版本,专门为unix域填充。

  • 问题内容: 我试图理解SocketChannels和NIO。我知道如何使用常规套接字,以及如何制作一个简单的每客户端线程服务器(使用常规阻塞套接字)。 所以我的问题是: 什么是SocketChannel? 当使用SocketChannel而不是Socket时,我还能得到什么呢? 通道和缓冲区之间是什么关系? 什么是选择器? 文档中的第一句话是。那是什么意思? 我也阅读了本文档,但是不知何故…… 问

  • 问题内容: 我需要使用套接字从C ++客户端到Java服务器接收包含浮点数的数组或类。但是InputStreamReader没正确。任何原因。任何更简单的建议将不胜感激。谢谢。 Java服务器代码 我将那些浮点数存储在名为“值”的类中。但是我得到的价值是垃圾。我在发送前检查C ++代码中的值,它们看起来不错。不知道哪里出了问题。请帮忙…!! 问题答案: 我建议你试试

  • 首先我要感谢你花时间... 我在macbook中用C++创建了一个服务器套接字,在运行windows XP的不同机器中用Java创建了一个客户机/套接字。我已将端口指定为5000,但无法指定正确的主机,因此无法进行连接。当我在windows xp中使用WinSock2创建一个C++服务器/套接字时,当我使用本地主机时,连接是完美的...有什么想法吗??? 提前Thnx int main(int a