Articles of socket

保留的TCP / IP端口

保留的TCP / IP端口是否要求程序正在运行并绑定到端口? 如果没有这样的程序正在运行或存在,另一个程序是否可以使用此端口? 例如,在Linux上,端口7是为回应服务器保留的。 我假设有一些程序正在运行,并绑定到机器的端口7。 该scheme基本上回声input。 如果这个程序停止了,端口7会被释放吗? 如果我写了自己的echo服务器并将其绑定到其他端口,那么一旦我的自定义回显服务器程序被终止,这个端口是不会被释放的? 保留端口是否发生同样的事情? 另外,如果所有这些程序都在保留端口上运行,那么即使它们被阻止监听连接,它们也不会占用系统资源吗? 这些程序是否始终运行?

如何不接收UDP数据报的错误的子网,但仍然广播?

我有一个接口eth0设置为168.152.32.222networking掩码255.255.255.0。 我的服务器应用程序希望现在接收在eth0上具有以下目标地址的UDP数据报: 168.152.32.222 168.152.32.255 255.255.255.255 这似乎是一个相当合理的请求,但我无法正确地绑定套接字。 如果我绑定到168.152.32.222,我没有收到广播。 如果我绑定到INADDR_ANY,我得到所有接口的数据报。 如果我绑定到INADDR_ANY和SO_BINDTODEVICE,我得到的数据包到达eth0为不同的子网,如168.152.47.x. 理论上,我可以只接受数据报,然后再用networking掩码自己过滤掉所有错误的数据包 – 但严重的是,一些低层应该这样做,这是networking掩码的重点。 如何不接收UDP数据报的错误的子网,但仍然广播? 服务器应用程序之外的解决scheme也是可以接受的。 我正在考虑用iptables过滤数据包,不知道这是否可行,这是最后的手段。

性能问题recv在c

我有如下实现套接字通信: 套接字客户端向套接字服务器发送“0010ABCDEFGHIJ”,前4个字节(本例中为“0010”)描述消息体有10个字节,接下来的字节是消息体! 我在服务器端使用“Linux编程接口”readn函数,来源: ssize_t readnx(int fd, void *buffer, size_t n) { ssize_t numRead; /* # of bytes fetched by last read() */ size_t totRead; /* Total # of bytes read so far */ char *buf; buf = (char*) buffer; /* No pointer arithmetic on "void *" */ for (totRead = 0; totRead < n; ) […]

使用带有原始以太网帧的sendmsg / sendmmsg

我试图用C通过sendmsg发送原始的以太网数据包。 这段代码成功地打开了一个原始数据包套接字,尝试用一个字节数组(char message [])填充一个结构iovec,然后用目标地址,地址长度和一个指向结构iovec的指针填充一个struct msghdr,消息。 sendmsg()为每个调用返回EINVAL,但我不知道哪些参数是无效的。 (我已经删除了一些perror()调用,使这个代码更简单的阅读;输出是“无效参数”)。 我一直无法findsendmsg()如何与原始套接字一起工作的示例,但是使用sendto()的类似代码按预期工作。 在那个代码中,我明确地形成了以太网帧,包括头文件和协议信息,但是据我的理解,sendmsg()调用并不是必须的。 我也试图让message.iov_base指向一个缓冲区,该缓冲区包含明确形成的以太网帧,包括14个字节的头,但是sendmsg()也是这样。 Sendmsg()和sendmmsg()可以与原始以太网帧一起工作吗? 有什么我错过了使它无效的iovec? 30 int main(void) { 32 unsigned char dest[ETH_ALEN] = {0x11, 0x11, 0x11, 0x11, 0x11, 0x11}; // destination MAC address 33 34 // Socket variables 35 int s; 36 unsigned short protocol = htons(ETH_P_802_EX1); 38 39 // Message variables 40 char message[] = {"Test […]

c sendto函数在linux2.6.29中设置“network is unreachable”errno

我有一个类似的问题,在sendto函数设置“networking不可达”errno和( 不太像 ) UDP广播发送失败:“networking是无法访问”在Linux 2.6.30但因为这个问题没有回答,是相当古老我试过重申他们在这里更多的澄清,希望得到答案。 我有一个UDP服务器和客户端,客户端广播活动消息和服务器捕获它们(代码如下)。 当我在ubuntu14.04,16.04,fedora6等几个不同的桌面Linux上运行这些工作,他们工作的很好。 但是,当我尝试从一个ltib制造的embedded式linux上运行mpc8308板,服务器工作(接收来自其他机器的消息),但客户端设置errno“networking无法访问”,因为它调用sendto。 我尝试了wireshark,并没有从客户端的接口上的数据包,我用板上的tcpdumptesting了系统,没有生成的数据包在那里。 这里是客户端的代码: int clientSocket, portNum, nBytes; char buffer[1024]; struct sockaddr_in serverAddr; socklen_t addr_size; /*Create UDP socket*/ clientSocket = socket(AF_INET, SOCK_DGRAM, 0); int broadcastEnable=1; int retsockopts=setsockopt(clientSocket, SOL_SOCKET, SO_BROADCAST, &broadcastEnable, sizeof(broadcastEnable)); /*Configure settings in address struct*/ serverAddr.sin_family = AF_INET; serverAddr.sin_port = htons(12021); serverAddr.sin_addr.s_addr = htonl(INADDR_BROADCAST); memset(serverAddr.sin_zero, '\0', sizeof serverAddr.sin_zero); […]

什么决定了最大的本地数据报大小? (PF_UNIX / SOCK_DGRAM)

本地基于消息的套接字可以将消息传输到SO_SNDBUF / SO_RCVBUF限制,或者可以确定使用socket(PF_UNIX, SOCK_SEQPACKET, 0)或socket(PF_UNIX, SOCK_DGRAM, 0) socket(PF_UNIX, SOCK_SEQPACKET, 0)创build的描述符的所谓“固定最大长度” socket(PF_UNIX, SOCK_DGRAM, 0) ?

为什么我要在一个全新的套接字上获得EPOLLHUP事件?

我有一些代码,当在虚拟机上运行是由于某种原因行为不端。 初始化的顺序是: s_listen = socket(…) bind(s_listen, …) epoll_ctl(epfd, EPOLL_CTL_ADD, s_listen, …) listen(s_listen, SOMAXCONN) 在连接被调用之前,epoll文件描述符上有一个事件循环/线程运行和处理事件。 那个事件循环在调用listen()之前得到一个EPOLLHUP在新创build的s_listen套接字上。 所以我的问题是,为什么我得到一个全新的套接字EPOLLHUP事件? 当我在调用listen()之后放置epoll_ctl时,错误就消失了,但是如果在套接字被添加到epoll之前它们会进来,会导致一些潜在的连接事件被错过吗?

Linux TCP / IP诊断为什么TCP / IP read()在C程序中返回0

我有一些Linux主机上运行的C程序(RHEL 6.6)。 他们有TCP / IP连接到同一主机上的其他应用程序。 每个连接上的stream量很less。 每隔一段时间,同一个主机上的一个进程的一个套接字的read()调用返回0.这些套接字通常在应用程序的整个生命周期中保持不变,因此在正常操作期间它们并不是完全closures的。 我期望,如果发生错误,如另一端崩溃,read()将返回-1并设置errno。 因此,问题是除了TCP / IP连接被另一端干净地closures(shutdown(fd); close(fd))之外还有什么原因导致read()调用返回0? read()的手册页指出只有EOF返回0,而recv()手册页指出它在对等体执行有序closures时返回“0”。 我假设read()和recv()的返回值是等价的,并且TCP / IP连接上的EOF意味着干净的closures。

级别触发或边缘触发?

我有一个服务器应用程序,监听端口,接受(TCP)对等连接,然后为每个套接字 1) reads (不超过30字节的数据) 2) sends (1字节ack) 3) reads (不超过2K) 4) sends (1字节ack) 5) closes (连接) 我在我的应用程序中使用epoll循环。 我希望epoll_wait 只有当所有的数据从对等体到达时才返回(带有EPOLLIN标志的事件列表),这样我才能读取一个read/recv调用到数组中。 如果所有的数据都没有收到一个特定的套接字fd我不希望epoll添加这个fd到事件列表。 据我所知epoll水平触发和边缘触发模式之间的差异,这种行为可以达到使用边缘触发epoll与非阻塞套接字加上有限状态来跟踪步骤。 请纠正我,如果我错了边缘触发选项。 任何想法?

2程序从端口获得相同的udp数据包

有一个服务器会发送一些UDP数据包到我的本地主机,例如:如果它发送一些UDP数据包到我的本地主机和目的地端口是5000.并且将有一个客户端程序来接收它在端口5000.但是,我想要什么是创build另一个程序,它将尝试在端口5000上接收相同的数据包。 如果服务器发送数据包p1,p2,p3 …. pn到我的本地主机端口5000,我希望这两个客户端程序都会收到相同的数据包。 (客户端程序1:p1,p2,p3 … pn,客户端程序2:p1,p2,p3 … pn) 我试图使用pcap来做到这一点,但有时似乎丢失了一些数据包(服务器将发送一些videostream到客户端)