为什么不触发CSOCKET:ONRECEIVE事件 我现在做一个通讯程序,有一个CLIENT 有一个SERVER;CLIENT连接SERVER,如果CLIENT发送的包很快的话,会出现发送阻塞现象(错误码为10035)这时发现SERVER的ONRECEIVE事件不触发了,但我查询缓冲中还有8192个字节。试了很多次,CLIENT与SERVER的发送包与接受包对不上,不知怎么处理!请各位指教! 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 你在Create时,没有加入相应的事件,当然不会触发.MSN:[email protected]MailTo:[email protected] 用CSocketFile和CArchive对象怎么样?另外在Server类中放个hWnd,在OnReceive触发的时候PostMessage(hWnd,WM_GGGG,0) ;然后,扑获这个消息:#define WM_GGGG WM_USER+100CXXXXXView::CView{ /.... protected: //slkdfjslkdj afx_msg void xxxx(xxx,xxx,xxx) ; ... afx_msg void ReceivedMsg(UINT msg,LParam,WPARAM) ; //sdklfjsldkf};void CXXXX::ReceivedMsg(UINT msg,....){ m_Msg.Serialize(*pClient->m_in) ; // 这样就可以了。}应该效果会好些。 你说:但我查询缓冲中还有8192个字节。试了很多次,是指server端的接收缓冲区吗? 1、也许是client端的send有问题,导致了server接收处理数据出现问题。void ...Socket::OnSend(int nErrorCode) { if(m_bNeedSend){ //m_SendArray 是要发的数据;m_cbSendOut是已发的字节数 int nBytes=CAsyncSocket::Send(m_SendArray+m_cbSendOut,SEND_BYTES-m_cbSendOut); if(nBytes==SOCKET_ERROR ) { if(GetLastError()!=WSAEWOULDBLOCK){ //HandleClose(); m_bNeedSend=false; } else AsyncSelect( FD_WRITE | FD_CLOSE ); }else{ m_cbSendOut+=nBytes; if(m_cbSendOut<SEND_BYTES){ AsyncSelect( FD_WRITE | FD_CLOSE ); }else{ m_bNeedSend=false; AsyncSelect( FD_READ | FD_WRITE | FD_CLOSE ); } } } CAsyncSocket::OnSend(nErrorCode);}2、你自己在OnRecv中在Receieve(pBuf,BYTELEN);之后添加一行AsyncSelect( FD_READ | FD_WRITE | FD_CLOSE );主要是FD_READ,这样如果你的接收缓冲区有数据,就应该再次调用OnRecv,而在OnRecv中,你判断接收缓冲区中有多少数据,用相应的长度调用Receieve(pBuf,BYTELEN); cout 和 控制台的关联 有个问题百思不得其解,特来此处请教高人 在ActiveX控件中怎么获取 装载他的窗口的句柄呢? report 风格的 ListCtrl 如何在一个条目里显示多行? 极度郁闷:装了vc助手之后,vc的自动提示功能没有了 篮球联赛个人技术数据处理系统(求助) 关于调试与测试,大家都说一说 用VC编写一个单机数据库程序之后,程序发布将包含哪些文件 在杭州的上个星期天的《都市快报》上看到报道说WinXP是用Basic写的!!!!!!!! 急!急!急!通信控件的大难题!!!请高手指点迷津! 高人给我号一号! 有谁知道::前没有指定作用域 是什么用法?
MSN:[email protected]
MailTo:[email protected]
另外在Server类中放个hWnd,
在OnReceive触发的时候PostMessage(hWnd,WM_GGGG,0) ;
然后,扑获这个消息:
#define WM_GGGG WM_USER+100
CXXXXXView::CView
{
/....
protected:
//slkdfjslkdj
afx_msg void xxxx(xxx,xxx,xxx) ;
...
afx_msg void ReceivedMsg(UINT msg,LParam,WPARAM) ;
//sdklfjsldkf
};
void CXXXX::ReceivedMsg(UINT msg,....)
{
m_Msg.Serialize(*pClient->m_in) ; // 这样就可以了。
}
应该效果会好些。
{
if(m_bNeedSend){
//m_SendArray 是要发的数据;m_cbSendOut是已发的字节数
int nBytes=CAsyncSocket::Send(m_SendArray+m_cbSendOut,SEND_BYTES-m_cbSendOut);
if(nBytes==SOCKET_ERROR )
{
if(GetLastError()!=WSAEWOULDBLOCK){
//HandleClose();
m_bNeedSend=false;
}
else
AsyncSelect( FD_WRITE | FD_CLOSE );
}else{
m_cbSendOut+=nBytes;
if(m_cbSendOut<SEND_BYTES){
AsyncSelect( FD_WRITE | FD_CLOSE );
}else{
m_bNeedSend=false;
AsyncSelect( FD_READ | FD_WRITE | FD_CLOSE );
}
}
} CAsyncSocket::OnSend(nErrorCode);
}
2、你自己在OnRecv中
在Receieve(pBuf,BYTELEN);之后
添加一行AsyncSelect( FD_READ | FD_WRITE | FD_CLOSE );
主要是FD_READ,这样如果你的接收缓冲区有数据,就应该再次调用OnRecv,
而在OnRecv中,你判断接收缓冲区中有多少数据,用相应的长度调用Receieve(pBuf,BYTELEN);