Articles of networking

对“getaddrinfo_a”的未定义引用

在编译在Linux上使用getaddrinfo_a的最小程序时,出现连接器错误。 有问题的程序 #define _GNU_SOURCE #include <stdio.h> #include <netdb.h> int main(int argc, char **argv) { int err; err = getaddrinfo_a(0, NULL, 0, NULL); } 编译器输出: $ cc -lanl minimal.c /tmp/cc89BuFU.o: In function `main': minimal.c:(.text+0x24): undefined reference to `getaddrinfo_a' collect2: error: ld returned 1 exit status $ cc –version cc (Ubuntu 4.9.2-10ubuntu13) 4.9.2

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); […]

Linux Cnetworking通信程序在debugging器中工作,但不在外部

我有两个文件,server.c和client.c。 服务器侦听一个客户端请求,然后适当地回复(现在只有LIST和一个静态目录被实现)。 当服务器接收到LIST命令时,它会对指定目录(这是一个静态值)中的常规文件数量进行计数,然后向客户端发送数量,以便它一直监听,直到收到n个元素。 服务器然后开始发送文件名到侦听客户端。 这在理论上和debugging服务器时起作用,但是当我通过terminal正常运行这两个应用程序时不起作用。 在inputLIST命令后,客户端就会卡住,而服务器收到这个命令后,它不会继续发送数量和名称。 但是,当在CodeBlocks中以debugging模式运行服务器(尽pipe我猜IDE不重要)并逐行浏览代码时,一切都按预期工作。 这可能是某种竞争条件,但我无法自行解决。 client.c #include <sys/types.h> #include <sys/socket.h> #include <netinet/in.h> #include <arpa/inet.h> #include <unistd.h> #include <stdlib.h> #include <stdio.h> #include <string.h> #define BUF 1024 #define PORT 8543 int main (int argc, char **argv) { int create_socket; char buffer[BUF]; struct sockaddr_in address; int size; if ((create_socket = socket (AF_INET, SOCK_STREAM, 0)) == […]

为什么qemu使用私有虚拟桥创build专用networking失败? 我得到了“networking脚本/ etc / qemu-ifup失败,状态为256”“

我想在专用networking上创build一个虚拟机。 我正在关注这个网站http://www.linux-kvm.org/page/Networking来帮助configuration我的qemu。 我用下面的命令创build一个vm: sudo qemu-system-x86_64 -hda image.qcow2 -enable-kvm -netdev tap,id=tap1 -device rtl8139,netdev=tap1 我得到了: qemu-system-x86_64: -netdev tap,id=tap1: network script /etc/qemu-ifup failed with status 256 我正在使用拱门。 我创build一个桥: sudo ip link add br0 type bridge 默认情况下,我在/ etc / qemu-ifup中没有文件: 所以,我创build了自己的,就像这个网站http://www.linux-kvm.org/page/Networking推荐的一样: #!/bin/sh set -x switch=br0 if [ -n "$1" ];then ip tuntap add $1 mode tap user `whoami` ip […]

如何在Linux上正确地将networking接口设置为混杂模式

那么你如何正确地做到这一点? 我知道怎么做,通过创build套接字,然后使用ioctl设置IFF_PROMISC标志(如“ 如何检查C中的networking设备状态? ”等),但至less在理论上这看起来有缺陷。 1)通过ioctl读取标志2)更新标志3)其他人修改标志4)通过ioctl设置更新标志 有没有更好的方法,或者我只是担心太多? 后来我发现应该通过setsockopt(也没有竞争)添加接口到PACKET_MR_PROMISC,像这样: void set_promisc(const char *ifname, bool enable) { struct packet_mreq mreq = {0}; int sfd; int action; if ((sfd = socket(AF_PACKET, SOCK_RAW, htons(ETH_P_ALL))) == -1) { perror("unable to open socket"); return; } mreq.mr_ifindex = if_nametoindex(ifname); mreq.mr_type = PACKET_MR_PROMISC; if (mreq.mr_ifindex == 0) { perror("unable to get interface index"); return; […]

部分复制.flif文件

我有一个压缩的.flif图像。 我如何复制它的一部分,以便我能够通过低带宽连接来模拟部分接收的文件?

TCP保持活动参数不被遵守

我正在尝试使用TCP在我的Linux机器上保持活着状态,并且写下了以下小型服务器: #include <iostream> #include <cstring> #include <netinet/in.h> #include <arpa/inet.h> // inet_ntop #include <netinet/tcp.h> #include <netdb.h> // addrinfo stuff using namespace std; typedef int SOCKET; int main(int argc, char *argv []) { struct sockaddr_in sockaddr_IPv4; memset(&sockaddr_IPv4, 0, sizeof(struct sockaddr_in)); sockaddr_IPv4.sin_family = AF_INET; sockaddr_IPv4.sin_port = htons(58080); if (inet_pton(AF_INET, "10.6.186.24", &sockaddr_IPv4.sin_addr) != 1) return -1; SOCKET serverSock = […]

Linux UDP:UDP数据报在哪里丢失?

我有一个应用程序运行在发送者和接收者,与UDP协议。 UDP缓冲区大小约为70或1024字节,因此不会发生UDP碎片。 从ifconfig/sar级别,我没有看到重大的UDP损失。 但从应用层面来看,我看到~30%的损失。 我看到与iperf3 / ntttcp-for-Linux / netperf 。 损失发生在哪里? 这是由UDP造成的IP堆栈乱序吗? 我怎样才能确认这个假设? 谢谢!

UDP数据包转发从sendmsg获取EINVAL

我正在写我自己的DNS黑洞来阻止我的家庭networking上的广告和恶意软件。 我意识到这种types的程序已经存在了,但是我想学习这个过程并写下我自己的程序。 从Linux文档看来,可以告诉sendmsg()使用不同的返回地址,以便可以转发UDP数据包,并且接收服务器将响应发送给原始请求者而不是我的服务器。 从稀疏文档,我设置我的套接字绑定到端口53(DNS)。 我收到DNS请求,解释他们,并在网站被列入黑名单时作出回应。 对于“好”的域名,我得到了2个不同的结果。 在MacOS上,我的转发请求被发送,但响应返回到我的程序,而不是原来的请求者。 在Linux(Armbian 4.13内核)上,我从sendmsg()调用中获取EINVAL,并且不发送任何内容。 任何人都可以阐明我做错了什么? (为简洁起见,所有错误检查已被删除) 附加信息…在这种scheme中的一个皱纹是原始的DNS请求被绑定到53以外的套接字端口(显然)。 如何告诉sendmsg()将响应返回到原始请求的正确端口号? 我的“代理”版本的这个作品。 我存储了原始请求的事务ID和请求端口号,并能够成功返回响应 最新消息 – 我能够成功地完成我想要的,但不能使用sendmsg()。 通过使用RAW套接字和“欺骗”IP报头中的返回地址,我能够将数据包发送回不同的返回地址和端口号(使用sendto)。 nslookup认为这是一个问题,但浏览器可以。 我想我们可以称之为'closures' struct sockaddr_in addr, addrfrom, fwaddr; socklen_t addrLen = sizeof(struct sockaddr_in); int rc, listen_sock; listen_sock = socket(PF_INET, SOCK_DGRAM, IPPROTO_UDP); rc = 1; setsockopt(listen_sock, IPPROTO_IP, IP_PKTINFO, &rc, sizeof(rc)); memset(&addr, 0, sizeof(addr)); addr.sin_family = AF_INET; addr.sin_port = […]

守护进程支持Web服务的最佳方法

我对Web服务比较陌生,想知道什么是最好的方法。 基本上,事情的工作方式是我需要有一个不断运行的背景任务。 Web服务将连接到守护进程并返回相应的响应。 目前,这个通信是通过unix域套接字(Linux是预期的服务器平台)。 这是做到这一点的“正确”方式吗? 还是有一个更正确的方式来有一个后台任务,您的Web服务器是基于?