我的应用程序打开了一个绑定到INADDR_ANY的UDP套接字来监听我服务器上所有接口上的数据包。 我通过相同的套接字发送回复。 但是,在从服务器发送回复时,默认IP由Linux的IP层根据select哪个接口进行分组来select。 与此接口关联的IP可能不是该UDP服务器从客户端获取查询的目的地址。 因此,来自服务器的回复的来源IP与查询来自的目的地IP不同。 客户可能会对这样的回复感到不舒服。 以下链接给出了使用UDP的INADDR_ANY的行为: http : //www.cs.cmu.edu/~srini/15-441/F01.full/www/assignments/P2/htmlsim_split/node18.html 我怎样才能改变这个默认行为,并在源地址中使用特定的接口IP? 这是更多的控制应用程序代码来决定什么将是源地址。 同样有意义的是,回复中的源地址与查询出现的目的地址相同。
我试图在Linux环境下编写一个简单的Python脚本来testing以太网交换机,该交换机必须处理包含小型有效载荷(12字节)的高频率UDP消息。 基本的devise是我有一个笔记本电脑(瓦特/ Ubuntu的VirtualBox)运行一个Python脚本使用socket.recvfrom()连接到100Mbps交换机(NETGEAR FS105)。 这个交换机连接到一个桌面PC(另一个Ubuntu VirtualBox),发送包含两个字节的UDP数据包。 这些字节只是一个计数器,它允许我查看数据包传输后是否重新sorting或丢失。 传输代码如下所示: self.sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) # UDP period_s = 1 / 5000.0 # 5KHz while True: udp_count = chr ((i >> 8) & 0xFF) + chr( i & 0xFF ) start_time_s = time.time() self.sock.sendto(udp_count, (self.UDP_BROADCAST_IP, self.UDP_PORT)) remaining_idle_time_s = period_s – start_time_s time.sleep(remaining_idle_time_s) i += 1 每隔几秒会发生什么,remaining_idle_time_s返回为负数,因为self.sock.sendto()函数花费的时间超过了0.2ms。 使用cProfile,我可以看到,平均self.sock.sendto()调用需要0.14ms,但有时需要长达3ms! 使用getsockopt()我可以看到,套接字发送缓冲区是足够大(212992)。 […]
我inheritance了一大堆代码,与内部开发的设备进行交stream。 所述设备具有慷慨而特别的networking接口: 它始终将其IP地址设置为172.16.0.50,并假定它直接连接到172.16.0.250(通过物理电缆) 它将UDP心跳发送到.250:2000,无论是否绑定到该端口 它可以发送UDPstream量到.250:9001到.250:9016 它通过TCP在.50:7734处暴露一个基于文本的pipe理界面 它将UDP绑定为.50:7734,并接受该端口上的所有传入stream量作为时间戳,以便与自身进行同步 不幸的是,修改设备的代码是绝对不可能的。 来源是可用的,未装箱的硬件可用于testing,但部署的盒子是积极的密封的环境,并获得闪存芯片启动是一个为期一整天的过程。 我有兴趣将这些设备连接到同一台主机,但我的背景是在应用程序,networking和一些embedded式 – 不联网。 每个设备都有一个专用的networking接口(例如p1p1,p1p2等),我认为这应该救我,但是我不确定如何设置Fedora做必要的冒充,而且我不确定如何设置我的应用程序代码来区分接口p1p1 – IP 172.16.0.50 – 端口9000上的UDPstream量与来自接口p1p2 – IP 172.16.0.50 – 端口9000的UDPstream量之间的区别,或指定我想通过UDP在172.16广播给定的数据报.0.50:9000在接口p1p1 vs 172.16.0.50:9000在接口p1p2。 我相信我可以用静态路由条目和iptables规则的双向端口转发的足够聪明的组合来解决这个问题,但是我想在花费几天的时间之前就问一个根本上有缺陷的方法。 什么是最令人愉快的方法?
我试图在Linux内核中实现QUIC协议。 由于QUIC正在使用UDP,所以我一直使用UDP代码作为学习基础。 现在我想注册QUIC协议的协议处理程序,但我不明白如何以及在哪里做,因为我无法findUDP源文件中的相关代码片断。 我在互联网上search,但所有的例子谈论注册IPv4的处理程序,我没有find类似的实现在UDP(或TCP)。 有人可以指点我如何注册UDP协议处理程序? 这将有助于我与QUIC做同样的事情。
我有两个程序udp发件人和消费者在本地主机上。 发送方以最快的速度生成四个字节的int消息,但消费者并没有得到所有的消息。 消费者最后一行stdout是 1484444 1999999 Wireshark拦截所有包,并慢慢处理它们。 我怎样才能在C程序中获得相同的行为? // sender.c #include <sys/socket.h> #include <netinet/in.h> #include <strings.h> #include <arpa/inet.h> #include <unistd.h> #include <string.h> int main() { int sock = socket(AF_INET, SOCK_DGRAM, 0); struct sockaddr_in dest; bzero(&dest, sizeof(dest)); dest.sin_family = AF_INET; dest.sin_port = htons(40500); inet_aton("127.0.0.1", &dest.sin_addr); int i; for (i = 0; i < 2000000; ++i) { sendto(sock, […]
基于UDP是无连接协议的前提下,我推测主机是否启动是无关紧要的。 但是,现在我正在做testing,我发现,当我连接我的UDP客户端套接字, write该套接字返回错误,因为服务器已经发回ICMP端口无法访问错误.. “连接”UDP端口(根据Stevens Unixnetworking编程 )的目的是基本上从路由表caching条目,而不是为每个数据包创build一个新的,这应该有性能优势。 但是,这个ICMP数据包正在让我失去我的客户端套接字,这是非常烦人的。 任何人都可以阐明为什么这可能是? 有没有已知的解决方法? 我正在使用一个3p java库,没有考虑到这一点,只是断开连接,我可能不得不破解它重新连接,但在我之前,我有种希望有一些我可以做的(Linux)操作系统级别可能会阻止这种情况的发生…所有对套接字选项的调查等都变得毫无结果。 编辑 总之,这是不可能的,修复代码是唯一的方法来做到这一点。 唯一的可能性似乎是configurationiptables阻止ICMP响应,但这是一个大锤来破解这个特定的螺母。
我正在尝试使用sendto和recvfrom函数的udpclient程序。 我为我的套接字设置SO_RCVTIMEO值为10秒。 我将绑定到源ipaddress和源端口。 当我检查netstat时,我可以看到没有其他进程绑定了相同的值。 我的绑定操作也是成功的。 然后我正在做一个发送回应请求到目的地。 sendto之后,我正在做一个recvfrom。 但recvfrom失败的说,ERRNO 11这意味着再试一次 🙁 但是,如果我检查wireshark日志,我可以看到ECHO REQUEST和ECHO REPLY这是几毫秒内即将到来,但仍recvfrom是无法读取:(在wireshark我看到UDP ECHO REQUEST和UDP ECHO REPLY。 我没有任何防火墙在我的系统中启用。 有没有什么办法可以debugging这个问题:(我真的怀疑RECV操作是否有任何方法来找出包是否被发送到我的sockFD或不? UPDATE1:我的Linux PC通过交换机连接到另一台作为服务器的Linux PC。
我可以从我的Linux(C)应用程序中调用一个库的任何build议,使用Multicast UDP将简单的日志消息发送给正在networking上侦听的任何人?
我已经在Linux上编写了一个UDP C ++服务器应用程序,现在我正在加载testing,看看它可以处理多less个客户端。 我发现它在约150个同时发送数据包的速度达到每秒钟2-4个峰值。 之后添加的客户端将导致其他客户端的数据包被丢弃。 服务器本身没有压力,使用不到10%的CPU和内存。 networking一点也不强调,大约15K字节/秒。 数据包以大约200包/秒的速度到达服务器(使用一个UDP套接字进行读写)。 服务器线程自己仍然在这个负载级别上短时间hibernate。 问题 : 任何想法是什么瓶颈在这里? CPU,networking和服务器代码本身似乎都是不重视的。 操作系统是否无法处理这个UDP包? 硬件功耗非常低 – 1.5 MHz的单核Pentium等价物。 网卡是100M比特/秒。 我正在运行Ubuntu 11.1。 这篇文章可能是相关的: 在Windows Server 2008上UDP性能的上限 更新 :服务器build立一个UDP套接字,然后创build3个线程和2个队列。 第一个线程在套接字上读取,如下所示: while (1) { recvfrom(this->socket, readBuf, BUFSIZE, 0, (sockaddr *)&address, &addressLen); pushBack(this->inputQueue, message); } 第二个线程睡在inputQueue上。 当条件被发送并处理消息时它醒来。 它将处理的消息发送到outputQueue: while (1) { sleepOnQ(this->inputQueue); popFront(this->inputQueue); processMessage(); pushBack(this->outputQueue, message); } 第三个线程在outputQueue上hibernate并将消息从UDP套接字发送到目标。 请注意,这是用于阅读的相同的套接字。 […]
我已经写了下面的UDP客户端,它基本上产生了一个单独的线程接收数据块,但是数据块只在主线程中发送。 现在,按下ctrl ^ D post实例化(“./udpClient 1”)在Linux发行版上的UDP客户端,实现从循环(围绕getline()调用)并closures套接字描述符。 我所观察到的,尽pipe调用closures描述符,直到客户端进程终止,仍然看到相关的条目执行“netstat -an | grep udp”时才释放。 但是,如果我注释/删除了产生接收者线程的代码,那么套接字描述符会在调用close()后立即被释放。 似乎套接字引用计数正在增加一个单独的线程(基本上接收和阻塞上述套接字描述符),因此close()调用什么也不做。 这是需要的,因为我的理解是,套接字引用计数增加,如果套接字描述符跨进程共享,但不跨线程? 是否因为线程的Linux实现为LWP,如果是的话,这是所需的行为? #include <stdio.h> #include <stdlib.h> #include <strings.h> #include <sys/types.h> #include <sys/socket.h> #include <netinet/in.h> #include <errno.h> void *receiver (void *arg); int sockfd; int doConnect = 0; int main (int argc, char *argv[]) { pthread_t thrid; struct sockaddr_in servaddr; struct sockaddr_in clntaddr; char […]