- 论坛徽章:
- 0
|
我想要实现取文件,用VC,下面是原程序,请各位大虾帮我分析一下。
#include "iostream.h"
#include "stdio.h"
#include <windows.h>;
WSADATA wsa;
struct sockaddr_in server;
SOCKET remote_server;
int nError;
struct hostent* phost;
char szQuery[]="GET /index.htm HTTP/1.1 \r\n";
char szRev[100];
char fname[]="index.htm";
void main()
{
//初始化套接字环境
if(nError=WSAStartup(MAKEWORD(2,0),&wsa))
{
cout<<"WSAStartup error..."<<nError<<endl;
return;
}
//创建本地套接字,用于与服务器进行数据传输
remote_server =socket(AF_INET,SOCK_STREAM,0);
if(remote_server==INVALID_SOCKET)
{
cout<<"socket error..."<<endl;
WSACleanup();
return;
}
//获取服务器地址
phost=gethostbyname("youthszq.zj.com" ;
if(NULL==phost)
{
cout<<"get host addr error..."<<endl;
WSACleanup();
return;
}
cout<<"host name got......"<<endl;
//请求服务器建立连接
server.sin_family =AF_INET;
server.sin_port =htons(80);
memcpy(&(server.sin_addr .S_un .S_addr ),phost->;h_addr,phost->;h_length );
//server.sin_addr .S_un .S_addr =inet_addr("218.81.145.216" ;
cout<<int(server.sin_addr .S_un .S_un_b.s_b1)
<<"."<<int(server.sin_addr .S_un .S_un_b.s_b2)
<<"."<<int(server.sin_addr .S_un .S_un_b.s_b3)
<<"."<<int(server.sin_addr .S_un .S_un_b.s_b4)<<endl;
if(connect(remote_server,(const struct sockaddr*)&server,sizeof(server)))
{
cout<<"connect error..."<<WSAGetLastError()<<endl;
WSACleanup();
return;
}
cout<<"connected..."<<endl;
//发送取文件请求
cout<<"-------------cmd-----------------"<<endl;
cout<<szQuery<<endl;
cout<<"---------------------------------"<<endl;
int nSend=send(remote_server,szQuery,sizeof(szQuery),0);
if(nSend!=sizeof(szQuery))
{
cout<<"send query error..."<<endl;
WSACleanup();
return;
}
//接收文件
int nrec;
FILE *fp=fopen(fname,"w" ;
do
{
strset(szRev,0);
nrec=recv(remote_server,szRev,sizeof(szRev),0);
if(nrec>;0)
{
fprintf(fp,"%s",szRev);
cout<<szRev<<endl;
}
else
cout<<"error..."<<WSAGetLastError()<<endl;
//LogFile(szRev);
}while(nrec>;0);
fclose(fp);
closesocket(remote_server);
WSACleanup();
cout<<"right..."<<endl;
}
这样可以实现吗? |
|