客户端
步骤 | 描述 | 示例代码 |
创建套接字 | 使用socket 函数创建一个套接字描述符,指定地址族(如AF_INET表示IPv4)、套接字类型(SOCK_STREAM表示流式套接字,适用于TCP)和协议(通常为0,表示默认协议)。 | int sockfd = socket(AF_INET, SOCK_STREAM, 0); |
设置服务器地址 | 定义一个struct sockaddr_in 结构体来存储服务器的地址信息,包括服务器的IP地址和端口号,需要将IP地址从字符串形式转换为二进制形式(使用inet_pton 函数),并设置端口号(注意网络字节序转换,使用htons 函数)。 | struct sockaddr_in server_addr; |
连接服务器 | 使用connect 函数向服务器发起连接请求,传入套接字描述符和服务器地址结构体,如果连接成功,返回0;否则返回 -1。 | if (connect(sockfd, (struct sockaddr *)&server_addr, sizeof(server_addr)) perror("Connect failed"); |
数据发送与接收 | 连接成功后,可以使用send 或recv 函数进行数据的发送和接收,发送数据可以使用send(sockfd, buffer, strlen(buffer), 0); ,接收数据可以使用recv(sockfd, buffer, sizeof(buffer), 0); 。 |
服务器端
步骤 | 描述 | 示例代码 |
创建套接字 | 同客户端的创建套接字步骤,创建一个用于监听的套接字。 | int listenfd = socket(AF_INET, SOCK_STREAM, 0); |
绑定地址 | 定义一个struct sockaddr_in 结构体来设置服务器的本地地址和端口号,然后使用bind 函数将套接字与该地址绑定。 | struct sockaddr_in server_addr; |
开始监听 | 使用listen 函数使套接字进入被动打开状态,准备接受客户端的连接请求,指定监听的套接字描述符和最大挂起连接数(一般为5)。 | listen(listenfd, 5); |
接受连接 | 当有客户端连接请求时,使用accept 函数接受连接,返回一个新的套接字描述符用于与该客户端进行通信。 | int connfd = accept(listenfd, (struct sockaddr *)NULL, NULL); |
数据交互 | 与客户端类似,使用send 和recv 函数进行数据的发送和接收。 |
客户端
步骤 | 描述 | 示例代码 |
创建套接字 | 使用socket 函数创建一个套接字描述符,地址族为AF_INET,套接字类型为SOCK_DGRAM(表示数据报套接字,适用于UDP)。 | int sockfd = socket(AF_INET, SOCK_DGRAM, 0); |
设置服务器地址 | 同TCP客户端的设置服务器地址步骤,定义服务器的IP地址和端口号。 | struct sockaddr_in server_addr; |
发送数据 | 使用sendto 函数向服务器发送数据,需要传入套接字描述符、要发送的数据、数据长度、服务器地址结构体和地址长度。 | char *message = "Hello, UDP Server!"; |
接收数据 | 使用recvfrom 函数接收服务器发送的数据,同时可以获取发送方的地址信息。 | `char buffer[1024]; int n = recvfrom(sockfd, buffer, sizeof(buffer), 0, NULL, NULL); buffer[n] = ‘ |