6.3.9. Socket¶
6.3.9.1. Unix Socket¶
Unix Socket 可以使同一台操作系统上的两个或多个进程进行数据通信。Unix Socket 既可以使用字节流,又可以使用数据队列。
6.3.9.2. 常见结构¶
sockaddr是通用的套接字地址 是linux网络通信的地址结构体的一种,此数据结构用做bind、connect、recvfrom、sendto等函数的参数,指明地址信息。
struct sockaddr {
sa_family_t sa_family; /* address family, AF_xxx */
char sa_data[14]; /* 14 bytes of protocol address */
};
sockaddr_in是internet环境下套接字的地址形式,和sockaddr长度一样,都是16个字节。二者是并列结构,指向sockaddr_in结构的指针也可以指向sockaddr。
struct sockaddr_in {
__kernel_sa_family_t sin_family; /* Address family */
__be16 sin_port; /* Port number */
struct in_addr sin_addr; /* Internet address */
/* Pad to size of `struct sockaddr'. */
unsigned char __pad[__SOCK_SIZE__ - sizeof(short int) -
sizeof(unsigned short int) - sizeof(struct in_addr)];
};
sockaddr_un是unix环境下套接字的地址形式,这种方式也称为本地套接字。
struct sockaddr_un {
__kernel_sa_family_t sun_family; /* AF_UNIX */
char sun_path[UNIX_PATH_MAX]; /* pathname */
};
6.3.9.3. 常用函数¶
socket调用常用的函数有:socket/bind/listen/connect/accept/read/write/close等,其中部分函数的详细定义与分析见syscall部分。
6.3.9.3.1. listen¶
listen函数的原型为 int listen(int sockfd, int backlog);
。其中sockfd即socket描述符,backlog:为相应socket可以排队的最大连接个数,表示排队连接队列的长度。
服务器在调用socket()、bind()之后就会调用listen()来监听这个socket。
6.3.9.3.2. connect¶
connect函数的原型为 int connect(int sockfd, const struct sockaddr *addr, socklen_t addrlen);
。其中sockfd即socket描述符,addr是socket地址,addrlen为地址长度。
6.3.9.3.3. read / write¶
常见的用于读写的函数有:
int read(int socket, char *buffer, size_t len);
int write(int socket, char *buffer, size_t len);
ssize_t send(int sockfd, const void *buf, size_t len, int flags);
ssize_t recv(int sockfd, void *buf, size_t len, int flags);
ssize_t sendto(int sockfd, const void *buf, size_t len, int flags, const struct sockaddr *dest_addr, socklen_t addrlen);
ssize_t recvfrom(int sockfd, void *buf, size_t len, int flags, struct sockaddr *src_addr, socklen_t *addrlen);
ssize_t sendmsg(int sockfd, const struct msghdr *msg, int flags);
ssize_t recvmsg(int sockfd, struct msghdr *msg, int flags);
6.3.9.3.4. close¶
close的函数原型为 int close(int fd);
,用于关闭socket描述字。