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;
    }
  • 相关阅读:
    2018 ACM 网络选拔赛 徐州赛区
    2018 ACM 网络选拔赛 焦作赛区
    2018 ACM 网络选拔赛 沈阳赛区
    poj 2289 网络流 and 二分查找
    poj 2446 二分图最大匹配
    poj 1469 二分图最大匹配
    poj 3249 拓扑排序 and 动态规划
    poj 3687 拓扑排序
    poj 2585 拓扑排序
    poj 1094 拓扑排序
  • 原文地址:https://www.cnblogs.com/tony-yang-flutter/p/15709732.html
Copyright © 2011-2022 走看看