免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1223 | 回复: 2

[C] UDP 为什么在不同内核版本表现出来的现象不同呢 [复制链接]

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
发表于 2015-05-13 08:03 |显示全部楼层
linux 上的UDP程序

在不同版本的内核上执行时,表现出来的现象不一样,估计是啥原因造成的呢?

程序执行后,应该表现如下;
PC端用网络助手持续发命令 A;UDP服务端,解析命令,并返回结果;PC发送频率是10ms,服务端处理一次指令要1s, 因此,在服务端会有很多条指令没有执行;此时,PC发命令B,应该立即将B命令对应结果返回给PC

在linux  内核版本,3.2.0上,没有问题,持续发A ,发一段时间后,切换为命令B,可以立即返回B的结果。

在linux内核版本为 2.6.8 ,3.5.x的内核上,就不能立即返回B对应的结果。总是要执行几条命令A的结果后,才能返回命令B的结果....,,感觉就是缓存几条上一个命令

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
发表于 2015-05-13 10:49 |显示全部楼层
现在试了三个版本的内核
2.6.8
3.2.0
3.5.x

程序分别在 2.6,3.2,3.5上编译, 编译过的文件,分别在 2.6;3.2;3.5上执行,只有在3.2上的执行结果是想要的结果
也就说,无论在哪个版本上编译的程序,在内核3.2上执行,结果是想要的
而无论在哪个版本上编译的程序,在3.2以为的内核上跑,结果都超出意外了...

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
发表于 2015-05-13 19:54 |显示全部楼层
经人提醒,查看内核,以SOCK_MIN_RCVBUF 为关键字,凡是有 SOCK_MIN_RCVBUF 关键字的文件都对比一遍

发现有差异:

3.2.0 与2.6.32的差异就在于,SOCK_MIN_RCVBUF 定义的大小
3.2.0与 3.5.0 的差异就在于,在ip_vs_sync.c文件中,3.2.0未做对SOCK_MIN_RCVBUF 的操作;3.5.0里对SOCK_MIN_RCVBUF 作了操作


  1. sock.h
  2. 3.2.0
  3. #define SOCK_MIN_RCVBUF (2048 + sizeof(struct sk_buff))
  4. 3.5.0
  5. #define SOCK_MIN_RCVBUF (2048 + sizeof(struct sk_buff))
  6. 2.6.32
  7. #define SOCK_MIN_RCVBUF 256

  8. Tcp.c

  9. 3.2.0
  10. case TCP_WINDOW_CLAMP:
  11.                 if (!val) {
  12.                         if (sk->sk_state != TCP_CLOSE) {
  13.                                 err = -EINVAL;
  14.                                 break;
  15.                         }
  16.                         tp->window_clamp = 0;
  17.                 } else
  18.                         tp->window_clamp = val < SOCK_MIN_RCVBUF / 2 ?
  19.                                                 SOCK_MIN_RCVBUF / 2 : val;
  20.                 break;

  21. 3.5.0
  22. case TCP_WINDOW_CLAMP:
  23.                 if (!val) {
  24.                         if (sk->sk_state != TCP_CLOSE) {
  25.                                 err = -EINVAL;
  26.                                 break;
  27.                         }
  28.                         tp->window_clamp = 0;
  29.                 } else
  30.                         tp->window_clamp = val < SOCK_MIN_RCVBUF / 2 ?
  31.                                                 SOCK_MIN_RCVBUF / 2 : val;
  32.                 break;


  33. 2.6.32
  34. case TCP_WINDOW_CLAMP:
  35.                 if (!val) {
  36.                         if (sk->sk_state != TCP_CLOSE) {
  37.                                 err = -EINVAL;
  38.                                 break;
  39.                         }
  40.                         tp->window_clamp = 0;
  41.                 } else
  42.                         tp->window_clamp = val < SOCK_MIN_RCVBUF / 2 ?
  43.                                                 SOCK_MIN_RCVBUF / 2 : val;
  44.                 break;






  45. Sock.c
  46. 3.2.0
  47. if ((val * 2) < SOCK_MIN_RCVBUF)
  48.                         sk->sk_rcvbuf = SOCK_MIN_RCVBUF;
  49.                 else
  50.                         sk->sk_rcvbuf = val * 2;
  51.                 break;
  52. 3.5.0
  53. sk->sk_rcvbuf = max_t(u32, val * 2, SOCK_MIN_RCVBUF);
  54.                 break;
  55. 2.6.32
  56. if ((val * 2) < SOCK_MIN_RCVBUF)
  57.                         sk->sk_rcvbuf = SOCK_MIN_RCVBUF;
  58.                 else
  59.                         sk->sk_rcvbuf = val * 2;
  60.                 break;



  61. ip_vs_sync.c
  62. 3.2.0
  63. //无 SOCK_MIN_RCVBUF内容
  64. 3.5.0
  65. static void set_sock_size(struct sock *sk, int mode, int val)
  66. {
  67.         /* setsockopt(sock, SOL_SOCKET, SO_SNDBUF, &val, sizeof(val)); */
  68.         /* setsockopt(sock, SOL_SOCKET, SO_RCVBUF, &val, sizeof(val)); */
  69.         lock_sock(sk);
  70.         if (mode) {
  71.                 val = clamp_t(int, val, (SOCK_MIN_SNDBUF + 1) / 2,
  72.                               sysctl_wmem_max);
  73.                 sk->sk_sndbuf = val * 2;
  74.                 sk->sk_userlocks |= SOCK_SNDBUF_LOCK;
  75.         } else {
  76.                 val = clamp_t(int, val, (SOCK_MIN_RCVBUF + 1) / 2,
  77.                               sysctl_rmem_max);
  78.                 sk->sk_rcvbuf = val * 2;
  79.                 sk->sk_userlocks |= SOCK_RCVBUF_LOCK;
  80.         }
  81.         release_sock(sk);
  82. }

  83. 2.6.32
  84. //无SOCK_MIN_RCVBUF内容
复制代码
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP