Articles of udp

使用多个NIC广播UDP数据包

我正在为Linux中的相机控制器构build一个embedded式系统(不是实时的)。 我有一个问题,让networking做我想做的事情。 该系统有3个网卡,1个100base-T和2个千兆端口。 我将较慢的摄像机连接到摄像机(这是所有支持的),而较快的则是与其他机器的点对点连接。 我试图做的是从相机获取图像,做一些处理,然后使用UDP将其广播到其他每个NIC。 这是我的networkingconfiguration: eth0:addr:192.168.1.200 Bcast 192.168.1.255掩码:255.255.255.0(这是100base -t) eth1:addr:192.168.2.100 Bcast 192.168.2.255掩码:255.255.255.0 eth2:addr:192.168.3.100 Bcast 192.168.3.255 Mask:255.255.255.0 该图像是在专有协议eth0中来的,所以它是一个原始的套接字。 我可以把它播放到eth1或eth2就好了。 但是,当我尝试将它广播到两个,一个接一个,我得到了很多networking打嗝和eth0错误。 我初始化这样的UDP套接字: sock2=socket(AF_INET,SOCK_DGRAM,IPPROTO_UDP); // Or sock3 sa.sin_family=AF_INET; sa.sin_port=htons(8000); inet_aton("192.168.2.255",&sa.sin_addr); // Or 192.168.3.255 setsockopt(sock2, SOL_SOCKET, SO_BROADCAST, &broadcast, sizeof(broadcast)); bind(sock2,(sockaddr*)&sa,sizeof(sa)); sendto(sock2,&data,sizeof(data),0,(sockaddr*)&sa,sizeof(sa)); // sizeof(data)<1100 bytes 我分别为每个套接字执行此操作,并分别调用sendto。 当我做一个或另一个时,没关系。 当我尝试同时发送时,eth0开始收到错误的数据包。 任何想法,为什么发生这种情况? 这是一个configuration错误,有没有更好的方法来做到这一点? 编辑:感谢所有的帮助,我一直在尝试一些东西,并进一步调查。 严格来说,这个问题似乎并不是广播。 我用单播命令replace广播代码,它具有相同的行为。 我想我更好地理解行为,但不是如何解决这个问题。 这是发生了什么事。 在eth0上,我应该每50ms获得一张图片。 当我在eth1(或2)上发送图像时,发送图像大约需要1.5ms。 当我同时发送eth1和eth2时,大约需要45ms,偶尔跳到90ms。 当这超出了50ms窗口,eth0的缓冲区开始build立。 […]

在不使用环回networking的情况下将数据包转发到同一台主机上

我有这个libnetfilter_queue应用程序接收来自内核的一些iptables规则的数据包。 在直接回答我的问题之前,我给了一个示例代码和其他工具来设置一个testing环境,以便我们的问题定义和可能的解决scheme可以更加准确和强大。 以下代码描述了应用程序的核心function: #include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <netinet/in.h> #include <linux/types.h> #include <linux/netfilter.h> /* for NF_ACCEPT */ #include <errno.h> #include <libnetfilter_queue/libnetfilter_queue.h> #define PREROUTING 0 #define POSTROUTING 4 #define OUTPUT 3 /* returns packet id */ static u_int32_t print_pkt (struct nfq_data *tb) { int id = 0; struct nfqnl_msg_packet_hdr *ph; struct nfqnl_msg_packet_hw *hwph; u_int32_t […]

在unix上加强UDP套接字问题 – bind:已经在使用的地址

首先,我知道在同一主题上还有其他几个主题,但是我无法find那些能够帮助我的东西,所以我会试着对我的情况非常具体。 我已经build立了一个简单的UDP客户端/ UDP服务器对,负责在几个并行模拟之间发送数据。 也就是说,模拟器的每个实例都在一个单独的线程中运行,并在UDP套接字上发送数据。 在主线程中,服务器正在运行,并在模拟之间路由消息。 (对于这个问题)服务器代码的重要部分如下所示: UDPServer::UDPServer(boost::asio::io_service &m_io_service) : m_socket(m_io_service, udp::endpoint(udp::v4(), PORT_NUMBER)), m_endpoint(boost::asio::ip::address::from_string("127.0.0.1"), PORT_NUMBER) { this->start_receive(); }; void UDPServer::start_receive() { // Set SO_REUSABLE to true boost::asio::socket_base::reuse_address option(true); this->m_socket.set_option(option); // Specify what happens when a message is received (it should call the handle_receive function) this->m_socket.async_receive_from( boost::asio::buffer(this->recv_buffer), this->m_endpoint, boost::bind(&UDPServer::handle_receive, this, boost::asio::placeholders::error, boost::asio::placeholders::bytes_transferred)); }; 这在我的Windows工作站上正常工作。 事情是; 我希望能够在linux集群上运行它,这就是为什么我编译它并试图在集群节点上运行它的原因。 代码编译没有一丝困难,但是当我尝试运行它时,我得到的错误 […]

保护UDP – OpenSSL或GnuTls或…?

我需要保护我的UDPstream量。 据我所知,DTLS协议是最好的方法。 还有一个IPsec – 但它看起来不适合我,因为它不易使用,并有可能的硬件问题。 我发现有一些库已经实现了DTLS。 所以现在我试图select – OpenSSL或GnuTls? 你能告诉我什么是更好的使用? 有什么缺点或优点? 或者可能有另一个DTLS支持的库实现? 谢谢。

为什么我们可以将sockaddr投射到sockaddr_in

我明白了为什么将sockaddr投射到sockaddr_in是有用的,但是我不明白这是如何实现的。 从我读过的,他们是相同的大小和sockaddr_in添加sin_zero使其相同的大小。 我想知道如果编译器知道从sockaddr_in获取信息的方式是否与sockaddr_in不同,

我如何接受Perl中的多个TCP连接?

我有一个用于Linux的Perl脚本的问题。 主要目的是成为三个应用程序之间的中间人。 它应该做什么: 它应该能够等待$udp_port上的UDP文本(不含空格) 当它收到这个UDP文本时,它应该把它转发给连接的TCP客户端 问题是我的应用程序目前工作,直到我第一次与TCP客户端断开连接。 然后我无法连接到它,并且它在$udp_port上接收到下一个UDP数据包后超时。 所以基本上每当我想重新连接TCP时,我必须重新启动应用程序。 所有这些应该尽可能快(每毫秒计数)。 发送到UDP或TCP的文本不包含空格。 没有必要一次支持多个TCP客户端,但肯定会有好处:-) 这是我现在的代码: #!/usr/bin/perl use strict; use warnings; use IO::Socket; use Net::hostent; use threads; use threads::shared; my $tcp_port = "10008"; # connection from TCP Client my $udp_port = "2099"; # connection from Announcer my $udp_password = ""; # password from Announcer my $title = "Middle Man […]

如何获取redirectUDP消息的原始目的端口?

使用这个东西,我可以获得socket(PF_INET, SOCK_DGRAM, 0)套接字的原始目标IP地址。 如何获得原始目标端口?

Linux UDP接收缓冲区的最大大小

Linux UDP接收缓冲区的最大大小是多less? 我认为这只受可用内存的限制,但是当我设置时 5GB的rmem_max: echo 5000000000 > /proc/sys/net/core/rmem_max 和4GB的实际套接字缓冲区(在Erlang): gen_udp:listen(Port, [{recbuf, 4000000000}]) 当我测量缓冲区利用率时,它显示: # netstat -u6anp | grep 5050 udp6 1409995136 0 :::5050 :::* 13483/beam.smp 我不能超过这个1.4GB。 对于较小的缓冲区大小,例如500MB,实际的缓冲区大小与configuration的值相匹配。 我的系统是Debian 6.0,机器有50GB RAM可用。

我怎样才能做一个UDP协议的拥塞控制?

我有一个自定义UDP协议与多个发送器/接收器devise为尽快发送大文件。 这是基于客户端/服务器。 如何检测局域网上的拥塞情况,以减慢发送的UDP数据包的速率? 编辑:请不要评论使用UDP是否合适。 该协议使用UDP,但在到达时将数据包重新组装成整个文件。 重申一下这个问题:拥塞控制algorithm如何工作以及如何检测拥塞?

SO_REUSEPORT在Linux上

我想知道是否在LINUX 2.6中启用了SO_REUSEPORT选项? 如果我尝试使用它并编译我的代码,我得到以下错误 01.c:72: error: `SO_REUSEPORT' undeclared (first use in this function) 01.c:72: error: (Each undeclared identifier is reported only once 01.c:72: error: for each function it appears in.) 使用上面的选项,我想我可以绑定两个不同的套接字到相同的IPADRESS和端口号