Articles of udp

UDP广播发送失败:在Linux 2.6.30上“networking不可达”

我使用udp broadcast.Code段编写一个程序如下: struct sockaddr_in broadcast_addr; socklen_t sock_len=sizeof(broadcast_addr); bzero(&broadcast_addr,sock_len); broadcast_addr.sin_family=AF_INET; broadcast_addr.sin_port=12345; broadcast_addr.sin_addr.s_addr=inet_addr("255.255.255.255"); int fd=socket(AF_INET,SOCK_DGRAM,0); int broadcast_enable=1; setsockopt(fd,SOL_SOCKET,SO_BROADCAST,&broadcast_enable,sizeof(broadcast_enable)); uint8_t send_buf[100]; int ret=sendto(fd,send_buf,sizeof(send_buf),0, (struct sockaddr*)&broadcast_addr,sock_len); if(ret==-1) perror("sendto failed"); 输出: sendto failed: Network is unreachable 但是当我运行“添加默认网关”命令,如“路由添加默认gw 10.10.10.111”,错误消失。当设置一个新的ipaddress到netdev,命令如上应该跑,否则错误来了。 为什么? 谢谢。

广播UDP数据包到255.255.255.255

第一次海报,希望这是一个容易的: 我需要将广播数据包发送到一个硬件,当它通电时,它与我的机器位于不同的子网上,以便告诉它把IP地址重置为我networking上的IP地址。 但是,除非我使用DHCP,否则我似乎无法通过自己的子网进行广播,而最终我无法做到这一点。 networking上没有路由器,只是简单地在我的机器和我正在试图交谈的盒子之间切换,另外还有一些networking上的其他Linux机器。 所以基本上这个例子代码在testing环境(在我有DHCP启用的一个更大的networking上)在Fedora 19上工作,直到我尝试静态设置我的IP地址: int main(int argc, char *argv[]) { int sock; if( (sock = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP)) == -1) { perror("socket : "); return -1; } int broadcast = 1; if( setsockopt(sock, SOL_SOCKET, SO_BROADCAST, &broadcast, sizeof(broadcast)) != 0 ) { perror("setsockopt : "); close(sock); return -1; } char *ip = "255.255.255.255"; char […]

UDP数据包被networking堆栈丢弃的原因是什么?

我看到UDP数据包到达我的Linux机器上(通过tcpdump),目标端口设置为25555.但是: nc -l -u 25555 没有显示交通。 我已经检查过了: iptables已closures 目的MAC地址与入接口匹配 目标IP地址与传入的接口匹配 IP校验和是可以的 UDP校验和是可以的 而且, 所有的数据包都被丢弃了,所以这并不是rx缓冲区溢出的问题。 任何想法还有什么可能会导致帕克丢弃?

在Linux上使用python接收多播UDP数据报

我有一个硬件设备,在我的networking上发送多播数据。 我已经写了一个接收数据并打印它的Python脚本。 但是,我发现它只能在我的Windows XP电脑上运行,并且在我的Ubuntu Linux 10.04电脑上无法运行。 在Linux下,没有收到任何东西。 它只是围绕while循环,并没有收到任何数据。 我的代码张贴在下面。 你能看到任何理由,为什么这不会在Linux下工作? 谢谢,Rab。 # Multicast client # Adapted from: http://chaos.weblogs.us/archives/164 # on 05/03/2013 import socket ANY = "0.0.0.0" MCAST_ADDR = "224.0.33.154" MCAST_PORT = 31800 # Create a UDP socket sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM, socket.IPPROTO_UDP) # Allow multiple sockets to use the same PORT number sock.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,1) # Bind […]

UDP服务器给分段错误

我用UDP写了下面的echo服务器,但是我不知道为什么在sendto函数中给我分段错误,它收到很好,但是发送数据返回给客户端有问题。 我一直试图find几个小时的问题,但没有得到任何地方。 请有人指出错误,或者我可能做错了什么。 谢谢 #include <unistd.h> #include <sys/types.h> #include <sys/socket.h> #include <netinet/in.h> #include <arpa/inet.h> #include <stdio.h> #include <string.h> #include <stdlib.h> #define true 1 #define false 0 int main(int argc,char **args){ int BUF_LENGTH=101; int port_no=1800; struct sockaddr_in serv_addr,rmt_addr; //rmt_addr=malloc(sizeof(struct sockaddr_in)); char *buffer=malloc(BUF_LENGTH); int byte_recv=0; int rmt_length=0; int sock_id; sock_id=socket(AF_INET,SOCK_DGRAM,0); if(sock_id<0){ printf("Error creating socket : %d",sock_id); return […]

在多个线程中从相同的UDP套接字发送

我有多个线程需要发送UDP数据包到不同的IP地址(只发送,什么都不需要接收)。 我可以在所有线程中重复使用相同的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支持的库实现? 谢谢。