一、客户端接收(也可以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
获取具体的错误信息。