QT与LINUXC后台网络通信实现飞机票网络购票
飞机票网络通信模拟系统
该模拟系统是以QT为前端,LinuxC语言程序为后端的飞机票网络售票模拟系统。QT实现前端UI界面,LinuxC作为后台程序,提供数据库增删修改和插入、查询操作。
LinuxC总体作为套接字通信的服务器端,需要配置端口好和IP地址。而QT前端则作为“客户端”,负责向LinuxC后台发送字符串命令。二者通过套接字(Socket)进行通信,三次握手之后,便可以进行网络通信(即进程间通信)。
其次,要解决是多线程同步问题,由于本程序多线程问题有BUG,暂时只说一说关于多线程的解决方法。通过创建N(航班数量)个线程互斥锁,每一个互斥锁独立运行,负责特定航班的飞机票的购买(每一个航班的互斥锁只能同时运行一个,而其它互斥锁之间互不影响,只影响相同航班之间的飞机票购买同步问题)!
由于本人也是一个新手,开发过程中也有很多错误出现,如果大牛看到请及时指正。其中通信问题,请参考:http://m.blog.chinaunix.net/uid-20792373-id-3298553.html这位大牛的博客信息!
同时,转载请注明来源!
**
QT前端UI界面
**
- 登录、注册界面
regist.h
#ifndef REGIST_H
#define REGIST_H
#include "regis2.h"
#include <QDialog>
#include <QMessageBox>
#include <QtNetwork/QAbstractSocket>
#include <QtNetwork/QTcpSocket>
namespace Ui {
class regist;
class QTcpSocket;
}
class regist : public QDialog
{
Q_OBJECT
public:
explicit regist(QWidget *parent = 0);
~regist();
protected:
void init();
void connectServer();
private slots:
void on_login_clicked();
void displayError(QAbstractSocket::SocketError);
void on_reg_clicked();
void readMessages();
void on_Test_LOGININ_clicked();
private:
Ui::regist *ui;
QTcpSocket *tcpSocket;
};
#endif // REGIST_H
regist.cpp
#include "regist.h"
#include "ui_regist.h"
#include "regis2.h"
#include <QMessageBox>
#include <QString>
#include <QtSql/QSql>
#define ip "127.0.0.1"
#define port 8000
regist::regist(QWidget *parent) :
QDialog(parent),
ui(new Ui::regist)
{
ui->setupUi(this);
this->setWindowTitle(tr("飞机票网络售票模拟系统(Server)"));
init();
connectServer();
}
regist::~regist()
{
delete ui;
}
void regist::init()
{
tcpSocket=new QTcpSocket(this);
connect(tcpSocket,SIGNAL(error(QAbstractSocket::SocketError)),
this,SLOT(displayError(QAbstractSocket::SocketError))); //发生错误时执行displayError函数
}
void regist::connectServer()
{
tcpSocket->abort(); //取消已有的连接
tcpSocket->connectToHost(ip,port);
connect(tcpSocket,SIGNAL(readyRead()),this,SLOT(readMessages()));
}
void regist::on_login_clicked()
{
QString userName = ui->name1->text();
QString passward = ui->pass1->text();
if(userName=="" || passward=="")
QMessageBox::information(this,"警告","输入不能为空",QMessageBox::Ok);
else{
QString as = "b";
QString data = as + "#" + userName + "#" + passward;
tcpSocket->write(data.toLatin1());
}
}
void regist::displayError(QAbstractSocket::SocketError)
{
qDebug()<<tcpSocket->errorString(); //输出出错信息
}
void regist::readMessages()
{
QString data = tcpSocket->readAll();
QStringList list = data.split("#");
if(list[0]=="b" && list[1]=="true"){
QMessageBox::information(this,"信息提示","Account ok!",QMessageBox::Ok);
accept();//关闭窗体,并设置返回值为Accepted
this->close();
}
else if(list[0]== "b" && list[1]=="false")
{
QMessageBox::information(this,"信息提示","Account error!",QMessageBox::Ok);
}
return;
}
void regist::on_reg_clicked()
{
//Open the second ui
regis2 r;
r.exec();
this->close();
}
void regist::on_Test_LOGININ_clicked()
{
accept();
this->close();
}
regis2.h
#ifndef REGIS2_H
#define REGIS2_H
#include "regist.h"
#include <QDialog>
#include <QMessageBox>
#include <QtNetwork/QAbstractSocket>
#include <QtNetwork/QTcpSocket>
namespace Ui {
class regis2;
class QTcpSocket;
}
class regis2 : public QDialog
{
Q_OBJECT
public:
explicit regis2(QWidget *parent = 0);
~regis2();
protected:
void init2();
void connectServer2();
private slots:
void on_Regis_clicked();
void displayError2(QAbstractSocket::SocketError);
void readMessages2();
void on_back1_clicked();
private:
Ui::regis2 *ui;
QTcpSocket *tcpSocket2;
};
#endif // REGIS2_H
regis2.cpp
#include "regis2.h"
#include "ui_regis2.h"
#include <QMessageBox>
#include <QtNetwork/QtNetwork>
#include <QtNetwork/QAbstractSocket>
#include <QTcpSocket>
#define ip "127.0.0.1"
#define port 8000
regis2::regis2(QWidget *parent) :
QDialog(parent),
ui(new Ui::regis2)
{
ui->setupUi(this);
this->setWindowTitle(tr("飞机票网络售票模拟系统(Server)"));
ui->lineEdit_2->setEchoMode(QLineEdit::Password);
init2();
connectServer2();
}
regis2::~regis2()
{
delete ui;
}
void regis2::init2()
{
tcpSocket2=new QTcpSocket(this);
connect(tcpSocket2,SIGNAL(error(QAbstractSocket::SocketError)),
this,SLOT(displayError2(QAbstractSocket::SocketError))); //发生错误时执行displayError函数
}
void regis2::connectServer2()
{
tcpSocket2->abort(); //取消已有的连接
tcpSocket2->connectToHost(ip,port);
connect(tcpSocket2,SIGNAL(readyRead()),this,SLOT(readMessages2()));
}
void regis2::on_Regis_clicked()
{
QString userName2=ui->lineEdit->text();
QString passward2=ui->lineEdit_2->text();
if(userName2=="" || passward2=="")
QMessageBox::information(this,"警告","输入不能为空",QMessageBox::Ok);
QString as="a";
QString data=as+"#"+userName2+"#"+passward2;
tcpSocket2->write(data.toLatin1());
}
void regis2::displayError2(QAbstractSocket::SocketError)
{
qDebug()<<tcpSocket2->errorString(); //输出出错信息
}
void regis2::readMessages2()
{
QString data2 = tcpSocket2->readAll();
QStringList list2 =data2.split("#");
if(list2[0]=="a" && list2[1]=="true"){
QMessageBox::information(this,"信息提示","注册成功!",QMessageBox::Ok);
regist r;
r.exec();
this->close();
}
else if(list2[0]=="a" && list2[1]=="false")
QMessageBox::information(this,"信息提示","注册失败,用户名已经被注册!",QMessageBox::Ok);
return;
}
void regis2::on_back1_clicked()
{
this->close();
regist r;
r.exec();
}
- 服务器端界面
mainwindow.h
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QMainWindow>
#include <QDialog>
#include <QTcpSocket>
#include <QtNetwork/QtNetwork>
#include <QtNetwork/QAbstractSocket>
#include <QTcpSocket>
#include <QSql>
#include <QSqlDatabase>
#include <QSqlQuery>
#include <QDebug>
namespace Ui {
class MainWindow;
class QTcpSocket;
}
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
explicit MainWindow(QWidget *parent = 0);
~MainWindow();
void initsql();
void createtable();
protected:
void init3();
void connectServer3();
void connectServer4();
private slots:
void on_check_clicked();
void displayError3(QAbstractSocket::SocketError);
void readMessages3();
//void displayError4(QAbstractSocket::SocketError);
void readMessages4();
void on_insert_btn_clicked();
void check();
void on_check_all_clicked();
void on_delete_btn_clicked();
void on_updatebtn_clicked();
private:
Ui::MainWindow *ui;
QTcpSocket *tcpSocket3;
QSqlQuery *query;
};
#endif // MAINWINDOW_H
mainwindow.cpp
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QMessageBox>
#include <QtNetwork/QtNetwork>
#include <QtNetwork/QAbstractSocket>
#include <QSqlQueryModel>
#include <QTcpSocket>
#define ip "127.0.0.1"
#define port 8000
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
this->setWindowTitle(tr("飞机票网络售票模拟系统(Server)")); //
init3();
connectServer3();
connectServer4();
}
MainWindow::~MainWindow()
{
delete ui;
}
void MainWindow::init3() //
{
tcpSocket3 = new QTcpSocket(this);
connect(tcpSocket3,SIGNAL(error(QAbstractSocket::SocketError)),
this,SLOT(displayError3(QAbstractSocket::SocketError))); //发生错误时执行displayError函数
}
void MainWindow::connectServer3() //
{
tcpSocket3->abort(); //取消已有的连接
tcpSocket3->connectToHost(ip,port);
connect(tcpSocket3,SIGNAL(readyRead()),this,SLOT(readMessages3()));
}
void MainWindow::connectServer4() //
{
tcpSocket3->abort(); //取消已有的连接
tcpSocket3->connectToHost(ip,port);
connect(tcpSocket3,SIGNAL(readyRead()),this,SLOT(readMessages4()));
}
void MainWindow::displayError3(QAbstractSocket::SocketError)
{
qDebug()<<tcpSocket3->errorString(); //输出出错信息
}
void MainWindow::readMessages3() //
{
QString data3 = tcpSocket3->readAll();
QStringList list3 =data3.split("#");
if(list3[0]=="i" && list3[1]=="true"){
QMessageBox::information(this,"信息提示","insert successfully!",QMessageBox::Ok);
}
else if(list3[0]=="i" && list3[1]=="false")
QMessageBox::information(this,"信息提示","insert error!",QMessageBox::Ok);
return;
}
void MainWindow::readMessages4() //
{
QString data3 = tcpSocket3->readAll();
QStringList list3 =data3.split("#");
if(list3[0]=="c" && list3[1]=="true"){
QMessageBox::information(this,"信息提示","check successfully!",QMessageBox::Ok);
}
else if(list3[0]=="c" && list3[1]=="false")
QMessageBox::information(this,"信息提示","check error!",QMessageBox::Ok);
return;
}
//mysql check
void MainWindow::initsql()
{
QSqlDatabase db=QSqlDatabase::addDatabase("QMYSQL");
db.setHostName("127.0.0.1");
db.setUserName("root");
db.setPassword("123456");
db.setDatabaseName("info_t");
if(db.open())
{
qDebug()<<"Database connected successfully!";
createtable();
return;
}
else
{
qDebug()<<"Database connected failed!";
return;
}
}
void MainWindow::createtable()
{
query = new QSqlQuery;
query->exec("create table info_t(flight_num VARCHAR(30) PRIMARY KEY UNIQUE NOT NULL,num VARCHAR(30),price VARCHAR(30),start VARCHAR(30),terminus VARCHAR(30))");
/*创建root用户*/
query->exec("insert into info_t value('root', 'root')");
}
void MainWindow::on_check_clicked() //查询按钮
{
QString fn = ui->fnum_ch->text();//
QString n = ui->num_ch->text();//
QSqlQueryModel *model = new QSqlQueryModel(ui->tableView);
model->setQuery("select * from info_t where flight_num='"+ fn +"'");
model->setHeaderData(0, Qt::Horizontal, tr("flight_num"));
model->setHeaderData(1, Qt::Horizontal, tr("num"));
model->setHeaderData(2, Qt::Horizontal, tr("price"));
model->setHeaderData(3, Qt::Horizontal, tr("start"));
model->setHeaderData(4, Qt::Horizontal, tr("ternimus"));
ui->tableView->setModel(model);
}
void MainWindow::on_insert_btn_clicked()
{
QString info_fnum = ui->insert_fn->text();
QString info_num = ui->insert_n->text();
QString info_price = ui->insert_price->text();
QString info_start = ui->insert_start->text();
QString info_ter = ui->insert_t->text();
QString str=QString("select * from info_t where flight_num='%1").arg(info_fnum);
query=new QSqlQuery;
query->exec(str);
query->last();
int record=query->at()+1;
str=QString("insert into info_t value('%1','%2','%3','%4','%5')").arg(info_fnum).arg(info_num).arg(info_price).arg(info_start).arg(info_ter);
query->exec(str);
}
void MainWindow::check()
{
}
void MainWindow::on_check_all_clicked()
{
QSqlQueryModel *model2 = new QSqlQueryModel(ui->tableView_2);
model2->setQuery("select * from info_t");
model2->setHeaderData(0, Qt::Horizontal, tr("flight_num"));
model2->setHeaderData(1, Qt::Horizontal, tr("num"));
model2->setHeaderData(2, Qt::Horizontal, tr("price"));
model2->setHeaderData(3, Qt::Horizontal, tr("start"));
model2->setHeaderData(4, Qt::Horizontal, tr("ternimus"));
//qDebug()<<name<<danhao;
ui->tableView_2->setModel(model2);
//ui->tableView->show();
}
void MainWindow::on_delete_btn_clicked()
{
QString delete_flight_num = ui->delete_edit->text();
QString str = QString("delete from info_t where flight_num='"+ delete_flight_num +"'");
query = new QSqlQuery;
query->exec(str);
}
void MainWindow::on_updatebtn_clicked()
{
QString update_flight_num = ui->update_fnum->text();
QString update_num = ui->update_num->text();
QString update_start = ui->update_start->text();
QString update_ter = ui->update_ter->text();
QString update_price = ui->update_price->text();
query = new QSqlQuery;
QString str = QString("update info_t set num='"+ update_num +"' where flight_num='"+ update_flight_num +"'");
query->exec(str);
QString str1 = QString("update info_t set price='"+ update_price +"' where flight_num='"+ update_flight_num +"'");
query->exec(str1);
QString str2 = QString("update info_t set start='"+ update_start +"' where flight_num='"+ update_flight_num +"'");
query->exec(str2);
QString str3 = QString("update info_t set ternimus='"+ update_ter +"' where flight_num='"+ update_flight_num +"'");
query->exec(str3);
}
- 客户端界面
LinuxC后台程序
简单明了,我就直接把后台LinuxC的程序粘贴出来。其中多线程问题需要自己进行改进,我只是实现的利用一个互斥锁进行。后期的多线程问题需要大家自己解决。(数据库是Centos7下的Mariadb,)
socket.c
/******************************************************************
APP FUNCTION:处理飞机票网络购票模拟系统
网络通信使用C语言完成,体现进程通信、线程同步知识的使用;
界面部分使用QT;
程序编写者:Yangcl
程序编写时间:2019年7月10日
******************************************************************/
#include <stdio.h>
#include <string.h>
#include <math.h>
#include <stdlib.h>
//套接子依附的库文件
#include <sys/socket.h>
//数据库依附的库文件
#include <arpa/inet.h>
#include <mysql/mysql.h>
//线程依附的苦文件
#include <pthread.h>
#include <unistd.h>
#define RCV_BUF_LEN 200
#define NUM_MAX 30
//编译代码:gcc socket.c -o socket `mysql_config --cflags --libs` -pthread
pthread_mutex_t ticket_mutex; //定义线程互斥锁
int all_num,will_sold;
/*声明飞机票信息结构体*/
struct ti_info
{
int mutex_num; //飞机票互斥锁的锁号码
char fnum[30]; //飞机票航班
char num[30]; //该航班剩余飞机票数量
char price[30]; //单个飞机票价格
char start[30]; //该航班的始发地
char terminus[30]; //该航班目的地
};
struct ti_info ticketinfo[NUM_MAX]; //定义航班结构体
/*声明线程操作结构体*/
struct instruc
{
int flag; //falg=1 表示可以被买
int fn; //航班号
int n; //剩余的票数量
}info[NUM_MAX];
char ss[5];
/*Pthread operation function*/
void *eat(void *arg)
{
int i;
struct instruc *aa = (struct instruc *) arg;
while (1)
{
pthread_mutex_lock(&ticket_mutex);
if( aa->n <0 || aa->flag==0 )
{
pthread_mutex_unlock(&ticket_mutex);
printf("%d售票操作已经完成\n",aa->fn);
break;
}
aa->n--;
sprintf(ss,"%d",aa->n);
printf("%s\n",ss);
printf("购买者信息:%d %d\n",aa->fn,aa->n);
printf("剩%d个票,%d购买了票\n",aa->n,aa->fn);
info[ aa->fn ].flag =0;
pthread_mutex_unlock(&ticket_mutex);
sleep(2);
}
}
/*创建n个售票口,售卖x航班*/
void pthread_c(int n,int x)
{
pthread_t buyer;
int i,j;
for(i=0; i<n; i++)
{
if(i == x)
info[i].flag = 1;
else info[i].flag=0;
info[i].fn = i;
info[i].n = atoi( ticketinfo[i].num );
}
pthread_create(&buyer,NULL,eat,(void*) & info[x]);
pthread_join(buyer,NULL);
}
/*Delete mysql information........*/
void mysql_delete(int x)
{
MYSQL mysql;
MYSQL_RES *res;
MYSQL_ROW row;
char *query;
char *delete;
mysql_init(&mysql);
if(!mysql_real_connect(&mysql, "127.0.0.1", "root", "123456", "info_t", 0, NULL, 0))
{
printf("Failed to connect to Mysql!\n");
}
else
{
printf("Connected to Mysql successfully!\n");
}
char delete_cmd[200];
snprintf(delete_cmd, 64, "delete from info_t where flight_num = '%d'",x);
delete = mysql_query(&mysql,delete_cmd);
if(!delete)
{
printf("delete data success!\n");
}
else printf("delete data error!");
mysql_close(&mysql);
}
/*Update mysql information........*/
void mysql_change(int x, int y)
{
MYSQL mysql;
MYSQL_RES *res;
MYSQL_ROW row;
char *query;
int flag, t;
int sum=0,i=0;
char *change;
mysql_init(&mysql);
if(!mysql_real_connect(&mysql, "127.0.0.1", "root", "123456", "info_t", 0, NULL, 0))
{
printf("Failed to connect to Mysql!\n");
}
else
{
printf("Connected to Mysql successfully!\n");
}
char change_cmd[200];
snprintf(change_cmd, 64, "Update info_t set num = '%d' where flight_num = '%d'",x,y);
change = mysql_query(&mysql,change_cmd);
if(!change)
{
printf("change data success!\n");
}
else printf("change data error!");
mysql_close(&mysql);
}
void mysql_test(int y)
{
MYSQL mysql;
MYSQL_RES *res;
MYSQL_ROW row;
char *query;
int flag, t;
int sum=0,i=0;
mysql_init(&mysql);
if(!mysql_real_connect(&mysql, "127.0.0.1", "root", "123456", "info_t", 0, NULL, 0))
{
printf("Failed to connect to Mysql!\n");
}else {
printf("Connected to Mysql successfully!\n");
}
query = "select * from info_t";
//查询,成功则返回0
flag = mysql_real_query(&mysql, query, (unsigned int)strlen(query));
if(flag) {
printf("Query failed!\n");
}else {
printf("[%s] made...\n", query);
}
//mysql_store_result讲所有的查询结果读取到client
res = mysql_store_result(&mysql);
int mm=0;
//mysql_fetch_row检索结果集的下一行
while(row = mysql_fetch_row(res))
{
//mysql_num_fields返回结果集中的字段数目
for(t=0; t<mysql_num_fields(res); t++)
{
ticketinfo[mm].mutex_num = 0;
switch(t) //将读取到的数据库信息存储到结构体成员中
{
case 0:strcpy(ticketinfo[mm].fnum,row[t]);break;
case 1:strcpy(ticketinfo[mm].num,row[t]);break;
case 2:strcpy(ticketinfo[mm].price,row[t]);break;
case 3:strcpy(ticketinfo[mm].start,row[t]);break;
case 4:strcpy(ticketinfo[mm].terminus,row[t]);break;
default:break;
}
printf("%s\t", row[t]);
}
printf("\n");
mm++; //编号++
}
all_num = mm;
printf("mysql_test 共%d个窗口 将售卖%d个窗口的\n",mm,y);
pthread_c(mm,y);
will_sold = y;
mysql_close(&mysql);
//return 0;
}
void mysql_info_static()
{
MYSQL mysql;
MYSQL_RES *res;
MYSQL_ROW row;
char *query;
int flag, t;
int sum=0,i=0;
mysql_init(&mysql);
if(!mysql_real_connect(&mysql, "127.0.0.1", "root", "123456", "info_t", 0, NULL, 0))
{
printf("Failed to connect to Mysql!\n");
}else {
printf("Connected to Mysql successfully!\n");
}
query = "select * from info_t";
//查询,成功则返回0
flag = mysql_real_query(&mysql, query, (unsigned int)strlen(query));
if(flag) {
printf("Query failed!\n");
}else {
printf("[%s] made...\n", query);
}
//mysql_store_result讲所有的查询结果读取到client
res = mysql_store_result(&mysql);
int mm=0;
//mysql_fetch_row检索结果集的下一行
while(row = mysql_fetch_row(res))
{
//mysql_num_fields返回结果集中的字段数目
for(t=0; t<mysql_num_fields(res); t++)
{
ticketinfo[mm].mutex_num = 0;
switch(t) //将读取到的数据库信息存储到结构体成员中
{
case 0:strcpy(ticketinfo[mm].fnum,row[t]);break;
case 1:strcpy(ticketinfo[mm].num,row[t]);break;
case 2:strcpy(ticketinfo[mm].price,row[t]);break;
case 3:strcpy(ticketinfo[mm].start,row[t]);break;
case 4:strcpy(ticketinfo[mm].terminus,row[t]);break;
default:break;
}
printf("%s\t", row[t]);
}
printf("\n");
mm++; //编号++
}
mysql_close(&mysql);
//return 0;
}
/*字符交换函数*/
void ex(int x,char *y)
{
int i;
for(i=0;x/10!=0;i++)
{
y[i] = x/pow(2-i,10) - '0';
x = x % (int)pow(2-i,10);
}
}
int main( int ac, char **av )
{
//mysql_test();
//套接字定义
int sock;
int client_Sock;
int ret;
char inputBuf[200],ws[66];
char recvBuf[RCV_BUF_LEN];
struct sockaddr_in svrAddr;
int i,p=1,ff=0,kk=0;
int val;
// 创建监听套接字
if ( (sock = socket(AF_INET, SOCK_STREAM, 0)) < 0 ){
printf("socket error!\n");
return -1;
}
// 指定监听端口和地址
memset( &svrAddr, 0x00, sizeof(svrAddr) );
svrAddr.sin_family =AF_INET;
svrAddr.sin_addr.s_addr = htonl( INADDR_ANY );
svrAddr.sin_port = htons(8888);
setsockopt(sock,SOL_SOCKET,SO_REUSEADDR, (char *)&val, sizeof(val) );
// 绑定监听套接字和端口
if ( bind(sock, (struct sockaddr *)&svrAddr, sizeof(svrAddr)) != 0 ){
printf("bind error!\n");
return -1;
}
// 监听套接字
if ( listen( sock, 10 ) != 0 ){
printf("listen error!\n");
return -1;
}
while( 1 ) //循环等待连接请求
{
printf("等待客户端连接请求..\n");
if ( (client_Sock = accept( sock, NULL, 0 )) < 0 )
{
printf("accept error!\n");
return -1;
}
//mysql_test();
printf("客户端已连入..\n");
while( 1 )
{
memset( recvBuf, 0x00, RCV_BUF_LEN );
ret = recv( client_Sock, recvBuf, RCV_BUF_LEN, 0 );
recvBuf[strlen(recvBuf) - 1] = 0;
if ( ret > 0 )
{
printf("接收到: [%s]\n", recvBuf);
int flight_num = atoi(recvBuf);
printf("客户机想购买的飞机票航班是:%d\n",flight_num);
for( i = 0; i < strlen(recvBuf); i++ )
{
if(ff==1)
{
ws[kk]=recvBuf[i];kk++;
}
if ( recvBuf[i] > 96 && recvBuf[i] < 123 )
{
recvBuf[i] -= 32;
}
if(recvBuf[i]=='#') ff=1;
}
printf("客户机想购买%d航班%d张飞机票:\n",flight_num,atoi(ws));
int purchas_num = atoi(ws);
int mutex_num_trans = flight_num - 10010;
//printf("线程即将运行%d互斥锁,将出售%d张飞机票",mutex_num_trans,purchas_num);
mysql_info_static();
//mysql_test(mutex_num_trans);
ff=0;kk=0;flight_num=0;
if(atoi(ticketinfo[mutex_num_trans].num) - purchas_num >0)
{
mysql_change( atoi(ticketinfo[mutex_num_trans].num)-purchas_num, atoi(ticketinfo[mutex_num_trans].fnum) );
strcpy(recvBuf,"购票成功!,祝您旅途愉快!");
memset( ws, 0 , sizeof(ws) );
}
else strcpy(recvBuf,"票数不够,购票失败!,造成不便请谅解!");
memset( ws, 0 , sizeof(ws) );
ret = send( client_Sock, recvBuf, strlen(recvBuf), 0 );
if ( ret > 0 )
{
printf("处理并返回成功..\n");
}
else if ( ret < 0 )
{
printf("返回客户端错误..\n");
}
}
else if ( ret == 0 )
{
printf("客户端断开..\n");
break;
}
else
{
printf("rcv error!\n");
break;
}
}
}
return 0;
}
转载请注明出处!!!