zoukankan      html  css  js  c++  java
  • mysql UDF接口 网络编程(代码改进版非阻塞,超时重传)

    #ifdef STANDARD/* STANDARD is defined, don't use any mysql functions */
    #include <stdlib.h>
    #include <stdio.h>
    #include <string.h>
    #ifdef __WIN__
    typedef unsigned __int64 ulonglong;    /* Microsofts 64 bit types */
    typedef __int64 longlong;
    #else
    typedef unsigned long long ulonglong;
    typedef long long longlong;
    #endif /*__WIN__*/
    #else
    #include <my_global.h>
    #include <my_sys.h>
    #if defined(MYSQL_SERVER)
    #include <m_string.h>        /* To get strmov() */
    #else
    /* when compiled as standalone */
    #include <string.h>
    #endif
    #endif
    #include <mysql.h>
    #include <m_ctype.h>
    #include <m_string.h>
    #include <stdlib.h>
    #include <errno.h>
    #include <netdb.h>
    #include <unistd.h>
    #include<fcntl.h>
    #include<sys/time.h>
    #include<sys/ioctl.h>
    #include <sys/types.h>
    #include <netinet/in.h>
    #include <sys/socket.h>
    #include <sys/wait.h>
    #include<arpa/inet.h>
    #include<unistd.h>
    #include <mysql.h>
    #include <ctype.h>
    #ifdef HAVE_DLOPEN

    my_bool http_post_init(UDF_INIT *initid, UDF_ARGS *args, char *message);
    void http_post_deinit(UDF_INIT *initid);
    longlong http_post(UDF_INIT *initid, UDF_ARGS *args, char *is_null,char *error);
    /*************************************************************************
    ** Example of init function
    ** Arguments:
    ** initid                        Points to a structure that the init function should fill.
    **            char *ptr;            A pointer that the function can use.
    ** message                        Error message
    **RETURN                        This function should return 1 if something goes wrong. In this case
    **************************************************************************/
    my_bool http_post_init(UDF_INIT *initid, UDF_ARGS *args, char *message)
    {
    if (args->arg_count < 3 )
    {
        strcpy(message,"Wrong arguments to http_post; ");
        return 1;
    }

    if(args->arg_count == 4 && args->args[3]!=NULL)
    {
          int flexibleLength = strlen(args->args[3]);
          if(flexibleLength > 160000)
          {
              int allocLength = 200 + flexibleLength;
              if (!(initid->ptr=(char*) malloc(allocLength) ) )
              {
                    strcpy(message,"Couldn't allocate memory in http_post_init");
                    return 1;
              }       
            return 0;
          }
          else
          {
              initid->ptr=NULL;
        }
         
    }
       return 0;

    }

    /****************************************************************************
    ** Deinit function. This should all resources allocated by
    ** this function.
    ** Arguments:
    ** initid    Return value from xxxx_init
    ****************************************************************************/
    void http_post_deinit(UDF_INIT *initid)
    {
         if (initid!=NULL && initid->ptr!=NULL)
              {
                  free(initid->ptr);
                  initid->ptr = NULL;
              }

    }


    /***************************************************************************
    ** UDF string function.
    ** Arguments:
    ** initid    Structure filled by xxx_init
    ** args        The same structure as to xxx_init. This structure
    ** This function should return a pointer to the result string.
    ** Normally this is 'result' but may also be an alloced string.
    ***************************************************************************/
    longlong http_post(    UDF_INIT *initid, UDF_ARGS *args,
                    char *is_null __attribute__((unused)),
                    char *error __attribute__((unused)))
    {
        int sockfd=0;
        int numbytes=0;
        int flags=0;
        int cycletimes=0;
        char* sendBuffer=NULL;
       
        fd_set wset;
        struct timeval tval;
        tval.tv_sec = 0;
        tval.tv_usec = 300000;
       
        if(initid->ptr == NULL)
        {
            char sendArray[160000] = "\0";
            sendBuffer=sendArray;
        }
        else
        {
            sendBuffer = initid->ptr;
        }

        struct sockaddr_in serv_addr;     
        serv_addr.sin_family = AF_INET;
        serv_addr.sin_port = htons(atoi(args->args[1]));
        serv_addr.sin_addr.s_addr = inet_addr(args->args[0]);
        bzero(&(serv_addr.sin_zero),8);
             
        if(args->arg_count == 4 && (args->args[3]!=NULL) )
        {
            int argsNum = strlen(args->args[3]);
            sprintf(sendBuffer,"POST /?%s HTTP/1.1\r\nContent-Length:%d\r\n\r\n%s",args->args[2],argsNum,args->args[3]);
        }
        else
        {
            sprintf(sendBuffer,"POST /?%s HTTP/1.1\r\n",args->args[2]);     
        }
       
        if((sockfd = socket(AF_INET,SOCK_STREAM,0)) == -1)
        {
            close(sockfd);
            return 2;
        }
        flags = fcntl(sockfd,F_GETFL,0);
        fcntl(sockfd,F_SETFL,flags|O_NONBLOCK);//设置为非阻塞
        do
        {
            connect(sockfd, (struct sockaddr *)&serv_addr, sizeof(struct sockaddr));
            FD_ZERO(&wset);
            FD_SET(sockfd,&wset);
            if( select(sockfd+1, NULL, &wset, NULL,&tval) <= 0 && cycletimes==5)
            {
                close(sockfd);
                return 5;
            }   
            numbytes = send(sockfd,sendBuffer,strlen(sendBuffer),0);
            if(numbytes<0)
            {
                usleep(20000);
            }   
            cycletimes++;
        }while(numbytes<0 && cycletimes!=5);
        if(numbytes<0)
        {
            close(sockfd);
            return 4;
        }   
        close(sockfd);
        return 0;
    }             
    #endif /* HAVE_DLOPEN */

  • 相关阅读:
    二叉堆(最小堆, 最大堆)介绍与实现
    C++ 用变量定义数组
    C++ 用变量定义数组
    053185
    053184
    053183
    053182
    053181
    053180
    oracle prior
  • 原文地址:https://www.cnblogs.com/cnsanshao/p/2652645.html
Copyright © 2011-2022 走看看