mysql udf tcp_在mysql udf函数内建立socket连接

各位高手好!

小弟有一问题求帮助!

目前在做的项目用到了redis和mysql,同步的时候想到了使用udf建立socket和redis通信进而同步缓存。

经过一番搜索找到了七星高手写的C代码,于是尝试使用。

可是udf怎么调用都不成功。于是在本地IDE里试着模仿udf的调用,从main函数调用用于udf的函数。连接到redis

的socket一点问题都木有,每次都成功  于是乎编译成so扔到plugin文件夹。结果执行还是跳到socket没有连接成功的

那段代码上。

各位高手能不能指点一下。据说udf内不能在函数里新建指针什么的?有这回事么。?调试的时候想写个文件看看,但是只要写上fopen  就提示lost connection。英文文档看了一半实在看不下去了。

struct credis

{

int                fd;

struct sockaddr_in addr;

};

struct credis *res = NULL;

my_bool redis_connect_init(UDF_INIT *initid, UDF_ARGS *args, char *message)

{

if (args->arg_count != 2)

{

strcpy(message,"Wrong arguments to metaphon;  Use the source");

return 1;

}

args->arg_type[0] = STRING_RESULT;

args->arg_type[1] = INT_RESULT;

initid->ptr       = NULL;

return 0;

}

char *redis_connect(UDF_INIT *initid, UDF_ARGS *args, char *result, unsigned long *length, char *is_null, char *error)

{

uint16_t port;

FILE *fp;

if(res != NULL)

{

credis_close(res);

}

port  = *((ushort*) args->args[1]);

res = credis_connect(args->args[0], port);

if (res == NULL)

{

*length = 60;

fp = fopen("/home/result.log", "a");

fprintf(fp, "this is log");

fclose(fp);

return "Error connecting to Redis server. Please start server to run"; //在mysql中调用的时候一直运行这个return。

}

fp = fopen("/home/result.log", "a");

fprintf(fp, "this is log");

fclose(fp);

*length = 2;

return "OK";//写个main函数本地调试的时候每次都成功

}

struct credis *credis_connect(char *host, uint16_t port)

{

struct timeval timeout;

struct credis  *redis;

redis = (struct credis *)malloc(sizeof(struct credis));

if(redis == NULL) return NULL;

redis->fd                   = socket(AF_INET, SOCK_STREAM, 0);

redis->addr.sin_family      = AF_INET;

redis->addr.sin_port        = htons(port);

redis->addr.sin_addr.s_addr = inet_addr(host);

timeout.tv_sec  = 5;

timeout.tv_usec = 0;

setsockopt(redis->fd, SOL_SOCKET, SO_SNDTIMEO, (char *)&timeout, sizeof(timeout));

setsockopt(redis->fd, SOL_SOCKET, SO_RCVTIMEO, (char *)&timeout, sizeof(timeout));

if(connect(redis->fd, (struct sockaddr *)&redis->addr, sizeof(struct sockaddr)) == -1)

{

safe_free(redis);

return NULL;

}

return redis;

}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值