setsockopt不';t使用SO_RCVBUF递减和TCP_QUICKACK

setsockopt不';t使用SO_RCVBUF递减和TCP_QUICKACK,c,linux,sockets,tcp,setsockopt,C,Linux,Sockets,Tcp,Setsockopt,我有一个简单的TCP客户机-服务器示例。仅用于接收数据的服务器。服务器端逻辑是: #define LISTEN_PORT 31337 #define BUFFER_SIZE 4096 //#define QUICKACK void main () { int buflen = 6000, opt_val = 1; int server_fd, client_fd, err; struct sockaddr_in server, client; char

我有一个简单的TCP客户机-服务器示例。仅用于接收数据的服务器。服务器端逻辑是:

#define LISTEN_PORT 31337
#define BUFFER_SIZE 4096
//#define QUICKACK

void main () {
     int buflen = 6000, opt_val = 1;
     int server_fd, client_fd, err;
     struct sockaddr_in server, client;
     char buf[BUFFER_SIZE] = {0};

     server_fd = socket(AF_INET, SOCK_STREAM, 0);
     if (server_fd < 0) {
          perror("SOCKET");
          return;
     }

     server.sin_family = AF_INET;
     server.sin_port = htons(LISTEN_PORT);
     server.sin_addr.s_addr = htonl(INADDR_ANY);

     if (setsockopt(server_fd, SOL_SOCKET, SO_REUSEADDR, &opt_val, sizeof opt_val) < 0) {
          perror ("SETSOCKOPT");
          return;
     }

     if (bind(server_fd, (struct sockaddr *) &server, sizeof(server)) < 0) {
          perror("BIND");
          return;
     }

     if (listen(server_fd, 128)) {
          perror("LISTEN");
          return;
     }

     printf("Server is listening on %d\n", LISTEN_PORT);

     for(;;) {
          socklen_t client_len = sizeof(client);
          client_fd = accept(server_fd, (struct sockaddr *) &client, &client_len);
          if (client_fd < 0) {
               perror("ACCEPT");
               return;
          }

          if (setsockopt(client_fd, SOL_SOCKET, SO_RCVBUF, &buflen, sizeof(int)) < 0) {
               perror ("SETSOCKOPT");
               return;
          }

#ifdef QUICKACK
          if (setsockopt(client_fd, IPPROTO_TCP, TCP_QUICKACK, (int[]){1}, sizeof(int)) < 0) {
               perror ("SETSOCKOPT");
               return;
          }
#endif

          for (;;) {
               int read = recv(client_fd, buf, BUFFER_SIZE, 0);
#ifdef QUICKACK
               if (setsockopt(client_fd, IPPROTO_TCP, TCP_QUICKACK, (int[]){1}, sizeof(int)) < 0) {
                    perror ("SETSOCKOPT");
                    return;
               }
#endif

               if (!read) break;
               if (read < 0)
                    perror("READ");
               printf("%s\n", buf);
          }
     }
     return;
}
#定义侦听端口31337
#定义缓冲区大小4096
//#定义快速ack
空干管(){
int buflen=6000,opt_val=1;
int server_fd、client_fd、err;
服务器、客户端中的结构sockaddr_;
char buf[BUFFER_SIZE]={0};
服务器\u fd=socket(AF\u INET,SOCK\u STREAM,0);
如果(服务器\u fd<0){
佩罗(“插座”);
返回;
}
server.sinu family=AF\u INET;
server.sin\u port=htons(侦听\u端口);
server.sin_addr.s_addr=htonl(INADDR_ANY);
if(setsockopt(服务器fd、SOL_套接字、SO_REUSEADDR和opt_val、opt_val的大小)<0){
perror(“SETSOCKOPT”);
返回;
}
if(bind(server_fd,(struct sockaddr*)&server,sizeof(server))<0){
佩罗(“绑定”);
返回;
}
如果(侦听(服务器\u fd,128)){
佩罗尔(“倾听”);
返回;
}
printf(“服务器正在侦听%d\n”,侦听\u端口);
对于(;;){
socklen_u t client_len=sizeof(客户);
client\u fd=accept(server\u fd,(struct sockaddr*)与client和client\u len);
如果(客户端\u fd<0){
佩罗(“接受”);
返回;
}
if(setsockopt(客户端fd、SOL_套接字、SO_RCVBUF和buflen、sizeof(int))小于0){
perror(“SETSOCKOPT”);
返回;
}
#ifdef快速应答
if(setsockopt(client_fd,IPPROTO_TCP,TCP_QUICKACK,(int[]){1},sizeof(int))<0){
perror(“SETSOCKOPT”);
返回;
}
#恩迪夫
对于(;;){
int read=recv(客户端fd、buf、缓冲区大小,0);
#ifdef快速应答
if(setsockopt(client_fd,IPPROTO_TCP,TCP_QUICKACK,(int[]){1},sizeof(int))<0){
perror(“SETSOCKOPT”);
返回;
}
#恩迪夫
如果(!读取)中断;
如果(读取<0)
佩罗(“阅读”);
printf(“%s\n”,buf);
}
}
返回;
}
然后我连接到客户端或
nc
,在
tcpdump
中看到一些奇怪的行为,比如:

[SYN,ACK]赢得43690


recv()???如果这是您的实际代码,那么您正在调用未定义的行为。如果这不是您的实际代码,请发布您的实际代码。阅读文档。您提供的缓冲区大小是一个提示。实现可以向上或向下调整它。为什么要减小套接字接收缓冲区的大小?1024在30年前就被认为太小了。@user207421我想减少,只是为了测试。你能给我一个链接吗?手册页中没有任何提示。快速确认有什么问题吗?这也是一个暗示吗?请看man 7 tcp.friendly和蔼可亲的评论:@user207421您能解释一下
对tcp窗口大小的影响吗?