完成端口的一个奇怪的问题,重金求答.... ( 积分: 300 )

  • 主题发起人 主题发起人 panxiaosen
  • 开始时间 开始时间
P

panxiaosen

Unregistered / Unconfirmed
GUEST, unregistred user!
我的客户端连接上服务器之后,先用普通的RECV和SEND进行了一些验证操作之后,我再把她捆绑到完成端口上的.代码如下,但是我只要把那句Sleep(2000); 去了,就会发生错误,加上去就是可以的,,,请问各位这是为什么呢??
CreateIoCompletionPort(LPGAME.GameSocket, FCompletPort, Cardinal(LPGAME), 0);
Sleep(2000); //不加上这个就不能正常工作......
New(pPerIoDat);
FillChar(pPerIoDat^.Overlapped, sizeof(OVERLAPPED), 0);
pPerIoDat^.wsaBuffer.len := MAX_BUFSIZE;
pPerIoDat^.wsaBuffer.buf := pPerIoDat^.Buffer;
Flags := 0;
if WSARecv(LPGAME.GameSocket, @(pPerIoDat^.wsabuffer), 1, BytesRecv, Flags, @(pPerIoDat^.Overlapped), nil) = socket_error then
if GetLastError <> error_io_pending then
goto err;
 
我的客户端连接上服务器之后,先用普通的RECV和SEND进行了一些验证操作之后,我再把她捆绑到完成端口上的.代码如下,但是我只要把那句Sleep(2000); 去了,就会发生错误,加上去就是可以的,,,请问各位这是为什么呢??
CreateIoCompletionPort(LPGAME.GameSocket, FCompletPort, Cardinal(LPGAME), 0);
Sleep(2000); //不加上这个就不能正常工作......
New(pPerIoDat);
FillChar(pPerIoDat^.Overlapped, sizeof(OVERLAPPED), 0);
pPerIoDat^.wsaBuffer.len := MAX_BUFSIZE;
pPerIoDat^.wsaBuffer.buf := pPerIoDat^.Buffer;
Flags := 0;
if WSARecv(LPGAME.GameSocket, @(pPerIoDat^.wsabuffer), 1, BytesRecv, Flags, @(pPerIoDat^.Overlapped), nil) = socket_error then
if GetLastError <> error_io_pending then
goto err;
 
需要点延时吧,这些情况都是很正常的,不过你sleep(2000)也太大了吧,大概测算一下我想要不了那么久的

我以前遇到过类似的情况,我和同事的笔记本上都是正常的,可是到了客户的机器上就不用了,后来我用showmessage调试的时候才发现某个地方需要延时的(而我自己的本子上去不需要,呵呵,奇怪吧:) )
 
呵呵 sleep(2000)是最小了,我换成sleep(1500) 都不行...郁闷,不过我参考别人的代码都没有这个延时的...不知道有什么办法可以去掉这个?? 因为用这个延时,不确定的因素太多了,我怀疑在有的电脑上延时2000毫秒都不够
 
没道理呀。。代码貌似没错,你单步调试过没?按的动作快点(快于1.5秒间隔就行),看看是哪行代码出错?

另外,你试试把代码的顺序改一下
New(pPerIoDat);
FillChar(pPerIoDat^.Overlapped, sizeof(OVERLAPPED), 0);
pPerIoDat^.wsaBuffer.len := MAX_BUFSIZE;
pPerIoDat^.wsaBuffer.buf := pPerIoDat^.Buffer;
Flags := 0;
CreateIoCompletionPort(LPGAME.GameSocket, FCompletPort, Cardinal(LPGAME), 0);
if WSARecv(LPGAME.GameSocket, @(pPerIoDat^.wsabuffer), 1, BytesRecv, Flags, @(pPerIoDat^.Overlapped), nil) = socket_error then
if GetLastError <> error_io_pending then
goto err;
 
和SLEEP没有关系,查查连接线程有没有问题。
用完成端口还用普通的SEND/RECV,郁闷。
 
后退
顶部