Articles of 套接字

通过套接字发送图片(发送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,命令如上应该跑,否则错误来了。 为什么? 谢谢。

OS X UDP发送错误:55没有可用的缓冲区空间

当我在OSX10.9.1上的python3.3中实现RUDP时,我注意到下面的代码实际上并没有做它在linux上的工作:(对于C,Java和C#/ Mono来说,哪种语言,同样的行为并不重要) from socket import * udp = socket(AF_INET, SOCK_DGRAM) udp.setsockopt(SOL_SOCKET, SO_REUSEADDR, True) udp.bind(('0.0.0.0', 1337)) udp.setblocking(False) udp.setsockopt(SOL_IP, IP_TTL, 4) udp.connect(('8.8.8.8', 12345)) buf = b'x' * 400 for _ in range(1024 * 1024 * 10): udp.send(buf) 这个代码只是写了很多udp包到8.8.8.8,这些包在4跳之后被丢弃,所以他们不应该到达目的地,只是模拟出站stream量。 问题: 这段代码会抛出一个OSError(55,'No buffer space available')错误,而在Linux(Windows)上,它会抛出一个BlockingIOError,这很好,因为它是一个非阻塞套接字。 所以,在Linux和Windows上,套接字在OSX上的行为是正确的,这是一个OSError,这是不好的。 但真正有趣的是,即使我把这个套接字置于阻塞模式下,这个代码仍然会在OSX上抛出一个错误。 而在Linux和Windows上,这不会引发任何错误,正如所料,它只是阻止。 这是基于BSD系统的实现细节吗? 或者我错过了一些重要的networking设置? [编辑] 我忘了提到我正在千兆局域网中testing这种行为。 我认为这是问题。 我连接到一个100mbit的networking,问题就没有了,即使使用300mbit的wlan,问题也没有发生。 现在我想这是连接到高速networking时的一些OSX特定行为。 [编辑 – 最后]我终于find原因: http://lists.freebsd.org/pipermail/freebsd-hackers/2004-January/005369.html […]