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描述字。