老大们救我,我没辄了!5天了没人理我,再来碰碰运气,好心的老大,侠义的老大....

xzlzrsl 2005-08-04 10:20:51
一个客户端程序。
问题是:单步调试状态下一切正常。在windows环境中似乎卡在WSAWaitForMultipleEvents函数,接收不到任何数据。sniffer的结果表明,卡在这里,也没有数据。但是在bcb的单步调试状态下,又一切正常,能收到想得到的数据。
老大们看看程序错在那里?我都郁闷了一个星期了。救救我,老大。

//建立socket,事件对象等等,是照抄《windows网络编程技术》第8章例子。然后进入循环
while(!end)
{
//Index = WSAWaitForMultipleEvents(EventTotal,Event,false,WSA_INFINITE,false);
if((Index = WSAWaitForMultipleEvents(EventTotal,Event,false,1000,false))==WSA_WAIT_TIMEOUT)continue;
//开始以为是数据发的太快,后来发现不是这里的毛病。但在单步调试状态,若走的太快(按住F8不动),也是在这里卡住不动,接收不到数据,但稍慢一点,就能收到数据


WSAEnumNetworkEvents(Socket[Index-WSA_WAIT_EVENT_0],Event[Index-WSA_WAIT_EVENT_0],&networkevents);
//-------for connect------------------------------------
if(networkevents.lNetworkEvents & FD_CONNECT)
{
if(networkevents.iErrorCode[FD_CONNECT_BIT] != 0)
{
...
break;
}
if(send(Socket[Index-WSA_WAIT_EVENT_0],cmdbuf,strlen(cmdbuf),0)!=SOCKET_ERROR)
{cmdbuf[0]=0;
}
}
//-------for read------------------------------------
if(networkevents.lNetworkEvents & FD_READ)
{
if(networkevents.iErrorCode[FD_READ_BIT] != 0)
{
......
break;
}
recv(Socket[Index-WSA_WAIT_EVENT_0],recvbuf,sizeof(cmdbuf),0);
......//处理数据
}
//------for write--------------------------------------------
if(networkevents.lNetworkEvents & FD_WRITE)
{
if(networkevents.iErrorCode[FD_WRITE_BIT] != 0)
{
......
break;
}
if(strlen(cmdbuf)!=0)
{
send(Socket[Index-WSA_WAIT_EVENT_0],cmdbuf,sizeof(cmdbuf),0);
}
}
//-----for close--------------------------------------
if(networkevents.lNetworkEvents & FD_CLOSE)
{
if(networkevents.iErrorCode[FD_CLOSE_BIT] != 0)
{
....
break;
}
....
}
//-------------------------------------------
}
WSACloseEvent(NewEvent);
closesocket(Socket[Index-WSA_WAIT_EVENT_0]);
EventTotal = 0;
WSACleanup();
...全文
377 14 打赏 收藏 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
xzlzrsl 2005-08-05
  • 打赏
  • 举报
回复
to: FengSC(小猪快跑) 这段代码是线程的一部分,全部代码太长。在这段代码之前调用过WSAEventSelect函数,包括FD_READ,FD_WRITE,FD_CONNECT和FD_CLOSE四个,莫名其妙的是:在第一个循环中,只执行了FD_CONNECT事件中的“合成命令”函数(这两天修改的),结果放到cmdbuf中,然后执行FD_WRITE事件,将cmdbuf中的命令发出去,都没有检测到错误。(听 zhaowenbo(zhaowenbo) 的话,在程序中设置了很多检查错误的输出语句)。然而,第二个循环应该是接受数据了吧,哈哈,气死我了,不但收到了正常数据(在单步调试状态,直接执行程序还是不性),还收到了FD_CLOSE中的出错消息,!!第一个循环程序就没经过FD_CLOSE事件啊!!不过,FD_CLOSE也没说假话,程序果然退出了。

下午在socket connect后,Sleep(10000),休息10秒(7秒也行,5秒的时候就有空包收到),再进入while大循环,又一切正常。所有数据正常,郁闷,也太没效率了,比我的手也只快了一点点,这叫“自动化”??只是它不怕累而已,可是我累。
我真是头大啊!!!
再次感谢各位老大,我已经江郎才尽了,没辙了。
mli0080 2005-08-05
  • 打赏
  • 举报
回复
建议你在接收信息时SLEEP下,有可能时间上的问题
FengSC 2005-08-05
  • 打赏
  • 举报
回复
这段代码不完整,在之前你调用过WSAEventSelect函数吗?
xzlzrsl 2005-08-05
  • 打赏
  • 举报
回复
原因估计找到,不知道对不对:服务器负荷较重,连接后需要一定时间准备。
用TTimer元件设10秒,能自动运行。但没有效率可言。
疑问:既然服务器收到命令,即使主服务进程调用一个子服务进程,参数应该是传递过去的,为什么只能收到空包?
连接后,服务器的“准备时间”在做什么?怎样检测到服务器已经准备好了?
titan_ysl 2005-08-04
  • 打赏
  • 举报
回复
recv(Socket[Index-WSA_WAIT_EVENT_0],recvbuf,sizeof(cmdbuf),0);
这里,可能只收了部分数据,设法实时在处理数据处显示recvbuf的内容看看。
xzlzrsl 2005-08-04
  • 打赏
  • 举报
回复
谢谢大家关心。
不过,还是多关心以下吧,我等了一上午了。
是否需要需要对socket的选项(状态?)进行一些调整?怎么调整?给个思路也可以啊。
拜托!!!!!
dxqxiaoqiang 2005-08-04
  • 打赏
  • 举报
回复
帮你UP一下吧。
xzlzrsl 2005-08-04
  • 打赏
  • 举报
回复
//-------for connect------------------------------------
if(networkevents.lNetworkEvents & FD_CONNECT)
{
if(send(Socket[Index-WSA_WAIT_EVENT_0],cmdbuf,strlen(cmdbuf),0)!=SOCKET_ERROR)
{cmdbuf[0]=0; }
}
这里是连接后发出的第一个命令,放在这里是不是不好?放在while循环之前,socket建立并连接后发出第一个命令是不是好一点?我这样做了,但是结果一样。

另外,我说的“卡住”,是说,我的命令发出后,没有返回的数据,有时候返回的是空包,但是没有返回程序需要的、逻辑上、设计上要返回的数据。
xzlzrsl 2005-08-04
  • 打赏
  • 举报
回复
而且,将一个计算机通过另一个计算机(双网卡,作为网关)连接到网络上,结果还是一样。网关计算机也收不到关键的数据,排除了数据返回太快而计算机来不及接受而丢失的疑问。在这之前,还曾经用示波器监视网络的电平,在接收线对上,只检测到C/S连接是的包信号,没有发现返回的信号。这个办法也是我没辙了才这样做的,很可能包数据短,没看到。但我实在没什么办法了,求老大们帮我想想办法,我的程序在那里出错了。
xzlzrsl 2005-08-04
  • 打赏
  • 举报
回复
主界面上有Memo,在监视状态,不过,总是在关键的时刻没反应,好郁闷。估计会不会是我不理解WSAWaitForMultipleEvents函数的机制,在什么地方出错了。
我已经实在找不到错误在那里了
XBox360 2005-08-04
  • 打赏
  • 举报
回复
只能帮楼主顶一下
老赵同志QQ 2005-08-04
  • 打赏
  • 举报
回复
建议楼主在界面上放一个MEMO;在断点处插入收到的信息或者是状态信息+时间;这样跟踪会方便些!我经常这样做!
suigui 2005-08-04
  • 打赏
  • 举报
回复
建议代码中用Outputdebugstring输出信息
用dbgwiew工具查看
我来看看CB 2005-08-04
  • 打赏
  • 举报
回复
不懂啊。。。。。。。。。。

1,317

社区成员

发帖
与我相关
我的任务
社区描述
C++ Builder 网络及通讯开发
社区管理员
  • 网络及通讯开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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