标签: setsockopt

TCP选项SO_LINGER(零) - 何时需要

我想我理解该选项的正式含义.在我正在处理的一些遗留代码中,使用了该选项.客户抱怨RST作为对其接近的连接的FIN的回应.

我不确定我是否可以安全地将其删除,因为我不明白何时应该使用它.

能否举例说明何时需要该选项?

sockets networking tcp setsockopt so-linger

84
推荐指数
4
解决办法
12万
查看次数

SO_REUSEADDR(setsockopt选项)是什么意思 - Linux?

从手册页:

SO_REUSEADDR指定在验证提供给bind()的地址时使用的规则应该允许重用本地地址(如果协议支持的话).此选项采用int值.这是一个布尔选项

我应该什么时候使用它?为什么"重用本地地址"给出了?

sockets linux port ip-address setsockopt

57
推荐指数
3
解决办法
6万
查看次数

添加IPV6_V6ONLY标志的动机是什么?

在IPv6网络中,IPV6_V6ONLY标志用于确保套接字仅使用IPv6,特别是IPv4-to-IPv6映射不会用于该套接字.在许多操作系统上,IPV6_V6ONLY默认情况下未设置,但在某些操作系统(例如Windows 7)上,默认情况下会设置.

我的问题是:引入这面旗帜的动机是什么?是否存在导致问题的IPv4-to-IPv6映射,因此人们需要一种方法来禁用它?在我看来,如果有人不想使用IPv4到IPv6的映射,他们可能根本就没有指定IPv4映射的IPv6地址.我在这里错过了什么?

networking ipv6 setsockopt

23
推荐指数
3
解决办法
1万
查看次数

在Ubuntu上找不到TCP_NODELAY

我试图通过设置TCP_NODELAY参数在Ubuntu Linux机器上使用我的TCP套接字禁用Nagle算法.由于某种原因,此常量未在或中定义.这个常量是否已被弃用,然后从Linux中删除,或者我只是遗漏了什么?<sys/types.h><sys/socket.h>

bool Socket::setTCPNoDelay(bool enabled)
{

    int flag = (enabled ? 1 : 0);

    if(setsockopt(m_sock,IPPROTO_TCP,TCP_NODELAY,(char *)&flag,sizeof(flag)) == -1)
    {
         return false;
    }

    return true;
Run Code Online (Sandbox Code Playgroud)

}

c++ sockets setsockopt

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

使用urllib2加载URL时如何设置TCP_NODELAY标志?

我使用urllib2加载网页,我的代码是:

httpRequest = urllib2.Request("http:/www....com")
pageContent = urllib2.urlopen(httpRequest)
pageContent.readline()
Run Code Online (Sandbox Code Playgroud)

如何获取要设置的套接字属性TCP_NODELAY

在普通的套接字我会使用函数:

socket.setsockopt(socket.IPPROTO_TCP, socket.TCP_NODELAY, 1)
Run Code Online (Sandbox Code Playgroud)

python sockets urllib2 setsockopt urlopen

13
推荐指数
2
解决办法
8667
查看次数

调用setsockopt时出错"No such device"

我有一个代码,其中发送多播数据报.一段重要的代码:

uint32_t port;
int sockfd, err_ip;
const uint32_t sizebuff = 65535 - (20 + 8);
unsigned char *buff = (unsigned char *) malloc(sizebuff);
struct sockaddr_in servaddr, cliaddr;
struct in_addr serv_in_addr;
struct ip_mreq req;

port = str2uint16(cmdsrv->ipport);
bzero(buff, (size_t)sizebuff);
bzero(&servaddr, sizeof(servaddr));
bzero(&serv_in_addr, sizeof(serv_in_addr));
err_ip = inet_aton(cmdsrv->ipaddr, &serv_in_addr);

if(( err_ip != 0 ) && ( port != 0 )) {
   servaddr.sin_family = AF_INET;
   servaddr.sin_addr = serv_in_addr;
   servaddr.sin_port = htons(port);
   memcpy(&req.imr_multiaddr,&serv_in_addr,sizeof(req.imr_multiaddr));
   req.imr_interface.s_addr = INADDR_ANY;
   sockfd = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);

   if( sockfd == -1 …
Run Code Online (Sandbox Code Playgroud)

c sockets udp multicast setsockopt

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

在C中设置TCP接收窗口并在Linux中使用tcpdump

我正在运行一个运行2.6.9-55.ELsmp,x86_64的Linux机器.

我正在尝试使用C使用setsockopt()函数设置TCP接收窗口.我尝试以下操作:

rwnd = 1024;
setsockopt(sock, SOL_SOCKET, SO_RCVBUF, (char *)&rwnd, sizeof(rwnd));
Run Code Online (Sandbox Code Playgroud)

上面的代码段位于从服务器接收数据的客户端程序中.当我启动程序接收并观察tcpdump输出时,我会观察窗口协商,如下所示:

11:34:40.257755 IP clientReceiver.42464 > serverSender.8991: 
S 1742042788:1742042788(0) win 5840 
<mss 1460,sackOK,timestamp 1688222886 0,nop,wscale 2>
Run Code Online (Sandbox Code Playgroud)

我们看到客户端程序实际上正在协商一个与我在客户端程序中设置的窗口不同的窗口.但是,从我如何解释Steven的文本("TCP/IP Illustrated,第1卷")第20.4节开始,我相信你使用我使用的setsockopt()调用来影响他在第20.4节的第二个块引用中引用的内容(见上文) ).

我想知道我哪里出错了.

也许我对史蒂文斯所说的话的解释是错误的.在这种情况下,你能指出我设置接收缓冲区大小的正确方法吗?为了证明我的困惑,我在http://linux.die.net/man/7/tcp上提到Linux TCP套接字手册页(请参阅SO_RCFBUF上的评论).

我在这个故事里想念的是什么?如何控制接收缓冲区大小(并将其显示在tcpdump输出中)?请注意,我在这里提到套接字选项SO_RCFBUF的设置 - 我理解这是SYN中窗口协商中出现的内容.

任何输入都表示赞赏.

c linux tcp tcpdump setsockopt

10
推荐指数
1
解决办法
7072
查看次数

SO_SNDBUF的影响

我无法理解以下代码段的工作方式和原因:

    /* Now lets try to set the send buffer size to 5000 bytes */
    size = 5000;
    err = setsockopt(sockfd, SOL_SOCKET, SO_SNDBUF,  &size, sizeof(int));
    if (err != 0) {
        printf("Unable to set send buffer size, continuing with default size\n");
    }
Run Code Online (Sandbox Code Playgroud)

如果我们检查发送缓冲区的值,它确实正确设置为5000*2 = 10000.但是,如果我们尝试发送超过发送缓冲区大小,它会发送所有它.例如:

    n = send(sockfd, buf, 30000, 0);

    /* Lets check how much us actually sent */
    printf("No. of bytes sent is %d\n", n);
Run Code Online (Sandbox Code Playgroud)

这打印出30000.

这究竟是如何工作的?发送缓冲区大小限制为10000的事实没有任何影响吗?如果确实如此,究竟发生了什么?某种碎片?

更新:如果套接字处于非阻塞模式会发生什么?我尝试了以下方法:

  1. 将缓冲区大小更改为10000(5000*2)会导致发送16384个字节
  2. 将缓冲区大小更改为20000(10000*2)会导致发送30000个字节

再一次,为什么?

c sockets linux setsockopt

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

套接字编程-setsockopt:协议不可用?

我正在用 C 进行一些基本的套接字编程,并且在我尝试运行代码的每台计算机上都遇到了这个错误。代码编译得很好,但是当我尝试运行它时,我收到错误 setsockopt: 协议不可用。这似乎不是一个很常见的错误,但我在每台尝试运行它的计算机上都会遇到它。所有的电脑都是MacOS。

#include <unistd.h> 
#include <stdio.h> 
#include <sys/socket.h> 
#include <stdlib.h> 
#include <netinet/in.h> 
#include <string.h> 
#define PORT 8080 
int main(int argc, char const *argv[]) 
{ 
    int server_fd, new_socket, valread; 
    struct sockaddr_in address; 
    int opt = 1; 
    int addrlen = sizeof(address); 
    char buffer[1024] = {0}; 
    char *hello = "Hello from server"; 

    // Creating socket file descriptor 
    if ((server_fd = socket(AF_INET, SOCK_STREAM, 0)) == 0) 
    { 
        perror("socket failed"); 
        exit(EXIT_FAILURE); 
    } 

    // Forcefully attaching socket to the port 8080 
    if (setsockopt(server_fd, …
Run Code Online (Sandbox Code Playgroud)

c sockets networking network-programming setsockopt

8
推荐指数
1
解决办法
5405
查看次数

如何在非阻塞套接字上发送超时?

我在理解Linux中套接字的工作方面遇到了一些问题.

setsockopt(sockfd, SOL_SOCKET, SO_SNDTIMEO, &timeout, sizeof(int));
write = write(sockfd, buf, len);
Run Code Online (Sandbox Code Playgroud)

在上面的代码中,写入被缓冲,发送超时没有任何意义(当用户空间缓冲区被复制到内核缓冲区时,写入系统调用将立即返回).发送缓冲区大小是更重要的参数,但发送超时似乎没有什么值得的.但我当然错了,因为我已经看到了很多使用SO_SNDTIMEO的代码.假设接收器非常慢,用户空间代码如何使用SO_SNDTIMEO超时?

sockets network-programming setsockopt

7
推荐指数
2
解决办法
9987
查看次数