网络编程 netbios 遇到的一个对你们来说很简单的问题···跪地请求帮助···50分跪地磕头请求您的帮助···

DeanDeanDean 2008-10-15 10:31:36
我用netbios进行的一个可以接收并发送文字信息的小聊天程序的时候遇到了一个问题:
当我在成功进行call和listen之后,然后两端便进行通信···
在进行聊天的时候一旦聊天信息由一端发送出去之后,另一端在接收的时候便进行报错!(编译链接都没有问题)目前我就发现接收信息的时候报错,,我就奇怪了,,到底怎么回事啊??我觉得是不是buff的问题啊···???
下面是程序的发送端的一些代码:
UpdateData(TRUE); //从edit控件上面获取要发送的消息
strcpy((char*)buff,m_edit); //m_edit是string型edit控件对象
server.SessionSend(&ServerNncb,SessionNum,(UCHAR *)buff,sizeof(buff),lenum.lana[0]);
下面是程序的接收端的一些代码:
pInfo->Client.SessionRecv(&ClientNcb,SessionNum,hEvent,(UCHAR *)buff,(lenum.lana[0])); //先接收歡迎詞,再接收消息
WaitForSingleObject(hEvent,0xffffffff);

if(ClientNcb.ncb_cmd_cplt==0) //等待来咯消息
{
pInfo->m_sShowText+="\r\n";
pInfo->m_sShowText=pInfo->m_sShowText+buff;

::SetDlgItemText(AfxGetMainWnd()->m_hWnd,IDC_EDIT_BOARD,pInfo->m_sShowText);

}
注:buff: char buff[512];
跪地求助啊!!!
...全文
80 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
DeanDeanDean 2008-10-17
  • 打赏
  • 举报
回复
我就在想是不是建立事件句柄的时候出咯问题···因为每次receive到一个信息的时候,有时候第一次能够能够激发waitsingleobject的事件句柄,但在第一次接收完后再来信息就报错,我调试后发现根本就不能激发waitsingleobject的事件句柄···有时候干脆第一次就不能接收··(我判断第一次接收到信息的依据是当建立会话链接后服务器会向客户端发送一个welcome的欢迎信息,有时候能收到这个欢迎信息,接下来再接受信息就报错,有时候干脆接收这第一条的时候就直接报错,我调试看到那是因为根本就没有进入激发waitsingleobject事件句柄···)下面是我的事件句柄的建立与接收的部分代码

hEvent=CreateEvent(NULL,FALSE,FALSE,NULL); //这个是建立一个等待接收线程的事件句柄
//这个是启动一个线程用于等待接收信息
hThread=CreateThread(NULL,
0,
(LPTHREAD_START_ROUTINE)ThreadFunc,
&Info,
0,
&ThreadID);
//下面是进入线程里面进行等待接收的部分代码:
h1Event=CreateEvent(NULL,FALSE,FALSE,NULL);
for (;;)
{
memset(buff,0,512);
pInfo->Client.SessionRecv(&ClientNcb,SessionNum,h1Event,(UCHAR *)buff,(lenum.lana[0])); //先接收歡迎詞,再接收消息
WaitForSingleObject(h1Event,0xffffffff);//我在调试的是发现运行时报错的原因好像就是由于根本没有激活这个等待single的事件句柄h1Event···有时能激活一次接受完欢迎信息就有不行了···根本到不了下面去
pInfo->m_pShowText+="\r\n";
pInfo->m_pShowText=pInfo->m_pShowText+buff;
::SetDlgItemText(AfxGetMainWnd()->m_hWnd,IDC_EDIT_BOARD,pInfo->m_pShowText);

麻烦大家帮帮忙啊···前几天没上网不好意思···还有想问一下是不是没启动一个WaitForSingleObject最好用不同的事件句柄啊?不然会与另外的事件句柄混淆?
wgm001 2008-10-16
  • 打赏
  • 举报
回复
帮顶.
VsirSoft 2008-10-16
  • 打赏
  • 举报
回复
断点调试....一步步执行
DeanDeanDean 2008-10-16
  • 打赏
  • 举报
回复
不是编译报错,是运行的时候报错,有时候是debug assertion failed···有时候能接收一次信息,再接收下一条信息是时又报错是··内存指令引用··内存不能为read报错~~~怎么回事啊?反正有时能接收一条信息,然后再次接收出错,有时接收第一条就出错···
唉···
DeanDeanDean 2008-10-16
  • 打赏
  • 举报
回复
我用断点调试咯一下,
if(ClientNcb.ncb_cmd_cplt==0) //等待来咯消息
{
pInfo->m_pShowText+="\r\n";
pInfo->m_pShowText= pInfo->m_pShowText+buff;

::SetDlgItemText(AfxGetMainWnd()->m_hWnd,IDC_EDIT_BOARD,pInfo->m_pShowText);
//随时跟踪滚动条的位置
continue;
}
在等待信息接收过来的时候,应该是ClientNcb.ncb_cmd_cplt==0时,才表示命令的最终返回码,成功为0,但是我有的时候可以成功接收(ClientNcb.ncb_cmd_cplt=0),但是有的时候就不行咯,或者是只能成功接收一次信息,然后再接收信息过来时候ClientNcb.ncb_cmd_cplt就不等于0咯,这是怎么回事啊??
cnzdgs 2008-10-15
  • 打赏
  • 举报
回复
执行到哪行代码出错?错误信息是什么?

18,357

社区成员

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

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