UDP socket--sendto and recvfrom

sendto

系统调用原型

sendto( int fd, void * buff, size_t len,unsigned int flags, struct sockaddr  *addr,int addr_len)

内核中处理流程:

sendto( int fd, void * buff, size_t len,unsigned int flags, struct sockaddr  *addr,int addr_len)
	__sys_sendto(fd, buff, len, flags, NULL, 0)
		1.通过fd获取sock,将数据转换成struct msghdr格式
			
		2.调用sock->ops->sendmsg,即inet_sendmsg
		inet_sendmsg(struct socket *sock, struct msghdr *msg, size_t size)
			1.bind
				如果socket没有bind过,源端口号、地址信息是没有的,需要自动分配,并将sock插入udp的hash表中,这些都通过bind完成
				
			2.调用udp协议的sendmsg函数,即udp_sendmsg
				

recvfrom

系统调用原型

recvfrom( int fd, void *ubuf, size_t size,unsigned int flags, struct sockaddr  *addr,int *addr_len)

内核中的处理流程

recvfrom( int fd, void *ubuf, size_t size,unsigned int flags, struct sockaddr  *addr,int *addr_len)
	__sys_recvfrom(fd, ubuf, size, flags, addr, addr_len)
		1.通过fd获取sock,构造struct msghdr msg

		2.调用sock->ops->recvmsg,即inet_recvmsg
		inet_recvmsg(struct socket *sock, struct msghdr *msg, size_t size,int flags)
			sk->sk_prot->recvmsg(udp_recvmsg)			

struct msghdr

上面两个系统调用都是用这个结构体存放数据,定义如下:

struct msghdr {
	void		*msg_name;	/* ptr to socket address structure */
	int		msg_namelen;	/* size of socket address structure */
	struct iov_iter	msg_iter;	/* data */

	/*
	 * Ancillary data. msg_control_user is the user buffer used for the
	 * recv* side when msg_control_is_user is set, msg_control is the kernel
	 * buffer used for all other cases.
	 */
	union {
		void		*msg_control;
		void __user	*msg_control_user;
	};
	bool		msg_control_is_user : 1;
	__kernel_size_t	msg_controllen;	/* ancillary data buffer length */
	unsigned int	msg_flags;	/* flags on received message */
	struct kiocb	*msg_iocb;	/* ptr to iocb for async requests */
};
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值