完成端口问题(50)

  • 主题发起人 主题发起人 wengang16
  • 开始时间 开始时间
W

wengang16

Unregistered / Unconfirmed
GUEST, unregistred user!
我写一个程序,发现在用调用该API函数一段时间后GetQueuedCompletionStatus(CompletionPort, Transfered, Dword(CompleteKey), POverlapped(Block), INFINITE),Transfered在一个连接上返回总是0,我想问问这个应该怎么解决?是什么原因引起的?
 
请各位高手,都发表一下自己的想法,谢谢了
 
function GetQueuedCompletionStatus(hCompPort:THandle;var nBytesTransferred:Cardinal;var dwCompletionKey:Cardinal;var lpOverlapped:POverlapped;dwTimeout:Cardinal):BOOL;stdcall; 在完成端口编程中,GetQueuedCompletionStatus用来查询投递到完成端口上的异步I/O是否完成或出错。 1. 当有任务成功时,返回TRUE,dwCompletionKey返回调用CreateIOCompletionPort将I/O设备(比如文件,套接字等等)句柄关联到完成端口时提供的dwCompletionKey参数,lpOverlapped返回异步调用时提供的lpOverlapped参数,nBytesTransferred返回写入或读取的字节数。 2. 当没有任务完成,也没有任务出现错误时,返回FALSE。lpOverlapped被设置为nil。调用GetLastError可以得到更详细的原因,如果GetLastError返回WAIT_TIMEOUT,表明超时了,如果是其他错误,可以查MSDN上的系统错误码,了解原因。 3. 如果有任务失败了,返回FALSE。dwCompletionKey和lpOverlapped的设置情况跟第一种结果一样。GetLastError返回任务失败的原因。 对于Winsock2的WSARecv调用,如果GetLastError返回ERROR_NETNAME_DELETED,表示连接被通讯的另一方复位或者异常中断了,比如对方死机,此时应关闭套接字。 对于Winsock2的ConnectEx调用,如果GetLastError返回ERROR_CONNECTION_REFUSED,表示远端主机没有在这一端口进行监听;如果返回ERROR_HOST_UNREACHABLE,表示网络不通。
 
我用GetLastError也没有得到错误,但就是nBytesTransferred=0,而如果为0,我会将该连接断开的,我想知道nBytesTransferred=0在什么情况下,会为0,并且怎么避免
 
连接正常中断Connection Gracefully Closed时 Recv或WSARecv操作会导致nBytesTransferred为0.
 
你是说客户端Socket连接正常关闭了是吗,还有没有别的可能,麻烦您在想想,谢谢了
 
我刚刚发现了一个情况,就是当GetLastError为ERROR_IO_PENDING或10038错误时会出现nBytesTransferred=0,这两个错误怎么避免呀
 
我发现在WSARecv调用出现10055错误后,就会出现GetQueuedCompletionStatus调用出现nBytesTransferred=0,并且也会出现ERROR_IO_PENDING或10038错误
 
我发现这一切都是由于10055错误而出现的,而该错误的意思是由于系统缺乏足够的缓冲区空间,或因为队列已满,在套接字上的操作无法执行。但我不知道怎么来处理这个错误,麻烦知道的高手,给我讲解一下处理方法,
 
这是因为投递的I/O请求太多,系统锁定了很多页面。导致内存不足。你可以提供0字节的缓冲区调用WSARecv
 
就是说对所有投递的I/O请求,都设置缓冲为0吗
 
麻烦具体给我写一个例子,提供0字节的缓冲区调用WSARecv,这样做后,还有别的地方要改吗,谢谢,
 
分数太少了。点到即止。
 
可以加呀,希望您能够帮我解答,谢谢,在线等
 
您能不能够告诉我您的QQ,我想具体请教一下
 
我的投递代码是下面这样的function TIOCPServer.PostRead(SocketInfo: TSocket): boolean;var byteRecv, Flags, ErrCode: DWORD; HandleData: PPerHandleData;begin Flags := 0; New(HandleData); FillChar(HandleData.Overlapped, Sizeof(Overlapped), 0); FillChar(HandleData.Buffer, BUFFER_SIZE, 0); HandleData.wsaBuffer.buf := HandleData.Buffer; HandleData.wsaBuffer.len := BUFFER_SIZE; HandleData.Statu := ssRecv; HandleData.Socket := SocketInfo; Result := (WSARecv(SocketInfo, @(HandleData.wsaBuffer), 1, byteRecv, Flags, @HandleData.Overlapped, nil) <> SOCKET_ERROR); if (Result = False) then begin ErrCode := WSAGetLastError; Result := ErrCode = ERROR_IO_PENDING; end;end;
 
怎么就没有人回答呀
 
后退
顶部