为什么我的onreceive有时能触发,有时又不行呢,请高手帮忙看看,

HZIEEDLX 2005-10-20 11:22:03
开始监听的函数:
m_pListeningSocket=new CListeningSocket(this);
if(!m_pListeningSocket->Create(8080,SOCK_STREAM,NULL))
{return;
}
m_pListeningSocket->Bind(8080,"127.0.0.1");

while(!m_pListeningSocket->Listen())
{
}
建立连接的函数:
void CListeningSocket::OnAccept(int nErrorCode)
{
if(nErrorCode==0){
HelpListen(this);
}
else{
}
CSocket::OnAccept(nErrorCode);
}

void CListeningSocket::HelpListen(CListeningSocket *pLSocket)
{

//创建新的套接字
m_pConnectSocket=new CConnectSocket();
int nLengthAddr=sizeof(SOCKADDR_IN);
//将监听套接字监听的客户转到新的套接字中
//并把客户地址信息保存到ClientSockAddr中
if (Accept(*m_pConnectSocket,(LPSOCKADDR)&ClientSockAddr,&nLengthAddr)==0)
AfxMessageBox( "新的套接字获取失败!");

//选择网络事件
m_pConnectSocket->AsyncSelect(FD_READ);

//HQ:向客户端发送信息,以完成握手
m_pConnectSocket->Send("Message From SDN Server",30);


//创建新线程指针,接收客户请求的套接字句柄转移到新线程中
m_pConnectThread=new CConnectThread(m_pConnectSocket->m_hSocket,m_pDFSView);
m_threadList.AddTail(m_pConnectThread);
m_addressList.AddTail(inet_ntoa(ClientSockAddr.sin_addr));
m_pConnectThread->ConnectSocket.bRunning=TRUE;
if (m_pConnectThread->CreateThread()==0)
AfxMessageBox("创建新的线程失败!");

m_pConnectSocket->Detach();
////AfxMessageBox("新的socket连接创建成功! ");
delete m_pConnectSocket;
//AfxMessageBox("成功创建新的接收线程,等待数据发送!");

//DLX:关于socket缓冲区的测试

while (1)
{
iRet = Receive(m_Buffer,2000) ;
if (iRet<=0) break ;
recv(s,m_Buffer,len,NULL);
}

}
数据接收的函数:
void CConnectSocket::OnReceive(int nErrorCode)
{ do
{


if(nErrorCode!=0)
return;


if (m_nRecByte=Receive(rx_buf,100))
{
//临界区对象锁定
cs.Lock();
if (rx_buf[m_nRecByte-1]!='/0')
rx_buf[m_nRecByte] = '/0';
//将接收数据加入日志文件
g_strFusionData=rx_buf;

//数据处理。。
cs.Unlock();
}
else
{
//HQ:接收错误
//HQ:写入日志文件
...
return;
}while(m_nRecByte>0);
}
问题是在上面,请高手指教是哪里出了问题啊,
...全文
139 6 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
DentistryDoctor 2006-01-08
  • 打赏
  • 举报
回复
//创建新线程指针,接收客户请求的套接字句柄转移到新线程中
m_pConnectThread=new CConnectThread(m_pConnectSocket->m_hSocket,m_pDFSView);
m_threadList.AddTail(m_pConnectThread);
m_addressList.AddTail(inet_ntoa(ClientSockAddr.sin_addr));
m_pConnectThread->ConnectSocket.bRunning=TRUE;
if (m_pConnectThread->CreateThread()==0)
AfxMessageBox("创建新的线程失败!");

m_pConnectSocket->Detach();
////AfxMessageBox("新的socket连接创建成功! ");
delete m_pConnectSocket;


???

你的线程有关的代码呢?
cqgaoke 2006-01-06
  • 打赏
  • 举报
回复
up
HZIEEDLX 2005-10-20
  • 打赏
  • 举报
回复
就是没发现是什么情况触发,就是在程序运行后,进行断开在连接的试验,数据在不停的发送过来,触发好像是随机的一样,没找到不同
HZIEEDLX 2005-10-20
  • 打赏
  • 举报
回复
1,本来onreceive里面没有用循环的,receive接收只接收一次,但当在连接后突然有大量数据发送过来的时候,就会出错,即只接收到两条数据,后面的就再也接收不到了,换成循环以后,因为没次连接只触发一次onreceive,所以后面的数据都是通过循环接收的,socket缓冲的原理我不太懂,以上是我从程序运行结果上分析的。
2,但有时时候,建立连接以后,在没有大量的数据发送的情况下,也无法触发onreceive函数,通过断开在连接,反复几次,又会触发起来,实在找不到原因。
oyljerry 2005-10-20
  • 打赏
  • 举报
回复
能的时候是什么情况,不能的时候又是什么情况?
HZIEEDLX 2005-10-20
  • 打赏
  • 举报
回复
怎么没人回阿?我的这个循环在这里会出问题么?

18,363

社区成员

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

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