Linux内核网络问题,各位大牛一定要进来看一下
Linux内核版本2.6.18
socket函数的系统调用函数如下:
我在其中对发送的数据和接收的数据试图进行输出操作,如带有注释的两行代码所示。结果是,可以输出发送数据,但是无法输出接收的数据(是直接没有输出任何的数据,不是输出乱码)。
- asmlinkage long sys_socketcall(int call, unsigned long __user *args)
- {
- unsigned long a[6];
- unsigned long a0, a1;
- int err;
- if (call < 1 || call > SYS_RECVMSG)
- return -EINVAL;
- /* copy_from_user should be SMP safe. */
- if (copy_from_user(a, args, nargs[call]))
- return -EFAULT;
- err = audit_socketcall(nargs[call] / sizeof(unsigned long), a);
- if (err)
- return err;
- a0 = a[0];
- a1 = a[1];
- switch (call) {
- case SYS_SOCKET:
- err = sys_socket(a0, a1, a[2]);
- break;
- case SYS_BIND:
- err = sys_bind(a0, (struct sockaddr __user *)a1, a[2]);
- break;
- case SYS_CONNECT:
- err = sys_connect(a0, (struct sockaddr __user *)a1, a[2]);
- break;
- case SYS_LISTEN:
- err = sys_listen(a0, a1);
- break;
- case SYS_ACCEPT:
- err =
- sys_accept(a0, (struct sockaddr __user *)a1,
- (int __user *)a[2]);
- break;
- case SYS_GETSOCKNAME:
- err =
- sys_getsockname(a0, (struct sockaddr __user *)a1,
- (int __user *)a[2]);
- break;
- case SYS_GETPEERNAME:
- err =
- sys_getpeername(a0, (struct sockaddr __user *)a1,
- (int __user *)a[2]);
- break;
- case SYS_SOCKETPAIR:
- err = sys_socketpair(a0, a1, a[2], (int __user *)a[3]);
- break;
- case SYS_SEND:
- err = sys_send(a0, (void __user *)a1, a[2], a[3]);
- break;
- case SYS_SENDTO:
- printk("sendto a1=%s\n",(char *)a1);//a1是指向要发送的用户数据的指针,可以打印
- err = sys_sendto(a0, (void __user *)a1, a[2], a[3],
- (struct sockaddr __user *)a[4], a[5]);
- break;
- case SYS_RECV:
- err = sys_recv(a0, (void __user *)a1, a[2], a[3]);
- break;
- case SYS_RECVFROM:
- printk("recvfrom a1=%s\n",(char *)a1);//a1是指向要接收的用户数据的指针,不能打印???
- err = sys_recvfrom(a0, (void __user *)a1, a[2], a[3],
- (struct sockaddr __user *)a[4],
- (int __user *)a[5]);
- break;
复制代码从sys_sendto和sys_recvfrom的参数a1,我们知道,
a1 是一个指针,当发送时,指向要发送的数据,当接收时,指向要接收的数据
各位大牛,给点看法,思路。在此先谢过了!
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
你这种写法是错误的,因为a1的值可能是无效的,或指向的内存是无效的。
其次recvfrom指向的空间内容是随机的,即使打印出来也没有什么意义
你应该放在recvfrom后面来打印
回复 2# qtdszws
多谢大侠指点,真是醍醐灌顶啊。
我仍有一个疑问,就是,在sys_recvfrom()接收到数据之后,系统是不是直接退出内核态,进入用户态了?那如果想在数据传到应用程序之前,对接收到的数据进行处理(比如解密),应该在哪下手呢?
望大侠赐教!
看看ipsec