Articles of 套接字

如何指定在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 […]

套接字编程gfortran

我希望能够在我的Fortran应用程序中调用networkingfunction。 我的老板希望我在Fortran中做所有的事情,而不是使用C和Fortran。 我们已经在Windows上使用PGI的Fortran编译器完成了一个应用程序的版本。 我们正在把它移到Linux,我们可能会使用它们的编译器。 现在,我正在使用gfortran。 我为这些networking调用创build了一个接口,并且编译和链接。 下面的代码与我正在做的类似,除了接口和常量在模块中。 PROGRAM MAIN INTEGER,PARAMETER ::AF_INET = 2 INTEGER,PARAMETER ::SOCK_STREAM = 1 INTEGER,PARAMETER ::IPPROTO_TCP = 6 INTERFACE FUNCTION socket(domain,type,protocol) INTEGER ::socket,domain,type,protocol END FUNCTION END INTERFACE sock = socket(AF_INET,SOCK_STREAM,IPPROTO_TCP) WRTIE(*,*)"Socket returned: ",sock END PROGRAM 当我运行该程序时,套接字函数无法返回-1。 我真的不知道发生了什么事。 我不在命令行中添加任何库,所以我猜想它正确地链接到默认库。 我编译使用 gfortran -o MAIN_PROGRAM MAIN_PROGRAM.f90 -fno-underscoring

原始套接字访问作为正常用户在Linux 2.4上

在一个embedded式系统(2.4内核)中,我需要一个原始套接字从一个不以root身份运行的进程访问eth0接口。 我尝试通过从命令行设置CAP_NET_RAWfunction并使用cap_set_proc()以编程方式解决此问题,但都没有成功。 看来我没有权限这样做,在程序中我得到一个EPERM错误,在命令行上 无法在进程“1586”上设置上限:(操作不允许) 有没有更简单的方法来做我想要的? 如果不是,则成功设置CAP_NET_RAWfunction需要执行哪些步骤? 编辑:我有根访问,但作为根永久运行的过程是没有select。 libcap的版本是1.10,没有“setcap”二进制文件,而是“setpcaps”。 编辑 – 回答George Skoptsov: 如果我弄明白了,你的build议是用setuid启动一个进程,然后设置CAP_NET_RAWfunction,然后删除权限。 我用下面的代码尝试了这个,但是它似乎不起作用,即使caps命令不返回错误。 随着seteuid()注释掉,原始访问工作,但只是因为该进程作为根运行,那么: cap_t caps = cap_get_proc(); cap_value_t cap_list[1]; cap_list[0] = CAP_NET_RAW; if (cap_set_flag(caps, CAP_EFFECTIVE, 1, cap_list, CAP_SET) == -1) { printf("cap_set_flag error"); } if (cap_set_proc(caps) == -1) { printf("cap_set_proc error"); } if (seteuid(getuid()) != 0) { printf("seteuid error"); } function_that_needs_raw_access(); 谢谢你的帮助。 克里斯

通过套接字发送NULL数据

我目前正试图通过基于TCP / IP的套接字与外部应用程序通信。 我已经成功build立了与客户端的连接,并收到一些数据。 这个手册在这里指出 在收到这个命令后,客户端必须从守护进程读取一个确认字节。 肯定确认是一个零位的八位位组。 否定确认是任何其他模式的八位字节。 我想发送一个积极的承认,我发送这种方式我的服务器侦听代码是从这里获得 void WriteData(std::string content) { send(newsockfd,content.c_str(),content.length(),0); } WriteData("00000000"); 我的问题是,如果我正确地发送这个数据(八位字节的零位)? 更新: 我已经阅读这篇文章,其中指出,发送只允许发送一个char *数组。 所以我不知道我怎么可以通过套接字发送一个字节。 我知道我可以做这样的事情 std::bitset<8> b1 ; // [0,0,0,0,0,0,0,0] 但我不知道如何通过套接字发送。

Socket编程发送()返回值

在linux下,或者windows套接字编程 我知道读取返回一个值,它表示成功接收的字节数。 这个返回值可能小于请求的长度。 (即,如果接收缓冲区只有50个字节,则read(sd,buf,100)可能会返回50) 这有可能吗? send(sd, buf, 100); 返回1〜99之间的值 如果是的话,现在是什么时候? 我想知道具体的例子情况。 先谢谢你

如何测量TCP背压?

我正在试图调查与通过TCP套接字发布日志到中央服务器的代码的性能问题。 一个假设是,发行商正在经历套接字层面的背压。 有没有办法从操作系统获得背压指标? 我相信答案是针对操作系统的。 就我而言,我使用的是Ubuntu 14.04和默认的Canonical提供的3.13内核。 我想我可以通过缩放正在发布的消息量并测量等待套接字写入完成所花费的相对时间量来检测背压。 但似乎这是一个普遍的问题,find一个通用的方法来衡量它。 (但是,在我的Googlesearch中,我所发现的只是关于连接过程中阻塞的讨论以及关于背压如何工作的解释。)

在AF_PACKET套接字上发送数据

如何在SOCK_PACKET套接字上发送数据,而不指定它绑定的主机? 我已经构build了IP头来显示它应该去,但写()将无法正常工作。

C代码来获取Linux中IP地址的接口名称

我如何从C代码获取Linux中IP地址的接口名称? 例如,我想获取分配给IP地址192.168.0.1的接口名称(如etho,eth1,l0)