跳转至

经常使用的 Linux Socket API 函数释义

1. socket()

int socket(int 协议族, int 套接字类型, int 协议);

📖 解释:创建一个新的套接字,返回一个文件描述符用于后续网络通信.

第 1 个参数 🔑:协议族,指定通信协议类型.

  • 示例:AF_INET(IPv4协议)、AF_INET6(IPv6协议)、AF_UNIX(本地进程间通信).

第 2 个参数 🔑:套接字类型,指定通信语义.

  • 示例:SOCK_STREAM(TCP流式套接字)、SOCK_DGRAM(UDP数据报套接字).

第 3 个参数 🔑:具体协议,通常为0(使用默认协议).

  • 示例:若类型是SOCK_STREAM,则默认协议是IPPROTO_TCP;若类型是SOCK_DGRAM,默认协议是IPPROTO_UDP.

返回值 📤

  • ✅ 成功时:返回非负整数(套接字文件描述符).

  • ❎ 失败时:返回-1,并设置errno(如EACCES权限不足、EINVAL参数无效).


2. bind()

int bind(int 套接字描述符, const struct sockaddr *地址, socklen_t 地址长度);

📖 解释:将套接字与特定IP地址和端口绑定.

第 1 个参数 🔑:套接字描述符(通过socket()创建的文件描述符).

第 2 个参数 🔑:地址(指向sockaddr结构的指针),包含IP和端口.

  • 示例:struct sockaddr_in server_addr(IPv4地址结构),需填充sin_familyAF_INET)、sin_porthtons(8080))、sin_addrINADDR_ANY 表示监听所有接口).

第 3 个参数 🔑:地址长度(地址结构的大小).

  • 示例:sizeof(struct sockaddr_in).

返回值 📤

  • ✅ 成功时:返回0.

  • ❎ 失败时:返回-1(如端口已被占用,errno=EADDRINUSE).


3. listen()

int listen(int 套接字描述符, int 积压连接数);

📖 解释:将套接字设为监听模式,等待客户端连接请求.

第 1 个参数 🔑:套接字描述符(已绑定的套接字).

第 2 个参数 🔑:积压连接数(等待队列的最大长度).

  • 示例:5(表示最多允许5个未处理的连接请求).

返回值 📤

  • ✅ 成功时:返回0.

  • ❎ 失败时:返回-1(如套接字未绑定,errno=EINVAL).


4. accept()

int accept(int 监听套接字描述符, struct sockaddr *客户端地址, socklen_t *客户端地址长度);

📖 解释:接受客户端的连接请求,返回新的套接字用于通信.

第 1 个参数 🔑:监听套接字描述符(通过listen()设置的套接字).

第 2 个参数 🔑:客户端地址(输出参数,保存客户端地址信息).

  • 示例:struct sockaddr_in client_addr,调用后填充客户端IP和端口.

第 3 个参数 🔑:客户端地址长度(输入输出参数,传入地址结构大小,返回实际大小).

  • 示例:socklen_t len = sizeof(client_addr);

返回值 📤

  • ✅ 成功时:返回新的套接字描述符(用于与客户端通信).

  • ❎ 失败时:返回-1(如系统资源不足,errno=ENOMEM).


5. connect()

int connect(int 套接字描述符, const struct sockaddr *服务器地址, socklen_t 地址长度);

📖 解释:客户端主动连接服务器.

第 1 个参数 🔑:套接字描述符(客户端通过socket()创建的套接字).

第 2 个参数 🔑:服务器地址(服务器的IP和端口).

  • 示例:struct sockaddr_in server_addr,填充sin_family=AF_INETsin_port=htons(80)sin_addr.s_addr=inet_addr("192.168.1.1").

第 3 个参数 🔑:地址长度(地址结构的大小).

  • 示例:sizeof(struct sockaddr_in).

返回值 📤

  • ✅ 成功时:返回0.

  • ❎ 失败时:返回-1(如服务器不可达,errno=ECONNREFUSED).


6. send()

ssize_t send(int 套接字描述符, const void *缓冲区, size_t 长度, int 标志);

📖 解释:通过TCP套接字发送数据.

第 1 个参数 🔑:套接字描述符(已连接的套接字).

第 2 个参数 🔑:缓冲区(发送数据的内存地址).

  • 示例:char *msg = "Hello";

第 3 个参数 🔑:长度(要发送的字节数).

  • 示例:strlen(msg).

第 4 个参数 🔑:标志(控制行为,通常为0).

  • 示例:0(默认阻塞发送).

返回值 📤

  • ✅ 成功时:返回实际发送的字节数.

  • ❎ 失败时:返回-1(如连接断开,errno=EPIPE).


7. recv()

ssize_t recv(int 套接字描述符, void *缓冲区, size_t 长度, int 标志);

📖 解释:通过TCP套接字接收数据.

第 1 个参数 🔑:套接字描述符(已连接的套接字).

第 2 个参数 🔑:缓冲区(接收数据的内存地址).

  • 示例:char buffer[1024];

第 3 个参数 🔑:长度(缓冲区最大容量).

  • 示例:sizeof(buffer).

第 4 个参数 🔑:标志(控制行为,通常为0).

  • 示例:0(默认阻塞接收,直到有数据到达).

返回值 📤

  • ✅ 成功时:返回实际接收的字节数(若返回0,表示对端关闭连接).

  • ❎ 失败时:返回-1(如套接字无效,errno=ENOTCONN).


8. sendto()

ssize_t sendto(int 套接字描述符, const void *缓冲区, size_t 长度, int 标志, const struct sockaddr *目标地址, socklen_t 地址长度);

📖 解释:通过UDP套接字发送数据到指定地址.

第 1 个参数 🔑:套接字描述符(UDP套接字).

第 2 个参数 🔑:缓冲区(发送数据的内存地址).

  • 示例:char *msg = "UDP Message";

第 3 个参数 🔑:长度(发送数据的字节数).

  • 示例:strlen(msg).

第 4 个参数 🔑:标志(通常为0).

第 5 个参数 🔑:目标地址(目标IP和端口).

  • 示例:struct sockaddr_in server_addr,填充服务器信息.

第 6 个参数 🔑:地址长度(目标地址结构的大小).

  • 示例:sizeof(struct sockaddr_in).

返回值 📤

  • ✅ 成功时:返回实际发送的字节数.

  • ❎ 失败时:返回-1(如网络不可达,errno=ENETUNREACH).


9. recvfrom()

ssize_t recvfrom(int 套接字描述符, void *缓冲区, size_t 缓冲区长度, int 标志, struct sockaddr *源地址, socklen_t *地址长度);

📖 解释:从套接字接收数据,支持获取发送方地址信息(常用于UDP).

第 1 个参数 🔑:套接字描述符(已绑定的UDP或TCP套接字).

第 2 个参数 🔑:接收缓冲区指针(存储接收到的数据).

第 3 个参数 🔑:缓冲区最大容量(字节).

第 4 个参数 🔑:接收标志(如MSG_PEEK预览数据、MSG_WAITALL等待完整数据).

第 5 个参数 🔑:源地址(输出参数,保存发送方地址信息).

第 6 个参数 🔑:地址长度(输入输出参数,传入地址结构大小,返回实际地址长度).

返回值 📤

  • ✅ 成功时:返回实际接收的字节数.

  • ❎ 失败时:返回-1(如缓冲区不足,errno=EINVAL).


10. sendmsg()

ssize_t sendmsg(int 套接字描述符, const struct msghdr *消息结构, int 标志);

📖 解释:发送复杂消息(支持多缓冲区和辅助数据,如文件描述符传递).

第 1 个参数 🔑:套接字描述符(已连接的TCP或绑定的UDP套接字).

第 2 个参数 🔑:消息结构指针(包含数据缓冲区、地址、控制信息).

第 3 个参数 🔑:发送标志(如MSG_DONTWAIT非阻塞发送).

返回值 📤

  • ✅ 成功时:返回实际发送的字节数.

  • ❎ 失败时:返回-1(如无效参数,errno=EINVAL).


11. recvmsg()

ssize_t recvmsg(int 套接字描述符, struct msghdr *消息结构, int 标志);

📖 解释:接收复杂消息(支持多缓冲区和辅助数据).

第 1 个参数 🔑:套接字描述符.

第 2 个参数 🔑:消息结构指针(输出参数,存储接收的数据和控制信息).

第 3 个参数 🔑:接收标志(如MSG_TRUNC返回完整数据长度即使截断).

返回值 📤

  • ✅ 成功时:返回实际接收的字节数.

  • ❎ 失败时:返回-1(如套接字未连接,errno=ENOTCONN).


12. close()

int close(int 文件描述符);

📖 解释:关闭套接字描述符,释放资源.

第 1 个参数 🔑:要关闭的套接字描述符.

返回值 📤

  • ✅ 成功时:返回0.

  • ❎ 失败时:返回-1(如无效描述符,errno=EBADF).


13. shutdown()

int shutdown(int 套接字描述符, int 关闭方式);

📖 解释:关闭套接字的读/写通道或全部通道.

第 1 个参数 🔑:套接字描述符.

第 2 个参数 🔑:关闭方式(SHUT_RD停读,SHUT_WR停写,SHUT_RDWR全停).

返回值 📤

  • ✅ 成功时:返回0.

  • ❎ 失败时:返回-1(如无效方式,errno=EINVAL).


14. setsockopt()

int setsockopt(int 套接字描述符, int 协议层, int 选项名, const void *选项值, socklen_t 选项长度);

📖 解释:设置套接字选项(如超时、重用地址).

第 1 个参数 🔑:套接字描述符.

第 2 个参数 🔑:协议层(如SOL_SOCKET通用选项,IPPROTO_TCP TCP选项).

第 3 个参数 🔑:选项名(如SO_REUSEADDR地址重用,SO_RCVTIMEO接收超时).

第 4 个参数 🔑:选项值指针(如int reuse = 1).

第 5 个参数 🔑:选项值长度(如sizeof(reuse)).

返回值 📤

  • ✅ 成功时:返回0.

  • ❎ 失败时:返回-1(如无效选项,errno=ENOPROTOOPT).


15. getsockopt()

int getsockopt(int 套接字描述符, int 协议层, int 选项名, void *选项值, socklen_t *选项长度);

📖 解释:获取套接字选项的当前值.

第 1 个参数 🔑:套接字描述符.

第 2 个参数 🔑:协议层(同setsockopt).

第 3 个参数 🔑:选项名(如SO_ERROR获取错误状态).

第 4 个参数 🔑:选项值指针(输出参数,存储选项值).

第 5 个参数 🔑:选项长度(输入输出参数,传入指针大小,返回实际大小).

返回值 📤

  • ✅ 成功时:返回0.

  • ❎ 失败时:返回-1(如无效选项,errno=ENOPROTOOPT).


16. getsockname()

int getsockname(int 套接字描述符, struct sockaddr *地址, socklen_t *地址长度);

📖 解释:获取套接字绑定的本地地址.

第 1 个参数 🔑:套接字描述符.

第 2 个参数 🔑:地址结构指针(输出参数,保存本地IP和端口).

第 3 个参数 🔑:地址长度(输入输出参数,传入结构大小,返回实际大小).

返回值 📤

  • ✅ 成功时:返回0.

  • ❎ 失败时:返回-1(如未绑定地址,errno=EINVAL).


17. getpeername()

int getpeername(int 套接字描述符, struct sockaddr *地址结构, socklen_t *地址长度);

📖 解释:获取已连接套接字对端的地址信息.

第 1 个参数 🔑:已连接的套接字描述符(如accept返回的描述符).

第 2 个参数 🔑:地址结构(输出参数,保存对端IP和端口).

  • 示例:struct sockaddr_in peer_addr;

第 3 个参数 🔑:地址长度(输入输出参数,传入结构大小,返回实际大小).

  • 示例:socklen_t len = sizeof(peer_addr);

返回值 📤

  • ✅ 成功时:返回0.

  • ❎ 失败时:返回-1(如未连接套接字,errno=ENOTCONN).


18. ioctl()

int ioctl(int 文件描述符, unsigned long 请求码, ... /* 参数 */);

📖 解释:对文件描述符执行设备输入/输出操作(常用于设置套接字选项).

第 1 个参数 🔑:文件描述符(如套接字描述符).

第 2 个参数 🔑:请求码(指定操作类型,如FIONBIO设置非阻塞模式).

第 3 个参数 🔑:可变参数(根据请求码传入参数,如int *非阻塞标志).

  • 示例:
int flags = 1;

ioctl(sockfd, FIONBIO, &flags); // 设置非阻塞

返回值 📤

  • ✅ 成功时:返回0.

  • ❎ 失败时:返回-1(如无效请求码,errno=EINVAL).


19. fcntl()

int fcntl(int 文件描述符, int 命令, ... /* 可选参数 */);

📖 解释:对文件描述符执行控制操作(如设置非阻塞模式).

第 1 个参数 🔑:文件描述符(如套接字描述符).

第 2 个参数 🔑:命令(如F_GETFL获取标志,F_SETFL设置标志).

第 3 个参数 🔑:可选参数(如标志位O_NONBLOCK).

  • 示例:
int flags = fcntl(sockfd, F_GETFL, 0);

fcntl(sockfd, F_SETFL, flags | O_NONBLOCK); // 设置非阻塞

返回值 📤

  • ✅ 成功时:返回依赖命令(如F_GETFL返回标志值).

  • ❎ 失败时:返回-1(如无效命令,errno=EINVAL).


20. select()

int select(int 最大描述符+1, fd_set *读集合, fd_set *写集合, fd_set *异常集合, struct timeval *超时时间);

📖 解释:同步I/O多路复用,监控多个文件描述符状态.

第 1 个参数 🔑:监控的最大文件描述符值+1(如max_fd+1).

第 2-4 个参数 🔑:读/写/异常集合(使用FD_SET宏设置,返回就绪的描述符).

  • 示例:
fd_set read_fds;

FD_ZERO(&read_fds);

FD_SET(sockfd, &read_fds);

第 5 个参数 🔑:超时时间(NULL表示无限等待,timeval结构指定秒/微秒).

返回值 📤

  • ✅ 成功时:返回就绪的描述符总数.

  • ❎ 失败时:返回-1(如中断,errno=EINTR).


21. poll()

int poll(struct pollfd *文件描述符数组, nfds_t 文件描述符数量, int 超时时间);

📖 解释:类似select,但使用数组结构管理描述符.

第 1 个参数 🔑pollfd结构数组(包含描述符、事件、返回事件).

  • 示例:
struct pollfd fds[1];

fds[0].fd = sockfd;

fds[0].events = POLLIN;

第 2 个参数 🔑:数组元素数量(如sizeof(fds)/sizeof(fds[0])).

第 3 个参数 🔑:超时时间(毫秒,-1表示无限等待).

返回值 📤

  • ✅ 成功时:返回就绪的描述符数量.

  • ❎ 失败时:返回-1(如无效参数,errno=EFAULT).


22. epoll_create()

int epoll_create(int 大小);

📖 解释:创建epoll实例(内核事件表).

第 1 个参数 🔑:事件表大小(Linux 2.6.8+忽略此值,建议填0).

返回值 📤

  • ✅ 成功时:返回epoll文件描述符.

  • ❎ 失败时:返回-1(如权限不足,errno=EPERM).


23. epoll_ctl()

int epoll_ctl(int epoll描述符, int 操作类型, int 目标描述符, struct epoll_event *事件);

📖 解释:注册/修改/删除epoll事件.

第 1 个参数 🔑:epoll描述符(由epoll_create返回).

第 2 个参数 🔑:操作类型(EPOLL_CTL_ADD添加,EPOLL_CTL_MOD修改,EPOLL_CTL_DEL删除).

第 3 个参数 🔑:目标描述符(如套接字描述符).

第 4 个参数 🔑:事件结构(指定监听事件如EPOLLIN).

  • 示例:
struct epoll_event ev;

ev.events = EPOLLIN;

ev.data.fd = sockfd;

epoll_ctl(epfd, EPOLL_CTL_ADD, sockfd, &ev);

返回值 📤

  • ✅ 成功时:返回0.

  • ❎ 失败时:返回-1(如描述符已存在,errno=EEXIST).


24. epoll_wait()

int epoll_wait(int epoll描述符, struct epoll_event *事件数组, int 最大事件数, int 超时时间);

📖 解释:等待epoll事件就绪.

第 1 个参数 🔑:epoll描述符(由epoll_create返回).

第 2 个参数 🔑:事件数组(保存就绪事件).

  • 示例:
struct epoll_event events[10];

int num = epoll_wait(epfd, events, 10, -1);

第 3 个参数 🔑:最大事件数(如数组长度10).

第 4 个参数 🔑:超时时间(毫秒,-1表示无限等待).

返回值 📤

  • ✅ 成功时:返回就绪事件数量.

  • ❎ 失败时:返回-1(如中断,errno=EINTR).


Generated by Qwen2.5-Max + QwQ-32B-Preview.