用VC实现在线订货

发表于:2007-07-14来源:作者:点击数: 标签:
目前电子商务采用的处理模式大多是订货用户在网页上填写订单,发出订货请求,接着WEB 服务器 上运行CGI程序对用户填写的数据进行一定的处理后,发送到专用的电子商务服务器中,服务器则对发来的用户数据进行一系列校验,验证用户身份及证实所需的订货信息完
   目前电子商务采用的处理模式大多是订货用户在网页上填写订单,发出订货请求,接着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\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]; //这个数组用于从获取的字串中分离用户填写的数据  

   ::memset(Ware,0,5?256);  

   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 服务器上运行正常。

原文转自:http://www.ltesting.net