免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1246 | 回复: 7
打印 上一主题 下一主题

我想要实现取文件 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2004-05-21 08:16 |只看该作者 |倒序浏览
我想要实现取文件,用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;
}

这样可以实现吗?

论坛徽章:
0
2 [报告]
发表于 2004-05-21 08:34 |只看该作者

我想要实现取文件

由于没有找到vc专区所以就发到这里了,希望高手们指点。

论坛徽章:
0
3 [报告]
发表于 2004-05-21 09:01 |只看该作者

我想要实现取文件

  1. fprintf(fp,"%s",szRev);

  2. -->;

  3. fwrite ( szRecv, 1, nrec, fp );
复制代码


这个网站是 UNIX 专区.

论坛徽章:
0
4 [报告]
发表于 2004-05-21 09:25 |只看该作者

我想要实现取文件

虽然是unix网站,但是不是也开设了编程专区吗?
还有我发的这个区不是c/c++区吗?
windflowers1976
你的意思是让我把
fprintf(fp,“%s,szRev”);
该写成
fwrite( szRecv,1,nrec,fp);
谢谢我在测试一下

论坛徽章:
0
5 [报告]
发表于 2004-05-21 15:18 |只看该作者

我想要实现取文件

我试过了
和这一句没有关系,因为,这个程序就停留在了recv(remote_server,szRev,sizeof(szRev),0);上,没有再向下走了。用Sinffer我可以看到有那边发来的数据,recv函数没有收到,???????????????

论坛徽章:
0
6 [报告]
发表于 2004-05-21 15:30 |只看该作者

我想要实现取文件

自己调试调试吧。vc的调试环境还是很友好D。

论坛徽章:
0
7 [报告]
发表于 2004-05-21 18:47 |只看该作者

我想要实现取文件

如果我能够调试好的话就不用到这里,请教各位了。
如果您知道的话就请提点一下。

论坛徽章:
0
8 [报告]
发表于 2004-05-21 19:12 |只看该作者

我想要实现取文件

停在RECV了,说明是阻塞在RECV了,设置成非阻塞SOCKET吧。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP