自学内容网 自学内容网

浅谈C++之UDP通信

基本步骤

在C++中,可以使用标准库中的套接字API来实现UDP通信。以下是使用UDP进行通信的基本步骤:

1. 创建UDP服务器(接收端)

#include <iostream>
#include <cstring> // for memset
#include <sys/socket.h> // for socket functions
#include <netinet/in.h> // for sockaddr_in
#include <arpa/inet.h> // for inet_addr

int main() {
    int server_fd, new_socket;
    struct sockaddr_in address;
    int opt = 1;
    int addrlen = sizeof(address);
    char buffer[1024] = {0};
    char *hello = "Hello from server";

    // Creating socket file descriptor
    if ((server_fd = socket(AF_INET, SOCK_DGRAM, 0)) == 0) {
        perror("socket failed");
        exit(EXIT_FAILURE);
    }

    // Forcefully attaching socket to the port 8080
    if (setsockopt(server_fd, SOL_SOCKET, SO_REUSEADDR | SO_REUSEPORT, &opt, sizeof(opt))) {
        perror("setsockopt");
        exit(EXIT_FAILURE);
    }
    address.sin_family = AF_INET;
    address.sin_addr.s_addr = INADDR_ANY;
    address.sin_port = htons(8080);

    // Forcefully attaching socket to the port 8080
    if (bind(server_fd, (struct sockaddr *)&address, sizeof(address)) < 0) {
        perror("bind failed");
        exit(EXIT_FAILURE);
    }

    while (1) {
        // Clear the buffer by using memset
        memset(buffer, 0, 1024);

        // Receive message from client
        if (recvfrom(server_fd, buffer, 1024, 0, (struct sockaddr *)&address, (socklen_t*)&addrlen) < 0) {
            perror("recvfrom failed");
            exit(EXIT_FAILURE);
        }

        std::cout << "Client : " << buffer << std::endl;

        // Send message to client
        if (sendto(server_fd, hello, strlen(hello), 0, (struct sockaddr *)&address, addrlen) < 0) {
            perror("sendto failed");
            exit(EXIT_FAILURE);
        }
    }

    return 0;
}

2. 创建UDP客户端(发送端)

#include <iostream>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <unistd.h>
#include <string.h>

int main() {
    int sock = 0;
    struct sockaddr_in serv_addr;
    char *hello = "Hello from client";
    char buffer[1024] = {0};

    if ((sock = socket(AF_INET, SOCK_DGRAM, 0)) < 0) {
        std::cout << "\n Socket creation error \n";
        return -1;
    }

    serv_addr.sin_family = AF_INET;
    serv_addr.sin_port = htons(8080);

    // Convert IPv4 and IPv6 addresses from text to binary form
    if(inet_pton(AF_INET, "127.0.0.1", &serv_addr.sin_addr)<=0) {
        std::cout << "\nInvalid address/ Address not supported \n";
        return -1;
    }

    // Send message to server
    sendto(sock, hello, strlen(hello), 0, (struct sockaddr *)&serv_addr, sizeof(serv_addr));
    printf("Hello message sent\n");

    // Receive response from the server
    int valread = recvfrom(sock, buffer, 1024, 0, (struct sockaddr *)&serv_addr, sizeof(serv_addr));
    printf(" %s \n", buffer);

    return 0;
}

注意事项:

  • 确保在编译时链接了正确的库,例如使用g++ -o udp_server udp_server.cppg++ -o udp_client udp_client.cpp
  • 服务器和客户端都应该检查套接字操作的返回值,以处理可能的错误。
  • 在实际应用中,你可能需要处理异常和错误,例如网络中断或数据包丢失。
  • 确保服务器和客户端的端口号匹配,并且服务器端口没有被其他应用占用。
  • 考虑到UDP是不可靠的,你可能需要在应用层实现一些机制来确保数据的完整性和顺序。


原文地址:https://blog.csdn.net/a876106354/article/details/142898115

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!