看看以下这两个函数,那里出了问题?
char fname[255];void LogFile(char *p)
{ FILE *fp=fopen(fname,"a+");
fprintf(fp,"%s\n",p);
fclose(fp);
};BOOL HttpClient(void)
{
WSADATA ws;
SOCKET s;
struct sockaddr_in addr;
int iResult;
long lResult;
char strSubAddr[100], strBuffer[100];
lResult = WSAStartup(0x0101,&ws);
s = socket(AF_INET,SOCK_STREAM,0);
addr.sin_family = AF_INET;
addr.sin_port = htons(80);
addr.sin_addr.s_addr = inet_addr("168.160.224.185"); // 计算机世界日报
iResult=connect(s,(struct sockaddr *)&addr, sizeof(addr));
if(SOCKET_ERROR == iResult)
{
// 连接失败
WSACleanup();
return FALSE;
}
else {
// 连接成功
strcpy(strSubAddr, "GET /99/tips/ \r\n");
strcpy(fname, "index.htm");
iResult = send(s, strSubAddr,strlen(strSubAddr),0);
// 下载文件
do {
strset(strBuffer,' ');
iResult = recv(s,strBuffer,sizeof(strBuffer),0);
LogFile(strBuffer);
} while( iResult !=0 );
}
WSACleanup();
return TRUE;
}
char fname[255];void LogFile(char *p)
{ FILE *fp=fopen(fname,"a+");
fprintf(fp,"%s\n",p);
fclose(fp);
};BOOL HttpClient(void)
{
WSADATA ws;
SOCKET s;
struct sockaddr_in addr;
int iResult;
long lResult;
char strSubAddr[100], strBuffer[100];
lResult = WSAStartup(0x0101,&ws);
s = socket(AF_INET,SOCK_STREAM,0);
addr.sin_family = AF_INET;
addr.sin_port = htons(80);
addr.sin_addr.s_addr = inet_addr("168.160.224.185"); // 计算机世界日报
iResult=connect(s,(struct sockaddr *)&addr, sizeof(addr));
if(SOCKET_ERROR == iResult)
{
// 连接失败
WSACleanup();
return FALSE;
}
else {
// 连接成功
strcpy(strSubAddr, "GET /99/tips/ \r\n");
strcpy(fname, "index.htm");
iResult = send(s, strSubAddr,strlen(strSubAddr),0);
// 下载文件
do {
strset(strBuffer,' ');
iResult = recv(s,strBuffer,sizeof(strBuffer),0);
LogFile(strBuffer);
} while( iResult !=0 );
}
WSACleanup();
return TRUE;
}
解决方案 »
- 如何在mfc上写倾斜的字
- LVN_ENDLABELEDIT消息响应函数不执行
- 菜鸟题问ON_COMMAND(IDC_DRAW_CIRCLE, OnDrawCircle)是什么意思啊???/
- 急问,对话框菜单如何禁用和恢复?
- 怎样改变ListBox等控件的滚动条,比如作成扁平的
- 一个对话框放在靠近屏幕边缘的地方,怎么才能让它自动缩进,就想MSN消息那样
- pcxxx进来领分,呵呵
- 对话框中间可以嵌入CListView吗?
- activex控件有click事件如何获得被点击的控件id
- 这个宏是干什么地?高手来答!
- 为什么偏偏喜欢她?来者有分!
- 小生有一添加代码菜鸟问题想问,(以前我的问题都给分结贴了,信用极佳)
需要用到以下几个类:
CInternetSession;
CHttpConnectionp;
CHttpFile;
strcpy(fname, "index.htm");
iResult = send(s, strSubAddr,strlen(strSubAddr),0);
HTTP头缺少HTTP version,host信息(会在虚拟主机上失败)比较通用的请求以HTTP://www.sina.com.cn/index.html为例GET index.html HTTP/1.0
Host: www.sina.com.cn
无法下载非文本文件
能否具体一点?
之后就没有反映了
也就没有办法使用
GET index.htm HTTP/1.0
怎么回事啊?
我以前写过一个smtp和pop3的client类,也有遇到这种情况,读取的时候读半拉儿就没有了.后来用select,一直等到超时后无反应就当成是失败.这样比较保险一点.你可以试试.
但是读取像.exe .gif .jpg 等二进制文件时只取了其中一部分,是不是写入文件的方式有问题?
然后查找Content-length 头,检查数据长度(如果没有该头,直接读取数据直到对方关闭连接)。
然后应该使用2进制模式打开文件写入数据。写入数据时从第一个"\r\n\r\n"后开始写文件。
这个问题参考的重点恐怕不是 MSDN 吧?应该是 rfc2626 吧
1、HTTP的回复是有格式的,不是你发了一个GET收到的都是你想要的。
2、LogFile有问题,它只能正确的写入文本文件,因为你用fprintf(fp,"%s",p)
但想要分。。
1、如何接受和写入二进制文件;
2、如何判断接受的数据是不是二进制文件; 小弟不胜感谢!
以前发邮件给[email protected]获取rfc可以成功,现在不知为何就不行了,请问哪可得到rfc.
void LogFile(char *p,int count)//count--要写的字符数
{ FILE *fp=fopen(fname,"ab+");
fwrite(p,1,count,fp);
fclose(fp);
};
现在文件写入正常,但是由于设置得缓冲区是固定值,每次下载后写入文件的大小会比原文件大些,怎样将最后一次接受的数据中空白去掉?
iResult = recv(s,strBuffer,sizeof(strBuffer),0);
LogFile(strBuffer,iResult);