QT与LINUXC后台网络通信实现飞机票网络购票

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界面

**

  1. 登录、注册界面
    登录界面截图
    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();
}

  1. 服务器端界面
    服务器端界面
    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);
}

  1. 客户端界面

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;
}

转载请注明出处!!!

评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值