Articles of 套接字

如何在Linux中创build很多(我的意思是很多)套接字?

我试图用不同的语言(C#,Java,C ++,PHP)来创build一个简单的程序来连接到一个服务器,所有的行为都是一样的。 所以我相信这个问题更多的是一个操作系统级的东西。 基本上我想程序连接到TCP套接字的服务器,并发送1个字节,然后closures套接字。 这需要每秒完成数千次,并持续一段时间。 这是为了对服务器进行基准testing。 到目前为止,在几千个客户端套接字之后,系统完全停止。 它只能在一分钟左右冷却后才能开始创build套接字。 我已经确定,在传输之后我已经closures了每个sockets。 现在,这类问题对像Apache这样的服务器很熟悉,其中的工具(如ab / siege)被build议使用keep-alive协议对Apache进行基准testing。 也就是说,创buildless量的TCP连接,但通过它们发出多个请求来达到基准testing的目的。 然而,在我们的情况下,这是不可能的,因为我们的专有服务器不提供HTTP服务,也不支持HTTP 1.1保持活动模式。 那么如何实现呢? 我已经检查了以下限制 ulimit被设置为非常高的数字 通过将/proc/sys/net/ipv4/tcp_rw_recycle和/proc/sys/net/ipv4/tcp_rw_reuse为1来消除TCP TIME_WAIT 。(我确实已经用netstat确认了没有TIME_WAIT套接字) 这与线程/进程数量的限制无关。 我已经尝试重新启动我的客户端应用程序,它是一样的。 一旦操作系统拒绝新的套接字,没有任何帮助。 PS。 这不是服务器端的限制。 我们通过购买另一个盒子并在第一个客户端盒子拒绝插入新套接字时运行相同的客户端代码来testing这一点。 服务器处理得很好。 我们不想购买5-10盒,并在它们之间旋转来克服这个问题。 OS:Fedora 10 Linux 2.6.24-23-xen#1 SMP

通过套接字发送图片(发送func)在c + +,但不要收回完整(Windows)!

我正在从客户端发送数据到服务器,但图片没有收到完整。 客户代码: FILE *fr = fopen(tmppicsend, "rb"); char* buffer; buffer = (char*) malloc(sizeof(char)*size); fread(buffer, size, 1, fr); send_len_pic = send( m_socket_pic, buffer, size, 0 ); recv( m_socket_pic, rec_end_check, 32, 0 ); fclose(fr); free(buffer); 服务器代码: FILE *fw = fopen(fname, "wb"); char* buffer; buffer = (char*) malloc(sizeof(char)*size); int rec_len = recv( current_client, buffer, size, 0 ); buffer[size]='\0'; […]

通过蓝牙套接字stream式传输audio

我需要通过Windows套接字stream式传输audio到蓝牙耳机。 我可以使用RFCOMM和A2DP /耳机configuration文件/免提configuration文件来连接蓝牙耳机的套接字。 我的要求是通过套接字streamaudio( WAV或MP3 )。 是否可以通过简单地写入audio数据到套接字(使用send())? 或者有其他的方法来做到这一点? 我需要使用相同的套接字连接来传输。 如果我使用媒体控制接口API,他们将做一个单独的连接,然后stream。

如果networking坏了,socket发生了什么事?

假设一个简单的networking模型:A已经成功创build了一个到B的TCP连接,并且它们正在像这样彼此通信 A <———-> B 我知道,如果A上的程序死亡(例如核心转储),那么将导致RST数据包到B.因此,任何B的读取尝试都将导致EOF,并且任何B的写入尝试都将导致SIGPIPE。 我对吗? 但是,如果假设networking在A上发生故障(如电缆/路由器故障),那么B的读写尝试会发生什么? 在我的情况下,所有的套接字已被设置为非阻塞。 因此,我不可能检测到networking错误? 顺便说一下,我注意到在socket中有一个选项SO_KEEPALIVE ,可能对我有用http://tldp.org/HOWTO/html_single/TCP-Keepalive-HOWTO/ 。 但是我想知道如果将探测间隔设置为2〜3秒(默认为75秒),成本是多less? 看起来间隔configuration是全球性的,那么这会影响机器上的所有sockets吗? 最后的问题…说networking已经崩溃了,任何写入尝试都会导致EPIPE一段时间后。 但是,如果不是试图写入,我把这个套接字放入epoll设备,那么会发生什么呢? epoll_wait是否会返回EPOLLHUP或EPOLLERR事件?

套接字关机和重新绑定 – 如何避免漫长的等待?

我正在使用Python中的套接字,并在开发阶段,我需要杀死并频繁地重新启动我的程序。 问题是,一旦我的Python脚本死亡,我必须等待很长时间才能重新绑定侦听套接字。 这是一个重现问题的片段: #!/usr/bin/env python3 import socket s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) s.bind((socket.gethostname(), 4321)) try: s.listen(5) while True: (a, b) = s.accept() print(a.recv(1000)) except KeyboardInterrupt: print("Closing") s.shutdown(socket.SHUT_RDWR) s.close() 打到Cz运行除了代码,调用shutdown和closefunction,但我不能重新启动我的程序,直到套接字超时(GNU / Linux环境)。 我怎样才能避免这一点?

如何在Linux中重新绑定udp套接字

我是一个有经验的Linux套接字编程人员,正在编写一个有很多出接口的服务器应用程序。 现在,服务器套接字与INADDR_ANY一起绑定到进程开始时的随机源端口。 稍后在提交对特定节点的响应时,我需要分配一个固定的源IP地址 。 标准的做法是调用bind。 但是,绑定被调用一次端口号, 连续调用失败,无效的参数错误。 创build一个新的套接字并不是一个好的select,因为在响应某些客户端时,我将不得不经常这样做。 我也探讨了SO和许多套接字选项,如IP_FREEBIND,但它并不完全符合我的scheme。 也许使用IP_PKT_INFO和设置源地址可能会工作,除非它遭受同样的问题,即不允许套接字一旦绑定到INADDRANY重新绑定到一个固定的源IP后者。 有没有办法解除绑定现有的套接字或替代方式来设置传出数据包中的源IP地址? int sock = socket(AF_INET, SOCK_DGRAM, 0); if(sock < 0) printf("Failed creating socket\n"); struct sockaddr_in addr; memset(&addr, 0, sizeof(struct sockaddr_in)); addr.sin_family = AF_INET; addr.sin_port = htons(1500); addr.sin_addr.s_addr = INADDR_ANY; // first bind succeeds if ( (status = bind(sock, (struct sockaddr *) &addr, sizeof(addr))) < 0) […]

如何使用具有Boost Asio套接字的特定networking接口/ Ip?

我有一个Debian / Linux服务器有几个IP地址,全部分配到同一个物理网卡。 /etc/network/interfacesconfiguration文件看起来像这样(xx代表数字) auto lo iface lo inet loopback auto eth0 iface eth0 inet static address 176.xx.xx.144 netmask 255.255.255.0 network 176.xx.xx.0 broadcast 176.xx.xx.255 gateway 176.xx.xx.254 auto eth0:0 allow-hotplug eth0:0 iface eth0:0 inet static address 46.xx.xx.57 netmask 255.255.255.255 broadcast 46.xx.xx.57 auto eth0:1 allow-hotplug eth0:1 iface eth0:1 inet static address 94.xx.xx.166 netmask 255.255.255.255 broadcast 94.xx.xx.166 //IPv6 […]

在C中closuresTCP侦听套接字

假设你有一个侦听TCP端口的套接字,并且有一些客户端被连接。 当在C中发出sock_close(fd)并尝试在同一个端口上再次绑定时,绑定失败。 在“netstat -plutnoa”中可以看到一些TIME_WAIT状态,例如: tcp 0 0 127.0.0.1:4567 127.0.0.1:32977 TIME_WAIT – timewait (17.12/0/0) 那么,如何正确断开服务器套接字并立即重新连接到相同的端口?

如何指定在Linux中使用哪个接口

是否有可能绑定一个udp套接字到一个特定的接口,所以它通过该接口发送数据? 我有一个应用程序使用多个Udp套接字来发送数据,它运行在具有多个接口的机器上。 我知道可以通过使用下面的代码来指定接口名称: int UdpSocket::open(const char *interface) { send_fd_ = ::socket(AF_INET, SOCK_DGRAM, 0); if (send_fd_ < 0) { perror("socket"); return -1; } int val = 1; int rc = ::setsockopt(send_fd_, SOL_SOCKET, SO_REUSEADDR, &val, sizeof(val)); if (rc < 0) { perror("sesockopt"); close(); return -1; } unsigned char ttl = 16; rc = ::setsockopt(send_fd_, IPPROTO_IP, IP_MULTICAST_TTL, &ttl, […]

UDP广播发送失败:在Linux 2.6.30上“networking不可达”

我使用udp broadcast.Code段编写一个程序如下: struct sockaddr_in broadcast_addr; socklen_t sock_len=sizeof(broadcast_addr); bzero(&broadcast_addr,sock_len); broadcast_addr.sin_family=AF_INET; broadcast_addr.sin_port=12345; broadcast_addr.sin_addr.s_addr=inet_addr("255.255.255.255"); int fd=socket(AF_INET,SOCK_DGRAM,0); int broadcast_enable=1; setsockopt(fd,SOL_SOCKET,SO_BROADCAST,&broadcast_enable,sizeof(broadcast_enable)); uint8_t send_buf[100]; int ret=sendto(fd,send_buf,sizeof(send_buf),0, (struct sockaddr*)&broadcast_addr,sock_len); if(ret==-1) perror("sendto failed"); 输出: sendto failed: Network is unreachable 但是当我运行“添加默认网关”命令,如“路由添加默认gw 10.10.10.111”,错误消失。当设置一个新的ipaddress到netdev,命令如上应该跑,否则错误来了。 为什么? 谢谢。