内核中的UDP socket流程(6)——sendto

简介: 内核中的UDP socket流程(6)——sendto作者:gfree.wind@gmail.com原文:http://blog.chinaunix.net/space.php?uid=23629988&do=blog&id=85912现在开始新的API sendto,那么就重新回到了socket.c文件。
内核中的UDP socket流程(6)——sendto
作者:gfree.wind@gmail.com

现在开始新的API sendto,那么就重新回到了socket.c文件。

SYSCALL_DEFINE6(sendto, int, fd, void __user *, buff, size_t, len,
          unsigned, flags, struct sockaddr __user *, addr,
          int, addr_len)
{
     struct socket *sock;
     struct sockaddr_storage address;
     int err;
     struct msghdr msg;
     struct iovec iov;
     int fput_needed;

     sock = sockfd_lookup_light(fd, &err, &fput_needed);
     if (!sock)
          goto out;

通过函数sockfd_lookup_light和参数fd,来得到对应的sock。sockfd_lookup_light的实现比较简单,fd就是进程的fdtable的索引。通过这个fd索引就可以得到对应的file指针,然后在从file指针中,得到sock的地址。


     iov.iov_base = buff;
     iov.iov_len = len;
     msg.msg_name = NULL;
     msg.msg_iov = &iov;
     msg.msg_iovlen = 1;
     msg.msg_control = NULL;
     msg.msg_controllen = 0;
     msg.msg_namelen = 0;

初始化iov和msg,因为这里的消息传递方式采用的是4.4 BSD的消息传递方式。

struct msghdr {
     void * msg_name; /* Socket name */
     int msg_namelen; /* Length of name */
     struct iovec * msg_iov; /* Data blocks */
     __kernel_size_t msg_iovlen; /* Number of blocks */
     void * msg_control; /* Per protocol magic (eg BSD file descriptor passing) */
     __kernel_size_t msg_controllen; /* Length of cmsg list */
     unsigned msg_flags;
};

通过查看msghdr结构体的定义,可以很容易的理解上述代码。


    if (addr) {
          err = move_addr_to_kernel(addr, addr_len, (struct sockaddr *)&address);
          if (err 0)
               goto out_put;
          msg.msg_name = (struct sockaddr *)&address;
          msg.msg_namelen = addr_len;
     }
     if (sock->file->f_flags & O_NONBLOCK)
          flags |= MSG_DONTWAIT;
     msg.msg_flags = flags;

如果sendto指定了addr,那么首先将用户空间的地址addr复制到kernel空间的address中,并用内核空间的address来初始化msg;如果该socket指定了O_NONBLOCK,那么将flags设置上MSG_DONTWAIT,并将flags赋给msg.msg_flags。
err = sock_sendmsg(sock, &msg, len);
最后调用sock_sendmsg,将msg发送出去。

今天的sendto比较简单,就这么几行代码。明天学习sock_sendmsg。

目录
相关文章
|
8月前
|
网络协议 Linux C语言
linux下CC++网络编程基本:socket实现tcp和udp的例子
linux下CC++网络编程基本:socket实现tcp和udp的例子
164 0
|
6月前
|
安全 网络协议 Java
Thread类的用法 && 线程安全 && 多线程代码案例 && 文件操作和 IO && 网络原理初识 &&UDP socket
Thread类的用法 && 线程安全 && 多线程代码案例 && 文件操作和 IO && 网络原理初识 &&UDP socket
39 0
|
1天前
|
存储 网络协议 关系型数据库
Python从入门到精通:2.3.2数据库操作与网络编程——学习socket编程,实现简单的TCP/UDP通信
Python从入门到精通:2.3.2数据库操作与网络编程——学习socket编程,实现简单的TCP/UDP通信
|
17天前
|
Python
Python网络编程基础(Socket编程)UDP服务器编程
【4月更文挑战第8天】Python UDP服务器编程使用socket库创建UDP套接字,绑定到特定地址(如localhost:8000),通过`recvfrom`接收客户端数据报,显示数据长度、地址和内容。无连接的UDP协议使得服务器无法主动发送数据,通常需应用层实现请求-响应机制。当完成时,用`close`关闭套接字。
|
1月前
|
网络协议 Linux
TCP 和 UDP 的 Socket 调用
【2月更文挑战第19天】
TCP 和 UDP 的 Socket 调用
|
4月前
|
存储 网络协议 安全
网络编程『socket套接字 ‖ 简易UDP网络程序』
网络编程『socket套接字 ‖ 简易UDP网络程序』
77 0
|
4月前
|
网络协议
百度搜索:蓝易云【基于TCP/UDP的Socket编程】
通过使用上述示例,您可以基于TCP或UDP协议进行Socket编程,实现网络通信功能。根据您的需求,可以进一步扩展和定制这些示例代码。
37 1
|
3月前
|
网络协议
百度搜索:蓝易云【基于TCP/UDP的Socket编程。】
以上是基于TCP/UDP的Socket编程的基本步骤和函数调用。通过理解和掌握这些概念和操作,可以实现网络应用程序的数据传输和通信功能。
49 1
|
6月前
|
域名解析 存储 移动开发
TCP socket && UDP && TCP协议 && IP协议 && 以太网等
TCP socket && UDP && TCP协议 && IP协议 && 以太网等
37 0
|
6月前
|
存储 网络协议 Java
网络编程:UDP socket
网络编程:UDP socket
57 0