各位大侠,谁来救救我,为什么我传递的句柄在OnReceive数据只能接收到一次,给出我的全部家当了

zljsyd 2003-06-10 11:46:18
我刚学,具体如下,我想用二个线程负责接收与发送数据,在主线程中创建监听与连接对象,把句柄传递给子线程,是工作线程(不知可不可以)。第一次发送可以接收到,第二次必须再Detach和Attach一次又可收到上一次,是否我用的方法和地方不对,我刚学,另外是否CSocket传递的句柄只能在用户界面使用,另外为什么线程中循环过不取,第二次Receive就过不去,不要For就可以。各位大侠,帮帮我!
void CMyServerDlg::OnReceive()
{
m_hSocket=m_pConnectionSocket->Detach();
AfxBeginThread(OnReceiveData,LPVOID(m_hSocket));
m_pConnectionSocket->Attach(m_hSocket);

}

UINT OnReceiveData(LPVOID lparam)
{
SOCKET m_hRevSocket,m_hSocket;
m_hRevSocket=SOCKET (lparam);
CMyServerDlg *p_Dlg=(CMyServerDlg *)AfxGetApp()->GetMainWnd();
CString m_Rev;
CNewSocket m_RSocket;
m_RSocket.Create();
BOOL AttachSuccess=m_RSocket.Attach(m_hRevSocket);
char buff[1024]={0};
int ret=0;
if(AttachSuccess!=0)
{
for(;;)
{
ret=m_RSocket.Receive(buff,100);

if(ret==0)
break;
m_Rev+=buff;
ret=0;
}
m_hSocket=m_RSocket.Detach();
if(p_Dlg->m_radio ==1)
p_Dlg->GetDlgItem(IDC_EDIT_COMMAND)->SetWindowText(m_Rev);
if(p_Dlg->m_radio==2)
p_Dlg->GetDlgItem(IDC_EDIT_RECEIVE)->SetWindowText(m_Rev);
}
else
{
p_Dlg->GetDlgItem(IDC_EDIT_STATUS)->SetWindowText("网络连接错误!");
return -1;
}

m_RSocket.Close();
return 0;

}
...全文
104 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
zljsyd 2003-06-10
  • 打赏
  • 举报
回复
已经解决!
zljsyd 2003-06-10
  • 打赏
  • 举报
回复
我自己已经解决了,不过还是要谢谢大家!分我自己得了,哈哈!!
zljsyd 2003-06-10
  • 打赏
  • 举报
回复
为什么你们都叫我传对象,但很多人说不能传。而且我也试了一下,确实传进去就出错,就是没有窗口。还有别的方法吗,最好写详一点,我很笨!
曾经的猎狐 2003-06-10
  • 打赏
  • 举报
回复
你在传参数之前CSocket *sock=new CSocket;
然后把这个新sock传进取
AfxBeginThread(OnReceiveData,LPVOID(*sock));
livelivelive 2003-06-10
  • 打赏
  • 举报
回复
好像每次必须把接收到的数据读取完毕,下次才能在数据到来时得到通知。
zljsyd 2003-06-10
  • 打赏
  • 举报
回复
不说不能传对象指针的吗?
tserpent 2003-06-10
  • 打赏
  • 举报
回复
你不可以直接传一个CSocket的对象指针,然后直接用它receive()就可以了吗,何必那么麻烦的attach,detach?

18,357

社区成员

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

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