Articles of sockets

处理具有非空读取缓冲区的套接字stream时出现“非法查找”错误

我目前正在使用<sys/socket.h>在Linux x86_64上编写一个服务器应用程序。 通过accept()接受连接后,我使用fdopen()将检索到的套接字封装到FILE*stream中。 写入和读取FILE*stream通常工作得很好,但是一旦我写入了它,套接字变得不可用,而它有一个非空的读取缓冲区。 为了演示目的,我写了一些代码来监听连接,然后使用fgetc()将input逐行读入到读缓冲区中。 如果该行太长而不能放入缓冲区,则不能完全读取,而是在下一次迭代中读取。 #include <unistd.h> #include <stdio.h> #include <sys/types.h> #include <sys/socket.h> #include <netinet/in.h> FILE* listen_on_port(unsigned short port) { int sock = socket(AF_INET, SOCK_STREAM, 0); struct sockaddr_in name; name.sin_family = AF_INET; name.sin_port = htons(port); name.sin_addr.s_addr = htonl(INADDR_ANY); if(bind(sock, (struct sockaddr*) &name, sizeof(name)) < 0) perror("bind failed"); listen(sock, 5); int newsock = accept(sock, 0, […]

BSD套接字兼容包装winsock?

我试图将一个Linux应用程序移植到Windows。 该应用程序不是太复杂,使用所有相当标准的代码,很less有外部依赖。 主要的依赖是libelf(在mingw下编译得很好),pthreads(似乎有一个win32版本可用)和套接字。 主要的问题是套接字… Windows提供了WinSock,但是这与所有* nixes使用的BSD(Berkeley)套接字不是100%兼容的。 我想知道的是,是否有人在windows上公开了一个封装器来暴露一个BSD套接字API,但在后端调用Winsock,以便于移植?

在Linux上使用python接收多播UDP数据报

我有一个硬件设备,在我的networking上发送多播数据。 我已经写了一个接收数据并打印它的Python脚本。 但是,我发现它只能在我的Windows XP电脑上运行,并且在我的Ubuntu Linux 10.04电脑上无法运行。 在Linux下,没有收到任何东西。 它只是围绕while循环,并没有收到任何数据。 我的代码张贴在下面。 你能看到任何理由,为什么这不会在Linux下工作? 谢谢,Rab。 # Multicast client # Adapted from: http://chaos.weblogs.us/archives/164 # on 05/03/2013 import socket ANY = "0.0.0.0" MCAST_ADDR = "224.0.33.154" MCAST_PORT = 31800 # Create a UDP socket sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM, socket.IPPROTO_UDP) # Allow multiple sockets to use the same PORT number sock.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,1) # Bind […]

我可以将父进程的stderrredirect到分支进程上的套接字文件描述符吗?

我编写了一个守护进程,在开发过程中,它的debugging信息会进入stderr(在完全被“守护进程”之前)。 现在代码更成熟了,所以stderr已经通过freopen(2)调用redirect到了/dev/null 。 为了debugging的目的,我真的希望能够连接到服务器守护进程,发送一个命令,神奇地开始通过套接字发送stderrstream。 有没有一种方法(在分叉的过程中)对父进程的 stderr 对subprocess套接字文件描述符执行“ dup(2) ”类似的操作? 只有Linux的解决scheme是可以接受的 有大量的代码打印到stderr , 为了validation的目的 ,我宁愿不去碰。 如果dup2可以做我所要求的,这将工作: redirectSTDOUT和STDERR到C中的套接字?

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