zoukankan      html  css  js  c++  java
  • 使用C语言进行udp通信

    一、概述

      UDP协议简单介绍:

              1.UDP协议是用户数据报协议,面向无连接的、不稳定、不可靠、不安全的数据报传递---更像是是收发短信。

              2.UDP传输不需要建立连接,传输效率更高,在稳定的局域网内环境相对可靠

              3.UDP天然支持多客户端

      C语言UDP函数介绍:   

    ssize_t recvfrom(int sockfd, void *buf, size_t len, int flags,
                            struct sockaddr *src_addr, socklen_t *addrlen);
    函数说明: 接收消息
    参数说明:
          sockfd 套接字
          buf  要接受的缓冲区
          len  缓冲区的长度
          flags 标志位 一般填0
          src_addr 原地址 传出参数 
          addrlen  发送方地址长度 
    返回值
          成功: 返回读到的字节数 
          失败: 返回 -1 设置errno 
                调用该函数相当于TCP通信的recv+accept函数
    
    ssize_t sendto(int sockfd, const void *buf, size_t len, int flags,
                          const struct sockaddr *dest_addr, socklen_t addrlen);
    函数说明: 发送数据
    参数说明:
          sockfd 套接字
          dest_addr 目的地址
          addrlen 目的地址长度
    返回值
          成功: 返回写入的字节数
          失败: 返回-1,设置errno 

      UDP通讯服务端具体步骤:

         1.创建套接字,得到一个cfd

         2.绑定端口 

         3.在while循环中收发数据 recvfrom/sendto

         4.关闭套接字   

      UDP通讯客户端操作步骤:

         1.创建一个套接字,得到一个cfd

         2.在while循环中收发数据recvfrom /sendto

         3.关闭套接字 

    二、代码示例

      1.服务端代码

    //udp服务端(udp天生支持多客户端)
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include <sys/types.h>
    #include <unistd.h>
    #include <arpa/inet.h>
    #include <netinet/in.h>
    #include <ctype.h>
    
    int main(int argc, char const *argv[])
    {
        //1.创建socket
        int cfd = socket(AF_INET,SOCK_DGRAM,0);
        if(cfd<0){
            perror("socket error");
            return -1;
        }
    
        //绑定
        struct sockaddr_in serv;
        struct sockaddr_in client;
        bzero(&serv,sizeof(serv));
        serv.sin_family = AF_INET;
        serv.sin_port = htons(8888);
        serv.sin_addr.s_addr = htonl(INADDR_ANY);
        bind(cfd,(struct sockaddr *)&serv,sizeof(serv));
    
        //3.循环读取读取客户端消息和给客户端回复消息
        int i;
        int n;
        socklen_t len;
        char buf[1024];
        while(1){
            //4.读取数据
            memset(buf,0x00,sizeof(buf));
            len = sizeof(client);
            n = recvfrom(cfd,buf,sizeof(buf),0,(struct sockaddr*)&client,&len);
    
            //将大写转换为小写
            for(i=0;i<n;i++){
                buf[i] = toupper(buf[i]);
            }
            printf("[%d]:n=[%d],buf=[%s]\n",ntohs(client.sin_port),n,buf);
            //5.给客户端回复消息
            sendto(cfd,buf,n,0,(struct sockaddr*)&client,len);
        }
        //关闭套接字
        close(cfd);
    
        return 0;
    }

      2.客户端代码

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include <sys/types.h>
    #include <unistd.h>
    #include <arpa/inet.h>
    #include <netinet/in.h>
    #include <ctype.h>
    
    
    int main(){
        //1.创建socket
        int cfd = socket(AF_INET,SOCK_DGRAM,0);
        if(cfd<0){
            perror("socket error");
            return -1;
        }
    
        int n ;
        char buf[1024];
        struct sockaddr_in serv;
        serv.sin_family = AF_INET;
        serv.sin_port = htons(8888);
        inet_pton(AF_INET,"127.0.0.1",&serv.sin_addr.s_addr);
    
        while(1){
            //读取标准输入数据
            memset(buf,0x00,sizeof(buf));
            n = read(STDIN_FILENO,buf,sizeof(buf));
    
            //发送数据
            sendto(cfd,buf,n,0,(struct sockaddr*)&serv,sizeof(serv));
    
            //读取数据
            memset(buf,0x00,sizeof(buf));
            n = recvfrom(cfd,buf,sizeof(buf),0,NULL,NULL);
            printf("n=[%d],buf=[%s]\n",n,buf);
        }
        //关闭套接字
        close(cfd);
    
        return 0;
    }
  • 相关阅读:
    1722 最优乘车 1997年NOI全国竞赛
    5969 [AK]刻录光盘
    tarjan算法讲解
    求有向图的强连通分量个数 之 Kosaraju算法
    信使
    1405 奶牛的旅行
    P1828 香甜的黄油 Sweet Butter
    洛谷P2235 [HNOI2002]Kathy函数
    「BZOJ1010」[HNOI2008] 玩具装箱toy(斜率优化)
    BZOJ 1974 [Sdoi2010] auction 代码拍卖会(数位dp)
  • 原文地址:https://www.cnblogs.com/tony-yang-flutter/p/15709732.html
Copyright © 2011-2022 走看看