linux udp socket如何不等包,立马发送一个包?

yby1231 2018-07-01 03:36:14
各位高手,请教问题。小弟初学linux socket网络编程。在实现一个算法,算法要求是发送udp(1472字节)报文,严格控制每个udp发送时间。举个例子就是t1时间发送udp1,t2时间发送udp2,t3时间发送udp3。。。。差不多会发送几百个包,t1,t2,t3之间的时间间隔是我(算法)严格控制的。先不考虑系统调用对时间造成的干扰(在底层发包当然最快最准)。

我想要达到的效果是应用程序一个包发完,再发第二个包。。。第三个,第四个。但是上网了解到系统会自主等包,意思就是我虽然调用write函数发第一个包,但是其实包在内核里(或者什么其他地方或者网卡那)不是立马发走,会等一段时间,然后一起发出去。(原因是不想浪费资源,一个包发一次调度一次太耗资源)。

比如举个例子假设系统是每三秒发一次包。我1s钟的时候调write函数发第一个包,2s钟时调write函数发第二个包,3s钟调用write函数发第三个udp包。但是其实在系统里,第一次调write后1号包在等2号包和3号包到了然后一起扔出去(因为等3s发一次。)。这就导致不是我想要的发包时间顺序。1号包和2,3号包的发送时间是一样的实际上。然后我统计时间戳也是一号包到达对端的时间最长,2号包3号包其次。而且每次都是这个结果。也印证了1号包在等2,3号包

有没有什么方法可以让系统不等包,立马发? 上网查了1.调用fflush函数,说是可以立马发送不等包。fflush(FILE * stream)函数如何跟udp socket接口配合用起来?貌似是写文件I/O时才能用的fflush函数。这个方法可行吗?fflush函数如何和socket一起用?2.上网还搜到了关闭GSO功能,到底哪个比较好比较合适?谢谢大家!
...全文
802 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
danscort2000 2018-07-10
  • 打赏
  • 举报
回复
setsockopt(, ..SO_SNDBUF,..., 0) 是正解 , Linger等待好像是tcp的事情吧,udp没有等待一说,
就算其他进程也在使用udp发送,和 你的udp并不会冲突或在干扰, 每个 socket缓冲都是独立的 ,
你只要把发送缓冲设为0,那就是立即发送,当然有可能发送失败发不出去,检测返回值
反正缓冲为0,系统就会立即送到IP层,但是失败与否不可预测
yby1231 2018-07-03
  • 打赏
  • 举报
回复
引用 3 楼 VisualEleven 的回复:
setsockopt(, ..SO_SNDBUF,..., 0) ?
你说的这个buffer是内核发送的buffer吧,这样只是告诉socket立马把数据copy到内核协议栈发送buffer吧。具体内核等包发还是不等立马发,这两者是不是没有关系即setsockopt选项并没有实际产生效果,可以这么理解么?
yby1231 2018-07-03
  • 打赏
  • 举报
回复
引用 4 楼 jintiann 的回复:
fflush一般是在发前或者错误时这样用的较多,如果你希望每次直接发,应该去设置缓存区的大小,参考 三楼“Eleven版主”的回答。
你说的这个buffer是内核发送的buffer吧,这样只是告诉socket立马把数据copy到内核协议栈发送buffer吧。具体内核等包发还是不等立马发,这两者是不是没有关系即setsockopt选项并没有实际产生效果,可以这么理解么?
yby1231 2018-07-03
  • 打赏
  • 举报
回复
引用 4 楼 jintiann 的回复:
fflush一般是在发前或者错误时这样用的较多,如果你希望每次直接发,应该去设置缓存区的大小,参考 三楼“Eleven版主”的回答。


1 #include "unp.h"
2 void
3 str_echo(int sockfd)
4 {
5 char line[MAXLINE];
6 FILE *fpin, *fpout;
7 fpin = Fdopen(sockfd, "r");
8 fpout = Fdopen(sockfd, "w");
9 while (Fgets(line, MAXLINE, fpin) != NULL)
10 Fputs(line, fpout);
11 }

大概是上面这段代码的意思,一个简单的例子,我可以加个fflush(fpout);类似的东西。不知各位大侠明白我的意思么
jintiann 2018-07-03
  • 打赏
  • 举报
回复
fflush一般是在发前或者错误时这样用的较多,如果你希望每次直接发,应该去设置缓存区的大小,参考 三楼“Eleven版主”的回答。
Eleven 2018-07-02
  • 打赏
  • 举报
回复
setsockopt(, ..SO_SNDBUF,..., 0) ?
yby1231 2018-07-02
  • 打赏
  • 举报
回复
引用 1 楼 zhao4zhong1 的回复:
udp本来不就是基于包的协议吗?
是啊,是基于包的。我的意思是内核会等包聚包。怎么让内核不等包。
赵4老师 2018-07-02
  • 打赏
  • 举报
回复
udp本来不就是基于包的协议吗?

18,356

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 网络编程
c++c语言开发语言 技术论坛(原bbs)
社区管理员
  • 网络编程
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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