1. 程式人生 > 其它 >linux UDP C++網路程式設計演示

linux UDP C++網路程式設計演示

技術標籤:UbuntuUNIX系統程式設計C++併發程式設計實戰網路socketc++

1.引用標頭檔案

#include <iostream>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <netinet/in.h>
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

2.建立資料報套接字

int socket_fd = socket(AF_INET,SOCK_DGRAM,IPPROTO_UDP);
    if (socket_fd<0)
    {
        perror("建立socket失敗");
        exit(-1);

    }

3.繫結套接字

struct sockaddr_in server_addr;
    bzero(&server_addr, sizeof(server_addr));
    server_addr.sin_port=htons(port);
    server_addr.sin_addr.s_addr = htons(INADDR_ANY);
    server_addr.sin_family = AF_INET;

    if(bind(socket_fd,(struct sockaddr*)&server_addr, sizeof(server_addr)))
    {
        perror("繫結UDP服務失敗");
        close(socket_fd);
        exit(-1);
    }

4.接收與傳送資料

sendto(socket_fd,send_buf, strlen(send_buf),0,(struct sockaddr*)&client_addr,client_addr_len);
        int recv_len = recvfrom(socket_fd,recv_buf, sizeof(recv_buf),0,(struct sockaddr*)&client_addr,&client_addr_len);
        if (recv_len>0)
        {
            printf("%s\n",recv_buf);
        }

伺服器完整程式碼:

#include <iostream>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <netinet/in.h>
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main() {
    std::cout << "UDP網路程式設計!" << std::endl;

    unsigned short port=8000;
    int socket_fd = socket(AF_INET,SOCK_DGRAM,IPPROTO_UDP);
    if (socket_fd<0)
    {
        perror("建立socket失敗");
        exit(-1);

    }

    struct sockaddr_in server_addr;
    bzero(&server_addr, sizeof(server_addr));
    server_addr.sin_port=htons(port);
    server_addr.sin_addr.s_addr = htons(INADDR_ANY);
    server_addr.sin_family = AF_INET;

    if(bind(socket_fd,(struct sockaddr*)&server_addr, sizeof(server_addr)))
    {
        perror("繫結UDP服務失敗");
        close(socket_fd);
        exit(-1);
    }

    char send_buf[512]="udp server message";
    char recv_buf[512]="";
    unsigned short client_port = 9000;
    struct sockaddr_in client_addr;
    socklen_t client_addr_len = sizeof(sockaddr_in);
    bzero(&client_addr, sizeof(client_addr));
    client_addr.sin_family = AF_INET;
    client_addr.sin_port =htons(client_port);
    client_addr.sin_addr.s_addr = inet_addr("127.0.0.1");

    while (true)
    {
        sendto(socket_fd,send_buf, strlen(send_buf),0,(struct sockaddr*)&client_addr,client_addr_len);
        int recv_len = recvfrom(socket_fd,recv_buf, sizeof(recv_buf),0,(struct sockaddr*)&client_addr,&client_addr_len);
        if (recv_len>0)
        {
            printf("%s\n",recv_buf);
        }

    }

    return 0;
}

客戶端完整程式碼:

//
// Created by linux on 2021/2/9.
//

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>

int main(int argc,char *argv[])
{
    unsigned short port = 9000;
    int socket_fd = socket(AF_INET,SOCK_DGRAM,IPPROTO_UDP);
    if (socket_fd<0)
    {
        perror("建立socket失敗");
        exit(-1);

    }

    struct sockaddr_in server_addr;
    socklen_t server_addr_len = sizeof(server_addr);
    bzero(&server_addr, sizeof(server_addr));
    server_addr.sin_port=htons(port);
    server_addr.sin_addr.s_addr = inet_addr("127.0.0.1");
    server_addr.sin_family = AF_INET;

    bind(socket_fd,(struct sockaddr*)&server_addr, sizeof(server_addr));

    char recv_buf[512] = "";
    char send_buf[512] = "udp client data";
    unsigned short client_port = 8000;
    struct sockaddr_in client_addr;
    socklen_t client_addr_len = sizeof(sockaddr_in);
    bzero(&client_addr, sizeof(client_addr));
    client_addr.sin_family = AF_INET;
    client_addr.sin_port =htons(client_port);
    client_addr.sin_addr.s_addr = inet_addr("127.0.0.1");

    while (true)
    {
        sendto(socket_fd,send_buf, sizeof(send_buf),0,(struct sockaddr*)&client_addr,client_addr_len);
        int recv_len = recvfrom(socket_fd,recv_buf, sizeof(recv_buf),0,(struct sockaddr*)&server_addr, &server_addr_len);
        if (recv_len>0)
        {
            printf("接收的長度:%d,資料:%s\r\n",recv_len,recv_buf);
        }

    }
    close(socket_fd);
    return 0;
}