mysql重传_mysql的udf编程之非阻塞超时重传

#ifdef STANDARD/* STANDARD is defined, don't use any mysql functions */

#include

#include

#include

#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

#include

#if defined(MYSQL_SERVER)

#include         /* To get strmov() */

#else

/* when compiled as standalone */

#include

#endif

#endif

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#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 */

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值