Linux系统c语言socket实现UDP通信

⌚Time: 2023-05-22 15:27:09

👨‍💻Author: Jack Ge

UDP全称 User Datagram Protocol,即:用户数据报协议。是面向无连接的协议。通常,UDP 通信还会被冠以不可靠的头衔。这里的不可靠指的是:无法可靠地得知对方是否收到数据。

UDP有如下特征:

简单来讲,UDP 类似于寄信,如果两个人除了信件之外没有任何别的通信方式,那么信件寄出去了之后,寄件人是无法得知收件人是否收到信件或者是否已经读取内容的。UDP 的特点是无需连接、无需确认、无需缓冲区和分包序列号,因此 UDP 的效率是比较高的。

UDP适用情况

UDP通信流程

发送方:

接收方:

代码

客户端


#include <stdio.h>

#include <string.h>

#include <stdlib.h>

#include <unistd.h>

#include <arpa/inet.h>

#include <netinet/in.h>

#include <sys/socket.h>



int main(){



    int sockfd = socket(AF_INET, SOCK_DGRAM,  IPPROTO_UDP);

    struct sockaddr_in serv_addr;

    memset(&serv_addr, 0, sizeof(serv_addr));

    serv_addr.sin_family = AF_INET;

    serv_addr.sin_addr.s_addr = inet_addr("127.0.0.1");

    serv_addr.sin_port = htons(1234);





    while(1){

        char buff[128] = {0};

        fgets(buff, 128, stdin);

        sendto(sockfd, buff, strlen(buff), 0, (struct sockaddr*)&serv_addr, sizeof(serv_addr));

    }



    close(sockfd);



    return 0;

}

服务端


#include <stdio.h>

#include <string.h>

#include <stdlib.h>

#include <unistd.h>

#include <arpa/inet.h>

#include <netinet/in.h>

#include <sys/socket.h>



int main(){



    int sockfd = socket(AF_INET, SOCK_DGRAM,  IPPROTO_UDP);

    struct sockaddr_in serv_addr, clnt_addr;

    memset(&serv_addr, 0, sizeof(serv_addr));

    serv_addr.sin_family = AF_INET;

    serv_addr.sin_addr.s_addr = inet_addr("127.0.0.1");

    serv_addr.sin_port = htons(1234);

    bind(sockfd, (struct sockaddr*)&serv_addr, sizeof(serv_addr));



    while(1){

        char buff[128] = {0};

        memset(buff, 0, sizeof(buff));

        socklen_t len = (socklen_t)sizeof(clnt_addr);

        int recv_size = recvfrom(sockfd, buff, sizeof(buff)-1, 0, (struct sockaddr*)&clnt_addr, &len);

        char *ip = inet_ntoa(clnt_addr.sin_addr);

        int port = ntohs(clnt_addr.sin_port);

        printf("message from %s:%d,length:%d,context:%s\n", ip, port, recv_size, buff);

    }



    close(sockfd);



    return 0;

}