• Linux下UDP一发一收通信


      实现在Linux环境下的UDP通信测试。

           注释了while循环,将代码规范化。

           udpserver.c代码:

    /**********************************************************************
    * 版权所有 (C)2016, WangSq。
    *
    * 文件名称:xx.c
    * 文件标识:无
    * 内容摘要:udpserver演示程序
    * 其它说明:无
    * 当前版本:V1.0
    * 作    者:WangSq
    * 完成日期:2016
    *
    **********************************************************************/
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    
    #include <sys/socket.h>
    #include <stdio.h>
    #include <stdlib.h>
    #include <sys/types.h>
    #include <netinet/in.h>
    #include <arpa/inet.h>
    #include <string.h>
    /********************socket相关******************************************/
    //socket参数
    #define SERVER_PORT 2234                 /*监听端口*/
    #define MAX_MSG_SIZE 256              /*recv缓冲器大小*/
    int sockfd;  //套接字描述符
    
    /*客户机的地址信息及长度信息*/
    struct sockaddr_in client;
    int  client_len=sizeof(struct sockaddr_in); 
    
    //udp服务器监听函数初始化
    void udpser_init()
    {
       /*服务器的地址信息*/
       struct sockaddr_in server;
    
      /*服务器填充sockaddr server结构*/
        bzero(&server,sizeof(server));
        server.sin_family=AF_INET;
        server.sin_addr.s_addr=htonl(INADDR_ANY);
        server.sin_port=htons(SERVER_PORT);
       
       /*服务器建立socket描述符*/
        if(-1 == (sockfd=socket(AF_INET, SOCK_DGRAM,0)))    
            {
                perror("create socket failed");
                exit (1);
            }
        /*捆绑socket描述符sockfd*/
        if(-1 == ( bind( sockfd, ( struct sockaddr * )&server, sizeof(server) )) )
            {
                perror("bind error");
                exit (1);    
            }
    }
    
    /*接收缓冲区--------------------len =4-----------------*/
    unsigned char message[MAX_MSG_SIZE];
    int recv_len=0;
    /* IP地址的存放缓冲区*/
    char addr_p[INET_ADDRSTRLEN];
    char *sndbuf = "Hello! i am OK.
    ";
    /**********************************************************************
    * 功能描述:主函数
    * 输入参数:无
    * 输出参数:无
    * 返 回 值:无
    * 其它说明:无
    * 修改日期        版本号     修改人            修改内容
    * -------------------------------------------------------------------
    * 2016xxxx       V1.0       WangSq       创建
    ***********************************************************************/
    int main(int argc, char *argv[])
    {
        
        
        //udp服务器监听函数初始化
        udpser_init();
    //    while(1)
    //    {
            /********************************接收数据并打印*************************/
            recv_len=recvfrom(sockfd,message,sizeof(message),0,(struct sockaddr *)&client,&client_len); //阻塞式
            if(recv_len <0)
            {
               printf("recvfrom error
    ");
               exit(1);
            }
            /*打印客户端地址和端口号*/
            inet_ntop(AF_INET,&client.sin_addr,addr_p,sizeof(addr_p));
            printf("client IP is %s, port is %d
    ",addr_p,ntohs(client.sin_port));
            message[recv_len]='';
            /*显示消息长度*/
            printf("server received %d:%s
    ", recv_len, message);
    
            /********************************回发数据*************************/ 
            if(sendto(sockfd,sndbuf,strlen(sndbuf),0,(struct sockaddr*)&client,client_len)<0)
            {
               printf("sendto error
    ");
               exit(1);
            }
    //    }
        return 0;
    }
    View Code

        udpclient.c代码:

    /**********************************************************************
    * 版权所有 (C)2016, WangSq。
    *
    * 文件名称:xx.c
    * 文件标识:无
    * 内容摘要:udpclient演示程序
    * 其它说明:无
    * 当前版本:V1.0
    * 作    者:WangSq
    * 完成日期:2016
    *
    **********************************************************************/
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    
    
    #include <sys/socket.h>
    #include <stdio.h>
    #include <stdlib.h>
    #include <sys/types.h>
    #include <netinet/in.h>
    #include <arpa/inet.h>
    #include <string.h>
    #include <unistd.h>
    
    /**********************************************************************
    * 功能描述:主函数
    * 输入参数:无
    * 输出参数:无
    * 返 回 值:无
    * 其它说明:无
    * 修改日期        版本号     修改人            修改内容
    * -------------------------------------------------------------------
    * 2016xxxx       V1.0       WangSq       创建
    ***********************************************************************/
    #define UDP_TEST_PORT       2234
    
    #define UDP_SERVER_IP       "192.168.1.10"
    
    #define MAX_LINE             80 
    
    int main(int argC, char* arg[])
    
    {
    
        struct sockaddr_in server;
    
        int sockfd, len = 0;   
    
        int server_len = sizeof(struct sockaddr_in);     
         
        char *sendStr ="i am a client
    "; //默认发送串
        
        char buf[MAX_LINE];//接收缓冲区
    
        /* setup a socket,attention: must be SOCK_DGRAM */
        if ((sockfd = socket(AF_INET, SOCK_DGRAM, 0)) < 0) {
       
            perror("socket");
            exit(1);
        }
    
     
        /*complete the struct: sockaddr_in*/
        bzero(&server, sizeof(server));
        server.sin_family = AF_INET;
        server.sin_port = htons(UDP_TEST_PORT);
        server.sin_addr.s_addr = inet_addr(UDP_SERVER_IP);
    
      //  while(1) {
    
            //printf("Please enter a string to send to server: 
    ");
    
            /* get the string from standard in*/
    
            //len = read(STDIN_FILENO, buf, sizeof(buf));
    
            /* send the string to server*/
    
            if(sendto(sockfd, sendStr,  strlen(sendStr), 0, (struct sockaddr *)&server, server_len)<0) //sizeof
            {
                printf("sendto error
    ");
                exit(1);
            }
    
            memset(buf, 0, sizeof(buf));
    
            /* recieve the string from server*/
           
            len = recvfrom(sockfd, buf, sizeof(buf), 0, (struct sockaddr *)&server, &server_len);
            if(len <0)
            {
               printf("recvfrom error
    ");
               exit(1);
            }
            printf("Receive from server: %s
    ", buf);
    
      //  }
    
     
    
        return 0;
    
    }
    View Code

      Makefile:

    all :        udpserver udpclient
    udpserver: udpserver.c
        gcc udpserver.c -o udpserver
    udpclient: udpclient.c
        gcc udpclient.c -o udpclient
    
    
    clean:
        rm *.o udpserver udpclient
    
    .PHONY: clean

      好久没有在这里写博客了,希望自己多多加油,多实践,多思考!

  • 相关阅读:
    JAVA入门到精通-第42讲-坦克大战9
    JAVA入门到精通-第40讲-线程
    JAVA入门到精通-第37讲-事件总结-坦克大战5
    大数据 资源
    在线工具
    idea 添加 阿里代码规范
    idea 控制台中文乱码 解决方法
    idea 构建maven web项目
    oracle SQL 练习
    Oracle分页
  • 原文地址:https://www.cnblogs.com/shuqingstudy/p/7123446.html
Copyright © 2020-2023  润新知