用VC实现在线订货
目前电子商务采用的处理模式大多是订货用户在网页上填写订单,发出订货请求,接着WEB服务器上运行CGI程序对用户填写的数据进行一定的处理后,发送到专用的电子商务服务器中,服务器则对发来的用户数据进行一系列校验,验证用户身份及证实所需的订货信息完整后,将订单写入数据库中,并向WEB服务器中的CGI程序发回一个交易成功的信息,证实交易完成。我们利用VC++的AppWizard创建一个支持MFC类的控制台模式程序(An application that support MFC),命名为“Eshopping”,修改主程序文件EShopping.cpp如下:
#include "stdafx.h" #include "EShopping.h" #include "afxsock.h" typedef struct OrderSet //用户自己定义的一个订货单结构 { char UserName[24]; char Password[12]; char Goods[24]; int Count; char Addr[256]; }ORDER; ……//省略部分机器生成代码 int _tmain(int argc, TCHAR* argv[], TCHAR* envp[]) { if (!AfxWinInit(::GetModuleHandle(NULL), NULL, ::GetCommandLine(), 0)) {……//省略部分机器生成代码 }else //程序处理的主体 {cout<<"Content-type:Text/HTML "; //输出回显给用户的HTML的头 cout<<"<HTML><HEAD><TITLE></TITLE></HEAD><BODY> "; 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]; //这个数组用于从获?淖执蟹掷胗没钚吹氖? ::memset(Ware,0,5256); char* p=buffer; int Row=0,Col=0; while(Row<5)//开始处理获取的字串 {if(*p= ==){//若在字串中遇到“=”号,意味着用户填写的一个项的开始 Col=0; p++; while(*p!=&&) { //若在字串中遇到“&&”号,意味着用户填写的一个项的结束 if(*p= =+) *p= ; //字串中的“+”号要转成空格 Ware[Row][Col++]=*p; p++; } Row++; } p++; } ORDER Order;//处理完字串后,把用户填写的数据填写到一个ORDER结构中 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; //开始连接到服务器上 WSADATA wsaData; hostent FAR *hp; wVersionRequested = MAKEWORD( 2, 0 ); WSAStartup( wVersionRequested, &&wsaData ); SOCKET sockClient= INVALID_SOCKET; sockaddr_in addr; //填写一个sockaddr_in结构 hp = gethostbyname("Alex"); //假设服务器名为“Alex” memcpy(&&(addr.sin_addr),hp->h_addr,hp->h_length); addr.sin_family = AF_INET; addr.sin_port =htons(1025); //假设服务器侦听端口为1025 sockClient= socket(AF_INET, SOCK_STREAM, 0); connect(sockClient, (sockaddr *)&&addr, sizeof(addr)); //连接到服务器 send(sockClient,(char*)&&Order,sizeof(ORDER),0); //发送用户填写的信息 while(TRUE) //等待服务器发来确认信息,完成交易 {if(int length=recv(sockClient,buffer,dataSize)>0) {……//省略校验回送信息的代码 cout<<"cout<<"We have got your order!"; break; } } closesocket(sockClient); //关闭socket WSACleanup( ); cout<<"</BODY></HTML>"; return 0; } return nRetCode; } |
上述程序只是一个获取英文电子订单并向服务器发送订单数据的CGI程序,假设服务器程序已经运行于服务器上,并在1025端口上进行侦听,验证后发送交易成功与否的信息。
以上程序在Windows 98、VC++ 6.0环境下调试通过,在OmniHTTPd 2.0 Alpha 8 服务器上运行正常。