关于通过socket获取http报文的问题.

move_forward 2006-12-16 07:09:36
代码过程如下:
(具体代码见下面)
1,创建socket
2,获取sina的ip
3,连接到sina的80端口
4,通过发送"GET .."获取某个页面.

可以成功得到某些网站页面的内容.但是有些就无法得到, 比如sina等.
在获取sina等网站某个页面的内容的时候, 会死在recv函数上面? (很久都没有回应)

注: 用ethereal抓包的结果显示通过send函数发出去的GET请求字符串显示为"tcp segment of a reassembled pdu", 而不是常规的http-->"GET /k/2006-4-5.html"

==========
代码:
void GetHTTP(LPCSTR lpServerName, LPCSTR lpFileName)
{
//
// Use inet_addr() to determine if we're dealing with a name
// or an address
//
IN_ADDR iaHost;
LPHOSTENT lpHostEntry;

iaHost.s_addr = inet_addr(lpServerName);
if (iaHost.s_addr == INADDR_NONE)
{
// Wasn't an IP address string, assume it is a name
lpHostEntry = gethostbyname(lpServerName);
}
else
{
// It was a valid IP address string
lpHostEntry = gethostbyaddr((const char *)&iaHost,
sizeof(struct in_addr), AF_INET);
}
if (lpHostEntry == NULL)
{
PRINTERROR("gethostbyname()");
return;
}


//
// Create a TCP/IP stream socket
//
SOCKET Socket;

Socket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
if (Socket == INVALID_SOCKET)
{
PRINTERROR("socket()");
return;
}


//
// Find the port number for the HTTP service on TCP
//
LPSERVENT lpServEnt;
SOCKADDR_IN saServer;

lpServEnt = getservbyname("http", "tcp");
if (lpServEnt == NULL)
saServer.sin_port = htons(80);
else
saServer.sin_port = lpServEnt->s_port;


//
// Fill in the rest of the server address structure
//
saServer.sin_family = AF_INET;
saServer.sin_addr = *((LPIN_ADDR)*lpHostEntry->h_addr_list);


//
// Connect the socket
//
int nRet;

nRet = connect(Socket, (LPSOCKADDR)&saServer, sizeof(SOCKADDR_IN));
if (nRet == SOCKET_ERROR)
{
PRINTERROR("connect()");
closesocket(Socket);
return;
}


//
// Format the HTTP request
//
char szBuffer[1024];

sprintf(szBuffer, "GET %s\n", lpFileName);
nRet = send(Socket, szBuffer, strlen(szBuffer), 0);
if (nRet == SOCKET_ERROR)
{
PRINTERROR("send()");
closesocket(Socket);
return;
}

//
// Receive the file contents and print to stdout
//
while(1)
{
// Wait to receive, nRet = NumberOfBytesReceived
nRet = recv(Socket, szBuffer, sizeof(szBuffer), 0);
if (nRet == SOCKET_ERROR)
{
PRINTERROR("recv()");
break;
}

fprintf(stderr,"\nrecv() returned %d bytes", nRet);

// Did the server close the connection?
if (nRet == 0)
break;
// Write to stdout
fwrite(szBuffer, nRet, 1, stdout);
}
closesocket(Socket);
}

...全文
665 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
move_forward 2007-01-02
  • 打赏
  • 举报
回复
ding
wind19 2006-12-28
  • 打赏
  • 举报
回复
路过,看看
move_forward 2006-12-28
  • 打赏
  • 举报
回复
我的确用的GET your_url HTTP/1.1\r\n\r\n
只是出现了这个:
HTTP/1.0 302 Redirect
Pragma: no-cache
Cache-Control: no-cache
Content-Length: 0
Connection: close
Location: https://192.168.254.32:4081/nohost
  • 打赏
  • 举报
回复
Hi guys,
try this method, use these command, "GET your_url HTTP/1.1\r\n\r\n", don't forget it need double "\r\n".
Good lucky
move_forward 2006-12-28
  • 打赏
  • 举报
回复
为什么浏览器发的get request不会重定向?!
tiananmen 2006-12-27
  • 打赏
  • 举报
回复
重定向,是不是代理给你发的消息啊?
move_forward 2006-12-26
  • 打赏
  • 举报
回复
谢谢.
我在内网发的, 现在无论那个站点都返回的是这个信息:
HTTP/1.0 302 Redirect
Pragma: no-cache
Cache-Control: no-cache
Content-Length: 0
Connection: close
Location: https://192.168.254.32:4081/nohost
====
不知是什么缘故?
happyzhu 2006-12-26
  • 打赏
  • 举报
回复
sprintf(szBuffer, "host:sina.com.cn", lpFileName);-》sprintf(szBuffer, "host:sina.com.cn\r\n", lpFileName);

最后还要补一个空行
sprintf(szBuffer, "\r\n", lpFileName);

这样web服务器才认为你的请求头结束了,才会返回你请求的东西!
happyzhu 2006-12-26
  • 打赏
  • 举报
回复 1
char szBuffer[1024];

sprintf(szBuffer, "GET %s\n", lpFileName);
nRet = send(Socket, szBuffer, strlen(szBuffer), 0);
if (nRet == SOCKET_ERROR)
{
PRINTERROR("send()");
closesocket(Socket);
return;
}

/////////////////////////////////////////////////
sprintf(szBuffer, "GET %s\n", lpFileName);这里好像似乎差一个结束行,而且你的请求头不完整,可能有的网站的web服务器对此有要求

sprintf(szBuffer, "GET %s http/1.1\r\n", lpFileName);
sprintf(szBuffer, "host:sina.com.cn", lpFileName);
...
move_forward 2006-12-23
  • 打赏
  • 举报
回复
ding

18,356

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 网络编程
c++c语言开发语言 技术论坛(原bbs)
社区管理员
  • 网络编程
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧