Articles of sockets

为位于不同networking的节点定义UDP套接字

假设有两台不同networking的Linux机器有以下configuration Node1 Node2 IPaddr(private) 192.168.0.14 10.25.3.75 Router modem's IP(real) 1.2.3.4 5.6.7.8 Netmask (real) 255.255.0.0 255.255.192.0 Router modem's IP(priv) 192.168.0.1 10.0.20.1 Netmask (priv) 255.255.255.0 255.0.0.0 下面是C一个通用的UDP(客户端)套接字代码(错误检查不包括在内以节省空间)。 假设下面的代码可以在node1上运行。 我的问题是, 如何在下面的代码中定义node2以及我需要编辑哪些内容以便从node1 to node2 UDP数据包能够毫无问题地传递? #include <arpa/inet.h> #include <netinet/in.h> #include <stdio.h> #include <sys/types.h> #include <sys/socket.h> #include <unistd.h> #include <stdlib.h> #include <string.h> #define SRV_IP "5.6.7.8" int main(){ struct sockaddr_in serv_addr; […]

数据types – socklen_t,sa_family_t

我正在使用sys / socket.h库构build一个简单的套接字web服务器,并且遇到了socklen_t和sa_family_t数据types,并且对它们的实际用途有些困惑。 定义: sa_family_t – 无符号整型。 socklen_t – 一个长度至less为32位的无符号不透明整型。 现在我知道<sys/socket> lib声明了三个结构( sockaddr , msghdr , cmsghdr ),它们包含声明这些数据types的成员。 sa_family_t sa_family address family socklen_t msg_namelen size of address socklen_t msg_controllen ancillary data buffer len socklen_t cmsg_len data byte count, including the cmsghdr 但是为什么要创build新的数据types,为什么不使用unsigned int数据types呢?

为什么我的C socket文件传输(服务器/客户端)程序只能正确运行一次?

这是我第一次发布堆栈溢出。 如果我没有正确遵守协议,我很抱歉。 我有一个简单的C套接字程序与客户端和服务器组件。 程序将一个VM上的客户端文件发送到另一个VM上的服务器。 程序运行并且文件首次成功发送。 但是,当我尝试第二次运行该程序时,该文件似乎不会被传输。 经过调查,我发现重新启动虚拟机后,程序再次运行。 为什么发生这种情况? 这里是服务器代码: NewFileServer.c /* Server code */ /* TODO : Modify to meet your need */ #include <stdio.h> #include <sys/stat.h> #include <fcntl.h> #include <sys/sendfile.h> #include <stdio.h> #include <sys/types.h> #include <sys/socket.h> #include <stdlib.h> #include <errno.h> #include <string.h> #include <arpa/inet.h> #include <unistd.h> #include <netinet/in.h> #define PORT_NUMBER 5000 #define SERVER_ADDRESS "10.20.20.55" […]

Linux中的SO_WIFI_STATUS套接字选项

有人可以摆脱SO_WIFI_STATUS套接字选项 – 我在hostapd nl80211驱动程序代码中遇到它。 我可以在/usr/include/asm-generic/socket.h文件中find它的声明,但是在任何地方都找不到任何相关的文档。

如何解决DNS名称parsing在其他协议似乎closures时运行?

我们正试图实施一个基于Moxa UC-7112-LXembedded式计算机(uClinux OS)的软件。 我们使用Cinteron MC52i GSM调制解调器(普通GPRS服务)和标准的pppd连接到互联网。 一切似乎都很好,就在连接之后。 Ping实用程序正在工作,我的程序中的Socket函数也正常工作。 但是在一段时间后,ppp连接以非常特殊的方式进行了破解。 这是这种情况的症状: 当我用一些主机名称作为参数调用ping实用程序时,系统能够parsing它的IP并开始发送ICMP数据包,但是没有响应。 我正在尝试不同的Web资源名称,以便系统不能将其地址caching或什么。 无论我select什么,系统正确parsingIP,但不能得到任何ping响应。 connect()和write()函数在我的应用程序中没有错误返回,但是当涉及到read()函数返回时,errno设置为ECONNRESET (由对等方重置连接)。 该程序使用标准套接字函数(TCP协议) ppp链接显示为正在运行( ifconfig ppp0 ) 所以,我的情况是:这个链接足以维护DNSparsing服务(UDP正在工作?),但不足以运行TCP连接并接收ping回声。 这种情况一直没有出现。 有时系统可以正常工作几天而没有任何问题。 每当出现问题,简单的重置就可以解决所有问题。 我知道我们使用的系统是非常奇特的,这里描述的情况可能与一些错误的tcp堆栈或pppd实现有关。 考虑到系统是由制造商预先configuration的,我没有任何选项来重build/更改OS固件。 不过,我希望有人看到类似linux系统的情况。 有什么办法来testing为什么DNS名称parsing正在工作,而其他networking的东西没有? 是否有可能删除这种连接状态与一些PPPD设置? 编辑: 首先,我想解决本地cachingIP地址的可能性。 我没有dig实用程序,我不知道如何检查哪个主机给getaddrinfo()结果。 不过,我敢肯定,地址不caching,因为我试图ping完全随机的url。 此外,由于GPRS响应时间较慢,因此在开始发送数据包之前,无需使用时间测量实用程序查看ping需要1-2秒或更长时间来parsingIP。 此外, ncsd , BIND或任何DNS服务器不在本地运行。 我明白,你可能不会看到这个证据,但这是我的系统上提供的实用工具集。 我想提供一些关于互联网连接操作的更多信息。 正常连接状态 系统加载的rc脚本运行另一个脚本作为后台进程: sh /etc/connect & connect脚本如下所示: #!/bin/sh echo First connect attempt > /etc/ppp/conn.info while true […]

PHP如何正常closures本地套接字连接…?

我有一个PHP客户端通过纯文本的Unix域套接字连接到本地C服务器程序。 但是,我可以很好地closures它的唯一方法是如果我完成套接字会话: stream_socket_shutdown($sock, 1); // shutdown socket writing usleep(500 * 1000); // wait for 0.5 seconds fclose($sock); // actually close the socket (finally) 我想像我的C客户端那样优雅地closures它: shutdown(connection_fd, SHUT_WR); // tell server we've stopped sending queries // Read from the socket until poll(connection_fd) yields POLLRDHUP / POLLHUP / POLLERR / POLLNVAL shutdown(connection_fd, SHUT_RDWR); // tell connection we've stopped […]

如何从内核中的UDP读取缓冲区中删除数据包?

我将要编写用于VoIP应用程序的负载/压力testing的工具。 大部分被testing的电话都是类似会议的电话,其中一个客户说话,其他所有人都在听。 在这种情况下,服务器将UDP RTPaudio数据包复制到每个侦听客户端。 在我的加载工具中,我将等待这些数据包在基于epoll的循环中。 问题:当UDP RTP包到达时,我必须调用recvfrom来接收它。 在我的情况下,我不想在大多数情况下处理这个数据包的内容(数据包数量是足够的),所以recvfrom不必要的拷贝数据从内核到用户空间。 对于大集团来说,这意味着很多不必要的复制。 是否有可能要求内核从接收缓冲区中删除这个数据包,而不是传递给用户空间? 或者可能以某种方式将其redirect到内核中的/ dev / null? 或者要求内核删除所有数据包并返回删除的数量? 环境:Linux RedHat 6(7也可以),x86_64,gcc。

内核地sockets连接超时

再次,我需要你的帮助,我的内核模块。 我已经实现了一个客户端模块,但每次连接函数返回errno = 110(超时)。 我不明白为什么? 为了testing这个模块,我在监听模式下启动了netcat(nc -vl -p4242)。 你对这个神秘的bug有什么build议吗? int init_module(void) { struct socket* sock = NULL; struct sockaddr_in* dest = {0}; int retVal = 0; dest = (struct sockaddr_in*)kmalloc(sizeof(struct sockaddr_in), GFP_KERNEL); sock_create(PF_INET, SOCK_STREAM, IPPROTO_TCP, &sock); dest->sin_family = AF_INET; dest->sin_addr.s_addr = htonl(in_aton("127.0.0.1")); dest->sin_port = htons(4242); printk(KERN_EMERG "Connect to %X:%u\n", dest->sin_addr.s_addr, 4242); retVal = sock->ops->connect(sock, (struct […]

`netstat`不显示由python SimpleHTTPServer绑定的套接字?

本地服务器使用Python 2.7中的SimpleHTTPServer模块运行 $ python -m SimpleHTTPServer Serving HTTP on 0.0.0.0 port 8000 … 然后,我使用netstat来search该套接字使用8000作为端口号的筛选器,但是,我找不到任何带有该filter的套接字(即使当我打开浏览器窗口并访问127.0.0.1:8000 )。 $ netstat | grep 8000 // "return Nothing" 有没有人有想法,为什么我看不到在Python的SimpleHTTPServer在netstat绑定的套接字?

Linux套接字使用多个线程发送

我有一个单一的非阻塞套接字发送udp数据包到多个目标,并在同一个套接字上接收来自所有的响应。 我正在阅读一个专门的线程,但写(sendto)可以来自几个不同的线程。 这是没有任何额外的同步安全吗? 我需要写一个互斥锁吗? 或者,写入需要来自同一个线程,我需要一个队列?