首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

非阻塞套接字发送get报文的有关问题

2013-12-19 
非阻塞套接字发送get报文的问题请各位老师帮忙看一下问什么下面的程序无法工作,功能是和一http服务器建立

非阻塞套接字发送get报文的问题
请各位老师帮忙看一下问什么下面的程序无法工作,功能是和一http服务器建立连接,用的是非阻塞套接字,发送get报文,打印出回复的内容,谢谢。
#include "CInitSock.h"
#include <stdio.h>
#include <string.h>

CInitSock initSock;

int main()
{
u_long ul = 1;
SOCKET sockClient=socket(AF_INET,SOCK_STREAM,0);  //创建socket
ioctlsocket( sockClient,FIONBIO,(u_long*)&ul );//设置socket为非阻塞方式
fd_set fdSocket;
fd_set fdRead;
int nRet;
FD_ZERO( &fdSocket );
FD_SET( sockClient,&fdSocket );
fdRead = fdSocket;

char C_server_name[] = "hq.sinajs.cn";      //服务器域名
struct hostent *S_hptr;
S_hptr = gethostbyname( C_server_name );//把域名转化为ip

    SOCKADDR_IN addrSrv;  
char *str;
str = inet_ntoa(*(struct in_addr *)*S_hptr->h_addr_list);

    addrSrv.sin_addr.S_un.S_addr = inet_addr(str);
    addrSrv.sin_family=AF_INET;  
    addrSrv.sin_port=htons(80);  

while( connect(sockClient,(SOCKADDR*)&addrSrv,  //循环connect直至成功返回。
sizeof(SOCKADDR)) == WSAEWOULDBLOCK);
printf( "connecting success\n" );

int nRecv;
char cSendBuf[500];
strcpy( cSendBuf,
"GET /list=sh601006 HTTP/1.1\r\nHOST: hq.sinajs.cn\r\nConnection: Close\r\n\r\n\0" );
nRet = ::select( 0,NULL,&fdRead,NULL,NULL ); //检测套接字是否可写
printf("write enabled\n");
if( nRet>0 )
{
for( int i=0;i<(int)fdSocket.fd_count;i++ )
{
if( FD_ISSET(fdSocket.fd_array[i],&fdRead) )
{
if( fdSocket.fd_array[i] == sockClient )
{
nRecv = ::send( sockClient,
cSendBuf, 500, 0);
}
}
}
}
if( nRet == 0 || nRet == SOCKET_ERROR )
{
printf("write failed\n");
}
else
{
printf("write enabled\n");
}

char cRecvBuf[500];
nRet = ::select( 0,&fdRead,NULL,NULL,NULL );   //检测套接字是否可读
if( nRet>0 )
{
for( int i=0;i<(int)fdSocket.fd_count;i++ )
{
if( FD_ISSET(fdSocket.fd_array[i],&fdRead) )
{
if( fdSocket.fd_array[i] == sockClient )
{
nRecv = ::recv( sockClient,
cRecvBuf, 500, 0);
}
}
}
}
if( nRet == 0 || nRet == SOCKET_ERROR )
{
printf("read failed\n");
}
else
{
printf("read enabled\n");
}
if( nRecv > 0 )
{
printf( "%s\n",cRecvBuf );
}

::closesocket(sockClient);
return 0;
}



下面是CInitSock.h:

#include <winsock2.h>

#pragma comment( lib, "WS2_32" )

class CInitSock
{
public:
CInitSock( BYTE minorVer = 2, BYTE majorVer = 2 )
{
WSADATA wsaData;
WORD sockVersion = MAKEWORD( minorVer, majorVer );
if( ::WSAStartup( sockVersion, &wsaData ) != 0 )
{
exit(0);
}
}
~CInitSock()
{
::WSACleanup();
}
};
[解决办法]
把strcpy换成memcpy函数
另外select没有给超时时间的啊?
[解决办法]
先单步调试,缩小问题范围。

引用:
请各位老师帮忙看一下问什么下面的程序无法工作,功能是和一http服务器建立连接,用的是非阻塞套接字,发送get报文,打印出回复的内容,谢谢。
#include "CInitSock.h"
#include <stdio.h>
#include <string.h>

CInitSock initSock;

int main()
{
u_long ul = 1;
SOCKET sockClient=socket(AF_INET,SOCK_STREAM,0);  //创建socket
ioctlsocket( sockClient,FIONBIO,(u_long*)&ul );//设置socket为非阻塞方式
fd_set fdSocket;
fd_set fdRead;
int nRet;
FD_ZERO( &fdSocket );
FD_SET( sockClient,&fdSocket );
fdRead = fdSocket;

char C_server_name[] = "hq.sinajs.cn";      //服务器域名
struct hostent *S_hptr;
S_hptr = gethostbyname( C_server_name );//把域名转化为ip



    SOCKADDR_IN addrSrv;  
char *str;
str = inet_ntoa(*(struct in_addr *)*S_hptr->h_addr_list);

    addrSrv.sin_addr.S_un.S_addr = inet_addr(str);
    addrSrv.sin_family=AF_INET;  
    addrSrv.sin_port=htons(80);  

while( connect(sockClient,(SOCKADDR*)&addrSrv,  //循环connect直至成功返回。
sizeof(SOCKADDR)) == WSAEWOULDBLOCK);
printf( "connecting success\n" );

int nRecv;
char cSendBuf[500];
strcpy( cSendBuf,
"GET /list=sh601006 HTTP/1.1\r\nHOST: hq.sinajs.cn\r\nConnection: Close\r\n\r\n\0" );
nRet = ::select( 0,NULL,&fdRead,NULL,NULL ); //检测套接字是否可写
printf("write enabled\n");
if( nRet>0 )
{
for( int i=0;i<(int)fdSocket.fd_count;i++ )
{
if( FD_ISSET(fdSocket.fd_array[i],&fdRead) )
{
if( fdSocket.fd_array[i] == sockClient )
{
nRecv = ::send( sockClient,
cSendBuf, 500, 0);
}
}
}
}
if( nRet == 0 
[解决办法]
 nRet == SOCKET_ERROR )
{
printf("write failed\n");
}
else
{
printf("write enabled\n");
}

char cRecvBuf[500];
nRet = ::select( 0,&fdRead,NULL,NULL,NULL );   //检测套接字是否可读
if( nRet>0 )
{
for( int i=0;i<(int)fdSocket.fd_count;i++ )
{
if( FD_ISSET(fdSocket.fd_array[i],&fdRead) )
{
if( fdSocket.fd_array[i] == sockClient )
{
nRecv = ::recv( sockClient,
cRecvBuf, 500, 0);
}
}
}
}
if( nRet == 0 
[解决办法]
 nRet == SOCKET_ERROR )
{
printf("read failed\n");
}
else
{
printf("read enabled\n");
}
if( nRecv > 0 )
{
printf( "%s\n",cRecvBuf );
}

::closesocket(sockClient);
return 0;
}



下面是CInitSock.h:

#include <winsock2.h>

#pragma comment( lib, "WS2_32" )

class CInitSock
{
public:
CInitSock( BYTE minorVer = 2, BYTE majorVer = 2 )
{
WSADATA wsaData;
WORD sockVersion = MAKEWORD( minorVer, majorVer );
if( ::WSAStartup( sockVersion, &wsaData ) != 0 )
{
exit(0);
}
}
~CInitSock()
{
::WSACleanup();
}
};

热点排行