Articles of 绑定

如何在Linux中重新绑定udp套接字

我是一个有经验的Linux套接字编程人员,正在编写一个有很多出接口的服务器应用程序。 现在,服务器套接字与INADDR_ANY一起绑定到进程开始时的随机源端口。 稍后在提交对特定节点的响应时,我需要分配一个固定的源IP地址 。 标准的做法是调用bind。 但是,绑定被调用一次端口号, 连续调用失败,无效的参数错误。 创build一个新的套接字并不是一个好的select,因为在响应某些客户端时,我将不得不经常这样做。 我也探讨了SO和许多套接字选项,如IP_FREEBIND,但它并不完全符合我的scheme。 也许使用IP_PKT_INFO和设置源地址可能会工作,除非它遭受同样的问题,即不允许套接字一旦绑定到INADDRANY重新绑定到一个固定的源IP后者。 有没有办法解除绑定现有的套接字或替代方式来设置传出数据包中的源IP地址? int sock = socket(AF_INET, SOCK_DGRAM, 0); if(sock < 0) printf("Failed creating socket\n"); struct sockaddr_in addr; memset(&addr, 0, sizeof(struct sockaddr_in)); addr.sin_family = AF_INET; addr.sin_port = htons(1500); addr.sin_addr.s_addr = INADDR_ANY; // first bind succeeds if ( (status = bind(sock, (struct sockaddr *) &addr, sizeof(addr))) < 0) […]

绑定INADDR_ANY

如果我将套接字绑定到INADDR_ANY,我知道它将接受在服务器上configuration的任何IP上的传入连接。 比方说,当我进行bind()调用,然后一个新的IP被configuration,我有1 IPconfiguration。 将绑定()接受连接启动到新configuration的IP还是只有在调用bind()时存在的IP才起作用?

Linux:将UDP监听套接字绑定到特定的接口(或者找出接收到的数据报的接口)?

我有一个守护进程,我正在监听UDP广播数据包,并通过UDP响应。 当一个数据包进入时,我想知道数据包到达哪个IP地址(或NIC),以便我可以使用该IP地址作为源进行响应。 (由于很多原因,我们系统的一些用户希望把同一台机器上的两个网卡连接到同一个子网,我们告诉他们不要这样做,但是他们坚持认为,我不需要提醒你有多丑。) 似乎没有办法检查一个数据报,直接找出它的目的地址或接口。 基于大量的search引擎,我发现找出数据报的目标的唯一方法是每个接口有一个监听套接字,并将套接字绑定到它们各自的接口。 首先,我的侦听套接字是这样创build的: s=socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP) 为了绑定套接字,我尝试的第一件事就是在这里, nic是一个char*到接口的名字: // Bind to a single interface rc=setsockopt(s, SOL_SOCKET, SO_BINDTODEVICE, nic, strlen(nic)); if (rc != 0) { … } 这完全没有效果,并且默默地失败了。 ASCII名称(例如eth0 )是否传递给此调用的正确types的名称? 为什么它会默默地失败? 根据man 7 socket ,“请注意,这只适用于某些套接字types,尤其是AF_INET套接字,不支持包套接字(使用正常绑定(8))。 我不确定'包套接字'是什么意思,但是这是一个AF_INET套接字。 所以接下来我尝试的是这个(基于绑定与SO_BINDTODEVICE套接字 ): struct sockaddr_ll sock_address; memset(&sock_address, 0, sizeof(sock_address)); sock_address.sll_family = PF_PACKET; sock_address.sll_protocol = htons(ETH_P_ALL); sock_address.sll_ifindex = if_nametoindex(nic); […]

如何在Linux上基于CPU能力进行运行时绑定

是否有可能有一个Linux库(例如“libloader.so”)加载另一个库来解决任何外部符号? 我有一大堆的代码被有条件编译为支持SIMD级别(SSE2,AVX,AVX2)。 如果构build平台与运行时平台相同,此工作正常。 但它妨碍了不同处理器世代的重用。 一个想法是有一个调用function链接到libloader.so executable ,它不直接实现function 。 相反,它parsing(绑定?)该符号从另一个加载的库,例如libimpl_sse2.so , libimpl_avx2.so等取决于cpuflags。 有数百个函数需要以这种方式进行dynamic绑定,因此更改声明或调用代码是不现实的。 程序链接相当容易改变。 运行时环境variables也可以改变,但我不想。 我已经得到尽可能做一个可执行文件,并通过ld标志 – –unresolved-symbols=ignore-allbuild立并开始与未parsing的外部符号(UES)。 但是随后的impl lib的加载不会将UES函数的值从NULL改变。

在Windows中为套接字使用特定的networking接口

除了更改路由表之外,Windows中是否有可靠的方法来强制新创build的套接字使用特定的networking接口? 我明白bind()到接口的IP地址并不能保证这一点。

我如何在Windows上运行已安装的Python模块?

我正在使用Point Grey相机(Grasshopper3),并使用Python中的OpenCV分析图像。 Point Grey相机配备了一个名为flycapture的C语言API。 我发现GitHub( pyflycapture2 )上的flycapture v2 api的python绑定,他们提供Unix系统的安装说明,但由于我在Windows上,我不能使用awesome apt-get命令。 以下是提供的说明: mkdir ~/git cd ~/git git clone https://github.com/peterpolidoro/pyflycapture2.git sudo apt-get install python-pip python-virtualenv -y mkdir ~/virtualenvs/ virtualenv ~/virtualenvs/flycapture2 source ~/virtualenvs/flycapture2/bin/activate pip install cython pip install numpy cd ~/git/pyflycapture2/ python setup.py install 我不需要安装Cython和NumPy,因为它们包含在我的Python发行版(Anaconda)中, 我试过只运行python setup.py install但后来我得到ImportError: No module named flycapture2如果我用存储库中提供的代码testing安装, ImportError: No module named flycapture2 。 […]