网络编程笔记——套接字可选项

转自 https://blog.csdn.net/wangdd_199326/article/details/76595293

套接字可选项

套接字具体多种特性,可通过可选项更改。

1 套接字可选项和I/O缓冲大小

SOL_LOCKET层是套接字相关的通用可选项

IPPROTO_IP层可选项是IP协议相关事项

IPPROTO_TCP层可选项是TCP协议相关事项

可选项的读取和设置通过如下两个函数完成


 
 
  1. #include<sys/socket.h>
  2. int getsockopt(int sock,int level,int optname,void *optval,socklen_t *optlen); //成功时返回0.失败时返回-1
sock用于查看选项套接字文件描述符

level 要查看的可选项的协议层

optname 要查看的可选项名

optval 保存查看结果的缓冲地址值

optlen 向第四个参数optval传递的缓冲大小。调用函数后,该变量中保存通过第四个参数返回的可选项信息的字节数



 
 
  1. #include<sys/socket.h>
  2. int setsockopt(int sock,int level,int optname,const void *optval,socklen_t *optlen); //成功时返回0.失败时返回-1

sock用于更改可选项套接字文件描述符

level 要更改的可选项的协议层

optname 要更改的可选项名

optval 保存要更改的选项信息的缓冲地址值

optlen 向第四个参数optval传递的可选项信息的字节数。


套接字类型类型只能在创建时觉得,以后不能再更改。

---------------------------------------------------------------------------------------------------------

创建套接字将同时生产I/O缓冲。

SO_RCVBUF是输入缓冲大小相关可选项,SO_SNDBUF的输出缓冲大小相关可选项。用这两个选项既可以读取当前I/O缓冲大小,也可以进行更改。

缓冲大小的设置需要谨慎处理,因为不会完全按照我们的要求进行,只是通过调用setsockopt函数向系统传递我们的要求。


2 SO_REUSEADDR

发生地震分配错误Binding Error

P146~P147程序学习:强制终止程序时,由操作系统关闭文件及套接字,此过程相当于调用close函数,也会向服务器端传递FIN消息。

1)在客户端控制台输入Q消息,或通过crtl+c终止程序。让客户端先通知服务器端终止程序,向服务器端发送FIN消息并经过四次握手过程,不会发生特别的事情。

2)服务器端和客户端已建立连接的状态下,向服务器端控制台输入CRTL+C,让服务器端先通知客户端终止程序,即强制关闭服务器端终止程序,那服务器端重新运行时将产生问题。若用同一端口号重新运行服务器端,将输出“bind() error”消息,并且无法再次运行。


Time-wait状态

套接字经过四次握手过程后并非立即清除,而是要经过一段时间的TIME_WAIT状态。只有先断开连接(先发送FIN消息)的主机才经过Time-wait状态。若服务器端先断开连接,则无法立即重新运行。套接字处在Time-wait过程时,相应端口是正在使用的状态。


不管是服务器端还是客户端,套接字都会有Time-wait状态。先断开连接的套接字必然经过Time-wait过程。但无需考虑客户端的Time-wait状态。因为客户端套接字的端口号是任意指定的。与服务器端不同,客户端每次运行程序时都会动态分配端口号,因此无需过多关注Time-wait状态


地址再分配

在主机A的四次握手过程中,如果最后的数据丢失,则主机B会认为A未收到自己发送的FIN消息,因此重转。这时,收到FIN消息的主机A将重启Time-wait计时器。因此,如果网络状况不理想,Time-wait状态将持续。

解决方案就是在套接字的可选项中更改SO_REUSEADDR的状态。适当调整该参数,可将Time-wait状态下的套接字端口号重新分配给新的套接字。SO_REUSEADDR的默认值是0,意味无法分配Time-wait状态下的套接字端口号。因此需要将这个值改为1.


3. TCP_NODELAY


Nagle算法为防止因数据包过多而发生网络过载。应用于TCP层,非常简单。

只有收到前一数据的ACK消息时,Nagle算法才发送下一数据。


TCP套接字默认使用Nagle算法交换数据,因此最大限度地进行缓冲,直到收到ACK。


不使用Nagle算法将对网络流量(Traffic:指网络负载或混杂程度)产生负面影响。为了提高网络传输效率,必须使用Nagle算法。


在程序中将字符串传给输出缓冲时并不是逐字传递的。

Nagle算法并不是什么时候都可以用,网络流量未受未受太大影响时,不使用Nagle算法要比使用它的传输速度快。最典型的就是“传输大文件数据”。将文件数据传入输出缓冲不会花太多时间,即使不用Nagle算法也会在装满输出缓冲时传输数据包。不仅不会增加数据包的数量,反而会在无需等待ACK的前提下连续传输,因此可以大大提高传输速度。


禁用Nagle算法

如果有必要就禁用Nagle算法。

Nagle算法使用与否在网络流量上差别不大,使用Nagle算法的传输速度更慢。


禁用方法,只需将套接字可选项TCP_NODELAY 改为1即可。


 
 
  1. int iot_val=1;
  2. int setsockopt(sock,IPPROTO_TCP,TCP_NODELAY,(void*)&opt_val,sizeof(opt_val);















  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值