socket+mysql
测试windows 下 Socket+Mysql调用。
环境:
OS:Win7; DBMS:Mysql; IDE:codeblockS.
server:
1 #include <WINSOCK2.H> 2 #include <stdio.h> 3 #include <mysql.h> 4 /*数据库连接用宏*/ 5 #define HOST "localhost"//本地 6 #define USERNAME "root"//dbms user name 7 #define PASSWORD "123456"//password 8 #define DATABASE "test"//database name 9 #pragma comment(lib,"ws2_32.lib") 10 #pragma comment(lib,"C:\\Program Files\\MySQL\\MySQL Server 5.5\\lib\\libmysql.lib") 11 void query_sql(char* sql);//数据库查询 12 int main(int argc,char **argv) 13 { 14 WORD myVersionRequest; 15 WSADATA wsaData; 16 int err; 17 SOCKET serSocket; 18 SOCKADDR_IN addr; 19 int len; 20 SOCKADDR_IN clientsocket; 21 SOCKET serConn; 22 char sendBuf[100]; 23 char receiveBuf[100];//接收 24 char *query; 25 query="select * from serverinfo";//查询学生表 26 27 myVersionRequest=MAKEWORD(1,1); 28 err=WSAStartup(myVersionRequest,&wsaData); 29 if (!err) 30 { 31 printf("已打开套接字,等待连接!\n"); 32 } 33 else 34 { 35 printf("ERROR:嵌套字未打开!"); 36 return 1; 37 } 38 //进一步绑定套接字 39 serSocket=socket(AF_INET,SOCK_STREAM,0);//创建了可识别套接字 40 41 //需要绑定的参数 42 addr.sin_family=AF_INET; 43 addr.sin_addr.S_un.S_addr=htonl(INADDR_ANY);//ip地址 44 addr.sin_port=htons(6000);//绑定端口 45 46 bind(serSocket,(SOCKADDR*)&addr,sizeof(SOCKADDR));//绑定完成 47 listen(serSocket,5);//其中第二个参数代表能够接收的最多的连接数 48 49 ////////////////////////////////////////////////////////////////////////// 50 //开始进行监听 51 ////////////////////////////////////////////////////////////////////////// 52 53 len=sizeof(SOCKADDR); 54 while (1) 55 { 56 query_sql(query);//仅用于测试,没有写客户端,所以在阻塞之前对数据库进行调用 57 serConn=accept(serSocket,(SOCKADDR*)&clientsocket,&len);//如果这里不是accept而是conection的话。。就会不断的监听 58 59 sprintf(sendBuf,"hello, %s !",inet_ntoa(clientsocket.sin_addr));//找对对应的IP并且将这行字打印到那里 60 printf("Send:%s\n",sendBuf); 61 send(serConn,sendBuf,strlen(sendBuf)+1,0); 62 63 64 recv(serConn,receiveBuf,sizeof(receiveBuf),0); 65 printf("recv:%s\n",receiveBuf); 66 67 closesocket(serConn);//关闭 68 WSACleanup();//释放资源的操作 69 return 0; 70 } 71 return 1; 72 } 73 void query_sql(char* sql) 74 { 75 MYSQL my_connection; /*这是一个数据库连接*/ 76 int res; /*执行sql語句后的返回标志*/ 77 MYSQL_RES *res_ptr; /*指向查询结果的指针*/ 78 MYSQL_FIELD *field; /*字段结构指针*/ 79 MYSQL_ROW result_row; /*按行返回的查询信息*/ 80 int row, column; /*查询返回的行数和列数*/ 81 int i, j; 82 /*初始化mysql连接my_connection*/ 83 mysql_init(&my_connection); 84 /*建立mysql连接*/ 85 if (NULL != mysql_real_connect(&my_connection, HOST, USERNAME, PASSWORD, 86 DATABASE, 0, NULL, CLIENT_FOUND_ROWS)) /*连接成功*/ 87 { 88 printf("数据库查询query_sql连接成功!\n"); 89 /*设置查询编码为gbk,以支持中文*/ 90 mysql_query(&my_connection, "set names gbk"); 91 res = mysql_query(&my_connection, sql); 92 if (res) /*执行失败*/ 93 { 94 printf("Error: mysql_query !\n"); 95 /*关闭连接*/ 96 mysql_close(&my_connection); 97 } 98 else /*现在就代表执行成功了*/ 99 { 100 /*将查询的結果给res_ptr*/ 101 res_ptr = mysql_store_result(&my_connection); 102 /*如果结果不为空,就把结果print*/ 103 if (res_ptr) 104 { 105 /*取得結果的行数和*/ 106 column = mysql_num_fields(res_ptr); 107 row = mysql_num_rows(res_ptr); 108 printf("查询到 %d 行 \n", row); 109 /*输出結果的字段名*/ 110 for (i = 0; field = mysql_fetch_field(res_ptr); i++) 111 printf("%10s ", field->name); 112 printf("\n"); 113 /*按行输出結果*/ 114 for (i = 1; i < row+1; i++) 115 { 116 result_row = mysql_fetch_row(res_ptr); 117 for (j = 0; j < column; j++) 118 printf("%10s ", result_row[j]); 119 printf("\n"); 120 } 121 } 122 /*不要忘了关闭连接*/ 123 mysql_close(&my_connection); 124 } 125 } 126 else 127 { 128 printf("数据库连接失败"); 129 } 130 }