一、客户端接收(也可以bind)
1. socket
socket 函数 用于创建一个套接字(socket),这是网络通信的基础。
它的原型如下:int socket(int domain, int type, int protocol);
-
参数:
domain:指定协议族,如:AF_INET:IPv4协议AF_INET6:IPv6协议
type:指定通信类型,如:SOCK_STREAM:面向连接的TCP协议SOCK_DGRAM:无连接的UDP协议
protocol:一般设为0,表示使用默认协议。
-
返回值:返回套接字的描述符,失败则返回-1。
2. recvfrom
recvfrom 函数用于接收数据报(UDP)的函数。它的原型如下:
ssize_t recvfrom(int sockfd, void *buf, size_t len, int flags, struct sockaddr *src_addr, socklen_t *addrlen);
-
参数:
sockfd:套接字描述符。buf:指向接收数据的缓冲区。len:缓冲区的长度。flags:接收选项,一般设为0。src_addr:指向sockaddr结构的指针,用于存储发送者的地址信息。addrlen:指向变量的指针,表示src_addr的长度。
-
返回值:成功时返回接收到的字节数,失败时返回-1。
3.sendto
函数的原型通常如下所示:
ssize_t sendto(int sockfd, const void *buf, size_t len, int flags, const struct sockaddr *dest_addr, socklen_t addrlen);
参数说明:
sockfd: 套接字描述符,通常是通过socket函数创建的。buf: 指向要发送的数据的指针。len: 要发送的数据的字节数。flags: 发送操作的标志,常用的有 0(无特殊标志)。dest_addr: 目的地的地址信息,指向struct sockaddr结构体。addrlen: 目的地地址结构的长度。-
返回值:
- 成功时,返回发送的字节数;失败时,返回 -1,错误信息可以通过
errno获取。
4. inet_addr
inet_addr 函数用于将IPv4地址的字符串表示形式(如 "192.168.1.1")转换为网络字节序的二进制形式。其原型如下:
in_addr_t inet_addr(const char *cp);
- 参数:
cp是指向包含点分十进制IP地址字符串的指针。 - 返回值:返回一个
in_addr_t类型的数值,表示网络字节序的IPv4地址。如果输入的IP地址格式不正确,则返回INADDR_NONE。
4. inet_ntoa
inet_ntoa 函数用于将网络字节序的二进制IP地址转换为点分十进制字符串表示形式。其原型如下:
char *inet_ntoa(struct in_addr addr);
- 参数:
addr是一个struct in_addr类型的结构,包含网络字节序的IPv4地址。 - 返回值:返回一个指向字符串的指针,该字符串表示IPv4地址。该字符串为静态分配,后续调用可能会覆盖该字符串。
5. ntohs
ntohs 函数用于将网络字节序转换为主机字节序的无符号短整型(一般用于端口号)。其原型如下:
uint16_t ntohs(uint16_t netshort);
- 参数:
netshort是网络字节序的无符号短整型值。 - 返回值:返回一个主机字节序的无符号短整型值。
6.htons
函数原型: uint16_t htons(uint16_t hostshort);
参数
hostshort: 需要转换的 16 位无符号整数,通常代表端口号或其他短整型值。
返回值
htons 返回转换后的 16 位无符号整数,以网络字节序表示。
网络字节序 vs主机字节序
- 网络字节序:通常是大端字节序(big-endian),即高位字节存储在低地址。
- 主机字节序:根据具体的硬件架构,可以是大端或小端(little-endian)。例如,大多数 x86 架构使用小端字节序。

二、服务器端
1.socket
2.bind
bind 函数用于将一个套接字(socket)与一个本地地址(包括IP地址和端口号)关联起来。它通常用于服务器套接字,以便在特定地址上监听传入的连接请求。bind 的原型如下:
int bind(int sockfd, const struct sockaddr *addr, socklen_t addrlen);
参数:
sockfd:一个套接字的描述符,通常是通过调用socket函数创建的。addr:指向一个sockaddr结构体的指针,其中包含接口的地址和端口号。通常需要将其转换为适当的地址结构,例如sockaddr_in(用于IPv4)。addrlen:addr的长度,通常可以使用sizeof来获取。
返回值:
- 成功时返回0。
- 失败时返回-1,并且可以通过
errno获取具体的错误信息。

三、基于tcp的网络通信;(read,write)

1.tcp服务器
(1)建立连接
socket
bind
listen
listen 函数用于将一个已绑定的套接字设为监听状态,以便接收传入的连接请求。只有在调用 bind 后,才能调用 listen。其原型如下:
int listen(int sockfd, int backlog);
参数:
sockfd:一个套接字的描述符,它已经通过socket和bind函数创建和绑定。backlog:表示等待连接排队的最大数量。如果连接请求超过此数量,额外的请求会被拒绝或被重置。
返回值:
- 成功时返回0。
- 失败时返回-1,并且可以通过
errno获取具体的错误信息
accept
accept 函数用于接受传入的连接请求。成功后,它会返回一个新的套接字文件描述符,用于与连接的客户端进行通信。其原型如下:
int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen);
参数:
sockfd:一个处于监听状态的套接字描述符,由listen返回。addr:指向一个sockaddr结构的指针,用于存储客户端的地址信息。addrlen:指向一个socklen_t类型的变量的指针,表示addr的大小,接受后会被更新为实际的地址长度。
返回值:
- 成功时返回一个新的套接字文件描述符,用于与客户端通信。
- 失败时返回-1,并且可以通过
errno获取具体的错误信息。

2.tcp客户端
socket
connect
connect 函数用于客户端程序建立与服务器的连接。使用该函数时,客户端需要先创建一个套接字,并且必须知道服务器的地址和端口号。其原型如下:
int connect(int sockfd, const struct sockaddr *addr, socklen_t addrlen);
参数:
sockfd:通过socket创建的套接字描述符,客户端使用此套接字进行连接。addr:指向一个sockaddr结构的指针,包含服务器的地址(IP 地址和端口号)。addrlen:addr的大小,通常使用sizeof(struct sockaddr_in)来获得。
返回值:
- 成功时返回0。
- 失败时返回-1,并且可以通过
errno获取具体的错误信息。





![[Meachines] [Easy] Optimum HFS文件管理2.3.x-RCE+MS16-032](https://img-blog.csdnimg.cn/img_convert/0519f946163b0e82930667efde6c4ded.jpeg)






![[Meachines] [Easy] grandpa IIS 6.0+CVE-2017-7269+MS14-070权限提升](https://img-blog.csdnimg.cn/img_convert/3b6d3674c62e3ae3bd20bf436222f0df.jpeg)







