用VC完成在線訂貨
發(fā)表時(shí)間:2024-02-21 來源:明輝站整理相關(guān)軟件相關(guān)文章人氣:
[摘要]目前電子商務(wù)采用的處理模式大多是訂貨用戶在網(wǎng)頁上填寫訂單,發(fā)出訂貨請求,接著WEB服務(wù)器上運(yùn)行CGI程序?qū)τ脩籼顚懙臄?shù)據(jù)進(jìn)行一定的處理后,發(fā)送到專用的電子商務(wù)服務(wù)器中,服務(wù)器則對發(fā)來的用戶數(shù)據(jù)進(jìn)行一系列校驗(yàn),驗(yàn)證用戶身份及證實(shí)所需的訂貨信息完整后,將訂單寫入數(shù)據(jù)庫中,并向WEB服務(wù)器中的CGI程序...
目前電子商務(wù)采用的處理模式大多是訂貨用戶在網(wǎng)頁上填寫訂單,發(fā)出訂貨請求,接著WEB服務(wù)器上運(yùn)行CGI程序?qū)τ脩籼顚懙臄?shù)據(jù)進(jìn)行一定的處理后,發(fā)送到專用的電子商務(wù)服務(wù)器中,服務(wù)器則對發(fā)來的用戶數(shù)據(jù)進(jìn)行一系列校驗(yàn),驗(yàn)證用戶身份及證實(shí)所需的訂貨信息完整后,將訂單寫入數(shù)據(jù)庫中,并向WEB服務(wù)器中的CGI程序發(fā)回一個(gè)交易成功的信息,證實(shí)交易完成。
我們利用VC++的AppWizard創(chuàng)建一個(gè)支持MFC類的控制臺模式程序(An application that support MFC),命名為“Eshopping”,修改主程序文件EShopping.cpp如下:
#include "stdafx.h"
#include "EShopping.h"
#include "afxsock.h"
typedef struct OrderSet //用戶自己定義的一個(gè)訂貨單結(jié)構(gòu)
{
char UserName[24];
char Password[12];
char Goods[24];
int Count;
char Addr[256];
}ORDER;
……//省略部分機(jī)器生成代碼
int _tmain(int argc, TCHAR* argv[], TCHAR* envp[])
{ if (!AfxWinInit(::GetModuleHandle(NULL), NULL, ::GetCommandLine(), 0))
{……//省略部分機(jī)器生成代碼
}else //程序處理的主體
{cout〈〈"Content-type:Text/HTML\n\n";
//輸出回顯給用戶的HTML的頭
cout〈〈"〈HTML〉〈HEAD〉〈TITLE〉〈/TITLE〉〈/HEAD〉〈BODY〉\n";
char *StreamSize=getenv("CONTENT_LENGTH"); //開始取得用戶填寫的信息
long dataSize=atol(StreamSize);
char* buffer[dataSize]=new char[dataSize];
::memset(buffer,0,dataSize);
cin〉〉buffer; //取得用戶填寫的信息
char Ware[5][256]; //這個(gè)數(shù)組用于從獲取的字串中分離用戶填寫的數(shù)據(jù)
::memset(Ware,0,5256);
char* p=buffer;
int Row=0,Col=0;
while(Row〈5)//開始處理獲取的字串
{if(*p= ='='){//若在字串中遇到“=”號,意味著用戶填寫的一個(gè)項(xiàng)的開始
Col=0;
p++;
while(*p!='&&') { //若在字串中遇到“&&”號,意味著用戶填寫的一個(gè)項(xiàng)的結(jié)束
if(*p= ='+') *p=' '; //字串中的“+”號要轉(zhuǎn)成空格
Ware[Row][Col++]=*p;
p++; }
Row++; }
p++;
}
ORDER Order;//處理完字串后,把用戶填寫的數(shù)據(jù)填寫到一個(gè)ORDER結(jié)構(gòu)中
memcpy(Order.UserName,Ware[0],24);
memcpy(Order.Password,Ware[1],12);
memcpy(Order.Goods,Ware[2],24);
int Counts=atoi(Ware[3]);
Order.Count=Counts;
memcpy(Order.Addr,Ware[4],256);
WORD wVersionRequested; //開始連接到服務(wù)器上
WSADATA wsaData;
hostent FAR *hp;
wVersionRequested = MAKEWORD( 2, 0 );
WSAStartup( wVersionRequested, &&wsaData );
SOCKET sockClient= INVALID_SOCKET;
sockaddr_in addr; //填寫一個(gè)sockaddr_in結(jié)構(gòu)
hp = gethostbyname("Alex"); //假設(shè)服務(wù)器名為“Alex”
memcpy(&&(addr.sin_addr),hp-〉h_addr,hp-〉h_length);
addr.sin_family = AF_INET;
addr.sin_port =htons(1025); //假設(shè)服務(wù)器偵聽端口為1025
sockClient= socket(AF_INET, SOCK_STREAM, 0);
connect(sockClient, (sockaddr *)&&addr, sizeof(addr));
//連接到服務(wù)器
send(sockClient,(char*)&&Order,sizeof(ORDER),0);
//發(fā)送用戶填寫的信息
while(TRUE)
//等待服務(wù)器發(fā)來確認(rèn)信息,完成交易
{if(int length=recv(sockClient,buffer,dataSize)〉0)
{……//省略校驗(yàn)回送信息的代碼
cout〈〈"cout〈〈"We have got your order!";
break;
}
}
closesocket(sockClient); //關(guān)閉socket
WSACleanup( );
cout〈〈"〈/BODY〉〈/HTML〉";
return 0;
}
return nRetCode;
}
上述程序只是一個(gè)獲取英文電子訂單并向服務(wù)器發(fā)送訂單數(shù)據(jù)的CGI程序,假設(shè)服務(wù)器程序已經(jīng)運(yùn)行于服務(wù)器上,并在1025端口上進(jìn)行偵聽,驗(yàn)證后發(fā)送交易成功與否的信息。
以上程序在Windows 98、VC++ 6.0環(huán)境下調(diào)試通過,在OmniHTTPd 2.0 Alpha 8 服務(wù)器上運(yùn)行正常。