我可以使用 select 以接口(interface)可以处理的速度在多个接口(interface)上发送数据吗

标签 c network-programming select-syscall

我是一名经验丰富的网络程序员,我面临着需要一些建议的情况。

我需要在几个传出接口(interface)上分发一些数据(通过不同的 tcp 套接字连接,每个对应于每个接口(interface))。然而,重要的是,我应该能够在接口(interface)上发送更多/大部分数据,具有更好的带宽,即发送速度更快的接口(interface)。

我的意见是为此目的使用 select api(unix 和 windows)。我过去使用过 select、poll 甚至 epoll。但它总是用于在数据可用时从多个套接字读取。

这里我打算在几个接口(interface)上按顺序写入连续的数据包,然后监视每个接口(interface)的写入描述符(选择参数),然后哪个可用(意味着它能够先发送数据包),我会继续发送更多数据包通过该描述符。

我能在这里实现我的意图吗?即,如果我有一个 10Mbps 链路接口(interface)与另一个 1Mbps 链路接口(interface),我希望能够通过更快的接口(interface)获取大部分数据包。

更新 1: 我想知道在这种情况下 select 的行为是什么,即当您在读取描述符上调用 select 时,返回数据可用的那个。但是,在我的场景中,当我们在描述符上写入并等待 select 返回首先完成写入的那个时,select 是否确保仅在写入整个数据包时返回,即说我尝试一次写入 1200 个字节。它只会在整个 1200 都返回或存在永久错误时返回吗?我不确定 select 的行为如何,并且找不到任何描述该行为的文档。

最佳答案

我会改编 producer/consumer pattern .在这种情况下,一个生产者和几个消费者。

让主线程处理您的源(作为生产者)并为每个连接生成一个线程(作为消费者)。

并行的线程分别拉取一大块源并将其一个接一个地发送到连接上。

持有最快连接的线程应该在此设置中发送最多的 block 。

关于我可以使用 select 以接口(interface)可以处理的速度在多个接口(interface)上发送数据吗,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17081097/

相关文章:

c - PDCurses 循环后卡在输入上

使用protobuf序列化消息与zeromq进行通信

使用c正确获取使用malloc创建的整数数组的大小

c++ - FlowMonitor 不显示统计数据,但 PyViz 和跟踪文件显示它

linux - 在 Linux 上 : how can I programmatically determine if a NIC interface is enabled and plugged in?

java - 为什么即使在非阻塞套接字上,SocketChannel 写入也总是完整完成?

c - 为什么在 Linux 中使用 select

c++ - 如果我们添加安全的有符号/无符号比较 C/C++,它会破坏语言或现有代码吗?