Articles of networking

如何在Haskell中指定本地绑定接口来组播套接字?

我已经尝试了Network.Multicast包,但它确实工作,但是,我找不到指定本地绑定接口(“bond0”或“bond1”等)到组播套接字的方法。 我知道在CI需要使用ioctl将债券转换为结构sockaddr_in,然后将此结构提供给IPPROTO_IP系列的setsockopt IP_MULTICAST_IF选项,但我不知道如何在Haskell中做到这一点。 有人能帮忙吗? 谢谢!

发送固定长度的TCP帧

我需要使用TCP在固定的非标准MTU(例如1560)的子网上发送一些数据。 如果帧的长度小于MTU,则通过该子网传输的所有以太网帧都应手动填充0。 所以,数据大小应该是(1560 – sizeof(IP头) – sizeof(TCP头))。 这是我要这样做的方式: 我设置了TCP_CORK选项来减less数据的分段。 这是不可靠的,因为有200毫秒的天花板,但它的工作原理。 我知道IP头的大小(20字节),所以数据长度应该等于(1540 – sizeof(TCP头))。 那就是问题所在。 我不知道TCP头的大小。 它的“选项”字段的大小是浮动的。 所以,问题是:如何获得TCP头的大小? 或者也许有一些方法发送TCP帧与固定长度的头?

如何在linux内核中添加一个新的自定义第4层协议(一个新的原始套接字)?

我想在linux(ubuntu 14.04)中添加自己定制的第4层协议–IPPROTO_MYPROTO作为可加载的内核模块。 我已经完成了所有必要的步骤来注册协议。 在这里,我分享我的代码。 当我试图从sendmsg()发送用户空间程序的消息时,我期望通过struct proto结构注册的相应的fn myproto_sendmsg()应该在内核空间中调用。 但是我正在观察的是,虽然内核空间中的myproto_sendmsg()没有被调用,但是目标机器正在接收正确的数据。 惊喜! 惊喜! 。 是默认的udp sendmsg()fn在这里踢,就像是不速之客做他的工作。 在这里,用户空间中的sendmsg()调用返回与发送一样多的字节。 因此,FN返回成功。 用户空间程序: void forwardUDP( int destination_node ,char sendString[] ) { struct msghdr msg; destination_node = destination_node % N; //destination node to which data is to be forwaded int sock, rc; struct sockaddr_in server_addr; struct iovec iov; struct hostent *host; //hostent predefined […]

可以在Unix域套接字上使用SO_REUSEPORT吗?

Linux内核> = 3.9允许在内核负载平衡的进程之间通过设置SO_REUSEPORT共享套接字: http : //lwn.net/Articles/542629/ 这怎么可以用于AF_UNIXtypes的套接字? 看来,它只适用于TCP,而不是Unix域套接字。 这是一个Pythontesting程序: import os import socket if not hasattr(socket, 'SO_REUSEPORT'): socket.SO_REUSEPORT = 15 if True: # using TCP sockets # works. test with: "echo data | nc localhost 8888" s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEPORT, 1) s.bind(('', 8888)) else: # using Unix domain sockets # does NOT work. […]

无法使用Linux上的NetworkInterface.getNetworkInterfaces获取所有networking接口

我需要打印我的机器的所有mac地址。 推荐的方法是使用NetworkInterface.getNetworkInterfaces()并遍历返回的枚举。 但是,当一些设备closures(没有IPconfiguration),那么上述方法将不会返回接口。 运行“ip addr”将返回以下内容 lo:mtu 16436 qdisc noqueue link / loopback 00:00:00:00:00 brd 00:00:00:00:00 inet 127.0.0.1/8 scope host lo inet6 :: 1/128 scope host valid_lft永远forever_lft永远 G2:mtu 1500 qdisc pfifo_fast qlen 1000 link / ether 00:03:b2:75:99:c2 brd ff:ff:ff:ff:ff:ff G1:mtu 1500 qdisc pfifo_fast qlen 1000 link / ether 00:03:b2:75:99:c3 brd ff:ff:ff:ff:ff:ff inet 10.205.191.123/16 brd 10.205.255.255 scope […]

不能将数据包从一个接口路由到另一个接口

我有一个有2个接口eth0和eth1 。 eth0是192.168.0.250并连接到网关192.168.0.2 。 eth1通过192.123.123.10连接到192.123.123.10 。 我试图将数据包从192.123.123.10路由到网关192.168.0.2 ,这意味着我需要路由192.123.123.x数据包通过eth0接口进入eth1接口。 我将ip_forward文件设置为1 。 我运行这个命令: route add -net 192.123.0.0 netmask 255.255.255.0 dev eth0 route add default gw 192.168.0.2 我可以ping从129.123.123.10到192.168.0.250 ,但我不能ping通到192.168.0.2我认为数据包不被转发到eth0 。 我的路由表看起来像这样: gteway Genmask Flags Ref Iface 192.123.123.0 * 255.255.255.0 U eth1 192.168.0.0 * 255.255.255.0 U eth0 192.123.0.0 * 255.255.255.0 U eth0 default 192.168.0.2 0.0.0.0 UG eth0 谁能告诉我什么是缺less的? 先谢谢你。

Python套接字库认为套接字是不是打开

我正在处理一些Python,看起来像这样: HOST = '127.0.0.1' PORT = 43434 single = socket.socket(socket.AF_INET, socket.SOCK_STREAM) try: single.bind((HOST, PORT)) except socket.error as e: # Print an error, exit. 虽然过去运行良好,但是现在我们已经得到错误[Errno 98] Address already in use 。 SIGINT处理程序closures套接字连接,所以我不确定它是如何得到这种状态,但现在我只是想解决它。 lsof和netstat都说没有使用该端口: [$]> sudo netstat -an | grep 43434 [$]> sudo lsof -i :43434 根据/proc/sys/net/ipv4/tcp_fin_timeout , TIME_WAIT被设置为60秒,但是在最后一次运行成功之后甚至几个小时都会发生错误。 我试过(暂时)设置REUSEADDR (通过single.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) ),但似乎没有任何效果。 什么在tarnation是怎么回事? 我能够再次使用这个端口而不必重新启动机器吗?

Linux以编程方式向上/向下接口内核

在内核空间中启用或禁用接口的编程方式是什么? 应该做什么?

启动一个应用程序在heroku? 什么是procfile? 'web:'命令?

我指的是这个网站,因为我正在学习python / flask并尝试使用heroku。 http://ryaneshea.com/lightweight-python-apps-with-flask-twitter-bootstrap-and-heroku 让我解释一下我所做的一切,让任何像我一样卡住的人都可以得到照片。 我正在使用Linux Backtrack命令行。 1.我启动了virtualenv,然后安装了flask virtualenv –distribute pip install flask 然后,连接的heroku和github,在github中也创build了一个回购。 写了一个简单的脚本,并保存在app.py 然后,要求创build一个procfile! web:python app.py 问题。 1.通俗文件中的procfile是什么? 2.当我inputweb:python app.py时,它显示'web :: command not found' 请详细说明这是如何工作的? 我还有一个疑问,sudo是至高无上的用户权利? 我们不应该在virtualenv中使用它? 而对于我们使用virtualenv究竟是什么? 一个简单的例子。 问题是非常基本的。 裸露。

使用多个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立。 […]