套接字函数 | 小牛学习日记
套接字函数
Published in:2025-03-01 | category: C++
Words: 962 | Reading time: 3min | reading:

套接字函数

socket()

创建套接字描述符,指定协议族、套接字类型和协议类型。

1
2
3
4
5
#include<sys/types.h>
#include<sys/socker.h>
#include<arpa/inet.h>//包含这个头文件就不需要包含上面两个

int socket(int domain, int type, int protocol);
  • 参数:
    • 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
Next:
I/O多路复用的三种机制(select、poll、epoll)
Prev:
互斥锁与相关函数