九、套接字的多种可选项

本文介绍了套接字的可选项,包括控制I/O缓冲大小的方法,如设置SORCVBUF和SO_SNDBUF,以及如何查看和修改缓冲区大小。接着详细讨论了SO_REUSEADDR选项,解释了Time-wait状态的重要性及其在网络通信中的作用。最后,阐述了TCP_NODELAY选项,分析了Nagle算法在TCP通信中的应用及其优缺点,并说明了如何控制Nagle算法的使用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

控制I/O缓冲大小的可选项

1. 选项的操作函数

具体的套接字选项,这里不好展开,可以自行去查,主要介绍选项的操作函数

getsocketopt(获取选项参数的函数)&&setsocketopt(设置选项参数的函数)
//getsocketopt
#include<sys/socket.h>
int getsocketopt(int sock,int level,int optname,void *optval,socklen_t *optlen);
//sock  用于查看选项套接字文件描述符。
//level 要查看的可选项的协议层
//optname 要查看的可选项名
//optval 保存要查看结果的缓冲地址值
//optlen  向第四个参数optval传递的缓冲大小。该函数调用之后,该变量中保存通过第四个参数返回的可选项信息的字节数
//setsocketopt
#include<sys/socket.h>
int setsockopt(int sock, int level, int optname, const void *optval, socklen_t optlen);
//sock  用于更改可选项的套接字文件描述符
//level 要更改的可选项协议层
//optname 要更改的可选项名
//optval  保存要更改的选项信息的缓冲地址值。
//optlen  向第四个参数optval传递的可选项信息的字节数

测试程序

#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
#include<sys/socket.h>
void error_handling(char *message);
int main(int argc,char* argv[])
{
   
   
  int tcp_sock,udp_sock;
  int sock_type;
  socklen_t optlen;
  int state;
  optlen=sizeof(sock_type);
  tcp_sock=socket(PF_INET,SOCK_STREAM,0);
  udp_sock=socket(PF_INET,SOCK_DGRAM,0);
  printf("SOCK_STREAM:%d \n",SOCK_STREAM);
  printf("SOCK_DGRAM:%d  \n",SOCK_DGRAM);
  state=getsockopt(tcp_sock,SOL_SOCKET,SO_TYPE,(void*)&sock_type,&optlen);
  if(state)error_handling("getsockopt error");
  printf("socket type one:%d  \n",sock_type);
  state=getsockopt(udp_sock,SOL_SOCKET,SO_TYPE,(void*)&sock_type,&optlen);
  if(state)error_handling("getsockopt error");
  printf("socket type two:%d  \n",sock_type);
  return 0;
}
void error_handling(char *message)
{
   
   
    fputs(message,stderr);
    fputc('\n',stderr);
    exit(1);
}

测试结果

SOCK_STREAM:1 
SOCK_DGRAM:2  
socket type one:1   //获取成功
socket type two:2   //获取成功

注意:

套接字类型只能在创建时决定,以后不能进行修改。

2. 设置缓冲区大小

之前说过,在建立套接字的过程当中也会同时生成I/O缓冲,SORCVBUF是输入缓冲大小相关可选项,SO_SNDBUF是输出缓冲大小相关可选项。这两个选项可以查看并修改缓冲区大小。我们通过上一节的选项操作函数对这两个选项进行查看以及修改达到对缓冲区的查看与修改。

测试程序

  1. 获取缓冲区大小
//get_size.c
#include<stdio.h>
#include<stdlib.h>
#include <unistd.h>
#include <sys/socket.h>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值