当前位置: 首页 > news >正文

5. C++网络编程-UDP协议的实现

UDP是无连接的。

UDP Server网络编程基本步骤

  • 创建socket,指定使用UDP协议
  • 将socket与地址和端口绑定
  • 使用recv/send接收/发送数据
    由于UDP是无连接的,直接侦听就行
  • 使用close关闭连接

在这里插入图片描述
这个UDP接收数据的时候用的API是recvfrom,发送数据是sendto

客户端

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

int main(int argc, char * *argv)
{
    struct sockaddr_in addr;

    socklen_t addrlen = sizeof(addr);

    int sock;

    addr.sin_family     = AF_INET;
    addr.sin_port       = htons(9876);
    addr.sin_addr.s_addr = inet_addr("127.0.0.1");

    char buff_send[512] = "Hello";
    char buff_recv[512] = {0};
    int len = sizeof(addr);

    int n = 0;

    printf("This is a UDP client\n");

    if ((sock = socket(AF_INET, SOCK_DGRAM, 0)) < 0)
    {
        printf("socket error.\n");
        exit(1);
    }

    if (addr.sin_addr.s_addr == INADDR_NONE)
    {
        printf("Incorrect ip address!");
        close(sock);
        exit(1);
    }

    n = sendto(sock, buff_send, strlen(buff_send), 0, (struct sockaddr *) &addr, sizeof(addr));
    if (n < 0)
    {
        printf("sendto error.\n");
        close(sock);
    }

    n = recvfrom(sock, buff_recv, 512, 0, (struct sockaddr *) &addr, &addrlen);
    if (n > 0)
    {
        buff_recv[n] = 0;
        printf("received from sever:");
        puts(buff_recv);
    }
    else if (n == 0)
        printf("server closed.\n");
    else if (n == -1)
        printf("recvfrom error.\n");

    close(sock);

    return 0;
}


服务器端

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

int main(int argc, char * *argv)
{
    struct sockaddr_in addr;
    addr.sin_family     = AF_INET;
    addr.sin_port       = htons(9876);
    addr.sin_addr.s_addr = INADDR_ANY;

    char buff_recv[512] = {0};
    char buff_send[512] = "world";

    struct sockaddr_in clientAddr;

    socklen_t addrlen = sizeof(clientAddr);

    int n;
    int len = sizeof(clientAddr);

    int sock;

    printf("Welcome! This is a UDP server.\n");

    if ((sock = socket(AF_INET, SOCK_DGRAM, 0)) < 0)
    {
        printf("socket error.\n");
        exit(1);
    }

    if (bind(sock, (struct sockaddr *) &addr, sizeof(addr)) < 0)
    {
        printf("bind error.\n");
        exit(1);
    }

    while (1)
    {
        //ssize_t recvfrom(int sockfd, void *buf, size_t len, int flags,struct sockaddr *src_addr, socklen_t *addrlen);

        n = recvfrom(sock, (void *)buff_recv, 511, 0, (struct sockaddr *) &clientAddr, &addrlen);
        if (n > 0)
        {
            buff_recv[n] = 0;
            printf("recv data from client:%s %u says: %s\n", inet_ntoa(clientAddr.sin_addr), ntohs(clientAddr.sin_port), buff_recv);

            n = sendto(sock, (void *)buff_send, n, 0, (struct sockaddr *) &clientAddr, sizeof(clientAddr));
            if (n < 0)
            {

                printf("sendto error.\n");
                break;

            }else {
                printf("recv error.\n");
                break;
            }
        }

    }
    return 0;
}

在这里插入图片描述

相关文章:

  • 实验报告2-多线程并发
  • KuberSphere 安装kubernates
  • SVM兵王问题
  • Intel HDSLB 高性能四层负载均衡器 — 基本原理和部署配置
  • 设计模式八股文
  • Vue 跨域代理设置
  • Midjourney Describe API 使用文档
  • 专业渗透测试 Phpsploit-Framework(PSF)框架软件小白入门教程(十三)
  • 03_前端三大件CSS
  • C++小游戏 合集
  • 人人皆是黑客?EvilProxy推出一键反向代理服务
  • MATLAB学习:频谱图的绘制
  • 基于开源ATmega8 无感BLDC程序移植到ATmega328PB
  • 几种常用的配置文件格式对比分析——ini、json、xml、toml、yaml
  • python类和对象
  • 一周股市价格为[2,6,1,4,8],求哪一天买入哪一天卖出,可获得最大收益,最大收益为多少——Java实现,详细注释
  • latex文字竖排
  • 美业美容院会员服务预约店铺管理小程序的效果是什么
  • React Native 之 接口请求(十四)
  • 调用其他程序(不用import call tranction)
  • 4月人文社科联合书单|天文学家的椅子
  • 国家发改委下达今年第二批810亿超长期特别国债资金,支持消费品以旧换新
  • 杭州银行一季度净赚超60亿增逾17%,增速较去年同期有所回落
  • 五万吨级半潜船在沪完成装备装载
  • 央行副行长:研究建立民营中小企业增信制度,破解民营中小企业信用不足等融资制约
  • 人社部:将会同更多部门分行业、分领域制定专项培训计划