面试题答案
一键面试- 创建Socket
- 函数调用:
int socket(int domain, int type, int protocol);
- 参数说明:
domain
:指定协议族,如AF_INET
(IPv4协议)、AF_INET6
(IPv6协议)等。type
:指定Socket类型,常见的有SOCK_STREAM
(面向连接的流套接字,如TCP)、SOCK_DGRAM
(无连接的数据报套接字,如UDP)。protocol
:指定协议,一般设置为0,让系统根据domain
和type
自动选择合适的协议。例如,对于AF_INET
和SOCK_STREAM
,系统会选择TCP协议。
- 函数调用:
- 绑定地址
- 函数调用:
int bind(int sockfd, const struct sockaddr *addr, socklen_t addrlen);
- 参数说明:
sockfd
:通过socket
函数创建的套接字描述符。addr
:指向一个struct sockaddr
类型的结构体指针,该结构体包含了要绑定的地址信息。对于IPv4,实际使用的是struct sockaddr_in
结构体,需要进行类型转换。struct sockaddr_in
包含sin_family
(协议族,如AF_INET
)、sin_port
(端口号,使用网络字节序)、sin_addr
(IP地址,使用网络字节序)等成员。addrlen
:addr
结构体的长度。对于struct sockaddr_in
,可以使用sizeof(struct sockaddr_in)
。
- 函数调用:
- 监听连接(仅适用于面向连接的Socket,如TCP)
- 函数调用:
int listen(int sockfd, int backlog);
- 参数说明:
sockfd
:要监听的套接字描述符。backlog
:指定等待连接队列的最大长度。它表示内核为该套接字维护的未完成连接队列和已完成连接队列的最大长度之和。常见值一般为5到10。
- 函数调用:
- 接受连接(仅适用于面向连接的Socket,如TCP)
- 函数调用:
int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen);
- 参数说明:
sockfd
:正在监听的套接字描述符。addr
:可选参数,用于返回客户端的地址信息。如果不关心客户端地址,可以设为NULL
。同样,对于IPv4,实际使用struct sockaddr_in
结构体,需类型转换。addrlen
:可选参数,是一个指向addr
结构体长度的指针。如果addr
为NULL
,该参数也设为NULL
。如果需要获取客户端地址,调用前需设置为sizeof(struct sockaddr_in)
,返回时该值会被更新为实际客户端地址结构体的长度。
- 函数调用: