// struct sock->sk_prot字段
// struct proto为插口层到传输层的接口
4.1 struct proto raw_prot = {
.name = "RAW",
.owner = THIS_MODULE,
.close = raw_close,
.destroy = raw_destroy,
.connect = ip4_datagram_connect,
.disconnect = udp_disconnect,
.ioctl = raw_ioctl,
.init = raw_init,
.setsockopt = raw_setsockopt,
.getsockopt = raw_getsockopt,
.sendmsg = raw_sendmsg,
.recvmsg = raw_recvmsg,
.bind = raw_bind,
.backlog_rcv = raw_rcv_skb,
.release_cb = ip4_datagram_release_cb,
.hash = raw_hash_sk,
.unhash = raw_unhash_sk,
.obj_size = sizeof(struct raw_sock),
.h.raw_hash = &raw_v4_hashinfo,
};
// raw sock绑定地址到socket
4.1 static int raw_bind(struct sock *sk, struct sockaddr *uaddr, int addr_len)
{
struct inet_sock *inet = inet_sk(sk);
struct sockaddr_in *addr = (struct sockaddr_in *) uaddr;
int ret = -EINVAL;
int chk_addr_ret;
//sk->sk_state!=TCP_CLOSE说明连接已经建立
if (sk->sk_state != TCP_CLOSE || addr_len < sizeof(struct sockaddr_in))
goto out;
//检查绑定的地址类型是否合法
chk_addr_ret = inet_addr_type(sock_net(sk), addr->sin_addr.s_addr);
ret = -EADDRNOTAVAIL;
//合法的绑定地址类型:本地地址,多播地址,广播地址
if (addr->sin_addr.s_addr && chk_addr_ret != RTN_LOCAL &&
chk_addr_
网络子系统81_inet协议族-SOCK_RAW(二)
最新推荐文章于 2023-09-13 16:28:40 发布
![](https://img-home.csdnimg.cn/images/20240711042549.png)