读书人

向网站发送 HTTP 请求,select回到1r

发布时间: 2013-08-09 15:16:24 作者: rapoo

向网站发送 HTTP 请求,select返回1,recv没有数据可接收。请强人解决
#include "stdafx.h"
struct timeval tv;

int _tmain(int argc, _TCHAR* argv[])
{

/////////////////////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////////////////////


WSADATA wsaData;//WSADATA结构体中主要包含了系统所支持的Winsock版本信息
SOCKET sockfd;//套接口的描述字
struct sockaddr_in server_addr;//通用地址结构
char hostname[]="www.baidu.com";
struct hostent *hostentIP = NULL;
if ( WSAStartup( MAKEWORD( 1,1 ), &wsaData ) != 0 ) //初始化Winsock 1.1
{
printf("初始化WSAStartup:出错\n");
WSACleanup( );
}
////////
///////套接字初始化必须成功地调用WSAStartup()
////////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////////
///////////
////////////DNS解析协议

if ( (hostentIP=gethostbyname(hostname)) == NULL)
{
printf("DNS解析地址:出错");
}

printf("连接该服务PI:%s\n",inet_ntoa(*((struct in_addr *)hostentIP->h_addr)));


/////////////////////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////////////////////

if((sockfd=socket(PF_INET,SOCK_STREAM,0))==-1)
{
printf("创建网络连接失败:出错\n");
WSACleanup( );
}
void ConnectWeb(void);////建立Web的连接
///////////////////////////////////////////////
/////////通用地址结构
{
memset(&server_addr,0, sizeof(server_addr));
server_addr.sin_family = AF_INET;
server_addr.sin_port = htons(80);
server_addr.sin_addr =*((struct in_addr *)hostentIP->h_addr);
printf("连接该服务端口号:%d\n",htons(server_addr.sin_port));

printf("连接该服务IP:%s\n",inet_ntoa(server_addr.sin_addr));
////////////////////////////////////////////////
if(connect(sockfd, (struct sockaddr *)(&server_addr), sizeof(struct sockaddr)) == NULL)
{

printf("连接到服务器成功\n");


}

}
//////////////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////////
///////////
///////////向网站发送 HTTP 请求
char htpp[128]="GET /index.php HTTP/1.1/r/nHost: www.baidu.com/r/nConnection: Close/r/n/r/n/";
char ttlk[4096];
fd_set set;
u_long iMode = 0;
int i,io=1;


ioctlsocket(sockfd,FIONBIO,&iMode);
i=send( sockfd, htpp, strlen(htpp), 0);
if(i != SOCKET_ERROR)
{
printf("发送成功%s\n发送了%d个字\n",htpp,i);
}
//memset(ttlk, 0, sizeof(ttlk));
//recv(sockfd,ttlk,sizeof(ttlk),0);
//printf("1111;%u", ttlk);
while(io){
FD_ZERO(&set);
FD_SET(sockfd,&set);
tv.tv_sec = 1;
tv.tv_usec = 1;


i=select(sockfd+1,&set,0,0, &tv);


printf("返回假(0)。;%d%\n",FD_ISSET(sockfd,&set));

if(i==0)
{
printf("连接超时\n");
}
if(i>0)
{
memset(ttlk, 0, sizeof(ttlk));
recv(sockfd,ttlk,4095,0);////////////////////////////////////这里没有数据可接收
/////////////////////////////////////////////////////////////////
io=0;
}
}

WSACleanup( );
return 0;
}
select
[解决办法]

引用:
while(io){
FD_ZERO(&set);
FD_SET(sockfd,&set);
tv.tv_sec = 1;
tv.tv_usec = 1;


i=select(sockfd+1,&set,0,0, &tv);


printf("返回假(0)。;%d%\n",FD_ISSET(sockfd,&set));

if(i==0)
{
printf("连接超时\n");


}
if(i>0)
{
memset(ttlk, 0, sizeof(ttlk));
recv(sockfd,ttlk,4095,0);////////////////////////////////////这里没有数据可接收
/////////////////////////////////////////////////////////////////
io=0;
}
}



重点就是这里了。编译后
向网站发送 HTTP 请求,select回到1,recv没有数据可接收。请强人解决




你确定的发出去的协议是和网站能接收的协议么?
如果不能它们的协议的话,它不会理睬你的!

这个问题用抓包工具把,抓包看看最明显是什么问题啦!

读书人网 >C语言

热点推荐