// 1、地址结构体(sockaddr)
#include
struct sockaddr
{
sa_family_t sa_family;// 地址族: AF_UNIX、AF_INET、AF_INET6
char sa_data[15];// 地址值
}
// 2、地址结构体(sockaddr_in)
#include
struct sockaddr_in
{
sa_family sin_family;// 地址族: AF_UNIX、AF_INET、AF_INET6
u_int16_t sin_port:// 端口号, 要用网络字节表示
struct in_addr sin_addr;// IPv4地址结构体
}
// 3、IPv4地址结构体
struct in_addr
{
u_int32_t s_addr;// IPv4地址,要用网络字节表示
}
// 4、点分十进制字符串转换为IPv4地址
#include
/*
* 函数: inet_addr
* 参数: strptr(点分十进制字符串表示的IP地址)
* 返回: IPv4地址
*/
in_addr_t inet_addr(const char* strptr);
/*
* 函数: inet_aton
* 参数: cp(点分十进制字符串表示的IP地址)
* inp(指向IPv4地址结构的指针)
* 返回: IPv4地址
*/
int inet_aton(const char* cp, struct in_addr* inp);
// 5、IPv4地址转换为点分十进制字符串 inet_ntoa
/*
* 函数: inet_ntoa
* 参数: in(IPv4地址结构体)
* 返回: 点分十进制字符串表示的IP地址
*/
char* inet_ntoa(struct in_addr in);
// 6、创建socket
#include
#include
/*
* 函数: socket
* 参数: domain(底层协议族 PF_INET、PF_INET6、PF_UNIX)
* type(服务类型 SOCK_STREAM、SOCK_DGRAM)
* protocol(协议, 0表示默认协议)
* 返回: 点分十进制字符串表示的IP地址
*/
int socket(int domain, int type, int protocol);
// 7、命名socket
#include
#include
/*
* 函数: bind
* 参数: sockfd(socket描述符)
* my_addr(地址)
* addrlen(地址长度)
* 返回: 0(成功)
* -1(失败)
*/
int bind(int sockfd, const struct sockaddr* my_addr, socklen_t addrlen);
// 8、监听socket
#include
/*
* 函数: listen
* 参数: sockfd(socket描述符)
* backlog(内核监听队列的最大长度)
* 返回: 0(成功)
* -1(失败)
*/
int listen(int sockfd, int backlog);
// 9、接受连接
#include
#include
/*
* 函数: accept
* 参数: sockfd(socket描述符)
* addr(被连接的远端socket地址)
* addrlen(地址长度)
* 返回: 新的socket(成功)
* -1(失败)
*/
int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen);
// 10、发起连接
#include
#include
/*
* 函数: connect
* 参数: sockfd(socket描述符)
* serv_addr(服务器监听的socket地址)
* addrlen(地址长度)
* 返回: 0(成功)
* -1(失败)
*/
int connect(int sockfd, const struct sockaddr *serv_addr, socklen_t addrlen);
// 11、关闭连接
#include
/*
* 函数: close
* 参数: fd(socket描述符)
* 返回: 0(成功)
* -1(失败)
*/
int close(int fd);
#include
/*
* 函数: shutdown
* 参数: sockfd(socket描述符)
* howto(SHUT_RD、SHUT_WR、SHUT_RDWR)
* 返回: 0(成功)
* -1(失败)
*/
int shutdown(int sockfd, int howto);
// 12、TCP数据读写
#include
#include
/*
* 函数: recv
* 参数: sockfd(socket描述符)
* buf(接收缓冲区)
* len(缓冲区大小)
* flags(控制参数, 通常设置为0即可)
* 返回: 实际读取到的数据长度(成功)
* 0(对方已关闭了连接)
* -1(失败)
*/
ssize_t recv(int sockfd, void *buf, size_t len, int flags);
/*
* 函数: send
* 参数: sockfd(socket描述符)
* buf(发送缓冲区)
* len(缓冲区大小)
* flags(控制参数, 通常设置为0即可)
* 返回: 实际发送的数据长度(成功)
* -1(失败)
*/
ssize_t send(int sockfd, const void *buf, size_t len, int flags);
// 13、UDP数据读写
#include
#include
/*
* 函数: recvfrom
* 参数: sockfd(socket描述符)
* buf(接收缓冲区)
* len(缓冲区大小)
* flags(控制参数, 通常设置为0即可)
* src_addr(发送端地址)
* addrlen(地址长度)
* 返回: 实际读取的数据长度(成功)
* -1(失败)
*/
ssize_t recvfrom(int sockfd, void *buf, size_t len, int flags, struct sockaddr *src_addr, socklen_t *addrlen);
/*
* 函数: sendto
* 参数: sockfd(socket描述符)
* buf(发送缓冲区)
* len(缓冲区大小)
* flags(控制参数, 通常设置为0即可)
* dest_addr(接收端地址)
* addrlen(地址长度)
* 返回: 实际写入的数据长度(成功)
* -1(失败)
*/
ssize_t sendto(int sockfd, const void *buf, size_t len, int flags, const struct sockaddr *dest_addr, socklen_t addrlen);
// 14、获取地址信息
#include
/*
* 函数: getsockname
* 参数: sockfd(socket描述符)
* address(本端地址)
* address_len(地址长度)
* 返回: 0(成功)
* -1(失败)
*/
int getsockname(int sockfd, struct sockaddr *address, socklen_t *address_len);
/*
* 函数: getpeername
* 参数: sockfd(socket描述符)
* address(远端地址)
* address_len(地址长度)
* 返回: 0(成功)
* -1(失败)
*/
int getpeername(int sockfd, struct sockaddr *address, socklen_t *address_len);