读书人

socket编程为何第二个recv出错?该怎

发布时间: 2012-02-07 17:45:36 作者: rapoo

socket编程,为何第二个recv出错?
#include <stdio.h>
#include <string>
#include <winsock.h>
#include <winsock2.h>
#include <iostream>
#define MAXLINE 10000
#define SA struct sockaddr
#define SOCKET int

using namespace std;
int main (int argc,char * argv[])
{

string s1,s2,s3,s4;
cin> > s1> > s2> > s3> > s4;
SOCKET sockfd;
char recvline[MAXLINE+1];
WSADATA wsaData;
if (WSAStartup(MAKEWORD(2,1),&wsaData)!=0)
{
perror( "initial error! ");
WSACleanup();
exit(1);
}

struct sockaddr_in server_addr;
struct hostent *hp;
hp=(struct hostent *)malloc(sizeof(struct hostent));
hp=gethostbyname( "www.baidu.com ");
server_addr.sin_family=AF_INET;
server_addr.sin_port=htons(80);
memcpy((char*)&server_addr.sin_addr,(char*)hp-> h_addr,hp-> h_length);


if ((sockfd=socket(AF_INET,SOCK_STREAM,0)) <0)/*判断socket是否出错*/
{
perror( "socket error ");
exit(1);
}



if(connect(sockfd,(SA*)&server_addr,sizeof(server_addr)) <0) //连接socket
{
perror( "connection error! ");
exit(1);
}

string strkey=(string) "GET /s?wd= "+s2+(string) "&cl=3 HTTP/1.1 <br /> "
"Accept: */* <br /> "
"Referer: http://www.baidu.com/ <br /> "


"Accept-Language: zh-cn <br /> "
"Accept-Encoding: gzip, deflate <br /> "
"User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 1.1.4322; .NET CLR 2.0.50727) <br /> "
"Host: www.baidu.com <br /> "
"Connection: Keep-Alive <br /> ";
const char* ptrkey =strkey.c_str();
char bufferkey[2048];
for (int i=0;bufferkey[i++]=*ptrkey++;);

if(send(sockfd,bufferkey,sizeof(bufferkey),0) <0) //发送关键字
{
perror( "send error! ");
exit(1);
}

if(recv(sockfd,recvline,MAXLINE,0) <0) //搜索结果返回
{
perror( "recv error! ");
exit(1);
}

string strclick= (string) "GET /w.gif?query= "+s2+(string) "&e=959f "/*&e=?不知道怎么处理*/+(string) "&title= "+s4+(string) "&url=http%3A//www.rfidinfo.com.cn/Portal/Simple/ "
"Contact_4209.html&spos=4&path=http://www.baidu.com/s?ie=gb2312&bs=rfid&sr=&z=&cl=3&f=8&wd=rfid+ "
"%D0%C5%B4%EF%BB%E3%B4%CF&ct=0&t=1177206870437 " /*url怎么处理?*/+
(string) "HTTP/1.1\nAccept: */*\nReferer: http://www.baidu.com/s?wd= "+s2+(string) "&cl=3\nAccept-Language: zh-cn\n "
"Accept-Encoding: gzip, deflate\n "
"User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 1.1.4322; .NET CLR 2.0.50727)\n "
"Host: s.baidu.com\n "
"Connection: Keep-Alive\n " ;
const char* ptrclick =strkey.c_str();
char bufferclick[2048];
for (int i=0;bufferclick[i++]=*ptrclick++;);

if(send(sockfd,bufferclick,sizeof(bufferclick),0) <0) //点击搜索结果
{
perror( "send error! ");
exit(1);


}

if(recv(sockfd,recvline,MAXLINE,0) <0) //返回点击内容
{
perror( "recv error! ");
exit(1);
}

closesocket(sockfd);
free(hp);
WSACleanup();
exit(0);
}


[解决办法]
发送的请求最后需要 "\r\n\r\n "
以下是我改过的程序可以收到回应

#include <cerrno>
#include <string>
#include <iostream>
#include <fstream>
#include <winsock.h>

using namespace std;

#define CRLF2 "\r\n\r\n "
#define CRLF "\r\n "
#define CR "\r "
#define LF "\n "

#define MAX_RECV_LEN40960
#define SA struct sockaddr
#define SOCKET int

int main (int argc,char * argv[])
{
SOCKETsockfd;
WSADATAwsaData;
structsockaddr_in server_addr;
structhostent *hp;

stringstrSend;
stringstrRecv;
charbufRecv[MAX_RECV_LEN + 1];

ofstream fout;
size_t posHtml;

int nSend, nRecv;

if (WSAStartup(MAKEWORD(2,1),&wsaData)!=0)
{
perror( "initial error! ");
WSACleanup();
exit(1);
}

hp=gethostbyname( "www.baidu.com ");
server_addr.sin_family=AF_INET;
server_addr.sin_port=htons(80);
memcpy((char*)&server_addr.sin_addr,(char*)hp-> h_addr,hp-> h_length);

if ( (sockfd = socket(AF_INET,SOCK_STREAM,0)) < 0 )
{
perror( "socket() ");
exit(1);
}

if( connect(sockfd,(SA*)&server_addr, sizeof(server_addr)) <0 )
{
perror( "connect() ");
exit(1);
}

string s;

strSend = "GET /s?wd= " "rfid " "&cl=3 HTTP/1.1 " CRLF CRLF;

if( (nSend = send(sockfd, strSend.c_str(), strSend.length() ,0)) <0 )
{
perror( "send() ");
exit(1);
}

Sleep(5000);
bufRecv[0] = '\0 ';
if ( (nRecv = recv(sockfd + 1, bufRecv, MAX_RECV_LEN, 0)) < 0 )
{
perror( "recv() ");
exit(1);
}

bufRecv[nRecv] = '\0 ';
strRecv = bufRecv;

if ( (strRecv.length() > 0)
&& ( (posHtml = strRecv.find(CRLF2)) != string::npos)
)
{
posHtml += 4;
fout.open( "html.log ", ios::out | ios::binary | ios::trunc);
fout < < strRecv;
fout.close();
system( "start html.log ");

fout.open( "html.html ", ios::out | ios::binary | ios::trunc);
fout < < strRecv.substr(posHtml);
fout.close();
system( "start html.html ");
}

closesocket(sockfd);
WSACleanup();

return 0;
}

读书人网 >C++

热点推荐