c mysql 服务器端_用c和mysql API写的简易操作mysql数据库的多线程服务器和客户端代码...

此程序通过mysql API函数管理mysql数据库模仿远程管理mysql数据库,错误之处,还请指教!

服务器端:

/*gcc command: gcc -o mypthread_server mypthread_server.c query_api.c $(mysql_config --libs) $(mysql_config --cflags) -pthread*/

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#define S_PORT 1234

#define LOG_NUM 10

#define MAXDATASIZE 1024

struct client_info{

int connfd;

struct sockaddr_in addr;

};

void* db_process(void* arg);

int main(int argc,char **argv)

{

int listenfd,connfd;

struct sockaddr_in server_addr,client_addr;

int sin_size;

pthread_t thread;

pthread_attr_t attr;

//      if(listenfd= socket(AF_INET,SOCK_STREAM, 0)==-1){

if((listenfd = socket(AF_INET, SOCK_STREAM, 0)) == -1){

perror("creating socket failed!");

exit(-1);

}

/*设置socket属性,端口可以重用*/

int opt=SO_REUSEADDR;

setsockopt(listenfd,SOL_SOCKET,SO_REUSEADDR,&opt,sizeof(opt));

bzero(&server_addr,sizeof(server_addr));

server_addr.sin_family=AF_INET;

server_addr.sin_addr.s_addr=htonl(INADDR_ANY);

server_addr.sin_port=htons(S_PORT);

if(bind( listenfd , (struct sockaddr *)&server_addr, sizeof(struct sockaddr)) == -1){

perror("bind socket failed!");

exit(-1);

}

if(listen(listenfd,LOG_NUM)==-1){

perror("listen error!");

exit(-1);

}

sin_size=sizeof(struct sockaddr_in);

while(1){

struct client_info client;

//sin_size=sizeof(struct sockaddr_in);

//if(connfd=accept(listenfd,(struct sockaddr *)&client_addr,(socklen_t *)&sin_size)==-1){

if((connfd=accept(listenfd,(struct sockaddr *)&client_addr,(socklen_t *)&sin_size))==-1){

perror("accept error!");

exit(-1);

}

client.connfd=connfd;

client.addr=client_addr;

/*初始化属性值,均设为默认值*/

pthread_attr_init(&attr);

pthread_attr_setscope(&attr, PTHREAD_SCOPE_SYSTEM);

/*  设置线程为分离属性*/

pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED);

if(pthread_create(&thread,&attr,db_process,(void*)&client)){

perror("pthread_creat error!");

exit(-1);

}

}

close(listenfd);

}

void process_cli(int connectfd,struct sockaddr_in *client)

{

int num;

char recvbuf[MAXDATASIZE], sendbuf[MAXDATASIZE], cli_name[20];

printf("You got a connection from %s.  ",inet_ntoa(client->sin_addr) );

num = recv(connectfd, cli_name, MAXDATASIZE,0);

if (num == 0) {

close(connectfd);

printf("Client disconnected./n");

return;

}

cli_name[num] = '/0';

printf("Client's name is %s./n",cli_name);

while (1){

//bzero(recvbuf,MAXDATASIZE);

num = recv(connectfd, recvbuf, MAXDATASIZE,0);

if (num == 0) {

close(connectfd);

printf("Client(%s) exit./n",cli_name);

return;

}

else if(num < 0){

//printf("recv error! %s : %s /n",errno,strerror(errno));

perror("recv!");

close(connectfd);

return;

}

recvbuf[num] = '/0';

//printf("num is %d/n",num);

printf("Received client( %s ) message: %s /n",cli_name, recvbuf);

fflush(stdout);

int i;

/*for (i = 0; i < num ; i++) {

sendbuf[i] = recvbuf[num - i -1];

//sendbuf[i] = recvbuf[i];

}*/

i=query(recvbuf,sendbuf);

if(i<0){

sprintf(sendbuf,"query error!./n");

}

//sendbuf[num] = '/0';

send(connectfd,sendbuf,strlen(sendbuf),0);

printf("return send:%s /n",sendbuf);

fflush(stdout);

//bzero(recvbuf,sizeof(recvbuf));

bzero(sendbuf,sizeof(sendbuf));

}

close(connectfd);

}

//接收数据并返回

void* db_process(void* arg)

{

struct client_info *info;

info=arg;

//printf("test........./n");

process_cli(info->connfd, &info->addr);

pthread_exit(NULL);

}

query_api.c:

#include  

#include  

#include  

#include  

int query(char *command, char *buf) {

MYSQL *conn;

MYSQL_RES *res;

MYSQL_ROW row;

char *server = "localhost";

char *user = "cxt";

char *password = "cxt"; /* �˴��ij��������� */

char *database = "mysql";

conn = mysql_init(NULL);

/* Connect to database */

if (!mysql_real_connect(conn, server,

user, password, database, 0, NULL, 0)) {

fprintf(stderr, "%s/n", mysql_error(conn));

return -1;

}

int i,num_rows,num_fields;

char  out[128]="";

char  temp[128];

/* send SQL query */

if (mysql_query(conn, command)) {

fprintf(stderr, "�%s/n", mysql_error(conn));

return -1;

}

else{

res = mysql_use_result(conn);

if (res)  // there are rows

{

num_fields = mysql_num_fields(res);

while ((row = mysql_fetch_row(res)) != NULL){

for(i=0;i

sprintf(temp,"%s /t",row[i]);

strcat(out,temp);

bzero(temp,sizeof(temp));

}

sprintf(out,"%s /n",out);

strcat(buf,out);

bzero(out,sizeof(out));

}

// retrieve rows, then call mysql_free_result(result)

}

else  // mysql_store_result() returned nothing; should it have?

{

if (mysql_errno(conn))

{

fprintf(stderr, "Error: %s/n", mysql_error(conn));

return -1;

}

else if (mysql_field_count(conn) == 0)

{

// query does not return data

// (it was not a SELECT)

num_rows = mysql_affected_rows(conn);

sprintf(buf,"Query success! %d row is effected!/n",num_rows);

}

}

}

/* close connection */

mysql_free_result(res);

mysql_close(conn);

return 0;

}

客户端:

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#define MAXLINE 1024

char sendhead[MAXLINE];

int main(int argc , char* argv[])

{

int sockfd;

struct sockaddr_in servaddr;

char *info="cxt";

int                     maxfdp1, stdineof;

fd_set          rset;

char            recvbuf[MAXLINE],tmp[128],sendbuf[MAXLINE];

int             n,len,fd;

if(argc!=3){

printf("useage:client address port ");

exit(0);

}

if((sockfd=socket(AF_INET,SOCK_STREAM,0))==-1  )

{

perror("socket");

exit(1);

}

printf("%s connect server/n",info);

bzero(&servaddr,sizeof(servaddr));

servaddr.sin_family=AF_INET;

servaddr.sin_port=htons(atoi(argv[2]));

inet_pton(AF_INET,argv[1],&servaddr.sin_addr);

if( ( connect(sockfd,(struct sockaddr*)&servaddr,sizeof(servaddr))  )<0)

{

perror("connect");

exit(1);

}

send(sockfd,info,strlen(info),0);

//FD_ZERO(&rset);

//FD_SET(sockfd, &rset);

//FD_SET(0, &rset);

//maxfdp1=sockfd+1;

for ( ; ; ) {

FD_ZERO(&rset);

FD_SET(sockfd, &rset);

FD_SET(0, &rset);

maxfdp1=sockfd+1;

if(  (  select(maxfdp1, &rset, NULL, NULL, NULL) )<=0){

perror("select");

}else{

if (FD_ISSET(0,&rset)){

fgets(sendbuf, MAXLINE, stdin);

n=send(sockfd,sendbuf,strlen(sendbuf)-1,0);

if(n>0)

printf("send: %s",sendbuf);

else

printf("send: %s error,the erro cause is %s:%s/n",sendbuf,errno,strerror(errno));

bzero(sendbuf,strlen(sendbuf));

}

if (FD_ISSET(sockfd, &rset)) {  /* socket is readable */

n=recv(sockfd, recvbuf, MAXLINE,0) ;

if(n<0) {

perror("str_cli: server terminated prematurely");

}else if(n==0)

{

printf("sever shutdown!");

exit(-1);

}

//recvbuf

recvbuf[n]='/0';

printf("receive :%s/n",recvbuf);

fflush(stdout);

bzero(recvbuf,strlen(recvbuf));

}

}

}

exit(0);}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值