#include <string>
#include <iostream>
#include <fstream>
#include "winsock2.h"
#include <time.h>
#pragma comment(lib, "ws2_32.lib")
using namespace std;
#define DEFAULT_PAGE_BUF_SIZE 1048576
void main(){
WSADATA wsaData;
int err;
err = WSAStartup(MAKEWORD(2,2), &wsaData);
if( err != 0 ) return;
char host[] = "hq.sinajs.cn";
/*
char *request[2] ={
"POST /list=sz000401 HTTP/1.0\r\nHost: hq.sinajs.cn\r\nConnection: keep-alive\r\n\r\n",
"POST /list=sz002233 HTTP/1.0\r\nHost: hq.sinajs.cn\r\nConnection: keep-alive\r\n\r\n"
};
*/
char *request[2] ={
"GeT /list=sz000401 HTTP/1.0\r\nHost: hq.sinajs.cn\r\nConnection: Close\r\n\r\n",
"GeT /list=sz002233 HTTP/1.0\r\nHost: hq.sinajs.cn\r\nConnection: Close\r\n\r\n"
};
struct hostent *hp;
hp = gethostbyname(host);
if(hp == NULL){
cout << "gethostbyname() error in GetIpByHost: " << host << endl;
return;
}
// 獲取域名對應的IP
struct in_addr inAddr;
LPSTR lpAddr;
lpAddr = hp->h_addr;
memmove(&inAddr,lpAddr,4);
int sock, ret = 0, optval = 1;
struct sockaddr_in sa;
sa.sin_family = AF_INET;
sa.sin_port = htons(80);
sa.sin_addr.s_addr = inet_addr(inet_ntoa(inAddr));
sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
connect(sock, (SOCKADDR*)&sa, sizeof(sa));
if(sock == -1) return;
if(sock == -2) return;
// send the "GET" data
//ret = send(sock, request, strlen(request), 0);
int m_nContentLength;
char *pageBuf;
// int bytesRead;
m_nContentLength = DEFAULT_PAGE_BUF_SIZE;
pageBuf = (char *)malloc(m_nContentLength);
ret = send(sock, request[0], strlen(request[0]), 0);
// 網頁內容長度。可以從http頭部資料中獲取 "Content-Length:"
memset(pageBuf, 0, m_nContentLength);
while(ret > 0) {
ret = recv(sock, pageBuf, m_nContentLength, 0);
if(ret > 0) pageBuf[ret] = '\0';
}
cout<<pageBuf<<endl;//???????????????????????????????第一次有輸出
ret = send(sock, request[1], strlen(request[1]), 0);
// 網頁內容長度。可以從http頭部資料中獲取 "Content-Length:"
memset(pageBuf, 0, m_nContentLength);
while(ret > 0) {
ret = recv(sock, pageBuf, m_nContentLength, 0);
if(ret > 0) pageBuf[ret] = '\0';
}
cout<<pageBuf<<endl;//???????????????????????????????第二次沒有輸出 為什么?
free(pageBuf);
closesocket(sock);
WSACleanup();
return;
}
uj5u.com熱心網友回復:
接識訓傳資料的處理不對while回圈里接受,假設最后回傳一個eof字符或回車字符,ret是1,那pageBuf就是只包含eof或回車符的字串(pageBuf[1]=‘\0’),那可不是沒有輸出內容?
為啥要用while來接收資料,就是因為不能保證一次接受完才不斷接收,直到ret為負數,那最后一次接收到的資料是什么你沒法保證,所以你要把每次接收到的資料保存到另一個全體(接收完所有資料)的字符陣列里,而不是這樣值保存最后一次接收的資料。
uj5u.com熱心網友回復:
還是沒搞懂應該怎么修改,能給點提示嗎?
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/110143.html
標籤:C++ 語言
上一篇:驗證哥德巴赫猜想c語言函式
下一篇:c語言:尾牙將近問題
