Tan's Blog.

CSAPP 套接字接口(续)

字数统计: 700阅读时长: 2 min
2019/06/02 Share

套接字接口

accept函数

TCP服务器端依次调用socket()、bind()、listen()之后,就会监听指定的socket地址了。TCP客户端依次调用socket()、connect()之后就向TCP服务器发送了一个连接请求。TCP服务器监听到这个请求之后,就会调用accept()函数取接收请求,这样连接就建立好了。之后就可以开始网络I/O操作了,即类同于普通文件的读写I/O操作。

#include<sys/socket.h>
int accept(int listenfd,struct sockaddr *addr,int *addrlen);//返回:成功为非负连接描述符,出错-1

第一个参数为服务器的socket描述字
第二个参数为指向struct sockaddr *的指针,用于返回客户端的协议地址
第三个参数为协议地址的长度
成功后返回一个已连接描述符,用来利用Unix I/O函数与客户端通信

主机和服务的转换

getaddrinfo函数

getaddrinfo函数将主机名、主机地址、服务名和端口号得字符串表示转化成套接字地址结构,这个函数可重入的,适用于任何协议。

#include<sys/types.h>
#include<sys/socket.h>
#include<netdb.h>
int getaddrinfo(const char *host,const char *service,const struct addrinfo *hints,struct addrinfo **result);//返回:成功0,出错为非零得错误代码
void freeaddrinfo(struct addrinfo *result);//释放链表,返回无
const char *gai_strerror(int errcode);//返回错误信息

getaddrinfo返回的数据结构:

struct addrinfo{
    int ai_flags;
    int ai_family;
    int ai_socktype;
    int ai_protocol;
    char *ai_canonname;
    size_t ai_addrlen;
    struct sockaddr *ai_addr;
    struct addrinfo *ai_next;
}

为了避免内存泄漏,应用程序必须在最后调用freeaddrinfo,释放该链表,如果getaddrinfo返回非零的错误代码,应用程序可以调用gai_strerror,该代码转换成消息字符串。
host:一个主机名或者地址串(IPv4的点分十进制串或者IPv6的16进制串)
service:服务名可以是十进制的端口号,也可以是已定义的服务名称,如ftp、http等
hints:可以是一个空指针,也可以是一个指向某个addrinfo结构体的指针,调用者在这个结构中填入关于期望返回的信息类型的暗示。举例来说:如果指定的服务既支持TCP也支持UDP,那么调用者可以把hints结构中的ai_socktype成员设置成SOCK_DGRAM使得返回的仅仅是适用于数据报套接口的信息。
result:本函数通过result指针参数返回一个指向addrinfo结构体链表的指针。

getnameinfo 函数

将一个套接字地址结构转换成相应得主机和服务名字符串。

#include<sys/socket.h>
#include<netdb.h>
int getnameinfo(const struct sockaddr *sa,socklen_t salen,char *host,size_t hostlen,char *service,size_t servlen,int flags);//返回:成功0,出错为非零错误代码
CATALOG
  1. 1. 套接字接口
    1. 1.1. accept函数
    2. 1.2. 主机和服务的转换
      1. 1.2.1. getaddrinfo函数
      2. 1.2.2. getnameinfo 函数