套接字函数
socket()
创建套接字描述符,指定协议族、套接字类型和协议类型。
1 |
|
- 参数:
domain
:协议族,如AF_INET
(IPv4)、AF_INET6
(IPv6)、AF_UNIX
(本地通信)。type
:套接字类型,如SOCK_STREAM
(TCP流)、SOCK_DGRAM
(UDP数据报)、SOCK_RAW
(原始套接字)。protocol
:协议类型,通常设为0
,由系统根据前两个参数自动选择。
- 返回值:成功返回套接字描述符(非负整数),失败返回
-1
,错误码存入errno
。
bind()
将套接字与本地IP地址和端口绑定(服务端常用)。
1 | int bind(int sockfd, const struct sockaddr *addr, socklen_t addrlen); |
- 参数:
sockfd
:由socket()
创建的套接字描述符。addr
:指向sockaddr
结构体的指针(需转换为特定地址结构体,如IPv4用sockaddr_in
)。addrlen
:地址结构体的长度(如sizeof(struct sockaddr_in)
)。
- 返回值:成功返回
0
,失败返回-1
,错误码存入errno
。
listen()
将套接字设为监听状态。
1 | int listen(int sockfd, int backlog); |
- 参数:
sockfd
:已绑定的套接字描述符。backlog
:等待连接队列的最大长度(通常不超过128
)。
- 返回值:成功返回
0
,失败返回-1
,错误码存入errno
。
accept()
服务端接受客户端连接请求,返回新套接字用于数据传输。
1 | int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen); |
参数:
sockfd
:监听套接字描述符。addr
:存储客户端地址的结构体指针(传出参数)。addrlen
:地址结构体长度的指针(传入时指定缓冲区大小,传出时返回实际大小)。
返回值:成功返回新套接字描述符,失败返回
-1
,错误码存入errno
。
connect()
客户端主动发起TCP连接请求。
1 | int connect(int sockfd, const struct sockaddr *addr, socklen_t addrlen); |
- 参数:
sockfd
:客户端套接字描述符。addr
:指向服务端地址结构体的指针(如sockaddr_in
)。addrlen
:地址结构体长度。
- 返回值:成功返回
0
,失败返回-1
,错误码存入errno
。
send()
在已连接的TCP套接字上发送数据。
1 | ssize_t send(int sockfd, const void *buf, size_t len, int flags); |
- 参数:
sockfd
:连接成功的套接字描述符。buf
:数据缓冲区指针。len
:数据长度。flags
:控制标志(如MSG_WAITALL
阻塞直到数据接收完整)。
- 返回值:成功返回实际发送的字节数,失败返回
-1
,错误码存入errno
。
recv()
在已连接的TCP套接字上接收数据。
1 | ssize_t recv(int sockfd, void *buf, size_t len, int flags); |
- 参数:
sockfd
:连接成功的套接字描述符。buf
:数据缓冲区指针。len
:数据长度。flags
:控制标志(如MSG_WAITALL
阻塞直到数据接收完整)。
- 返回值:成功返回实际接收的字节数,失败返回
-1
,错误码存入errno
。
sendto()
用于无连接的UDP套接字发送数据。
1 | ssize_t sendto(int sockfd, const void *buf, size_t len, int flags, const struct sockaddr *dest_addr, socklen_t addrlen); |
- 参数:
dest_addr
:目标地址结构体指针。addrlen
:地址结构体长度。
- 返回值:成功返回实际发送的字节数,失败返回
-1
,错误码存入errno
。
recvfrom()
用于无连接的UDP套接字接收数据。
1 | ssize_t recvfrom(int sockfd, void *buf, size_t len, int flags, struct sockaddr *src_addr, socklen_t *addrlen); |
- 参数:
src_addr
:来源地址结构体指针(传出参数)。
- 返回值:成功返回实际接收的字节数,失败返回
-1
,错误码存入errno
。
close()
关闭套接字并释放资源。
1 | int close(int sockfd); |
- 参数:
sockfd
:套接字描述符。
- 返回值:成功返回
0
,失败返回-1
,错误码存入errno
shutdown()
半关闭连接。
1 | int shutdown(int sockfd, int how); |
- 参数:
how
:关闭方式,如SHUT_RD
(关闭读)、SHUT_WR
(关闭写)、SHUT_RDWR
(关闭读写)。
- 返回值:成功返回
0
,失败返回-1
,错误码存入errno
。