CSocket::OnReceive()为什么只响应了一次?

tangshiping 2005-05-31 09:52:26
UDP连接,服务器给客户端发数据。
服务器代码:
m_sockSend.Create(0,SOCK_DGRAM); //在窗体初始化中,m_sockSend定义在Public中
..
..
static iIndex=0;
char szSend[20];
sprintf(szSend,"%010d",iIndex++);
m_sockSend.SendTo(szSend,10,6802,"192.168.0.63");//在“发送”按扭事件中

客户端重载了一个class CClientSocket : public CSocket

CClientSocket::OnReceive重载,加入AfxMessageBox("Received");代码,如下:
void CClientSocket::OnReceive(int nErrorCode)
{
// TODO: Add your specialized code here and/or call the base class
AfxMessageBox("Received");
CSocket::OnReceive(nErrorCode);
}

窗体初始化中:PReceive.Create(6802,SOCK_DGRAM); //PReceive定义在Public,
CClientSocket PReceive;

为什么点“发送”按扭的时候只有第一次客户端弹出了AfxMessageBox("Received");再点就没有反应,把客户端关闭重新再开,点“发送”的话客户端又有一次响应。但是还是只有第一次有。初次做网络方面的,请大家多指教。
...全文
429 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
souhay 2005-06-15
  • 打赏
  • 举报
回复
可能是你当OnRecvice的时候没有读取。没有读取第二次不会触发
younggle 2005-05-31
  • 打赏
  • 举报
回复
先看看发送成功了没有?
还有你的UDP不太可靠,可以重发试试。
Caps77 2005-05-31
  • 打赏
  • 举报
回复
你先看看发送方返回的数据,先在发送方找原因
tangshiping 2005-05-31
  • 打赏
  • 举报
回复
: kingzai(stevenzhu
能成功的例子我有,但是我只是想知道为什么我这样写代码会产生这样的问题,所以麻烦你看一下,给点建议
tangshiping 2005-05-31
  • 打赏
  • 举报
回复
创建一个socket时,可以指定它是否阻塞。在缺省情况下,Berkerley的Socket函数和WinSock都创建“阻塞”的socket。阻塞socket通过使用select函数或者WSAAsynSelect函数在指定操作下变成非阻塞的。WSAAsyncSelect函数原型如下。

int WSAAsyncSelect(

SOCKET s,

HWND hWnd,

u_int wMsg,

long lEvent

);

其中,参数1指定了要操作的socket句柄;参数2指定了一个窗口句柄;参数3指定了一个消息,参数4指定了网络事件,可以是多个事件的组合,如:

FD_READ 准备读

FD_WRITE 准备写

FD_OOB 带外数据到达

FD_ACCEPT 收到连接

FD_CONNECT 完成连接

FD_CLOSE 关闭socket。

用OR操作组合这些事件值,如FD_READ|FD_WRITE

WSAAsyncSelect函数表示对socket s监测lEvent指定的网络事件,如果有事件发生,则给窗口hWnd发送消息wMsg。

假定应用程序的一个socket s指定了监测FD_READ事件,则在FD_READ事件上变成非阻塞的。当read函数被调用时,不管是否读到数据都马上返回,如果返回一个错误信息表示还在等待,则在等待的数据到达后,消息wMsg发送给窗口hWnd,应用程序处理该消息读取网络数据。

但是加了以后的结果是即使把服务器关了,对话框还是不停的出来......................
jerry 2005-05-31
  • 打赏
  • 举报
回复
是 FD_READ , 写错啦, 楼主 这个自己要检查一下就知道了
kingzai 2005-05-31
  • 打赏
  • 举报
回复
suggest you use CAsyncSocket to deal OnReceive func.see
http://www.vckbase.com/document/viewdoc/?id=440
tangshiping 2005-05-31
  • 打赏
  • 举报
回复
error C2065: 'RD_READ' : undeclared identifier
这个是个什么宏?
jerry 2005-05-31
  • 打赏
  • 举报
回复
每次响应 OnReceiver 之后 调用一下 AsyncSelect(RD_READ);

void CClientSocket::OnReceive(int nErrorCode)
{
// TODO: Add your specialized code here and/or call the base class
AfxMessageBox("Received");
AsyncSelect(RD_READ);
}


16,473

社区成员

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

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

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