文章目录
控制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是输出缓冲大小相关可选项。这两个选项可以查看并修改缓冲区大小。我们通过上一节的选项操作函数对这两个选项进行查看以及修改达到对缓冲区的查看与修改。
测试程序
- 获取缓冲区大小
//get_size.c
#include<stdio.h>
#include<stdlib.h>
#include <unistd.h>
#include <sys/socket.h>