最近做的一个程序用到了IOCP通信模型,里面用到了setsockopt对套接字进行设置,看源代码的时候最setsockopt函数很不理解,看了msdn以后还是不太明白这个函数的用法,于是就到网上找了一个这个函数的用法,找到了下面的这篇文章,我觉得对setsockopt这个函数讲解的特别号,就转过来了,方便以后的查阅。。

1.closesocket(一般不会立即关闭而经历TIME_WAIT的过程)后想继续重用该socket:
BOOL  bReuseaddr=TRUE;
setsockopt(s,SOL_SOCKET  ,SO_REUSEADDR,(const char*)&bReuseaddr,sizeof(BOOL));

2.如果要已经处于连接状态的soket在调用closesocket后强制关闭,不经历
TIME_WAIT的过程:
BOOL  bDontLinger =  FALSE;
setsockopt(s,SOL_SOCKET,SO_DONTLINGER,(const  char*)&bDontLinger,sizeof(BOOL));

3.在send(),recv()过程中有时由于网络状况等原因,发收不能预期进行,而设置收发时限:
int  nNetTimeout=1000;//1秒
//发送时限
setsockopt(socket,SOL_S0CKET,SO_SNDTIMEO,(char  *)&nNetTimeout,sizeof(int));
//接收时限
setsockopt(socket,SOL_S0CKET,SO_RCVTIMEO,(char  *)&nNetTimeout,sizeof(int));

4.在send()的时候,返回的是实际发送出去的字节(同步)或发送到socket缓冲区的字节
(异步);系统默认的状态发送和接收一次为8688字节(约为8.5K);在实际的过程中发送数据
和接收数据量比较大,可以设置socket缓冲区,而避免了send(),recv()不断的循环收发:
// 接收缓冲区
int  nRecvBuf=32*1024;//设置为32K
setsockopt(s,SOL_SOCKET,SO_RCVBUF,(const  char*)&nRecvBuf,sizeof(int));
//发送缓冲区
int  nSendBuf=32*1024;//设置为32K
setsockopt(s,SOL_SOCKET,SO_SNDBUF,(const  char*)&nSendBuf,sizeof(int));

5.如果在发送数据的时,希望不经历由系统缓冲区到socket缓冲区的拷贝而影响
程序的性能:
int  nZero=0;
setsockopt(socket,SOL_S0CKET,SO_SNDBUF,(char  *)&nZero,sizeof(nZero));

6.同上在recv()完成上述功能(默认情况是将socket缓冲区的内容拷贝到系统缓冲区):
int  nZero=0;
setsockopt(socket,SOL_S0CKET,SO_RCVBUF,(char  *)&nZero,sizeof(int));

7.一般在发送UDP数据报的时候,希望该socket发送的数据具有广播特性:
BOOL  bBroadcast=TRUE;
setsockopt(s,SOL_SOCKET,SO_BROADCAST,(const  char*)&bBroadcast,sizeof(BOOL));

8.在client连接服务器过程中,如果处于非阻塞模式下的socket在connect()的过程中可
以设置connect()延时,直到accpet()被呼叫(本函数设置只有在非阻塞的过程中有显著的
作用,在阻塞的函数调用中作用不大)
BOOL  bConditionalAccept=TRUE;
setsockopt(s,SOL_SOCKET,SO_CONDITIONAL_ACCEPT,(const  char*)&bConditionalAccept,sizeof(BOOL));

9.如果在发送数据的过程中(send()没有完成,还有数据没发送)而调用了closesocket(),以前我们
一般采取的措施是"从容关闭"shutdown(s,SD_BOTH),但是数据是肯定丢失了,如何设置让程序满足具体
应用的要求(即让没发完的数据发送出去后在关闭socket)?
struct  linger {
u_short l_onoff;
u_short l_linger;
};
linger  m_sLinger;
m_sLinger.l_onoff=1;//(在closesocket()调用,但是还有数据没发送完毕的时候容许逗留)
// 如果m_sLinger.l_onoff=0;则功能和2.)作用相同;
m_sLinger.l_linger=5;//(容许逗留的时间为5秒)
setsockopt(s,SOL_SOCKET,SO_LINGER,(const  char*)&m_sLinger,sizeof(linger));

SO_LINGER

此选项指定函数close对面向连接的协议如何操作(如TCP)。缺省close操作是立即返回,如果有数据残留在套接口缓冲区中则系统将试着将这些数据  发送给对方。

SO_LINGER选项用来改变此缺省设置。使用如下结构:

struct linger  {

int l_onoff;

int l_linger;

};

有下列三种情况:

l_onoff为0,则该选项关闭,l_linger的值被忽略,等于缺省情况,close立即返回;

l_onoff为非0,l_linger为0,则套接口关闭时TCP夭折连接,TCP将丢弃保留在套接口发送缓冲区中的任何数据并发送一个RST  给对方,而不是通常的四分组终止序列,这避免了TIME_WAIT状态;

udp丢包解决办法 (没打开接收发送缓存)及setsockopt()用法 -转相关推荐

  1. Linux系统 UDP 丢包问题分析思路和修改网卡缓存

    最近工作中遇到某个服务器应用程序 UDP 丢包,在排查过程中查阅了很多资料,我在排查过程中基本都是通过使用 tcpdump 在出现问题的各个环节上进行抓包.分析在那个环节出现问题.针对性去排查解决问题 ...

  2. udp丢包原因和解决

    一.主要丢包原因 1.接收端处理时间过长导致丢包:调用recv方法接收端收到数据后,处理数据花了一些时间,处理完后再次调用recv方法,在这二次调用间隔里,发过来的包可能丢失.对于这种情况可以修改接收 ...

  3. udp丢包 又是udp丢包

    自己在做UDP传输时遇到的问题,接收端没设置缓存,结果总是丢包. 看到这篇文章设置了一下接收缓存就好 int nRecvBuf=32*1024;//设置为32K setsockopt(s,SOL_SO ...

  4. java中的udp丢包_udp丢包 处理

    什么会导致udp丢包呢,我这里列举了如下几点原因: 1.调用recv方法接收端收到数据后,处理数据花了一些时间,处理完后再次调用recv方法,在这二次调用间隔里,发过来的包可能丢失.对于这种情况可以修 ...

  5. linux下udp丢包和传输延迟,如何测试UDP数据包的丢包率和延迟

    iperf也可以用于UDP数据包吞吐量.丢包率和延迟指标,但是由于UDP协议是一个非面向连接的轻量级传输协议,并且不提供可靠的数据传输服务,因此对UDP应用的关注点不是传输数据有多快,而是它的丢包率和 ...

  6. linux 系统 UDP 丢包问题分析思路

    转自:http://cizixs.com/2018/01/13/linux-udp-packet-drop-debug?hmsr=toutiao.io&utm_medium=toutiao.i ...

  7. java udp丢包_linux 系统 UDP 丢包问题分析思路

    最近工作中遇到某个服务器应用程序 UDP 丢包,在排查过程中查阅了很多资料,总结出来这篇文章,供更多人参考. 在开始之前,我们先用一张图解释 linux 系统接收网络报文的过程. ●  首先网络报文通 ...

  8. winxp系统连接服务器丢包解决方法

    winxp系统连接服务器丢包解决方法 MFC编写一个打开网页的程序,发生异常没有获取到数据. 分析步骤: 1. 用getLastError()获取到的信息,(2)- 系统找不到指定的文件. 2. 用浏 ...

  9. idea 2020 2021 maven不能下载jar包解决办法

    idea 2020 2021 maven不能下载jar包解决办法 只需简单步骤就可以解决 打开idea 选择pom文件 右键 maven 选择 open 'settings.xml' 打开 修改mir ...

最新文章

  1. 如果卷积神经网络存在根本性的缺陷,你会怎么看?
  2. VC++ 定时器基本使用
  3. 李宏毅深度学习作业二
  4. 威联通nas怎么更换大硬盘_QNAP NAS在线RAID组态迁移及在线RAID容量扩充教程
  5. mongodb 入门笔记
  6. java钱_在Java中如何表示钱Money?
  7. SQL语句学习指南 - 教程书籍
  8. android手机黑科技软件,安卓党福利!10款黑科技APP,让你的手机更好用
  9. 关于粒子群算法的两种惯性权重
  10. C语言坐标打飞机,C语言实现打飞机小游戏
  11. c语言编程最大公约数教程说明,C语言:最大公约数。
  12. jsoup的简单实用兼谈一个简单的汇率查询(原创)
  13. TMOS系统之NATS 和 SNAT
  14. 图像处理与计算机视觉:2D射影变换
  15. 九宫格游戏(三阶积幻方)
  16. c语言读取一行的前几个字符串,c语言读取文件某一列 c语言 读取文件中某一行的前一行...
  17. Appium 服务器初始化参数(Capability)
  18. PHP中播放音乐代码
  19. JSP的优势和劣势 与php的比较
  20. iOS开发技巧:设置App icon图标及修改应用程序名

热门文章

  1. 揭露一种通过网络实施ATM诈骗的手段!
  2. 荷花用计算机怎么画,怎样画荷花荷叶简笔画
  3. 大学计算机基础数据库知识点,大学计算机基础试题(数据库)
  4. OBJ文件格式分析工具: objdump, nm,ar
  5. Android_Bitmap_图片的二次采样并生成缩略图
  6. 让Spring 3中jsp的数据对象使用懒加载(FetchType.LAZY)与Controller的JSR 303并存
  7. 阿里开源 iOS 协程开发框架 coobjc源码分析
  8. Java8 本地DateTime API
  9. 过剩通勤应用——线性规划问题解决开源工具(下篇)
  10. 使用python标准库urllib2访问网页