CAsyncSocket为何不触发OnReceive?

Atry 2006-08-07 10:19:18
这是一个UDP的客户端,代码如下,只有几行代码,问题在于OnReceive始终不被触发

当另外的代码调用CMySocket::Create();后,能够正常创建。然后向服务器发出请求,发出请求后,如果马上调用ReceiveFrom,代码中没有这样做,但是如果这样做的话,有可能能成功,也有可能不成功。而OnReceive中的代码始终不被运行。我不知道这是为什么


// MySocket.cpp : implementation file
//

#include "stdafx.h"

#include "MySocket.h"


// CMySocket

CMySocket::CMySocket()
:provider(NULL)
{
}

CMySocket::~CMySocket()
{
}


// CMySocket member functions

void CMySocket::Create()
{
CAsyncSocket::Create(0 , SOCK_DGRAM, FD_READ | FD_WRITE | FD_OOB | FD_ACCEPT | FD_CONNECT | FD_CLOSE);
ReqToken reqToken;
CAsyncSocket::SendTo(&reqToken, sizeof(reqToken),8000,_T("sz2.tencent.com"));

// 如果这里直接调用ReceiveFrom,则有可能能收到,也有可能收不到
}

void CMySocket::OnReceive(int nErrorCode)
{
//这里根本不会运行
char inBuf[1023];
int sockAddrLen = sizeof(SOCKADDR_IN);
SOCKADDR_IN sockAddr;
ReceiveFrom(inBuf, sizeof(inBuf), (SOCKADDR*)&sockAddr, &sockAddrLen);

CAsyncSocket::OnReceive(nErrorCode);
}


void CMySocket::OnConnect(int nErrorCode)
{
// TODO: Add your specialized code here and/or call the base class

CAsyncSocket::OnConnect(nErrorCode);
}

void CMySocket::OnSend(int nErrorCode)
{
// TODO: Add your specialized code here and/or call the base class

CAsyncSocket::OnSend(nErrorCode);
}

void CMySocket::OnClose(int nErrorCode)
{
// TODO: Add your specialized code here and/or call the base class

CAsyncSocket::OnClose(nErrorCode);
}

void CMySocket::OnAccept(int nErrorCode)
{
// TODO: Add your specialized code here and/or call the base class

CAsyncSocket::OnAccept(nErrorCode);
}
...全文
573 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
mefit 2006-08-07
  • 打赏
  • 举报
回复
接分
snowbirdfly 2006-08-07
  • 打赏
  • 举报
回复
是别的类使用它的时候有问题??
楼主什么意思??
那你怎么知道是其他类有问题??
snowbirdfly 2006-08-07
  • 打赏
  • 举报
回复
好的~~
接分来了~~~
Atry 2006-08-07
  • 打赏
  • 举报
回复
CMySocket这个类都没错,是别的类使用它的时候有问题,不好意思耽误大家时间,散分了,大家来接分,不能光让楼上的几位兄弟赚了
sea_zs 2006-08-07
  • 打赏
  • 举报
回复

新建一个类,让他继承CAsyncSocket,然后override OnReceive()

class CNewSocket : public CAsyncSocket
void CNewSocket::OnReceive(int nErrorCode)
{
// TODO: Add your specialized code here and/or call the base class

CAsyncSocket::OnReceive(nErrorCode);
}
mynamelj 2006-08-07
  • 打赏
  • 举报
回复
用socket api便于调试
DentistryDoctor 2006-08-07
  • 打赏
  • 举报
回复
无法保证!
最好用API。
Atry 2006-08-07
  • 打赏
  • 举报
回复
C++里如果基类的某个函数是虚函数,那么子类相同名字的函数也必然是虚函数,不管有没有用virtual关键字,当然,我是写了virtual的

至于丢包,这是有可能的,但是我100%收不到怎么办,而且如果直接Sleep之后收又能收到
softrain 2006-08-07
  • 打赏
  • 举报
回复
你的CMySocket的OnReceive是不是也是虚函数?
另外建议加定时器,检测到丢包就重发消息。你有时收到有时收不到就是因为丢包的原因。
Atry 2006-08-07
  • 打赏
  • 举报
回复
肯定是相应的,因为我如果把代码改成如下:
void CMySocket::Create()
{
CAsyncSocket::Create(0 , SOCK_DGRAM, FD_READ | FD_WRITE | FD_OOB | FD_ACCEPT | FD_CONNECT | FD_CLOSE);
ReqToken reqToken;
CAsyncSocket::SendTo(&reqToken, sizeof(reqToken),8000,_T("sz2.tencent.com"));
Sleep(1000);
char inBuf[1023];
int sockAddrLen = sizeof(SOCKADDR_IN);
SOCKADDR_IN sockAddr;
ReceiveFrom(inBuf, sizeof(inBuf), (SOCKADDR*)&sockAddr, &sockAddrLen);


}


这样便能收到
healer_kx 2006-08-07
  • 打赏
  • 举报
回复
就像那石子扔进了大海的波涛之中...
healer_kx 2006-08-07
  • 打赏
  • 举报
回复
说明人家就是不相应你呗...

18,356

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 网络编程
c++c语言开发语言 技术论坛(原bbs)
社区管理员
  • 网络编程
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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