CAsyncSocket的receivefrom()问题。

ling300 2001-08-23 10:27:04
在一个线程中用ReceiveFrom()函数接收udp数据,但是函数返回结果为-1;用n =WsaGetLastError()来查看错误代码时,却发现是n=WSAEWOULDBLOCK,怎么解释?
另外,我增加了等待时间后,仍然不能得到我想要的结果。具体程序代码见下:

UINT fro(LPVOID pParam)
{
........
CUdpCSocket * tem=new CUdpCSocket;
tem->Attatch((SOCKET)pParam);
.........
int rec=tem->ReceiveFrom((void *)t,sizeof(tPacket),s,port,0);
if(rec ==SOCKET_ERROR || rec == 0)
{
Sleep(2);
}
...........
}
另外,调用线程的函数如下:
AfxBeginThread((AFX_THREADPROC)fro,(void *)m_pUdpSocket->Detach(),
THREAD_PRIORITY_HIGHST,NULL,NULL,NULL);

其中,CUdpCSocket * m_pUdpSocket;

class CUdpCSocket:public CAsyncSocket
{
..........
}

各位帮我想象是哪儿出了问题?谢谢先!!
...全文
351 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
azuo_lee 2001-08-24
  • 打赏
  • 举报
回复
发送成功,只是说明数据已送入Socket底层驱动程序的发送缓冲区,并不意味着数据已经到达接收端。
接收端应该在OnReceive中调用ReceiveFrom。
更好的做法是发送端也不要直接SendTo,而是在OnSend中调用SendTo。否则Send也有可能发生WOULDBLOCK错误。
gzlucky 2001-08-24
  • 打赏
  • 举报
回复
发送只是把数据放进发送缓冲区,并不是真正把数据发送出去。
况且你怎么知道数据就一定收发会同步呢?
ling300 2001-08-24
  • 打赏
  • 举报
回复
可是我的服务器端一直都在发数据啊,代码如下:
UINT SendThread(LPVOID pParam)
{
..........
CUTSocket * pUSocket=new CUTSocket;
int n=pUSocket->Create(::htons(UDPPORT),SOCK_DGRAM,FD_WRITE | FD_CLOSE,NULL);
if(n==SOCKET_ERROR || n==0)
{
n=::WSAGetLastError();
::AfxMessageBox("sendthread-create error");
}
.......
while(1)
{
int iSendTime=0;
int nByte=0;
nByte=pUSocket->SendTo(temp,sizeof(FRAMEPACKETDATA),&SockAddr,sizeof
(SOCKADDR),0);
while(nByte==0 || nByte==SOCKET_ERROR)
{
int nErrorCode=::GetLastError();
if(nErrorCode==WSAEWOULDBLOCK)
{
::Sleep(1);
}
else
{
iSendTime++;
if(iSendTime>3)
{
break;
}
nByte=pUSocket->SendTo(temp,sizeof(FRAMEPACKETDATA),&SockAddr,sizeof
(SOCKADDR),0);
}

}
}
在while(1)循环中,每执行一次,nByte都可以得到发送的字节数,且这个字节数和sizeof(FRAMEPACKETDATA)的大小是一样的,说明发送是成功的。如果照你们所说客户端没有错的话,为什么有没有接受到数据呢。是不是应该在OnReceive(int nErrorCode)中加入以下的处理呢:
ReceiveFrome(........),这样就可以吗?
ling300 2001-08-24
  • 打赏
  • 举报
回复
-1如何解释.并且跟踪发现,发送数据的时候,似乎没有启动OnSend()函数.是不是消息传送机制的问题?
gzlucky 2001-08-23
  • 打赏
  • 举报
回复
这很正常,因为你的Socket是使用非阻塞的,所以如果没有数据可接收就会返回出错,不过GetLastError就会告诉你WSAEWOULDBLOCK。
如果你想你的程序在recv或recvfrom时阻塞,只要设置一下就可以了。

到MSDN查一查SetSockOpt() 你就清楚了。
azuo_lee 2001-08-23
  • 打赏
  • 举报
回复
根本就没有错。CAsyncSocket返回WSAEWOULDBLOCK是正常的——说明一个操作不能立即完成。稍候在对应的事件响应函数中再处理。
或者,使用CSocket不会发生这种问题。

16,472

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧