recv接收数据不完全? 本帖最后由 VisualEleven 于 2012-09-04 11:41:45 编辑 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 #include "stdafx.h"#include <stdio.h>#include <stdlib.h>#include <winsock2.h>#pragma comment(lib, "WS2_32.lib")//建立一个http tcp 连接的辅助函数int htconnect(char *domain, int port){ int white_sock; struct hostent *site; struct sockaddr_in me; //获得服务器的名称 site = gethostbyname(domain); if(NULL == site) { return (-2); } //建立套接字 white_sock = socket(AF_INET, SOCK_STREAM, 0); if(white_sock < 0) { return (-1); } //初始化为0 memset(&me, 0, sizeof(struct sockaddr_in)); memcpy(&me.sin_addr, site->h_addr_list[0], site->h_length); me.sin_family = AF_INET; me.sin_port = htons(port); //建立连接 return ( (connect(white_sock, (struct sockaddr*)&me, sizeof(struct sockaddr))<0)?1:white_sock ); }void main(int argc, char** argv){ WSAData wsaData; WSAStartup(MAKEWORD(2, 2), &wsaData); int black_sock; if(argc < 2) { printf("usage:\nwClient host\n"); return; } black_sock = htconnect(argv[1], 80); if (black_sock<0) { printf ( "Socket Connect Error!\n") ; return ; } char *msg = "GET / HTTP/1.1\r\n\r\n"; if( send(black_sock, msg, strlen(msg), 0)<0 ) { perror("error in send msg\n"); exit(1); } char buf[1024] = {0}; int i = 0; while((i=recv(black_sock,buf,sizeof(buf), 0))>0) { printf("\n[%s]\n",buf); memset(buf, 0, sizeof(buf)); } printf("\n------end---------\n"); closesocket(black_sock); WSACleanup();} 或者用wininet的CInternetSession::OpenURL(_T("http://www.baidu.com")) 我是LINUX C的~请问下有什么好的解决办法么?或者能告诉我这个原因什么?谢谢~ 1、http协议的数据接收应该分两步进行,先接收头(到一个空行结束),然后解析头 头中间通常有"Content-Length:"域,按其中指示的字节数接收其实体内容 如果没有"Content-Length:"域,建议接收按1-254字节循环recv,并且根据服务端的响应及网络情形,设置合理的套接字数据接收超时2、即使是html数据,也不要简单地认为其一定符合c字符串规则,所以对于接收的字节码,还是要进行一些处理,比如其中可能含有NULL('\0')字节,把它简单地处理为空格... 你的printf代码有问题,当接收的字节不等于2000的时候,尤其最后一次的时候,你会把上次接收的字节打出来,看起来不像是结尾 这里有 HTTP 客户端和服务器的代码,你可以参考.来自《WinSock网络编程经络》,源码下载地址:http://download.csdn.net/detail/geoff08zhang/4571358 问下下面的路该如何走 类继承的一些问题? 为什么CListCtrl的不能显示图标? 请教高手怎么给命令行程序添加个GUI界面 能不能让系统设置对某一个程序不起作用? 如何让我的程序具备类似硬件中断的功能? 关于CComboBoxEx的问题,谢谢! arx程序问题 急,请问同一份代码,2次完全编译后,EXE文件大小一样。但是二进制一定一样吗? ★★★ 建议!同意的举手!★★★ 关于有MSComm控件的DLL被调用的时候,提示控件没有注册的问题 如何打开任务栏右下角电源管理及喇叭的系统托盘图标(回帖请注意实时系统托盘图标)
#include <stdlib.h>
#include <winsock2.h>
#pragma comment(lib, "WS2_32.lib")//建立一个http tcp 连接的辅助函数
int htconnect(char *domain, int port)
{
int white_sock;
struct hostent *site;
struct sockaddr_in me;
//获得服务器的名称
site = gethostbyname(domain);
if(NULL == site)
{
return (-2);
}
//建立套接字
white_sock = socket(AF_INET, SOCK_STREAM, 0);
if(white_sock < 0)
{
return (-1);
}
//初始化为0
memset(&me, 0, sizeof(struct sockaddr_in));
memcpy(&me.sin_addr, site->h_addr_list[0], site->h_length);
me.sin_family = AF_INET;
me.sin_port = htons(port);
//建立连接
return ( (connect(white_sock, (struct sockaddr*)&me, sizeof(struct sockaddr))<0)?1:white_sock );
}void main(int argc, char** argv)
{
WSAData wsaData;
WSAStartup(MAKEWORD(2, 2), &wsaData);
int black_sock;
if(argc < 2)
{
printf("usage:\nwClient host\n");
return;
}
black_sock = htconnect(argv[1], 80);
if (black_sock<0)
{
printf ( "Socket Connect Error!\n") ;
return ;
}
char *msg = "GET / HTTP/1.1\r\n\r\n";
if( send(black_sock, msg, strlen(msg), 0)<0 )
{
perror("error in send msg\n");
exit(1);
} char buf[1024] = {0};
int i = 0;
while((i=recv(black_sock,buf,sizeof(buf), 0))>0)
{
printf("\n[%s]\n",buf);
memset(buf, 0, sizeof(buf));
}
printf("\n------end---------\n");
closesocket(black_sock);
WSACleanup();
}
头中间通常有"Content-Length:"域,按其中指示的字节数接收其实体内容
如果没有"Content-Length:"域,建议接收按1-254字节循环recv,并且根据服务端的响应及网络情形,设置合理的套接字数据接收超时2、即使是html数据,也不要简单地认为其一定符合c字符串规则,所以对于接收的字节码,还是要进行一些处理,比如其中可能含有NULL('\0')字节,把它简单地处理为空格...
来自《WinSock网络编程经络》,源码下载地址:http://download.csdn.net/detail/geoff08zhang/4571358