zoukankan      html  css  js  c++  java
  • 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("已打开套接字,等待连接!
    ");
     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
    ",sendBuf);
     61         send(serConn,sendBuf,strlen(sendBuf)+1,0);
     62 
     63 
     64         recv(serConn,receiveBuf,sizeof(receiveBuf),0);
     65         printf("recv:%s
    ",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连接成功!
    ");
     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 !
    ");
     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 行 
    ", row);
    109                 /*输出結果的字段名*/
    110                 for (i = 0; field = mysql_fetch_field(res_ptr); i++)
    111                     printf("%10s ", field->name);
    112                 printf("
    ");
    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("
    ");
    120                 }
    121             }
    122             /*不要忘了关闭连接*/
    123             mysql_close(&my_connection);
    124         }
    125     }
    126     else
    127     {
    128         printf("数据库连接失败");
    129     }
    130 }
  • 相关阅读:
    Matlab 绘制三维立体图(以地质异常体为例)
    Azure DevOps的variable group实现array和hashtable参数的传递
    Azure DevOps 利用rest api设置variable group
    Azure AADSTS7000215 其中一种问题的解决
    Power BI 实现实时更新Streaming Dataset
    AAD Service Principal获取azure user list (Microsoft Graph API)
    Matlab 沿三维任意方向切割CT图的仿真计算
    Azure Powershell script检测登陆并部署ARM Template
    Azure KeyVault设置策略和自动化添加secrets键值对
    Azure登陆的两种常见方式(user 和 service principal登陆)
  • 原文地址:https://www.cnblogs.com/A--Q/p/5972615.html
Copyright © 2011-2022 走看看