内核版本不一样,对网络程序有影响么?

色郎中 2015-05-12 10:15:57
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的结果....,,感觉就是缓存几条上一个命令


...全文
243 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
zuxi 2015-05-13
  • 打赏
  • 举报
回复
引用 2 楼 wanyeye 的回复:
[quote=引用 1 楼 wangzuxi 的回复:] 跟内核版本没关系,跟你的服务端实现有关系。
现在试了三个版本的内核 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以为的内核上跑,结果都超出意外了... [/quote] 你调试一下你的服务端程序,看看它收到命令B之后是立即返回还是执行A之后再执行B
qq_28176701 2015-05-13
  • 打赏
  • 举报
回复
[img=https://forum.csdn.net/PointForum/ui/scripts/csdn/Plugin/001/face/89.gif][/这样啊
色郎中 2015-05-13
  • 打赏
  • 举报
回复
引用 1 楼 wangzuxi 的回复:
跟内核版本没关系,跟你的服务端实现有关系。
现在试了三个版本的内核 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以为的内核上跑,结果都超出意外了...
色郎中 2015-05-13
  • 打赏
  • 举报
回复
经人提醒,查看内核,以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 作了操作


sock.h
3.2.0
#define SOCK_MIN_RCVBUF (2048 + sizeof(struct sk_buff))
3.5.0
#define SOCK_MIN_RCVBUF (2048 + sizeof(struct sk_buff))
2.6.32
#define SOCK_MIN_RCVBUF 256

Tcp.c

3.2.0
case TCP_WINDOW_CLAMP:
		if (!val) {
			if (sk->sk_state != TCP_CLOSE) {
				err = -EINVAL;
				break;
			}
			tp->window_clamp = 0;
		} else
			tp->window_clamp = val < SOCK_MIN_RCVBUF / 2 ?
						SOCK_MIN_RCVBUF / 2 : val;
		break;

3.5.0
case TCP_WINDOW_CLAMP:
		if (!val) {
			if (sk->sk_state != TCP_CLOSE) {
				err = -EINVAL;
				break;
			}
			tp->window_clamp = 0;
		} else
			tp->window_clamp = val < SOCK_MIN_RCVBUF / 2 ?
						SOCK_MIN_RCVBUF / 2 : val;
		break;


2.6.32
case TCP_WINDOW_CLAMP:
		if (!val) {
			if (sk->sk_state != TCP_CLOSE) {
				err = -EINVAL;
				break;
			}
			tp->window_clamp = 0;
		} else
			tp->window_clamp = val < SOCK_MIN_RCVBUF / 2 ?
						SOCK_MIN_RCVBUF / 2 : val;
		break;






Sock.c
3.2.0
if ((val * 2) < SOCK_MIN_RCVBUF)
			sk->sk_rcvbuf = SOCK_MIN_RCVBUF;
		else
			sk->sk_rcvbuf = val * 2;
		break;
3.5.0
sk->sk_rcvbuf = max_t(u32, val * 2, SOCK_MIN_RCVBUF);
		break;
2.6.32
if ((val * 2) < SOCK_MIN_RCVBUF)
			sk->sk_rcvbuf = SOCK_MIN_RCVBUF;
		else
			sk->sk_rcvbuf = val * 2;
		break;



ip_vs_sync.c
3.2.0
//无 SOCK_MIN_RCVBUF内容
3.5.0
static void set_sock_size(struct sock *sk, int mode, int val)
{
	/* setsockopt(sock, SOL_SOCKET, SO_SNDBUF, &val, sizeof(val)); */
	/* setsockopt(sock, SOL_SOCKET, SO_RCVBUF, &val, sizeof(val)); */
	lock_sock(sk);
	if (mode) {
		val = clamp_t(int, val, (SOCK_MIN_SNDBUF + 1) / 2,
			      sysctl_wmem_max);
		sk->sk_sndbuf = val * 2;
		sk->sk_userlocks |= SOCK_SNDBUF_LOCK;
	} else {
		val = clamp_t(int, val, (SOCK_MIN_RCVBUF + 1) / 2,
			      sysctl_rmem_max);
		sk->sk_rcvbuf = val * 2;
		sk->sk_userlocks |= SOCK_RCVBUF_LOCK;
	}
	release_sock(sk);
}

2.6.32
//无SOCK_MIN_RCVBUF内容

色郎中 2015-05-13
  • 打赏
  • 举报
回复
[/quote] 你调试一下你的服务端程序,看看它收到命令B之后是立即返回还是执行A之后再执行B[/quote] 我是在服务器端打印接受到的数据包 持续发A命令后,一定时间后,停止,手动开发发B命令,同样是先打印几条A命令包...
zuxi 2015-05-12
  • 打赏
  • 举报
回复
跟内核版本没关系,跟你的服务端实现有关系。

23,125

社区成员

发帖
与我相关
我的任务
社区描述
Linux/Unix社区 应用程序开发区
社区管理员
  • 应用程序开发区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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