C++:UDP通信

服务端

创建套接字

因为是udp通信,所有要使用数据报套接字

    int server_socket = socket(PF_INET, SOCK_DGRAM, 0);
    if (server_socket == -1)
    {
        perror("socket()");
        return -1;
    }
设置服务端信息
    sockaddr_in serverAddr;
    serverAddr.sin_family = AF_INET;
    serverAddr.sin_addr.s_addr = htonl(INADDR_ANY);
    serverAddr.sin_port = htons(atoi(argv[1]));
绑定套接字到上面指定地址
    if (bind(server_socket, (sockaddr *)&serverAddr, sizeof(serverAddr)) == -1)
    {
        perror("bind()");
        close(server_socket);
        return -1;
    }
接收数据recvform()

参数1:要读取的套接字,即服务端套接字

参数2:指向接收缓冲区的指针

参数3:缓冲区长度

参数4:标志,可以设置阻塞模式,写0即函数以默认方式执行

参数5:指向源地址的指针

参数6:源地址长度的指针

    char msg[1024]{};
    sockaddr_in clientAddr;
    socklen_t len = sizeof(clientAddr);
    while (true)
    {
        memset(msg, 0, sizeof(msg));
        if(recvfrom(server_socket, msg, sizeof(msg), 0, (sockaddr *)&clientAddr, &len)==-1)
        {
            continue;
        }
        cout << "[" << inet_ntoa(clientAddr.sin_addr) << ":" << ntohs(clientAddr.sin_port)
             << "]:" << msg << endl;

        if (strcmp(msg, "exit") == 0)
            break;
    }
关闭套接字
close(server_socket);

客户端

创建套接字
    int client_socket = socket(PF_INET, SOCK_DGRAM, 0);
    if (client_socket < 0)
    {
        perror("socket()");
        return -1;
    }
指定服务端的地址
    sockaddr_in serverAddr;
    serverAddr.sin_family = AF_INET;
    serverAddr.sin_addr.s_addr = inet_addr(argv[1]);
    serverAddr.sin_port = htons(atoi(argv[2]));
发送数据,sendto()

参数1:发送数据的套接字,即客户端套接字

参数2:发送数据的缓冲区的指针

参数3:数据长度

参数4:标志,可以设置阻塞模式,写0即函数以默认方式执行

参数5:指向目标地址的指针

参数6:目标地址的长度

    char buf[1024]{};
    while (true)
    {
        memset(buf, 0, sizeof(buf));
        fgets(buf, sizeof(buf), stdin);
        buf[strcspn(buf, "\n")] = '\0';
        if(sendto(client_socket, buf, sizeof(buf), 0, (sockaddr *)&serverAddr, sizeof(serverAddr)) == -1)
        {
            continue;
        }

        if (strcmp(buf, "exit") == 0)
            break;
    }
关闭套接字
close(client_socket);

运行效果如下:

 

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

头发乌黑茂密

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值