recvfrom vs2010 debug正常 realse错误10040

来源:互联网 发布:关于网络利弊的辩论赛 编辑:程序博客网 时间:2024/05/16 10:51

学习socket程序,udp多播发送和接收。其中一个接收recvfrom函数。在debug能正常运行,在release无法运行

,总是提示10040错误,查询百度,说是接收缓存区不够。下面是程序代码:

void MultiSock::RecvPacket(void)
{
MessageBox(NULL,TEXT("開始接收多播組192.168.5.226上的數據"),TEXT("接收"),MB_OK);
char buf[1028];
char err[10];
int nAddrLen = sizeof(si);
while(TRUE)
{
int nRet = ::recvfrom(s,buf,strlen(buf),0,(sockaddr*)&si,&nAddrLen);
if (nRet != SOCKET_ERROR)
{
buf[nRet]='\0';
MessageBox(NULL,buf,TEXT("數據"),MB_OK);
}
else
{
int n=::WSAGetLastError();
itoa(n,err,10);
MessageBox(NULL,err,TEXT("數據"),MB_OK);
break;
}
}


}

思来想去,后面还用

       int nRecvBuf=32*1024;
setsockopt(s,SOL_SOCKET,SO_RCVBUF,(const char*)&nRecvBuf,sizeof(int));
int nSendBuf=32*1024;
setsockopt(s,SOL_SOCKET,SO_SNDBUF,(const char*)&nSendBuf,sizeof(int));

专门调大缓冲区,也无济于事。后面想想还是recvfrom错误。认真再看看代码,发现接收

缓存区大小recvfrom实际为strlen(buf)。于是用memset(buf,0,1028)初始化。还是不行。

后来干脆直接把strlen(buf)换为数字1028,结果OK。 看来在debug和release下,strlen(buf)

的结果是有区别的。

0 0
原创粉丝点击