目录
预备知识
一.socket常见接口
1.1 socket
1.2 bind
1.2.1 sockaddr结构
1.2.2 sockaddr_in 结构
1.2.3 in_addr结构
1.3 listen
1.4 accept
1.5 connect
二. 数据接收与发送
2.1 send 和 sendto
2.2 recv 和 recvfrom
预备知识
- 端口号:用来标识一个进程, 告诉操作系统, 当前的这个数据要交给哪一个进程来处理
- ip地址:是互联网协议地址,用于在网络中唯一标识设备。它类似于家庭地址,帮助数据在互联网中找到正确的目的地。
- ucp协议:UDP协议叫做用户数据报协议(User Datagram Pool),它无需建立连接,而且不可靠,面向数据报的传输层协议
- tcp协议:传输控制协议(Transmission Control Protocol),他是可连接,可靠,面向字节流的协议
- 网络字节序:网络当中传输的数据必须采用大端字节序(不管是大端机还是小端机器,在网络传输中,必须转化为大端存储方式传送)以下是转换函数
一.socket常见接口
// 创建 socket 文件描述符 (TCP/UDP, 客户端 + 服务器)
int socket(int domain, int type, int protocol);// 绑定端口号 (TCP/UDP, 服务器)
int bind(int socket, const struct sockaddr *address, socklen_t address_len);// 开始监听socket (TCP, 服务器)
int listen(int socket, int backlog);// 接收请求 (TCP, 服务器)
int accept(int socket, struct sockaddr* address, socklen_t* address_len);// 建立连接 (TCP, 客户端)
int connect(int sockfd, const struct sockaddr *addr, socklen_t addrlen);
1.1 socket
socket 函数是网络编程中最基本的函数之一,用于 创建一个端点 (socket),它是进程间通信的 点对点连接 。以下是 socket 函数的详解:
参数说明:
domain (int):
- 指定通信协议的家族。最常见的是
AF_INET
(IPv4)和AF_INET6
(IPv6)。type (int):
- 指定socket的类型,决定了socket的使用方式。常见的类型有:
SOCK_STREAM
:提供基于TCP的可靠连接。SOCK_DGRAM
:提供基于UDP的数据报服务。SOCK_SEQPACKET
:提供一个面向连接的、有序的、等长的包序列。protocol (int):
- 指定使用的特定协议。通常情况下,可以设置为0,表示让系统选择默认的协议。对于
SOCK_STREAM
,通常使用IPPROTO_TCP
;对于SOCK_DGRAM
,通常使用IPPROTO_UDP
。
返回值:
- 成功时,函数返回新创建的socket的文件描述符。
- 失败时,返回-1,并设置全局变量
errno
以指示错误类型。
1.2 bind
bind
函数在网络编程中用于将一个套接字(socket)与特定的网络地址和端口绑定在一起。以下是bind
函数的详解:
参数说明:
socket (int):
- 要绑定的套接字的文件描述符,由
socket
函数创建。address (const struct sockaddr *):
- 指向
sockaddr
结构的指针,包含了要绑定的网络地址信息。sockaddr
是一个通用结构,具体类型取决于地址族,例如sockaddr_in
对于 IPv4,sockaddr_in6
对于 IPv6。address_len (socklen_t):
sockaddr
结构的大小,以字节为单位。这个参数是必须的,因为sockaddr
结构是一个可变长度的结构。
返回值:
- 成功时,函数返回0。
- 失败时,返回-1,并设置全局变量
errno
以指示错误类型
使用示例:
struct sockaddr_in server_addr;
memset(&server_addr, 0, sizeof(server_addr));
server_addr.sin_family = AF_INET;
server_addr.sin_port = htons(8080); // 端口号
server_addr.sin_addr.s_addr = htonl(INADDR_ANY); // 任意本地地址int result = bind(sockfd, (struct sockaddr *)&server_addr, sizeof(server_addr));
if (result < 0) {// 错误处理
}
1.2.1 sockaddr结构
1.2.2 sockaddr_in 结构
虽然socket api的接口是sockaddr, 但是我们真正在基于IPv4编程时, 使用的数据结构是sockaddr_in; 这个结构里主 要有三部分信息: 地址类型, 端口号, IP地址.
1.2.3 in_addr结构
in_addr用来表示一个IPv4的IP地址. 其实就是一个32位的整数
1.3 listen
listen
函数用于将一个套接字(socket)设置为监听状态,等待客户端的连接请求。这个函数通常在服务器端使用,用于接受客户端的连接请求。以下是listen
函数的详解:
参数说明:
socket (int):
- 要监听的套接字的文件描述符。这个套接字必须是一个已经绑定到特定地址和端口的 TCP 套接字。
backlog (int):
- 指定未完成连接的最大队列长度。也就是说,可以有多少个客户端连接请求在排队等待被服务器接受。如果队列满了,新的连接请求将被拒绝。
返回值:
- 成功时,函数返回0。
- 失败时,返回-1,并设置全局变量
errno
以指示错误类型。
1.4 accept
accept
函数用于接受一个连接请求,通常在服务器端使用。当服务器端的套接字(socket)调用了listen
函数并进入监听状态后,客户端的连接请求会被放入队列中。服务器端通过调用accept
函数来从队列中取出一个连接请求,并建立一个连接。
参数说明:
socket (int):
- 监听套接字的文件描述符。这个套接字必须已经调用过
listen
函数。*address (struct sockaddr)**:
- 指向
sockaddr
结构的指针,用于存储连接请求的客户端的地址信息。如果不需要客户端地址信息,可以设置为 NULL。*address_len (socklen_t)**:
- 指向
socklen_t
类型的指针,传入时指定address
缓冲区的长度。函数返回时,实际使用的address
缓冲区长度会被存储在这个变量中。
返回值:
- 成功时,函数返回一个新的套接字文件描述符,这个新的套接字用于与客户端通信。
- 失败时,返回-1,并设置全局变量
errno
以指示错误类型。
1.5 connect
connect
函数用于在客户端程序中建立一个到服务器的连接。它将一个套接字(socket)与服务器的地址和端口号关联起来,从而启动一个连接过程。
参数说明:
sockfd (int):
- 客户端套接字的文件描述符。这个套接字必须已经通过
socket
函数创建,并且可以是阻塞或非阻塞的。addr (const struct sockaddr *):
- 指向
sockaddr
结构的指针,包含了服务器的地址信息。这个结构的具体类型取决于使用的地址族(如sockaddr_in
对于 IPv4,sockaddr_in6
对于 IPv6)。addrlen (socklen_t):
sockaddr
结构的大小,以字节为单位。这个参数是必须的,因为sockaddr
结构是一个可变长度的结构。
返回值:
- 成功时,函数返回0。
- 失败时,返回-1,并设置全局变量
errno
以指示错误类型。
二. 数据接收与发送
2.1 send
和 sendto
send
函数用于向连接的套接字发送数据。通常用于TCP套接字
sendto
函数用于向指定地址发送数据,通常用于UDP套接字。
send参数说明:
- sockfd (int): 套接字文件描述符。
- buf (const void *): 指向要发送的数据的指针。
- len (size_t): 要发送的数据长度。
- flags (int): 指定发送操作的标志。通常设置为0。
sendto参数说明:
- sockfd (int): 套接字文件描述符。
- buf (const void *): 指向要发送的数据的指针。
- len (size_t): 要发送的数据长度。
- flags (int): 指定发送操作的标志。通常设置为0。
- dest_addr (const struct sockaddr *): 指向目标地址的指针。
- addrlen (socklen_t): 目标地址结构的大小。
返回值:
- 成功时,返回发送的字节数。
- 失败时,返回-1,
2.2 recv 和 recvfrom
recv
函数用于接收来自连接套接字的数据。通常用于TCP套接字。
recvfrom
函数用于接收来自指定地址的数据,通常用于UDP套接字。
recv参数说明:
- sockfd (int): 套接字文件描述符。
- buf (void *): 指向接收数据的缓冲区的指针。
- len (size_t): 缓冲区的长度。
- flags (int): 指定接收操作的标志。通常设置为0。
recvfrom参数说明:
- sockfd (int): 套接字文件描述符。
- buf (void *): 指向接收数据的缓冲区的指针。
- len (size_t): 缓冲区的长度。
- flags (int): 指定接收操作的标志。通常设置为0。
- src_addr (struct sockaddr *): 指向存储源地址的指针。
- addrlen (socklen_t *): 传入时指定源地址结构的大小,返回时实际使用的字节数。
返回值:
- 成功时,返回接收的字节数。
- 失败时,返回-1,并设置全局变量
errno
。- 如果连接被对方关闭,返回0。