非阻塞套接口接收数据问题,相当奇怪,请高手解迷. 通过抓包工具可以看到数据包已发送到pc端,通过select调用也检测到有可读套接口,并用FD_ISSET判断出套接口确实有数据,然后调用recvfrom接收数据,确实接收到了32字节,但缓冲区里的内容确是全0.从抓包工具来看,头五个字节应该statu,请高手解答,谢谢! 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 如果是udp的话,就在bind成功后,readfrom 阻在哪里可以了。tcp的话,也没有理由是全0啊。把代码贴出来 www.wantsoft.com 隐形者源码交流 HRESULT WINAPI RecieveData( unsigned char FAR* buf,int len){ int rnflag=0; //函数返回标志 SOCKADDR recvAdd; int addLen=sizeof(SOCKADDR); char textBuff[64]={0,}; fd_set readfds; struct timeval timeout; timeout.tv_sec=2; timeout.tv_usec=0; FD_ZERO(&readfds); FD_SET(g_VDS,&readfds);// EnterCriticalSection(&m_cs); int iRet = select(g_VDS+1, &readfds, NULL, NULL, &timeout); if(iRet > 0) { #if !GOSCAM_MODIFY rnflag=recvfrom(g_VDS,(char *)buf,len,0,NULL,NULL); #else rnflag=recvfrom(g_VDS,(char *)buf,len,0,&recvAdd,&addLen); #endif /*if (rnflag <=0 ) { CloseNetLink(); CreateNetLink(m_serverAddr, m_bServerPort, m_bLocalPort, m_bType); } */ } /* else { //if (WSAGetLastError() == WSAENETDOWN) { CloseNetLink(); CreateNetLink(m_serverAddr, m_bServerPort, m_bLocalPort, m_bType); } } */// LeaveCriticalSection(&m_cs); return rnflag;} 在另一个函数内g_VDS = WSASocket(AF_INET,SOCK_STREAM,0,NULL,0,WSA_FLAG_OVERLAPPED);这种代码是没问题的 你的整个socket初始化代码贴出来看看 setsockopt(g_VDS,SOL_SOCKET,SO_RCVBUF,(const char *)&iMaxBufLength,sizeof(iMaxBufLength));就这些没有了,我这边是客户端,连接服务端,不是每次都收不到,有时候可以 检查一下这个宏GOSCAM_MODIFY是否定已定义!debug时加入输出语句。#if !GOSCAM_MODIFYrnflag=recvfrom(g_VDS,(char *)buf,len,0,NULL,NULL);#elsernflag=recvfrom(g_VDS,(char *)buf,len,0,&recvAdd,&addLen);#endif 单看函数RecieveData应该没问题,你单步调试一下,在recvfrom函数后,看看buf里的数据。 紧急求助:MFC Tab Control 中的Edit Control问题 大家都来说说自己花了多长时间熟练掌握VC的 最近下visual studio 2005,很多东西都和我以前用的VB和VC++很不一样,有谁能告诉我他们的本质区别? char* s 问题 深入浅出MFC 写好的isapi dll 放在哪里? ACCESS的性能如何 哪位能提供一个现成的Windows NT Service 的框架?测试急用, 关于vc编译环境的送分题 在vc中Tap键怎么表示?急用!!! 请帮我看一下吧,本来成功的,现在出原这样的问题 Visual Studio和Platform SDK的关系?
把代码贴出来
www.wantsoft.com 隐形者源码交流
{
int rnflag=0; //函数返回标志
SOCKADDR recvAdd;
int addLen=sizeof(SOCKADDR);
char textBuff[64]={0,}; fd_set readfds;
struct timeval timeout;
timeout.tv_sec=2;
timeout.tv_usec=0;
FD_ZERO(&readfds);
FD_SET(g_VDS,&readfds);// EnterCriticalSection(&m_cs);
int iRet = select(g_VDS+1, &readfds, NULL, NULL, &timeout);
if(iRet > 0)
{
#if !GOSCAM_MODIFY
rnflag=recvfrom(g_VDS,(char *)buf,len,0,NULL,NULL);
#else
rnflag=recvfrom(g_VDS,(char *)buf,len,0,&recvAdd,&addLen);
#endif
/*if (rnflag <=0 )
{
CloseNetLink(); CreateNetLink(m_serverAddr, m_bServerPort, m_bLocalPort, m_bType);
} */
}
/* else
{
//if (WSAGetLastError() == WSAENETDOWN)
{
CloseNetLink(); CreateNetLink(m_serverAddr, m_bServerPort, m_bLocalPort, m_bType);
}
} */// LeaveCriticalSection(&m_cs); return rnflag;
}
这种代码是没问题的
就这些没有了,我这边是客户端,连接服务端,不是每次都收不到,有时候可以
debug时加入输出语句。#if !GOSCAM_MODIFY
rnflag=recvfrom(g_VDS,(char *)buf,len,0,NULL,NULL);
#else
rnflag=recvfrom(g_VDS,(char *)buf,len,0,&recvAdd,&addLen);
#endif