udp sendto SO_SNDBUF select 关系梳理

everysmile 2016-05-08 07:32:42
最近做了一个试验,其中有些现象理解不了,求高人指点:

主要代码片段如下:
sockfd = socket(AF_INET,SOCK_DGRAM, IPPROTO_UDP); //创建UDP Socket
fcntl(sockfd,F_SETFL,O_NONBLOCK); //设置Socket为非阻塞模式
int iSize = 2 *1024 //测试内容
setsockopt(sockfd,SOL_SOCKET,SO_SNDBUF, &iSize, sizeof(iSize);//设置SNDUBF
FD_SET(sockfd,wfdset);
while(1)
{
iRet = select(sockfd+1, NULL, wfdset, NULL,0 ); //select超时时间设置为0
if(iRet > 0)
{
if(FD_ISSET(sockfd,&sockfd))
{
iRet = sendto(sockfd,snd_buffer,1440,(sockaddr *)&addrSrv, len) //发送数据,snd_buffer的长度设置为1440
}
}
else
{
printf("select failed: %d.\n", iRet);
}

}

测试平台为Ubuntu12.04,查看系统SO_SNDBUF的值设置为 24000000

测试了iSize以下几种设置情况:
1)当iSize设置为 2*1024时,select会有时出现超时返回,也即不会执行后续的sendto发包操作;
2)当iSize设置为16 * 1024 * 1024时,select不会出现超时返回的情况,也即会每次循环都执行后续的sendto发包操作;
3)当不额外的设置SO_SNDBUF时,也即注释掉
//setsockopt(sockfd,SOL_SOCKET,SO_SNDBUF, &iSize, sizeof(iSize);//设置SNDUBF
时,select也会有时出现超时返回,也即不会执行后续的sendto发包操作;

在网上查到很多种版本,有说sendto函数不会阻塞的,有说sendto函数会阻塞的,有说select对sendto函数不起作用的,也有说起作用的,请高人帮忙指点一下:
1)sendto函数会阻塞么?
2)socke设置为非阻塞时,为什么不同的SO_SNDBUF设置会影响select函数的执行情况,也即测试出现的现象:SO_SNDBUF设置比较大的时候,select不会出现超时返回,SO_SNDBUF设置比较小的时候,select会出现超时返回,这里面的原因是什么,存在什么样的关系?
...全文
233 回复 打赏 收藏 转发到动态 举报
写回复
用AI写文章
回复
切换为时间正序
请发表友善的回复…
发表回复

1,738

社区成员

发帖
与我相关
我的任务
社区描述
网络协议与配置相关内容讨论专区
网络协议网络安全tcp/ip 技术论坛(原bbs)
社区管理员
  • 网络协议与配置社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧