Articles of 编程

在Linux上获取组播源IP地址

我使用struct sockaddr_in来接收从另一台机器发出的组播数据。 当我使用inet_ntop打印出源地址时,它给了我发送数据的PC的源地址。 我想知道是否有办法获得数据被发送到的多播地址?

如何为subprocessselect一个自由端口?

我正在编写一个围绕Appium服务器的Python包装器。 Appium接受本地端口绑定的命令行参数。 不幸的是,Appium不能自动为自己select一个自由端口,所以它要么绑定到明确指定的端口,要么与EADDRINUSE失败。 即使告诉它绑定到端口0 ,它将成功启动,但不会显示它绑定到什么端口。 如果我自己在Python包装器中find一个自由端口,则不能保证其他进程不会绑定到同一端口,同时我将它传递给Appium。 如果我不自己释放它,Appium将无法绑定它,所以我必须。 我知道在实践中这种情况不太可能发生,但是在将本地端口号以跨平台的方式(Linux,macOS,Windows)传递给另一个进程之前,“保留”本地端口号的“正确方法”是什么?

1个带有两块网卡的Linux PC不能为testing系统产生networkingstream量

这些问题涉及到networking的基础知识,但是我还没有find答案! 问题1:一个100Mbps的交换机可以处理两个100Mbps同时运行的TCPstream吗? 为了说明这一点,如果你有4台PC的1台交换机(100Mbps没有其他连接),你有两个独立的stream,他们会达到什么样的速度? 一个数据stream会影响其他速度,还是内部处理很多数据stream的速度足够快? 问题2:我在专用networking交换机上安装了1台PC(Linux),PC上有2个networking接口卡(NIC)。 这两个网卡有不同的IP地址“,并正常工作。 如果我从一个NIC发送任何数据到另一个networking交换机绝对没有stream量发送。 它认为内核是智能的并且不需要在networking上发送任何东西,因为IP在同一台PC上。 如何closures此function? 由于我无法访问4台PC,因此我无法在现实世界中testing问题1。 这些都是非常简单的问题,但同时也很难回答。 谢谢!

如何获取以太网设备列表

我想要获得使用C程序的系统上的以太网设备列表。 在我的系统下面,我想获得eth0-9的列表,如果可能的话还有一些相关的属性(例如MAC地址,支持的最大速度)。 # ip link show | grep " eth" 3: eth0: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN mode DEFAULT qlen 1000 4: eth1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP mode DEFAULT qlen 1000 5: eth2: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN mode DEFAULT qlen 1000 6: eth3: <BROADCAST,MULTICAST> mtu 1500 qdisc […]

c sendto函数在linux2.6.29中设置“network is unreachable”errno

我有一个类似的问题,在sendto函数设置“networking不可达”errno和( 不太像 ) UDP广播发送失败:“networking是无法访问”在Linux 2.6.30但因为这个问题没有回答,是相当古老我试过重申他们在这里更多的澄清,希望得到答案。 我有一个UDP服务器和客户端,客户端广播活动消息和服务器捕获它们(代码如下)。 当我在ubuntu14.04,16.04,fedora6等几个不同的桌面Linux上运行这些工作,他们工作的很好。 但是,当我尝试从一个ltib制造的embedded式linux上运行mpc8308板,服务器工作(接收来自其他机器的消息),但客户端设置errno“networking无法访问”,因为它调用sendto。 我尝试了wireshark,并没有从客户端的接口上的数据包,我用板上的tcpdumptesting了系统,没有生成的数据包在那里。 这里是客户端的代码: int clientSocket, portNum, nBytes; char buffer[1024]; struct sockaddr_in serverAddr; socklen_t addr_size; /*Create UDP socket*/ clientSocket = socket(AF_INET, SOCK_DGRAM, 0); int broadcastEnable=1; int retsockopts=setsockopt(clientSocket, SOL_SOCKET, SO_BROADCAST, &broadcastEnable, sizeof(broadcastEnable)); /*Configure settings in address struct*/ serverAddr.sin_family = AF_INET; serverAddr.sin_port = htons(12021); serverAddr.sin_addr.s_addr = htonl(INADDR_BROADCAST); memset(serverAddr.sin_zero, '\0', sizeof serverAddr.sin_zero); […]

点击接口和/ dev / net / tun设备,使用ip tuntap命令

我正在使用ip tuntap创build一个tap接口,如下所示: $ sudo ip tuntap add mode tap tap0 之后,我将接口设置为通用IP命令。 我可以看到我的界面和一个简单的ifconfig 。 现在,老师告诉我,通过创build一个tap接口(在这种情况下命名为tap0),我会find一个/dev/net/tap0节点,并且可以写入或读取它。 但是,我找不到它。 我“只是”有一个/dev/net/tun 。 我必须处理这个tun节点,还是我应该有一个tap0节点?

为什么当O_NONBLOCK被设置时这个读取被阻塞?

Strace摘录(请忽略发送xml到ssh): dup(12) = 13 getsockname(13, {sa_family=AF_INET, sin_port=htons(46811), sin_addr=inet_addr("127.0.0.1")}, [16]) = 0 getsockopt(13, SOL_SOCKET, SO_TYPE, [1], [4]) = 0 fstat(13, {st_mode=S_IFSOCK|0777, st_size=0, …}) = 0 getsockname(13, {sa_family=AF_INET, sin_port=htons(46811), sin_addr=inet_addr("127.0.0.1")}, [16]) = 0 getsockopt(13, SOL_SOCKET, SO_TYPE, [1], [4]) = 0 fcntl(13, F_SETFD, FD_CLOEXEC) = 0 fcntl(13, F_GETFL) = 0x802 (flags O_RDWR|O_NONBLOCK) fcntl(13, F_SETFL, O_RDWR|O_NONBLOCK) = 0 setsockopt(13, […]

Linux中的环回适配器名称

假设Linux系统上的环回networking适配器总是被称为“lo”是否安全 – 这只是一个命名约定,可能不被遵守,或者它一直是这种情况?

构build出口设备linux内核的sk_buff

长话短说,我试图build立一个非常裸露的骨头UDP SKB只是为了把东西放到电线上。 情况如下: 我有一个内核模块加载(除其他外)覆盖/net/ipv4/udp.c中的标准udp_sendmsg函数的内存位置。 从这里我想build立一个skb到我可以简单地把它放在电线上的点。 通常情况下,udp_sendmsg只是简单地做一些UDP簿记工作,绑定在一个UDP头上,并发送到IP层进行路由select,L3 / L2头等等。基本上我将一些function引入sendmsg函数。 在这个时候,我只是分配一个skb: skb = alloc_skb(1500, GFP_KERNEL); //skb has 1500 bytes of tail room only skb_reserve(skb, 500); //now has head and tail but no data space data = skb_put(skb, 500); //now we have an skb with 500 head, 500 data sec, 500 tail 然后(后一些路由表seteup)我想添加一个udp_hdr: struct udphdr *uh; skb->transport_header = […]

无线接口的RSSI(信号强度)编号在linux与hostapd编号?

所以,我们有一个小型的embedded式Linux系统作为无线(WiFi)路由器,作为我们公司的一个大型机器人项目的一部分。 它并不重要,但它有一个configuration为5.8 GHz无线A卡(以防止干扰其他事情)和另一个900MHz的特殊卡给我们一个3公里的范围。 我们的控制平板电脑连接到5.8,并且数据包被中继到900MHz的机器人。 因此,平板电脑和机器人都使用路由器盒作为接入点,所以我们正在运行hostapd。 作为用户界面的一部分,我们希望收集来自系统不同组件的RSSI(信号强度/噪声/等)信息,并将其全部显示出来。 机器人(也运行linux)通过读取/ proc / net / wireless来完成,然后将读取的数字发送到控制平板电脑。 但是,在路由器盒上,如果卡configuration为AP模式(hostapd running),则/ proc / net / wireless对于这两个接口都有线路,但所有值均为0。 如果我做一个站点转储它吐出一些RSSI号码,但我不想诉诸于这个输出。 我是(IMHO)一个相当有竞争力的C程序员(我写了一个实时内核),我想知道从内核获取这个信息的最好方法是什么。 我知道一点关于使用WEXT ioctl接口,但是我最近发现API被弃用,并且新的无线configuration/pipe理系统正在被分阶段地使用。 我可以逃避写一些使用WEXT的东西,因为我们不能让我们的embedded式Linux安装更新到最前沿。 但是,如果有人可以指向我的教程/资源,无论新的API将是,我会很感激。 或者,如果有一种方法可以让/ proc / net / wireless很好地与hostapd配合使用,我也会采用:P