Articles of sockets

在C中使用stdin和select()

我有以下程序: #include <stdio.h> #define STDIN 0 int main() { fd_set fds; int maxfd; // sd is a UDP socket maxfd = (sd > STDIN)?sd:STDIN; while(1){ FD_ZERO(&fds); FD_SET(sd, &fds); FD_SET(STDIN, &fds); select(maxfd+1, &fds, NULL, NULL, NULL); if (FD_ISSET(STDIN, &fds)){ printf("\nUser input – stdin"); } if (FD_ISSET(sd, &fds)){ // socket code } } } 我面对的问题是,一旦在STDIN上检测到input,“用户input – 标准input”信息将继续打印…为什么在循环检查哪些描述符已input时不打印一次? […]

如何closureswrite()系统调用的缓冲?

我曾经认为write()系统调用是无缓冲的, fwrite和fread用于缓冲IO。 不过,我写了一些简单的程序来确定在使用write()时仍然有一些缓冲。 我在套接字上使用write()和read() 。 由于缓冲,服务器不停地发送数据包时,客户端可能会滞后。 我不要那个。 我希望客户端必须在服务器发送更多logging之前消耗logging。 我怎样才能做到这一点,而不增加确认等networking负载! 我在linux上使用gcc server.c: #include <stdio.h> #include <errno.h> #include <sys/socket.h> #include <arpa/inet.h> #include <stdio.h> #include <netinet/in.h> #include <string.h> #include <stdlib.h> #include <stdio.h> #include <unistd.h> #include <netinet/tcp.h> int remote_rr_port=2000; // Server will send RR logs using connection on this port. char const *remote_server_ip="127.0.0.1"; int connFD_rr; static void startTcpServer(int *sd, […]

如何closures一个无阻塞的套接字?

我相信,如果我们在一个非阻塞套接字上调用close系统调用,它立即返回,那么如何处理响应呢? 是否closures? 换句话说,在非阻塞套接字上closures套接字系统调用的行为是什么?

处理具有非空读取缓冲区的套接字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是怎么回事? 我能够再次使用这个端口而不必重新启动机器吗?