【网络】基于UDP协议的聊天室(第二篇)

目录

UDP服务器

UDP客户端


在C++中,使用UDP协议进行网络通信通常涉及到socket编程。下面我将给出基于UDP的简单的客户端和服务器示例代码。这些示例将使用C++标准库以及POSIX套接字接口(主要适用于Linux和类Unix系统)。如果你在使用Windows,可能需要使用Winsock库,但这里我们主要关注POSIX接口。

UDP服务器

UDP服务器的主要任务是监听特定端口上的数据报,并处理接收到的数据。

cpp 复制代码
#include <iostream>  
#include <sys/socket.h>  
#include <netinet/in.h>  
#include <unistd.h>  
#include <cstring>  
  
#define PORT 8080  
#define BUFFER_SIZE 1024  
  
int main() {  
    int server_fd, new_socket;  
    struct sockaddr_in address;  
    int opt = 1;  
    int addrlen = sizeof(address);  
    char buffer[BUFFER_SIZE] = {0};  
  
    // 创建 socket 文件描述符  
    if ((server_fd = socket(AF_INET, SOCK_DGRAM, 0)) == 0) {  
        perror("socket failed");  
        exit(EXIT_FAILURE);  
    }  
  
    // 绑定 socket 到端口 8080  
    address.sin_family = AF_INET;  
    address.sin_addr.s_addr = INADDR_ANY;  
    address.sin_port = htons(PORT);  
  
    if (bind(server_fd, (struct sockaddr *)&address, sizeof(address)) < 0) {  
        perror("bind failed");  
        exit(EXIT_FAILURE);  
    }  
  
    // 设置 socket 选项  
    if (setsockopt(server_fd, SOL_SOCKET, SO_REUSEADDR | SO_REUSEPORT, &opt, sizeof(opt))) {  
        perror("setsockopt");  
        exit(EXIT_FAILURE);  
    }  
  
    while (true) {  
        // 接收数据  
        int len = recvfrom(server_fd, (char *)buffer, BUFFER_SIZE, MSG_WAITALL, (struct sockaddr *)&address, (socklen_t*)&addrlen);  
        buffer[len] = '\0';  
        std::cout << "Message from client: " << buffer << std::endl;  
  
        // 发送响应(如果需要)  
        // sendto(server_fd, (const char *)buffer, strlen(buffer), MSG_CONFIRM, (const struct sockaddr *)&address, addrlen);  
    }  
  
    return 0;  
}

UDP客户端

UDP客户端的主要任务是向服务器发送数据报,并可能接收来自服务器的响应。

cpp 复制代码
#include <iostream>  
#include <sys/socket.h>  
#include <netinet/in.h>  
#include <arpa/inet.h>  
#include <unistd.h>  
#include <cstring>  
  
#define PORT 8080  
  
int main() {  
    struct sockaddr_in serv_addr;  
    int sock = 0;  
    char *hello = "Hello from client";  
    char buffer[1024] = {0};  
  
    if ((sock = socket(AF_INET, SOCK_DGRAM, 0)) < 0) {  
        std::cerr << "Socket creation error" << std::endl;  
        return -1;  
    }  
  
    serv_addr.sin_family = AF_INET;  
    serv_addr.sin_port = htons(PORT);  
  
    // 将IPv4地址从文本转换成二进制形式  
    if(inet_pton(AF_INET, "127.0.0.1", &serv_addr.sin_addr)<=0) {  
        std::cerr << "Invalid address/ Address not supported" << std::endl;  
        return -1;  
    }  
  
    // 发送数据  
    sendto(sock, (const char *)hello, strlen(hello), MSG_CONFIRM, (const struct sockaddr *)&serv_addr, sizeof(serv_addr));  
  
    // 接收来自服务器的数据(如果需要)  
    // int valread = read(sock, buffer, 1024);  
    // buffer[valread] = '\0';  
    // std::cout << "Message from server: " << buffer << std::endl;  
  
    close(sock);  
    return 0;  
}

注意

  • 这些示例仅用于展示UDP通信的基本结构。
  • 真实世界的应用中,你可能需要处理更多的错误情况,如网络错误、缓冲区溢出等。
  • UDP是无连接的
相关推荐
deeper_wind5 小时前
keeplived双击热备配置
linux·运维·网络
技术猿188702783518 小时前
实现“micro 关键字搜索全覆盖商品”并通过 API 接口提供实时数据(一个方法)
开发语言·网络·python·深度学习·测试工具
zyhomepage8 小时前
科技的成就(六十九)
开发语言·网络·人工智能·科技·内容运营
Arva .9 小时前
HTTP常见误区
网络·网络协议·http
创思通信10 小时前
4G模块 A7670发送英文短信到手机
物联网·网络协议·信息与通信
Synfuture阳途11 小时前
终端安全管理系统为什么需要使用,企业需要的桌面管理软件
网络·安全
LUCIAZZZ12 小时前
高性能网络模式-Reactor和Preactor
java·服务器·开发语言·网络·操作系统·计算机系统
k *12 小时前
网络编程-tcp连接:服务器与客户端
服务器·网络·tcp/ip
云云32112 小时前
亚矩阵云手机:破解 Yandex 广告平台多账号风控难题的利器
网络·科技·线性代数·智能手机·矩阵
枷锁—sha12 小时前
【DVWA系列】——File Upload——High详细教程(webshell工具哥斯拉)
网络·web安全·网络安全