本示例展示了如何生成一个client socket,连接到一个 http server,并从 http server 上下载一个文件。

simple http client

 

一个简单的TCP CLIENT 程序流程:
    1. 初始化 winsock library
    2. 创建一个 IPPROTO_TCP_SOCKET 套接字。( 使用socket)
    3. 通过 gethostbyname() 和 gethostbyaddr() 获取主机信息
    4. 使用我们创建的socket 通过connect() 连接到服务器
    5. 通过send() 、recv() 收发数据直到tcp chat 结束
    6. 使用closesocket() 关闭连接。
    7. 释放资源:winsock library 。( 使用 WSACleanup())

#include  <cstdio> 
#include  <afx.h> 
#include  <winsock2.h> 

//z 2011-05-22 16:39:41@is2120 

#pragma comment(lib, "ws2_32" ) 
#pragma comment(lib, "MSVCRT" ) 

int   main()
 {
   WSADATA wsaData;
   char   strSrv[] = "www.vckbase.com" ;
   int   wsaret = WSAStartup(0x0101 ,&wsaData);
   struct   hostent* hp;
   unsigned   int   addr;
   struct   sockaddr_in server;
   char   buff[512 ] = {'/0' };
   int   y = 0 ;

   if   (wsaret)
   {
     return   -1 ;
   }

   SOCKET conn;
   conn = socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);

   if  (conn == INVALID_SOCKET)
   {
     return   -1 ;
   }

   if   (inet_addr(strSrv) == INADDR_NONE)
   {
     hp = gethostbyname(strSrv);
   }
   else  
   {
     addr = inet_addr(strSrv);
     hp=gethostbyaddr((char  *)&addr,sizeof  (addr),AF_INET);
   }

   if   (hp == NULL )
   {
     closesocket(conn);

     return   -1 ;
   }

   //z 初始化 server 地址。 
   server.sin_addr.s_addr=*((unsigned   long  *)hp->h_addr);
   server.sin_family=AF_INET;
   server.sin_port=htons(80 );

   if  (connect(conn,(struct   sockaddr*)&server,sizeof  (server)))
   {
     closesocket(conn);
     return   -1 ;  
   }

   sprintf(buff,"GET  %s /r/n/r/n " ,"/image/mlogo.gif" );
   send(conn,buff,strlen(buff),0 );

   CFile f;
   f.Open("c: // c.gif" ,CFile::modeCreate | CFile::modeWrite);
   while  (y=recv(conn,buff,512 ,0 ))
   {
     f.Write(buff,y);
   }

   f.Close();
   closesocket(conn);

   return   0 ;
 }