本示例展示了如何生成一个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 ;
}