📜  使用connect的UDP客户端服务器| C实现(1)

📅  最后修改于: 2023-12-03 15:06:52.227000             🧑  作者: Mango

使用connect的UDP客户端服务器 | C实现

介绍

在网络编程中,UDP是一种无连接协议,因此可靠性较低。但是,由于其速度快,在一些应用场景中使用广泛,例如视频流传输、在线游戏等。本文将介绍如何使用connect函数实现UDP客户端服务器的通信,实现对UDP传输的加强控制,提高通信可靠性。

实现步骤
UDP服务端

创建socket

// AF_INET表示网络协议,SOCK_DGRAM表示数据报传输,0表示协议类型由系统自动选择
int sockfd = socket(AF_INET, SOCK_DGRAM, 0);

绑定地址

struct sockaddr_in servaddr;
memset(&servaddr, 0, sizeof(servaddr)); // 初始化地址结构体
servaddr.sin_family = AF_INET; // 使用IPv4协议
servaddr.sin_port = htons(8888); // 设定端口号为8888
servaddr.sin_addr.s_addr = htonl(INADDR_ANY); // 将IP设定为本地任意地址
bind(sockfd, (struct sockaddr *)&servaddr, sizeof(servaddr)); // 绑定地址

接收数据

在使用connect函数处理数据时,客户端必须与服务端建立连接,因此服务端需要处理连接请求,并在连接建立后,通过接收数据的方式接受客户端发送过来的数据。

struct sockaddr_in cliaddr;
socklen_t len = sizeof(cliaddr);
char buffer[1024];
recvfrom(sockfd, buffer, sizeof(buffer), 0, (struct sockaddr *)&cliaddr, &len); // 接收客户端发送的数据
UDP客户端

创建socket

// AF_INET表示网络协议,SOCK_DGRAM表示数据报传输,0表示协议类型由系统自动选择
int sockfd = socket(AF_INET, SOCK_DGRAM, 0);

设定连接对象地址并连接

struct sockaddr_in servaddr;
memset(&servaddr, 0, sizeof(servaddr)); // 初始化地址结构体
servaddr.sin_family = AF_INET; // 使用IPv4协议
servaddr.sin_port = htons(8888); // 设定端口号为8888
inet_pton(AF_INET, "127.0.0.1", &servaddr.sin_addr); // 设定IP地址为127.0.0.1
connect(sockfd, (struct sockaddr *)&servaddr, sizeof(servaddr)); // 连接指定地址

发送数据

在使用connect函数处理数据时,由于已经建立连接,客户端无需指明发送的对象地址,只需要发送数据即可。

char buffer[1024] = "Hello, UDP Server!";
send(sockfd, buffer, strlen(buffer), 0); // 发送数据
完整代码
UDP服务端
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>

int main()
{
    int sockfd = socket(AF_INET, SOCK_DGRAM, 0);
    
    struct sockaddr_in servaddr;
    memset(&servaddr, 0, sizeof(servaddr));
    servaddr.sin_family = AF_INET;
    servaddr.sin_port = htons(8888);
    servaddr.sin_addr.s_addr = htonl(INADDR_ANY);
    
    bind(sockfd, (struct sockaddr *)&servaddr, sizeof(servaddr));
    
    struct sockaddr_in cliaddr;
    socklen_t len = sizeof(cliaddr);
    char buffer[1024];
    
    recvfrom(sockfd, buffer, sizeof(buffer), 0, (struct sockaddr *)&cliaddr, &len);
    printf("Message from client: %s\n", buffer);
    
    close(sockfd);
    return 0;
}
UDP客户端
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>

int main()
{
    int sockfd = socket(AF_INET, SOCK_DGRAM, 0);
    
    struct sockaddr_in servaddr;
    memset(&servaddr, 0, sizeof(servaddr));
    servaddr.sin_family = AF_INET;
    servaddr.sin_port = htons(8888);
    inet_pton(AF_INET, "127.0.0.1", &servaddr.sin_addr);
    
    connect(sockfd, (struct sockaddr *)&servaddr, sizeof(servaddr));
    
    char buffer[1024] = "Hello, UDP Server!";
    
    send(sockfd, buffer, strlen(buffer), 0);
    
    close(sockfd);
    return 0;
}
总结

使用connect函数可以提高UDP通信的可靠性,使其在一定程度上接近TCP传输的稳定性。但是使用UDP对数据的要求比TCP更高,因此在实际应用中,我们需要格外注意数据传输的稳定性,确保数据的可靠到达。