C语言通过socket编程实现与单片机的WiFi模块通信,读取数据库数据发送给单片机。
C语言运行在Linux系统上。
TCP/IP协议 叫做传输控制/网际协议,又叫网络通信协议。用来传输数据。
套接字(socket):在网络中用来描述计算机中不同程序与其他计算机程序的通信方式。socket其实是一种特殊的IO接口,也是一种文件描述符。用来实现tcp连接。
#include<stdio.h>
#include<sys/socket.h>
#include<string.h>
#include<netinet/in.h>
#include<arpa/inet.h>
#include<stdlib.h>
#include "mysql.h"
#define portnum 8888 //随便定义一个端口
int main(int argc, const char *argv[])
{
MYSQL mysql;
MYSQL_RES *res = NULL;
MYSQL_ROW row;
char *query_str = NULL;
int rc, i, fields;
int rows;
int sockfd, new_fd;
struct sockaddr_in server_addr;//服务器地址
struct sockaddr_in clint_addr; //客户机地址
char buffer[128];
int nbite;
int sin_size;
if (NULL == mysql_init(&mysql)) { //Mysql连接程序
printf("mysql_init(): %s\n", mysql_error(&mysql));
return -1;
}
if (NULL == mysql_real_connect(&mysql,
"主机地址", //主机名
"cxs_f",
"cxs5120cxs",
"cxs",
4010,
NULL,
0)) {
printf("mysql_real_connect(): %s\n", mysql_error(&mysql));
return -1;
}
printf("Connected MySQL successful! \n");
//1. 创建套接字
if((sockfd=socket( AF_INET, SOCK_STREAM, 0)) == -1)//如果创建套接字失败
{
printf("create socket error!\n");
exit(1);
}
//2.1 设置要绑定的地址,对server_addr初始化
bzero(&server_addr,sizeof(struct sockaddr_in));//全部成员清0
server_addr.sin_family = AF_INET;
server_addr.sin_port = htons( portnum);//转换成网络字节序
server_addr.sin_addr.s_addr = htonl( INADDR_ANY);//转换成网络字节序
//2.2 绑定地址
bind( sockfd, (struct sockaddr *)&server_addr, sizeof(struct sockaddr) );
//3. 监听端口
listen(sockfd, 5);
while(1)
{
//4. 等待连接
sin_size = sizeof(struct sockaddr);
new_fd = accept(sockfd,(struct sockaddr *)(&clint_addr),&sin_size);
printf("server get connection from %s\n",(inet_ntoa(clint_addr.sin_addr)) );//打印出连接服务器的客户机地址
//mysql查询数据
query_str = "SELECT key1 FROM User WHERE username = '122'";
rc = mysql_real_query(&mysql, query_str, strlen(query_str));
if (0 != rc) {
printf("mysql_real_query(): %s\n", mysql_error(&mysql));
return -1;
}
res = mysql_store_result(&mysql);
if (NULL == res) {
printf("mysql_restore_result(): %s\n", mysql_error(&mysql));
return -1;
}
rows = mysql_num_rows(res);
printf("The total rows is: %d\n", rows);
fields = mysql_num_fields(res);
printf("The total fields is: %d\n", fields);
while ((row = mysql_fetch_row(res))) {
for (i = 0; i < fields; i++) {
printf("%s\t", row[i]);
}
printf("\n");
}
if(row[0]=="0") {
printf("su1\n");
char * sendData="1111\r\n";
printf("su2\n");
send(new_fd,sendData,8,0) ;
printf("server received: %s\n",sendData);
printf("su3\n");
//mysql改写数据
query_str = "UPDATE User SET key1='0' WHERE username='122'";
rc = mysql_real_query(&mysql, query_str, strlen(query_str));
if (0 != rc) {
printf("mysql_real_query(): %s\n", mysql_error(&mysql));
return -1;
}
res = mysql_store_result(&mysql);
if (NULL == res) {
printf("mysql_restore_result(): %s\n", mysql_error(&mysql));
return -1;
}
rows = mysql_num_rows(res);
printf("The total rows is: %d\n", rows);
fields = mysql_num_fields(res);
printf("The total fields is: %d\n", fields);
while ((row = mysql_fetch_row(res))) {
for (i = 0; i < fields; i++) {
printf("%s\t", row[i]);
}
printf("\n");
}
}
//5. 接收数据
nbite = recv( new_fd, buffer, 128, 0);//返回接收到的数据长度
buffer[nbite] = '\0';
printf("server received: %s\n",buffer );
//mysql改写数据
query_str = "UPDATE User SET pai='buffer' WHERE username='122'";
sprintf(query_str, "UPDATE User SET pai= '%s' WHERE username='122'",buffer);
rc = mysql_real_query(&mysql, query_str, strlen(query_str));
if (0 != rc) {
printf("mysql_real_query(): %s\n", mysql_error(&mysql));
return -1;
}
res = mysql_store_result(&mysql);
if (NULL == res) {
printf("mysql_restore_result(): %s\n", mysql_error(&mysql));
return -1;
}
rows = mysql_num_rows(res);
printf("The total rows is: %d\n", rows);
fields = mysql_num_fields(res);
printf("The total fields is: %d\n", fields);
while ((row = mysql_fetch_row(res))) {
for (i = 0; i < fields; i++) {
printf("%s\t", row[i]);
}
printf("\n");
}
//结束测试
printf("su\n");
//6. 结束连接
close( new_fd );
}
close(sockfd);
mysql_close(&mysql);
return 0;
}
编译时用下面的编译指令
gcc server.c -o sql1 -I/usr/include/mysql -L/usr/lib64/mysql -lmysqlclient