Linux C语言实现UDP的发送和接收

发送端实现:U1.c

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

int main(int argc, char** argv)
{
    // 第一步:创建套接字
    // UDP 协议使用数据报式套接字,即套接字类型为 SOCK_DGRAM
    int sock = socket(AF_INET, SOCK_DGRAM, 0);

    if(sock == -1)
    {
        perror("socket");
        return 1;
    }


    // 第二步:绑定地址(IP + Port)
    struct sockaddr_in myaddr;
    myaddr.sin_family = AF_INET;
    myaddr.sin_addr.s_addr = inet_addr("127.0.0.1");
    myaddr.sin_port = htons(8888);

    if(bind(sock, (struct sockaddr*)&myaddr, sizeof(myaddr)) == -1)
    {
        perror("bind");
        return 1;
    }

    // 第三步:收发数据
    
    // 发送数据
    
    // 指定接收方地址   
    struct sockaddr_in dst_addr;
    dst_addr.sin_family = AF_INET;
    dst_addr.sin_addr.s_addr = inet_addr(argv[1]);//命令行输入接收方IP
    dst_addr.sin_port = htons(atoi(argv[2]));//命令行输入端口号

    // 指定数据内容
    char msg[128];
    int ret;

    while(1)
    {
        // 发送出去
        sprintf(msg, "hello, i am world");
        ret = sendto(sock, msg, strlen(msg), 0, (struct sockaddr*)&dst_addr, sizeof(dst_addr));
        sleep(1);
        if(ret == -1)
        {
            perror("sendto");
        }

    }
   
    // 第四步:关闭套接字
    close(sock);
    
    return 0;
} 

接收方实现:U2.c

#include <stdio.h>                                                                                                                                                                                                                               
#include <time.h>
#include <string.h>
#include <sys/socket.h>
#include <sys/types.h>
#include <arpa/inet.h>
#include <unistd.h>

int main()
{
    // 第一步:创建套接字
    // UDP 协议使用数据报式套接字,即套接字类型为 SOCK_DGRAM
    int sock = socket(AF_INET, SOCK_DGRAM, 0);

    if(sock == -1)
    {
        perror("socket");
        return 1;
    }


    // 第二步:绑定地址(IP + Port)
    struct sockaddr_in myaddr;
    myaddr.sin_family = AF_INET;
    myaddr.sin_addr.s_addr = INADDR_ANY;
    myaddr.sin_port = htons(9999);

    if(bind(sock, (struct sockaddr*)&myaddr, sizeof(myaddr)) == -1)
    {
        perror("bind");
        return 1;
    }


    // 第三步:收发数据
    
    char msg[100];
    int ret;
    

    // 接收数据
    
    //connect(sock, (struct sockaddr*)&addr, sizeof(addr));

    while(1)
    {   
        struct sockaddr_in addr;
        socklen_t len  = sizeof(addr);
        // 调用 recvfrom 函数时如果当前没有任何数据包,它会阻塞当前线程,直到成功接收到一个数据包或出错。出错时返回 -1,成功接收到一个数据包时返回接收到的字节数,如果收到空数据包,返回值为 0
    
        ret = recvfrom(sock, msg, sizeof(msg) - 1, 0, (struct sockaddr*)&addr, &len);
    
        if(0 < ret)
        {
            msg[ret] = '\0';
            printf("\n%s:%d说:%s\n", inet_ntoa(addr.sin_addr), ntohs(addr.sin_port), msg);
        }
        
    }

// 第四步:关闭套接字
    close(sock);

    return 0;
}

编译:gcc U1.c -o U1

           gcc U2.c -o U2

运行:./U1 192.xxx.xxx.xxx(IP地址) 9999(端口号,两程序需一致)

            ./U2文章来源地址https://www.uudwc.com/A/LaWwg/

原文地址:https://blog.csdn.net/itmozun629/article/details/129821150

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请联系站长进行投诉反馈,一经查实,立即删除!

h
上一篇 2023年11月01日 14:49
报错:Java HotSpot(TM) 64-Bit Server VM warning: Sharing is only supported for boot loader classes ...
下一篇 2023年11月01日 17:19