zoukankan      html  css  js  c++  java
  • C socket udp方式发数据

    #define HOST_SERVER_IP "192.168.3.35"
    #define HOST_PORT       9501
    #define SLEEP_TIME       1
    #define LOOP_TIME       3
    #define DATA_SIZE       80
    
    int judge_socket_exist()
    {
        int        loop_time = 0;
        fd_set     send_data_flag;
        static int socket_fd = -1;
    
        while(1)
        {
            if (socket_fd <= 0)
            {
                socket_fd = socket(AF_INET, SOCK_DGRAM, 0);
                loop_time++;
            }
    
            if (socket_fd > 0)
            {
                FD_ZERO(&send_data_flag);
                FD_SET(socket_fd, &send_data_flag);
                FD_SET(0, &send_data_flag);
    
                //check socket is effective
                if (select(socket_fd+1, NULL, &send_data_flag, NULL, 0) > 0)
                {
                    break;
                }
                else
                {
                    socket_fd = socket(AF_INET, SOCK_DGRAM, 0);
                    loop_time++;
                }
            }
    
            if (loop_time > LOOP_TIME)
            {
                return -1;
            }
    
            sleep(SLEEP_TIME);
        }
    
        return socket_fd;
    }
    
    int gsh_post_client(const char* sn, const char* ip)
    {
        if (NULL == sn || NULL == ip)
        {
            return -1;
        }
    
        int    loop_time                     = 0;                      //loop time of fail execute
        int    send_data_length              = 0;                      //length of sending data
        int    select_err                    = -1;                     //flag of select function back value
        int    socket_fd                     = judge_socket_exist();   //set socket flag, socket not close
        struct timeval select_wait           = {1, 0};                 //select function wait time
        char   text[BUFSIZ];
        char   send_data_buffer[DATA_SIZE];                            //buffer of sending data
        struct sockaddr_in socket_addr;                                //socket address of server ip and port
        fd_set send_data_flag;                                         //select function send data flag
    
        if (socket_fd <= 0)
        {
            fprintf(stderr, "establish socket fail");
            return -1;
        }
    
    
        //initialize socket data
        bzero(&socket_addr, sizeof(socket_addr));
        socket_addr.sin_family = AF_INET;
        socket_addr.sin_port   = htons(HOST_PORT);
        inet_aton(HOST_SERVER_IP, &socket_addr.sin_addr);
    
    
        //initialize request data
        memset(&send_data_buffer, 0, sizeof(send_data_buffer));
        strcat(send_data_buffer, "sn=");
        strcat(send_data_buffer, sn);
        strcat(send_data_buffer, "&ip=");
        strcat(send_data_buffer, ip);
    
    
        while(1)                                      //for no-blocking
        {
            if (loop_time > LOOP_TIME)
            {
                fprintf(stderr, "send data fail
    ");
                return -1;
            }
    
            FD_ZERO(&send_data_flag);
            FD_SET(socket_fd, &send_data_flag);
            FD_SET(0, &send_data_flag);
    
            select_err = select(socket_fd+1, NULL, &send_data_flag, NULL, &select_wait);
    
            if (select_err <= 0)
            {
                loop_time++;
            }
            else
            {
                if (FD_ISSET(socket_fd, &send_data_flag))
                {
                    loop_time = 0;
                    FD_CLR(socket_fd, &send_data_flag);
    
                    while(send_data_length < strlen(send_data_buffer))
                    {
                        send_data_length = sendto(socket_fd, send_data_buffer, strlen(send_data_buffer), 0, (struct sockaddr *)&socket_addr, sizeof(socket_addr));
    
                        if (send_data_length <= 0)
                        {
                            fprintf(stderr, "sending data fail
    ");
                            return -1;
                        }
    
                        if (loop_time > LOOP_TIME)
                        {
                            fprintf(stderr, "length of sending data shorten than data
    ");
                            return -1;
                        }
    
                        if (send_data_length < strlen(send_data_buffer))
                        {
                            loop_time++;
                            sleep(SLEEP_TIME);
                        }
                    }
    recvfrom(socket_fd,text,
    sizeof(text), 0 , NULL, NULL); printf("%s", text);
    break; } else { loop_time++; } } sleep(SLEEP_TIME); } return 0; }
  • 相关阅读:
    HTTP和SOAP完全就是两个不同的协议
    RabbitMQ七:交换机类型Exchange Types--Fanout 介绍
    日志级别简述
    RabbitMQ六:通过routingkey模拟日志
    http协议无状态中的 "状态" 到底指的是什么?!
    MySQL-时间(time、date、datetime、timestamp和year)
    API系列一:REST和RESTful认识
    Ref 和 Out 区别(演练代码)
    RabbitMQ五:生产者--队列--多消费者
    RabbitMQ四:生产者--队列--消费者
  • 原文地址:https://www.cnblogs.com/linguoguo/p/4428715.html
Copyright © 2011-2022 走看看