简单网络编程-TCP客户端示例

来源:互联网 发布:四驱车 知乎 编辑:程序博客网 时间:2024/06/05 03:02

http://blog.csdn.net/is2120/archive/2011/05/22/6438034.aspx

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

simple http client

 

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

原创粉丝点击