标签: setsockopt

正确使用getsockopt和setsockopt用于SO_RCVTIMEO和SO_SNDTIMEO

由于各种原因,我想在读取和写入服务器中的套接字时实现超时但无法使其运行,因此请求了解问题可能存在的地方.

为了设置读取和写入套接字的超时,我正在尝试使用函数setsocketopt()getsocketopt().但是我必须做错了,因为返回值表明发生了问题并且perror输出"Invalid argument".奇怪的是错误并不总是发生在第一次使用setsocketopt()getsocketopt(),这令我费解位.

以下服务器和客户端代码重现我的问题(使用gcc编译)

服务器代码:

#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <netdb.h>
#include <sys/socket.h> 
#include <netinet/in.h> 
#include <arpa/inet.h>  

int main() {
   struct sockaddr_in saddr,caddr; 
   socklen_t clen;
   int sock, csock, reuse = 1, ret=0;
   socklen_t ntrcv, ntsnd;
   struct timeval tout, tsnd, trcv;

   // create a new stream socket
   if ((sock = socket(AF_INET, SOCK_STREAM, 0)) < 0) perror("failed to create socket");
   else {          
      // enable the socket to reuse the address
      if (setsockopt(sock, …
Run Code Online (Sandbox Code Playgroud)

c sockets timeout setsockopt

4
推荐指数
1
解决办法
2万
查看次数

SO_REUSEADDR的目的是什么?

我试图理解一个多播代码,我不明白一小部分的实用程序:

int fd_socket = socket(AF_INET, SOCK_DGRAM, 0);
u_int yes = 1;

setsockopt(fd_socket, SOL_SOCKET, SO_REUSEADDR, &yes, sizeof(yes));
Run Code Online (Sandbox Code Playgroud)

我不明白该setsockopt功能的实用程序.我知道这个函数允许修改内核中的套接字,SOL_SOCKET因为我的修改是关于套接字的级别而不是协议级别.我不明白SO_REUSEADDR.

c sockets multicast setsockopt

4
推荐指数
1
解决办法
1728
查看次数

如何使用 C++ 代码中的 setsockopt() 调用更改 TCP 拥塞控制算法

是否可以使用Linux 中C++ 代码中的setsockopt调用来更改TCP 拥塞控制算法,Cubic反之亦然? 我正在寻找这样做的示例代码。Reno

sockets linux tcp congestion-control setsockopt

4
推荐指数
1
解决办法
5029
查看次数

如何在 Perl 的套接字上设置`SO_RCVTIMEO`?

如果我这样尝试:

my $sock = IO::Socket::INET->new( … )                    or die "no socket for you";
defined $sock->setsockopt(SOL_SOCKET, SO_RCVTIMEO, 30)   or die "setsockopt: $!";
Run Code Online (Sandbox Code Playgroud)

然后我的脚本因“setsockopt:[第 2 行] 处的无效参数”而死亡。在IO::Socketperlfunc豆荚不说,虽然perlfunc给出了一个例子TCP_NODELAY,这使它看起来像上面应该工作。

快速说明:我已经尽我所能回答了我自己的问题,但当然欢迎更好的答案。最明显的“更好”是它具有便携性,至少在 POSIX 机器上)

sockets perl setsockopt io-socket

2
推荐指数
1
解决办法
3915
查看次数