Articles of sockets

可以在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. […]

在C客户端服务器应用程序中,socket()返回0

我正在处理一个包含多个服务器套接字的应用程序,每个服务器套接字在一个独特的线程中运行 一个外部实用程序(脚本)由其中一个线程调用。 该脚本调用将消息发送到其中一个服务器套接字的实用程序(客户端)。 最初,我使用system()来执行这个外部脚本,但是我们不能使用它,因为我们必须确保服务器套接字在被分叉执行外部脚本的孩子中被closures。 我现在自己调用fork()和execvp() 。 我fork() ,然后在孩子我closures所有的服务器套接字,然后调用execvp()来执行脚本。 现在,所有这些工作正常。 问题是有时脚本会向服务器应用程序报告错误。 脚本通过调用另一个打开TCP套接字的应用程序(客户端)发送这些错误并发送相应的数据。 我的问题是客户端应用程序获取由socket()系统调用返回的值为0 。 注意:只有当使用我的forkExec()函数调用脚本/客户端应用程序时才会发生这种情况。 如果脚本/客户端应用程序被手动调用,那么socket()调用就会正常执行,而且事情工作正常。 基于这些信息,我怀疑这是在我的fork()execvp()代码下面的东西…任何想法? void forkExec() { int stat; stat = fork(); if (stat < 0) { printf("Error forking child: %s", strerror(errno)); } else if (stat == 0) { char *progArgs[3]; /* * First, close the file descriptors that the child * shouldn't […]

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是怎么回事? 我能够再次使用这个端口而不必重新启动机器吗?

socket.gaierror:名称或服务未知

伙计们,我是一个新手到套接字编程下面的程序是一个客户端程序,从服务器请求一个文件,但我得到的错误,如下所示..我的input是GET的index.html和代码是谁能解决这个错误…? #!/usr/bin/env python import httplib import sys http_server = sys.argv[0] conn = httplib.HTTPConnection(http_server) while 1: cmd = raw_input('input command (ex. GET index.html): ') cmd = cmd.split() if cmd[0] == 'exit': break conn.request(cmd[0],cmd[1]) rsp = conn.getresponse() print(rsp.status, rsp.reason) data_received = rsp.read() print(data_received) conn.close() input command (ex. GET index.html): GET index.html Traceback (most recent call last): File […]

在Linux上编写multithreadingTCP服务器

在工作中,我负责将TCP服务器作为Modbus从站设备的一部分来实现。 我在堆栈交换和一般的互联网(包括优秀的http://beej.us/guide/bgnet/ )上都做了大量的阅读,但是我正在为devise问题而苦苦挣扎。 总之,我的设备只能接受2个连接,每个连接都会接收到我在主控制器环路中必须处理的modbus请求,然后回复成功或失败状态。 我有如何实现这一点的以下想法。 有一个侦听器线程创build,绑定,侦听和接受连接,然后生成一个新的pthread来监听传入数据的连接,并在空闲超时期限后closures连接。 如果当前活动线程的数量是2,则立即closures新的连接以确保只允许2个连接。 不要从侦听器线程产生新线程,而是使用select()来检测传入的连接请求,以及在活动连接上传入的modbus连接(类似于Beejs指南中的方法)。 创build两个监听器线程,每个监听器线程创build一个可以阻塞accept()调用的套接字(相同的IP和端口号),然后closures套接字fd并处理连接。 在这里,我(可能天真地)认为这将只允许最多2个连接,我可以使用阻塞读取处理。 我一直在使用C ++很长一段时间,但对于Linux开发来说,我还是比较新的。 对于上述哪种方法最好(如果有的话),以及如果我对Linux的经验不足意味着其中任何一个都是非常糟糕的想法,我都非常欢迎。 我渴望避免fork()并坚持pthreads,因为传入的modbus请求将被排队并定期从主控制器循环读取。 预先感谢您的任何build议。

recv与非阻塞套接字

我想实现无阻塞的套接字recv和问题是,我得到一个错误-1当没有数据,但我希望得到EAGAIN错误。 套接字设置为非阻塞状态,我为O_NONBLOCK标志检查了flags = fcntl(s, F_GETFL, 0) 。 提前感谢! #include <arpa/inet.h> #include <linux/if_packet.h> #include <stdio.h> #include <string.h> #include <stdlib.h> #include <sys/ioctl.h> #include <sys/socket.h> #include <net/if.h> #include <netinet/ether.h> #include <unistd.h> #include <fcntl.h> #include <asm-generic/errno-base.h> #include <assert.h> #define ETH_FRAME_LEN_MY 1400 void print(void *buf, int length) { int i; for (i = 0; i < length; ++i) putchar(((char *)buf)[i]); […]

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() (和其他)协议的行为依赖于?

如何为每个进程路由使用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 […]

使用linux-kernel模块发送UDP数据包而不使用套接字

我正在编写一个创buildIP数据包的内核模块。 现在我想发送这个数据包,但是没有为它的传输创build任何套接字。 有没有什么办法直接发送它的内核例程的帮助。 因为我已经跟踪了用于数据包传输的linux内核代码,所以在net / core / dev.c中定义了一个名为dev_hard_start_xmit()的函数。 我们可以使用它吗? 其实我不想使用套接字。

有一个更清洁的方式来可靠地使用write()函数吗?

我阅读man页,我的理解是,如果write()失败,并将errno为EAGAIN或EINTR ,我可以再次执行write() ,所以我想出了以下代码: ret = 0; while(ret != count) { write_count = write(connFD, (char *)buf + ret, count); while (write_count < 0) { switch(errno) { case EINTR: case EAGAIN: write_count = write(connFD, (char *)buf + ret, count -ret); break; default: printf("\n The value of ret is : %d\n", ret); printf("\n The error number is : […]