Articles of networking

listen()队列长度在套接字编程在c?

我在Linux中写了两对代码( server.c和client.c )。 一个用于UNIX域AF_UNIX另一个用于INTERNET域AF_INET 。 两者都工作正常! listen()在both servers被称为积压队列长度= 3 listen(sockfd, 3); 在UNIX域(AF_UNIX):当一个客户端连接到服务器,如果我尝试连接更多的客户端到服务器。 三个排队,第四个请求被拒绝。 (正如我所希望的 – 3在等待队列中)。 在INTERNET域(AF_INET):三个以上的请求被保存在待处理的队列中。 即使积压队列长度为三,为什么不是第四个客户端的请求被拒绝? 为什么listen() (和其他)协议的行为依赖于?

在IRQ合并之前,NAPI有哪些优势?

众所周知,有两种方法可以避免在高负载networking中出现硬件中断的一些开销,当硬件中断太多时,切换到它们需要很多时间。 程序风格的performance和select方法是非常重要的。 NAPI(新API) – 不使用硬件中断 ,每隔一段时间轮询以太网设备。 Linux内核默认使用中断驱动模式,当进入的数据包stream量超过一定的阈值时,只能切换到轮询模式。 http://en.wikipedia.org/wiki/New_API内核可以定期检查传入networking数据包的到达而不中断 ,从而消除了中断处理的开销。 中断合并 – 使用硬件中断 ,但是如果发生中断,则禁止中断并在一段时间内开始轮询 ,之后轮询终止并且中断被激活。 https://en.wikipedia.org/wiki/Interrupt_coalescing一种技术,其中通常会触发硬件中断的事件被阻止 , 直到一定数量的工作挂起,或超时计时器触发。 两种方法都没有明显的中断成本 – 这对于默认的中断驱动模式是有利的。 但是第二种方法 – 中断合并更合理,因为它: 延迟较less – 一旦包到达,立即尝试立即处理中断,或在最近发生中断时轮询。 对面的NAPI将不会立即处理该帧,而是会等待下一轮的一定时间。 较less的CPU使用率 – 仅在至less有一个数据包已经到达的情况下才开始轮询。 但是,即使帧没有收到,也不是徒劳地进行民意调查,就像做了NAPI一样。 在IRQ合并之前,NAPI有哪些优势?

在回送设备上进行多播

我希望发送UDP组播数据包到环回地址,并在其他应用程序中接收。 所有的testing在Fedora Core 17 Linux上完成。 我们的想法是通过RTSP / HTTP或任何其他networking协议接收videostream,并在回送地址上多播它,以便我可以使用VLC使用多播地址播放stream。 撇开其他比特率和受控组播的问题,我试图读取一个video文件和组播环回设备上。 但是当试图在vlc上播放时,它没有奏效。 我能看到数据包在wireshark中传输,但src ip是从我的默认networking接口(即接口,这是我的默认网关) 我已经尝试过下面的命令 sudo ifconfig lo多播sudo ip route添加239.252.10.10 dev lo 在这方面的任何build议将是非常有帮助的。 testing程序代码粘贴在下面 #include <sys/types.h> #include <sys/socket.h> #include <arpa/inet.h> #include <netinet/in.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <unistd.h> #define MULTICAST_ADDRESS "239.252.10.10" #define UDP_PORT 1234 #define INTERFACE_IP "127.0.0.1" #define MTU 1474 #define DATA_BUFFER_SIZE (1024*1024) static int […]

如何通过代理连接到HTTP服务器的套接字?

最近我用C语言编写了一个程序,用来连接到本地运行的HTTP服务器,从而做出请求。 这对我来说很好。 之后,我尝试了相同的代码连接到networking上的另一台服务器(例如www.google.com),但我无法连接,并从我的networking中的代理服务器获得另一个html响应。 我的本地IP是:10.0.2.58 代理IP是:10.0.0.1 这是我得到的回应: HTTP/1.1 302 Found Expires: Fri, 10 Feb 2012 12:47:35 GMT Expires: 0 Cache-Control: max-age=180000 Cache-Control: no-store, no-cache, must-revalidate Cache-Control: post-check=0, pre-check=0 Pragma: no-cache Connection: close Location: http://10.0.0.1:8000/index.php?redirurl=http%3A%2F%2F10.0.2.58%2F Content-type: text/html Content-Length: 0 Date: Wed, 08 Feb 2012 10:47:35 GMT Server: lighttpd/1.4.29 我怎样才能绕过这个代理连接到外部服务器? 用CONNECT尝试时得到响应 HTTP/1.1 302 Found Expires: Fri, 10 Feb […]

我如何在C中find一个端口可以自由使用?

操作系统是Linux。 我有一个服务器进程,可以实时更改其端口。 但是,我想提前知道如果一个端口是绑定之前是免费的。 scheme:服务器绑定localhost:5000,并接收绑定在localhost:6000的请求。 服务器必须检查端口是否空闲。 这个问题寻求的答案,提供了一个例程,检查一个端口是否免费。 为了logging,我编辑我的问题与代码片断,检查端口是否可以使用。 这并不意味着它会被使用。 下面的代码回答“如果端口现在可用”的问题,它不使用它。 打开一个套接字,检查绑定是否返回EADDRINUSE并closures套接字。 #include <iostream> #include <sys/socket.h> #include <stdlib.h> #include <string.h> #include <unistd.h> #include <arpa/inet.h> #include <errno.h> int main(int argc, char **argv) { struct sockaddr_in serv_addr; if( argc < 2 ) return 0; int port = atoi(argv[1]); int sockfd = socket(AF_INET, SOCK_STREAM, 0); if( sockfd < 0 ) […]

在Linux上获取有关networking接口更改的通知

我需要一种方式来通知我的用户空间的应用程序时,networking接口启用或禁用。 我希望这样做,而不诉诸于投票。 当networking相关的事件发生时,内核是否提供某种钩子来触发callback函数?

我怎样才能诊断我们的Java IP多点传送应用程序?

出于某种原因,我运行的每个组播例子(计算机运行OpenSUSE Linux)都可以工作。 客户都静静地坐着。 如何找出为什么组播被阻止/忽略? 一些例子: 例1 http://www.roseindia.net/java/example/java/net/udp/UDPMulticastServer.java 例2 http://docs.oracle.com/javase/tutorial/networking/datagrams/broadcasting.html (使用这些文件:) http://docs.oracle.com/javase/tutorial/networking/datagrams/examples/MulticastServer.java http://docs.oracle.com/javase/tutorial/networking/datagrams/examples/MulticastServerThread.java http://docs.oracle.com/javase/tutorial/networking/datagrams/examples/MulticastClient.java http:// docs.oracle.com/javase/tutorial/networking/datagrams/examples/one-liners.txt

如何为每个进程路由使用Linuxnetworking命名空间?

我想通过浏览器抓取网页,并存储每个URL的networkingstream量(不仅HTTP,而且udp,rtmp等)我遇到这种解决scheme,使用Linuxnetworking名称空间为每个进程路由。 以下是我遵循的步骤,但无法浏览网页。 ip netns add test 创build一对虚拟networking接口(veth-a和veth-b): ip link add veth-a type veth peer name veth-b 改变veth-a接口的活动命名空间: ip link set veth-a netns test configuration虚拟接口的IP地址 ip netns exec test ifconfig veth-a up 192.168.163.1 netmask 255.255.255.0 ifconfig veth-b up 192.168.163.254 netmask 255.255.255.0 在testing命名空间中configuration路由: ip netns exec test route add default gw 192.168.163.254 dev veth-a sudo bash -c […]

了解Tcpdumpfilter和位掩码

我想通过使用tcpdump嗅探http头。 这个filter工作正常,但我不明白 – (((ip[2:2] – ((ip[0]&0xf)<<2)) – ((tcp[12]&0xf0)>>2)) != 0) 我GOOGLE了,但我找不到任何有用的信息 这是整个tcpdump命令 sudo tcpdump -A 'dst [dest host] or src [src host] and tcp and (((ip[2:2] – ((ip[0]&0xf)<<2)) – ((tcp[12]&0xf0)>>2)) != 0)' -i eth0

如何计算TCP校验和

我正在写一个内核模块,它使用Netfilter钩子来修改一些TCP头信息,显然,在发送之前,我想重新计算校验和。 我也在接收端编辑标题,所以我也需要重新计算。 在网上search,我发现有些人说我可以简单地把它设置为0,它会为我计算,显然这是行不通的。 我也find了这个function tcp_v4_send_check(struct sock *sk, struct sk_buff *skb); 虽然没有人解释这是如何使用的,以及我是否可以在接收/发送方式中实际使用它。 我自己的尝试是将校验和设置为0,然后调用这个函数传递我有的skb和我有的skb-> sk,仍然没有。 那么请问,什么是直接计算TCP数据报校验和的方法?