winsock和mysql的bug
2016-03-13 18:56
190 查看
今天写一个和winsock和mysql有关的程序,运行时总是停在:MYSQL_RES * result = mysql_store_result(mysql)上,单步的时候蛋疼地发现mysql总是显示内存读取出错。
于是开了个小程序实验了一下:
#include <winsock.h>
#include <mysql.h>
#include <stdio.h>
void add_one_in_name(MYSQL *mysql, char *name);
int main(void)
{
int i = 100;
MYSQL *mysql = mysql_init(0);
mysql_real_connect(mysql, "localhost", "root", "root", "webrobot", 0, 0, 0);
while(i--)
add_one_in_name(mysql,"我是中文");
mysql_close(mysql);
return 0;
}
void add_one_in_name(MYSQL *mysql, char *name)
{
char sql[256];
int flag = 0;
mysql_query(mysql, "select * from robot");
MYSQL_RES * result = mysql_store_result(mysql);
MYSQL_ROW row;
while (row = mysql_fetch_row(result))
{
if (strcmp(row[0], name) == 0)
{
flag = 1;
puts(row[0]);
}
}
if (flag == 1)
sprintf(sql, "update robot set value=value+1 where name='%s'", name);
else
sprintf(sql, "insert into robot values('%s',1)", name);
mysql_query(mysql, sql);
mysql_free_result(result);
}
函数就是原程序的函数,然而运行一下并没有什么问题,这就奇了怪了。
然后我又回头仔细单步了一下,终于发现mysql出错的点。
把测试程序改成这样:
#pragma comment(lib, "ws2_32.lib")
#include <winsock.h>
#include <mysql.h>
#include <stdio.h>
void add_one_in_name(MYSQL *mysql, char *name);
int main(void)
{
int i = 100;
MYSQL *mysql = mysql_init(0);
mysql_real_connect(mysql, "localhost", "root", "root", "webrobot", 0, 0, 0);
LPWSADATA wsaData;
WSAStartup(MAKEWORD(2, 1), &wsaData);
while(i--)
add_one_in_name(mysql,"我是中文");
mysql_close(mysql);
return 0;
}
void add_one_in_name(MYSQL *mysql, char *name)
{
char sql[256];
int flag = 0;
mysql_query(mysql, "select * from robot");
MYSQL_RES * result = mysql_store_result(mysql);
MYSQL_ROW row;
while (row = mysql_fetch_row(result))
{
if (strcmp(row[0], name) == 0)
{
flag = 1;
puts(row[0]);
}
}
if (flag == 1)
sprintf(sql, "update robot set value=value+1 where name='%s'", name);
else
sprintf(sql, "insert into robot values('%s',1)", name);
mysql_query(mysql, sql);
mysql_free_result(result);
}
果然就出错了。
于是找到了错误的原因,在连接mysql数据库成功后,再动态链接winsock,mysql就会被“挤下来”,发生读取内存失败的错误。
具体的原因有待进一步地学习。
然而,调整顺序之后。。。。。
会在结束的时候报错:
Stack around the variable 'wsaData' was corrupted
具体原因仍然有待学习。
于是开了个小程序实验了一下:
#include <winsock.h>
#include <mysql.h>
#include <stdio.h>
void add_one_in_name(MYSQL *mysql, char *name);
int main(void)
{
int i = 100;
MYSQL *mysql = mysql_init(0);
mysql_real_connect(mysql, "localhost", "root", "root", "webrobot", 0, 0, 0);
while(i--)
add_one_in_name(mysql,"我是中文");
mysql_close(mysql);
return 0;
}
void add_one_in_name(MYSQL *mysql, char *name)
{
char sql[256];
int flag = 0;
mysql_query(mysql, "select * from robot");
MYSQL_RES * result = mysql_store_result(mysql);
MYSQL_ROW row;
while (row = mysql_fetch_row(result))
{
if (strcmp(row[0], name) == 0)
{
flag = 1;
puts(row[0]);
}
}
if (flag == 1)
sprintf(sql, "update robot set value=value+1 where name='%s'", name);
else
sprintf(sql, "insert into robot values('%s',1)", name);
mysql_query(mysql, sql);
mysql_free_result(result);
}
函数就是原程序的函数,然而运行一下并没有什么问题,这就奇了怪了。
然后我又回头仔细单步了一下,终于发现mysql出错的点。
把测试程序改成这样:
#pragma comment(lib, "ws2_32.lib")
#include <winsock.h>
#include <mysql.h>
#include <stdio.h>
void add_one_in_name(MYSQL *mysql, char *name);
int main(void)
{
int i = 100;
MYSQL *mysql = mysql_init(0);
mysql_real_connect(mysql, "localhost", "root", "root", "webrobot", 0, 0, 0);
LPWSADATA wsaData;
WSAStartup(MAKEWORD(2, 1), &wsaData);
while(i--)
add_one_in_name(mysql,"我是中文");
mysql_close(mysql);
return 0;
}
void add_one_in_name(MYSQL *mysql, char *name)
{
char sql[256];
int flag = 0;
mysql_query(mysql, "select * from robot");
MYSQL_RES * result = mysql_store_result(mysql);
MYSQL_ROW row;
while (row = mysql_fetch_row(result))
{
if (strcmp(row[0], name) == 0)
{
flag = 1;
puts(row[0]);
}
}
if (flag == 1)
sprintf(sql, "update robot set value=value+1 where name='%s'", name);
else
sprintf(sql, "insert into robot values('%s',1)", name);
mysql_query(mysql, sql);
mysql_free_result(result);
}
果然就出错了。
于是找到了错误的原因,在连接mysql数据库成功后,再动态链接winsock,mysql就会被“挤下来”,发生读取内存失败的错误。
具体的原因有待进一步地学习。
然而,调整顺序之后。。。。。
会在结束的时候报错:
Stack around the variable 'wsaData' was corrupted
具体原因仍然有待学习。
相关文章推荐
- MYSQL校对规则
- mysql 详细安装步骤
- Mysql workbench连接阿里云问题-Malformed packet
- Mysql调优之Explain extend
- MySQL索引
- MySql连接——内连接、外连接(左连接、右连接、全连接)
- JDBC事务处理
- 查看mysql是否安装成功和mysql的版本信息
- 修改mysql root密码
- Mysql索引
- mysql 日期格式化
- MySQL性能优化的最佳20+条经验
- MySQL学习笔记之五:存储引擎和查询缓存
- 简单mysql连接池
- MySQL基础知识总结
- 看MySql如何实现批量操作
- MySQL Hash索引和B-Tree索引的区别
- 再谈Mysql中limit后的注入
- MySQL双主热备问题处理
- 使用Loadrunner11录制MySQL协议脚本