我想我理解该选项的正式含义.在我正在处理的一些遗留代码中,使用了该选项.客户抱怨RST作为对其接近的连接的FIN的回应.
我不确定我是否可以安全地将其删除,因为我不明白何时应该使用它.
能否举例说明何时需要该选项?
从手册页:
SO_REUSEADDR指定在验证提供给bind()的地址时使用的规则应该允许重用本地地址(如果协议支持的话).此选项采用int值.这是一个布尔选项
我应该什么时候使用它?为什么"重用本地地址"给出了?
在IPv6网络中,IPV6_V6ONLY标志用于确保套接字仅使用IPv6,特别是IPv4-to-IPv6映射不会用于该套接字.在许多操作系统上,IPV6_V6ONLY默认情况下未设置,但在某些操作系统(例如Windows 7)上,默认情况下会设置.
我的问题是:引入这面旗帜的动机是什么?是否存在导致问题的IPv4-to-IPv6映射,因此人们需要一种方法来禁用它?在我看来,如果有人不想使用IPv4到IPv6的映射,他们可能根本就没有指定IPv4映射的IPv6地址.我在这里错过了什么?
我试图通过设置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)
}
我使用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) 我有一个代码,其中发送多播数据报.一段重要的代码:
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) 我正在运行一个运行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中窗口协商中出现的内容.
任何输入都表示赞赏.
我无法理解以下代码段的工作方式和原因:
/* 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的事实没有任何影响吗?如果确实如此,究竟发生了什么?某种碎片?
更新:如果套接字处于非阻塞模式会发生什么?我尝试了以下方法:
再一次,为什么?
我正在用 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) 我在理解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超时?