模拟手机缴费系统要点指导
模拟手机缴费系统 linux
一、MySql数据库在Unix/Linux C的使用
Linux MySql数据库开发
MySql与C联合开发
开发库的安装
MySql C API
编程实例
1、软件包需要
1)MySql服务器
mysql-server-3.23.54a-11
mysql-server-3.23.58-1.9
2)MySql客户端
mysql-3.23.54a-11
mysql-3.23.58-1.9
3)MySql开发接口库
mysql-devel-3.23.54a-11
mysql-devel-3.23.58-1.9
2、Mysql服务配置
mysqyld服务要运行起来。最好是设为开机自动启动。方法: chkconfig –level 2345 mysqld on ntsysv service mysqld start / stop /restart 图形方式
3、Msqyl客户端命令行工具
MySqyl客户端命令行工具为mysql。其常用法为:
mysql [OPTIONS] [database] <script.sql >output.tab
常用参数有:
-?, --help: 帮助
-D, --database=DB_name: 指定数据库
-h, --host=Host_name: 指定主机
-u, --user=DB_user_name: 指定用户
-p[…], --password[=…]: 指定密码
4、客户端常用命令
在命令提示符下输入:mysql 或 mysql –u root进入mysql系统。提示符为―>‖,可以使用的命令有:
show databases / tables;
use database;
create database db;
create table tbl;
模拟手机缴费系统 linux
drop database db/ table tbl;
select … from tbl … where …
insert … into tbl … values …
update … tbl … set … where …
delete … from tbl … where …
4、MySql C开发接口
不同版本的MySql有不同的目录设置。
1)头文件
目录:/usr/include/mysql
使用:#include <mysql/mysql.h>
说明:必要时可使用-I参数
2)库文件
静态库:/usr/lib/mysql/libmysqlclient.a
动态库:/usr/lib/mysql/libmysqlclient.so
使用参数:-L/usr/lib/mysql -lmysqlclient
3)mysql C开发示例程序
//头文件
#include <stdio.h>
#include <mysql/mysql.h>
main()
{
//变量声明
MYSQL mysql;
MYSQL_RES *result;
MYSQL_ROW row;
// 初始化数据结构
mysql_init(&mysql);
//连接数据库
mysql_real_connect(&mysql,"localhost","root",0,"mydb",0,NULL,0);
//执行查询语句mysql_query
mysql_query(&mysql,"SELECT * FROM person");
//保存结果
result=mysql_store_result(&mysql);
//处理结果集
while((row=mysql_fetch_row(result))){
fprintf(stdout,"%s|\t%s\n",row[0],row[2]);
}
mysql_free_result(result); //清理数据
模拟手机缴费系统 linux
mysql_close(&mysql); //关闭连接
}
4)编译和链接方法
编译链接时要使用-L和-l参数。例如:
cc -o mysql mysql.c -L/usr/lib/mysql -lmysqlclient
5)开发接口说明
Mysql提供有多种开发接口:PHP,ODBC,PERL,C/C++,JAVA
C常用的开发接口有:
mysql_init,mysql_real_connect,mysql_query,mysql_store_result,mysql_fetch_row,mysql_free_result,mysql_close,mysql_init
(1)mysql_init
作用:是初始化MYSQL变量,为mysql_real_connect()做准备。
用法:MYSQL *mysql_init(MYSQL *mysql)
返回值:MYSQL句柄或描述符;内存不足是为NULL;
(2)mysql_real_connect
功能:链接mysql数据库;
用法:MYSQL *mysql_real_connect(MYSQL *mysql,\
const char *host, const char *user, \
const char *passwd, const char *db, \
unsigned int port, const char *unix_socket, \
unsigned int client_flag)
说明:如果port!=0,则将作为TCP/IP端口使用,默认为0;如果unix_socket!=NULL,则可指定socket或命名PIPE,默认为NULL;Client_flag可以指定特定的值(略),默认为0.
(3)mysql_query
功能:查询实施
用法:
int mysql_query(MYSQL *mysql, const char *query)
说明:query为数据库操作命令字符串,本义是查询(select),可包括select,update,insert,delete等对数据库操作的命令。mysql_query不能用来处理二进制数据,处理二进制数据可使用mysql_real_query。
返回值:0表示正常,非0表示发生了错误。
(4)mysql_store_resul
功能:结果集处理。如果使用mysql_query运行的是一个SELECT语句,或其它可以返回结果的查询,可用函数mysql_store_result来访问返回结果并并将其保存在一个变量中,以便做进一步处理。
用法:
MYSQL_RES *mysql_store_result(MYSQL *mysql)
模拟手机缴费系统 linux
MYSQL_RES *mysql_use_result(MYSQL *mysql)
说明:mysql为mysql_real_connect函数的返回值。
(5)结果集的使用
使用了mysql_store_result函数保存结果后,可以使用以下函数对结果集进行处理。
①获得结果集中的行数:
my_ulonglong mysql_num_rows(MYSQL_RES *result)
②获得结果集行的域字段数:
unsigned int mysql_num_fields(MYSQL_RES *result)
unsigned int mysql_num_fields(MYSQL *mysql)
③读取结果集中的一行:
MYSQL_ROW mysql_fetch_row(MYSQL_RES *result)
④获取结果集中行的域段数:
unsigned int mysql_field_count(MYSQL *mysql)
⑤获得结果集中的域的属性:
MYSQL_FIELD *mysql_fetch_field(MYSQL_RES *result)
⑥获得域属性数组:
MYSQL_FIELD *mysql_fetch_fields(MYSQL_RES *result)
⑦查询被update、delete、insert等受影响的行:
my_ulonglong mysql_affected_rows(MYSQL *mysql)
(6)善后工作
当对数据库使用完毕后,应对所创建的变量等进行释放:
mysql_free_result(result);
mysql_close(&mysql);
(7)错误处理
方法有2:利用函数的返回值来判断函数执行是否正确;2.使用mysql提供的错误号和错误信息: 错误号:unsigned int mysql_errno(MYSQL *mysql)
错误信息:char *mysql_error(MYSQL *mysql)
(8)辅助函数
获取客户机版本信息:char *mysql_get_client_info(void)
获取主机信息:char *mysql_get_host_info(MYSQL *mysql)
获取协议版本信息:unsigned int mysql_get_proto_info(MYSQL *mysql)
获取服务器版本信息:char *mysql_get_server_info(MYSQL *mysql)
获取可用数据库列表:MYSQL_RES *mysql_list_dbs(MYSQL *mysql, const char *wild)
获取数据库的可有表列表:MYSQL_RES *mysql_list_tables(MYSQL *mysql, const char *wild)
二、Unix Socket网络编程
1、守候进程
守候进程(daemon),也叫精灵进程,或服务器进程,是生存期长的一种进程。它们常常在系统引导
模拟手机缴费系统 linux
装入时起动,在系统关闭时终止。因为它们没有控制终端,所以说它们是在后台运行的。
2、客户机/服务器(C/S)模型
一般而言,服务器是一个进程,它等待客户机与其联系,提出某种类型的服务要求。
C/S模式在操作过程中采取的是主动请求方式。
服务对客户机服务可将结果或信息返回给客户机
(双向),也可不返回(单向)。
就双向C/S来讲,又分为重复型和并发型两种。
在网络编程中,一般来说,TCP服务器是并发的,
而UDP服务器是重复的。
1)重复型
重复型服务器通过以下步骤进行交互:
(1)打开一通信通道并告知本地主机,它愿意在某一公认地址端口上接收客户请求。
(2)等待一个客户请求的到来;
(3)处理客户请求;
(4)将服务结果数据发送给请求的客户;
(5)返回步骤(2)
重复型服务器主要的问题发生在第(3)步。在这期间,它不能接收其它客户请求,因而不能为其他客户机提供服务。
2)并发型
并发型服务器采用以下步骤进行交互:
(1)打开一通信通道并告知本地主机,它愿意在某一公认地址端口上接收客户请求。
(2)等待一个客户请求的到来;
(3)启动一个新的服务器来处理这个客户的请求。
启动一个新的服务器的方法可能不同,可能是生成一个新的进程或线程,这依赖于所使用的操作系统或开发系统的支持。新生成的服务器对客户的全部请求进行处理。处理完毕后,终止这个新服务器。
(4)返回步骤(2)
并发服务器的优点在于它是利用生成其他服务器的方法来处理客户的请求。它可以同时并发地为多个客户机服务。
3)客户方
(1)打开一通信通道,并连接到服务器所在主机的特定端口。
(2)向服务器发服务请求,等待并接收应答;
(3)请求结束后关闭通信通道。
3、socket的引入
socket程序库是UNIX网络上最普及的API,可调用socket程序库提供的各个程序开发网络软件和网络系统。
TCP/IP协议被集成到UNIX内核中时,相当于在UNIX系统引入了一种新型的I/0操作。UNIX用户进程与网络协议的交互作用比用户进程与传统的I/O设备相互作用复杂得多。
在UNIX系统中,网络应用编程界面有两类:UNIX BSD的套接字(socket)和UNIX System V的TLI。由于Sun公司采用了支持TCP/IP的UNIX BSD操作系统,使TCP/IP的应用有更大的发展,
其网络应用编
模拟手机缴费系统 linux
程界面(套接字)在网络软件中被广泛应用。
4、套接字类型
流式套接字(SOCK-STREAM):提供了一个面向连接、可靠的数据传输服务,数据无差错、无重复地发送,且按发送顺序接收。内设流量控制,避免数据流超限;数据被看作是字节流,无长度限制。文件传送协议(FTP)即使用流式套接字。
数据报式套接字(SOCK-DGRAM) :提供了一个无连接服务。数据包以独立包形式被发送,不提供无错保证,数据可能丢失或重复,并且接收顺序混乱。
原始式套接字(SOCK-RAW):该接口允许对较低层协议,如IP、ICMP直接访问。常用于检验新的协议实现或访问现有服务中配置的新设备。
5、基本套接字系统调用
创建套接字—socket()
地址绑定—bind()
建立连接—connect()与accept()
监听连接—listen()
数据传输—send()/write()与recv()/read()
关闭套接字—close()
1)创建套接字—socket()
应用程序在使用套接字前,必须拥有一个套接字,系统调用socket()向应用程序提供创建套接字的手段。其调用格式如下:
#include <sys/socket.h>
int socket(int domain, int type, int protocol);
该调用要接收3个参数,根据这3个参数建立一个套接字,并将相应的资源分配给它,同时返回一个整型套接字号,只和一个特定的协议相联系。实际上指定了相关五元组中的―协议‖这一元。
domain(协议族):AF_INET,AF_UNIX,AF_IPX,…
type(类型):SOCK_STREAM,SOCK_DGRAM
protocol(协议):0-让系统使用指定类型和协议族上的默认协议。
2)绑定本地地址—bind()
当一个套接字用socket()创建后,存在一个名字空间(地址族),但它没有被命名,bind()将套接字地址(包括本地主机地址和本地端口地址)与所创建的套接字号绑定起来,即将名字赋予套接字,以指定本地半相关。其调用格式如下:
#include <sys/socket.h>
int bind(int sockfd,const struct sockaddr *my_addr, int addrlen);
说明:
sockfd:为socket成功时的返回值—套接字描述符。
my_addr为本方地址数据结构。
addrlen=sizeof(my_addr).
3)监听连接—listen()
此调用用于面向连接服务器,表明它愿意接收连接。1isten()需在accept()之前调用,其调用格式如下: #include <sys/socket.h>
模拟手机缴费系统 linux
int listen(int s,int backlog);
listen()在执行调用过程中可为没有调用过bind()的套接字s完成所必需的连接,并建立长度为backlog的请求连接队列。
backlog定义最大长度的socket等待队列。默认值为5.
4)connect(),accept()
这两个系统调用用于完成一个完整相关的建立,其中connect()用于客户建立连接。accept()用于使服务器等待来自某客户进程的实际连接。
(1)connect
功能:客户方调用发出的请求
用法:
int connect(int sockfd,const structct sockaddr * server_addr, socklen_t addrlen);
在面向连接的协议中,该调用导致本地系统和外部系统之间连接实际建立。
(2)accept
功能:服务器调用,从等待从编号为s的套接字上接受客户连接请求。
用法:
int accept(int s, struct sockaddr *addr, socklen_t addrlen);
(3)connect与accept的说明
调用accept()后,服务器等待从编号为s的套接字上接受客户连接请求,连接请求是由客户方的connect()调用发出的。
当有连接请求到达时,accept()调用将请求连接队列上的第一个客户方套接字地址及长度放入addr和addrlen,并创建一个与s有相同特性的新套接字号。
新的套接字可用于处理服务器并发请求。
5)数据传输:send()/write与recv()/read()
当一个连接建立以后,就可以传输数据了。常用的系统调用有send()和recv()。send()调用用于在参数s指定的已连接的数据报或流套接字上发送输出数据,格式如下:
int send(int s,void *buf,int len,int flags);
int recv(int s,void *buf,int len,int flags);
recv/send可由文件系统调用read/write所取代。
在处理二进制数据处理时,后者优于前者。
6)关闭套接字:close()
close()关闭套接字s,并释放分配给该套接字的资源;如果s涉及一个打开的TCP连接,则该连接被释放。
close()的调用格式如下:
int close(int s);
6、字节顺序
网络字节顺序:TCP/IP使用大端字节来传输协议信息。
大端(尾)数(big-endian)把高位字节放在低地址,而小尾(端)数(little-endian)则把高位字节存放
模拟手机缴费系统 linux
在高地址空间。
需要在机器字节顺序与网络字节顺序转换的可使用下列函数:
unsignd int htonl(unsigned int hostlong)
unsignd short htons(unsigned int hostshort)
unsignd int nhtonl(unsigned int netlong)
unsignd int nhtons(unsigned int netshort)
前两个是正向的,后两者是反向的。这时里的―长整数‖指的是32位,而不是C语言的长整数。
7、地址转换
应用程序常常需要在点分十进制的IP与二进制形式IP间的转换。以下函数可以实现这种转换:
#include <netinet/in.h>
#include <socket.h>
#include <arpa/inet.h>
int inet_aton(const char *ddaddress, struct in_addr *adress)
char *inet_ntoa(struct in_addr address);
unsigned long int inet_addr(const char *ddaddress);
8、主机信息及相关数据结构和函数
struct hostent {
char *h_name; // Official name of host
char **h_aliases; // Alias list.
int h_addrtype; // Host address type
int h_length; // Length of address
char **h_addr_list; // List of addrs from NS
};
参见netdb.h
主机信息及相关数据结构和函数
#include <netdb.h>
struct hostent *gethostbyname(const char *name)
name:为主机名。可以是域名,也可在/etc/hosts中定义。
struct hostent *gethostbyadress(const char *addr, int len, int type)
addr::是一个指向in_addr的结构(见netinet/in.h);
len指明addr的长度;
type:对于SCOK_STREAM,type为AF_INET。
9、服务器端相关的数据结构和函数
struct servent {
char *s_name;
char **s_aliases;
int s_port;
char *s_proto;
};
参见netdb.h // Official service name. // Alias list. // Port number. // Protocol to use.
模拟手机缴费系统 linux
10、服务器端相关的数据结构和函数
#include <netdb.h>
struct servent *getservbyname(const char *name, const char *protocal);
name与protocal均定义在/etc/services中:
name:服务名;
protocal:为协议
struct servent *getservbyport(int port, const char *protocal);
直接使用数字作为端口号,建议不要这样做,因为不便配置。
IP socket地址
#include <sys/socket.h>
#include <netinet/in.h>
struct sockaddr_in {
short int sin_family; // AF_INET
unsigned short int sin_port; // port No.
struct in_addr sin_addr; // IP addr.
}
模拟手机缴费系统 linux
11、典型套接字调用过程
12、socket开发示例
现在几乎所有支持网络开发的系统,都支持socket开发。比如VB的winsock控件,Windows socket库,MS MFC的CAsynSocket和Csocket类,.net的http://doc.guandang.net.Sockets,Java,Delphi,perl等都有相应的类。
不同开发环境可实现指定功能,完成通信和联网。
这里给出UNIX Socket的开发框架示例程序,他们分别是客户端和服务端。
客房端程序:源程序见文件c.c。
服务器端程序:源程序见文件s.c。
三、实现
我们模拟银行代理移动公话费业务来说实现C/S通讯。
模拟手机缴费系统 linux
1、移动公司方(最终服务器方)
功能:记帐、查询、交费、统计。
1)手机话务数据库
数据库名称:cellphone
总控信息表:main
基本信息表:user
话务信息表:payment
交易流水表:journal
2)表结构
(1)总控信息表main
use cell;
create table main
(
);
create table user
(
);
create table payment
(
);
create table journal
(
journal char(20) not null primary key, trans_type char(2), trans_mount int, user_no month_fee cut_off transtime char(13) not null primary key, int, int, datetime , curr_fee int, user_no user_id userlevel char(13) not null primary key, char(18) not null, char(2) default '01', username char(40) not null, unit_id char(13) not null, unitname char(40) not null, unitaddr char(40) default ' ', curr_jnl bigint default 1 password char(30) , usertime datetime, preserve char(20) preserve char(20) default ' '
模拟手机缴费系统 linux
); trans_all varchar(250)
2、客户方
客户是交易的发起者。实现功能与服务器方同。
数据库名称:bank
总控信息表:main
交易信息表:trans
交易流水表:journal
2、示例程序
1)客户端
#include <time.h>
#include <stdio.h>
#include <string.h>
#include <sys/types.h>
#include <fcntl.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netdb.h>
#define rec_length 500
char str[512];
void strsplit(char *,char **,char *);
main(int argc,char **argv)
{
struct hostent *hp;
struct sockaddr_in sin;
struct servent *sp;
char buff[1000],cmd[500],*phone_no="13603750662";
int s,err_code,recs,flds,i,rd_l,wr_l;
char *service,*dest,*log="clt.log";
char *v[100],*d="|";
char *sat[]={
"OKOKOKOK","E_DBinit","E_DBconn","E_DBqry ","E_DBstor",
"E_DBnDAT","E_TCPsvr","E_TCPnam","E_TCPsoc","E_TCPcon",
"E_TCPsnd","E_TCPrcv","E_TCPbnd","E_TCPlsn","E_TCPacc"
};
if(argc!=1){ service=argv[1]; dest=argv[2];}
else {
fprintf(stderr,"NO service assigned!\nUsage:");
fprintf(stderr,"%s service_name destination!\n",argv[0]);
fprintf(stderr,"Note: service_name is defined in /etc/services\n");
fprintf(stderr," destination is defined in /etc/hosts\n");
模拟手机缴费系统 linux
exit(-1);
}
// 测试日志文件是否存在,若不存在则创建之
if((rd_l=open(log,O_WRONLY|O_CREAT|O_APPEND,0644))==-1){
fprintf(stderr,"Log file %s open error!\a\n",log);
exit(-1);
}
close(rd_l);
err_code=0;
if((sp=getservbyname(service,"tcp"))==NULL){ // 读取服务信息
fprintf(stderr,"Error: getservbyname");
err_code=6;goto log;
}
if((hp=gethostbyname(dest))==0){ // 读取目的主机信息
fprintf(stderr,"Error: gethostbyname");
err_code=7;goto log;
}
bzero(&sin,sizeof(sin));
bcopy(hp->h_addr,&sin.sin_addr,hp->h_length); // 读取地址族信息
sin.sin_family=hp->h_addrtype;
sin.sin_port=sp->s_port;
if((s=socket(AF_INET,SOCK_STREAM,0))==-1){ // 创建socket
fprintf(stderr,"Error: socket");
err_code=8;goto log;
}
if(connect(s,(struct sockaddr *)&sin,sizeof(sin))==-1){ // 建立联接
fprintf(stderr,"Error: connect");
err_code=9;goto log;
}
strcpy(buff,"1|");strcat(buff,"13603750662|");
// next 2 Line build request message
if((wr_l=write(s,buff,strlen(buff)))!=strlen(buff)){ // 向服务器写请求信息
fprintf(stderr,"Write Socket s ERROR\n!");
err_code=10;goto log;
}
if((rd_l=read(s,cmd,rec_length))==0){ // 从服务器读回应信息
fprintf(stderr,"Read Socket s Error\n");
err_code=11;goto log;
}
log:
close(s); // 关闭网络联接
printf("%s\tsend: %s\nget reply:(%d Bytes) %s\n",argv[0],buff,rd_l,cmd);
// 以下为日志记录部分
cmd[rd_l]='\0';
模拟手机缴费系统 linux
buff[wr_l]='\0';strcat(buff,sat[err_code]);strcat(buff,"|");wr_l+=9;
strncat(buff,cmd,rd_l);wr_l+=rd_l;buff[wr_l++]='\n';
if((flds=open(log,O_WRONLY|O_APPEND))==-1){ // 打开日志文件
fprintf(stderr,"File %s open error!\n",log);
exit(-5);
}
if(write(flds,buff,wr_l)!=wr_l){ // 写日志
fprintf(stderr,"File %s write error!\n",log);
close(flds); exit(-6);
}
close(flds); // 关闭日志文件
strsplit(cmd,v,d); // 拆分服务器返回信息
disp(v); //显示服务器返回的信息
exit(0);
}
disp(char **v)
{ // 显示服务器返回的信息,格式由用户根据需要设定
int i=0;
printf("No: %s\t\tName: %s\n",v[2],v[3]);
printf("fee: %s\t\tremder:%s\n",v[4],v[5]);
}
getdate(char *d)
{ // 获得当前时间,并按格式"%4.4d%2.2d%2.2d"组成字符串
int i;
time_t t,t1;
struct tm *t_m;
if((t=time(&t1))==-1) return -1;
t_m=localtime(&t);
sprintf(d,"%4.4d%2.2d%2.2d",t_m->tm_year+1900,t_m->tm_mon+1,t_m->tm_mday);
d[8]='\0';
return 0;
}
void strsplit(char *s,char **v,char *d)
{ // 字符串拆分函数. 注:拆分不能在常数字符串上进行,故使用(全局)临时字符串str
char *tmp;
int i=0;
strcpy(str,s);
v[i++]=str;
tmp=strtok(str, d);
while(tmp) {
tmp = strtok(NULL, d);
v[i++]=tmp;
模拟手机缴费系统 linux
} }
2)服务器端
#include <stdio.h>
#include <sys/types.h>
#include <fcntl.h>
#include <string.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netdb.h>
#include <mysql/mysql.h>
#define rec_length 20
char str[512];
void strsplit(char *,char **,char *);
main(int argc, char **argv )
{
struct sockaddr_in sin;
struct servent *sp;
int s,ns,pid;
int sql=0,rslt=0;
char *d="|",tmp[1000],buff[500],cmd[500];
char *service,*log="svr.log";
char *v[100];
int i,j,recs,flds,err_code,c,rd_l,wr_l;
char *sat[]={
"OKOKOKOK","E_DBinit","E_DBconn","E_DBqry ","E_DBstor",
"E_DBnDAT","E_TCPsvr","E_TCPnam","E_TCPsoc","E_TCPcon",
"E_TCPsnd","E_TCPrcv","E_TCPbnd","E_TCPlsn","E_TCPacc"
};
//declare structure and vars for MySQL
MYSQL mysql;
MYSQL_RES *result;
MYSQL_ROW row;
// 检查参数
if(argc!=1) service=argv[1];
else {
fprintf(stderr,"NO service assigned!\nUsage:\n");
fprintf(stderr,"\t%s server_name!\n",argv[0]);
fprintf(stderr,"Note: svr_name is defined in file /etc/services\n");
exit(-1);
}
模拟手机缴费系统 linux
// 测试日志文件,若不存在则创建之
if((rd_l=open(log,O_WRONLY|O_CREAT|O_APPEND,0644))==-1){
fprintf(stderr,"Log file %s open error!\a\n",log);
exit(-1);
}
close(rd_l);
for(i=0;i<100;i++) v[i]=NULL;
// 读取服务信息
if((sp=getservbyname(service,"tcp"))==NULL){
strcpy(tmp,"Error: getservbyname");
fprintf(stderr,"%s\n",tmp);
err_code=6; goto end_1;
}
// 创建socket
if((s=socket(AF_INET,SOCK_STREAM,0))==-1){
strcpy(tmp,"Error: socket create");
fprintf(stderr,"%s\n",tmp);
err_code=9;goto end_1;
}
bzero(&sin,sizeof(sin));
sin.sin_port=sp->s_port;
// 端口或地址绑定
if(bind(s,(struct sockaddr *)&sin,sizeof(sin))==-1){
strcpy(tmp,"Error: bind");
fprintf(stderr,"%s\n",tmp);
err_code=13;goto end_1;
}
// 声明可以接受链接
if(listen(s,5)==-1){
strcpy(tmp,"Error: listen");
fprintf(stderr,"%s\n",tmp);
err_code=14;goto end_1;
}
// initialize MYSQL structure
if(mysql_init(&mysql)==NULL){
strcpy(tmp,"Error in mysql_init!");
fprintf(stderr,"%s\n",tmp);
err_code=1; goto end_1;
}
sql=1;
//connect to DataBase
if(!mysql_real_connect(&mysql,"localhost","root",0,"cell",0,NULL,0)){
sprintf(tmp,"Error in connection: %s [%d]",\
mysql_error(&mysql),mysql_errno(&mysql));
相关推荐:
- [外语考试]用三层交换机实现大中型企业VLAN方案
- [外语考试]斯格配套系种猪饲养管理
- [外语考试]涂层测厚仪厂家直销
- [外语考试]研究生学校排行榜
- [外语考试]鄱阳湖湿地景观格局变化及其驱动力分析
- [外语考试]医学基础知识试题库
- [外语考试]2010山西省高考历年语文试卷精选考试技巧重点
- [外语考试]脉冲宽度法测量电容
- [外语考试]谈高职院校ESP教师的角色调整问题
- [外语考试]低压配电网电力线载波通信相关技术研究
- [外语考试]余额宝和城市商业银行的转型研究
- [外语考试]篮球行进间运球教案
- [外语考试]气候突变的定义和检测方法
- [外语考试]财经大学基坑开挖应急预案
- [外语考试]高大支模架培训演示
- [外语考试]一种改进的稳健自适应波束形成算法
- [外语考试]2-3-鼎视通核心人员薪酬股权激励管理手册
- [外语考试]我国电阻焊设备和工艺的应用现状与发展前景5
- [外语考试]MTK手机基本功能覆盖测试案例
- [外语考试]七年级地理教学课件上册第四章第一节 人口与人种
- 2014河北政法干警考试行测亮点分析——
- 班风学风建设主题班会总结三篇
- HC130-2运动控制器(3.25版)
- 现代造船技术复习题
- 食补最是自然-香菇炖鸡汤
- 冷热饮水机压缩机制冷电路的原理分析
- 虚惊事件管理制度
- 汉语拼音的轻声、儿化和变调
- 鲁商集团·菏泽鲁商城市广场市
- 地理教师个人工作总结
- AGVS—现代化物料搬运技术装备
- 第二节 牛顿第二定律的瞬时性
- 第一节 工业的区位因素与区位选择
- 2014年北京大学医学部硕士研究生入学考
- AIX压缩与解压缩
- 善导和尚答念佛往生文
- 关于全面建设小康社会新内涵的思考
- 1-7 线性空间的同构
- 关于高校贫困生思想政治教育工作问题的
- 学前教育专业《音乐与戏剧表演》教学大