INET 套接字就是支持 Internet 地址族的套接字,它位于TCP协议之上,BSD套接字之下,
如图所示,这里也体现了Linux网络模块分层的设计思想(图在PPT里,自己想象吧…)
INET和 BSD 套接字之间的接口通过 Internet 地址族套接字操作集实现,这些操作集实际是一组协议的操作例程,
在include/linux/net.h中定义为proto_ops:
struct proto_ops {
int family;
int (*release) (struct socket*sock);
int (*bind) (struct socket*sock, struct sockaddr *umyaddr, int sockaddr_len);
int (*connect) (struct socket*sock, struct sockaddr *uservaddr, int sockaddr_len, int flags);
int (*socketpair) (struct socket*sock1, struct socket*sock2);
int (*accept) (struct socket*sock, struct socket*newsock, int flags);
int (*getname) (struct socket*sock, struct sockaddr *uaddr, int*usockaddr_len, int peer);
unsigned int (*poll) (struct file *file, struct socket*sock, struct poll_table_struct *wait);
int (*ioctl) (struct socket*sock, unsigned int cmd, unsigned long arg);
int (*listen) (struct socket*sock, int len);
int (*shutdown) (struct socket*sock, int flags);
int (*setsockopt) (struct socket*sock, int level, int optname, char *optval, int optlen);
int (*getsockopt) (struct socket*sock, int level, int optname, char *optval, int*optlen);
int (*sendmsg) (struct socket*sock, struct msghdr *m, int total_len, struct scm_cookie *scm);
int (*recvmsg) (struct socket*sock, struct msghdr *m, int total_len, int flags, struct scm_cookie *scm);
int (*mmap) (struct file *file, struct socket*sock, struct vm_area_struct * vma);
ssize_t (*sendpage) (struct socket*sock, struct page *page, int offset, size_t size, int flags);
};
asmlinkage long sys_socket(int family, int type, int protocol) {
int retval;
struct socket *sock;
retval = sock_create(family, type, protocol, &sock);
if (retval < 0)
gotoout;
retval = sock_map_fd(sock);
if (retval < 0)
goto out_release;
out:
/* It may be already another descriptor 8) Not kernel problem. */return retval;
out_release:
sock_release(sock);
return retval;
}
EBADF :
The argument sockfd is nota valid descriptor.
EFAULT :
The addr argument points to memory notina valid part oftheprocess address space.
EINVAL :
addrlen is invalid (e.g., is negative).
ENOBUFS :
Insufficient resources were available inthesystemto perform the operation.
ENOTSOCK :
The argument sockfd is afile, notasocket.
EBADF
The argument sockfd is nota valid descriptor.
EFAULT
The addr argument points to memory notina valid part oftheprocess address space.
EINVAL
addrlen is invalid (e.g., is negative).
ENOBUFS
Insufficient resources were available inthesystemto perform the operation.
ENOTCONN
The socket is not connected.
ENOTSOCK
The argument sockfd is afile, notasocket.
struct servent *getservbyname(constchar *name, constchar *proto);
struct servent *getservbyport(int port, constchar *proto);
struct servent {
char *s_name; /* official service name */char **s_aliases; /* alias list */int s_port; /* port number */char *s_proto; /* protocol to use */
}