且构网

分享程序员开发的那些事...
且构网 - 分享程序员编程开发的那些事

利用DELPHI开发完成例程(2)

更新时间:2022-09-22 09:44:23

对于使用完成例程来实现发送数据,其实现类似于接收方法。一下我大概讲述一下。
首先定义一个发送的回调函数:
procedure SendWorkerThread(Error:DWORD;BytesTransferred:DWORD;IoData: PIOData;InFlags:DWORD);stdcall;
FComletionRoutine:=TCompletionRoutine(IoData.FNetClass);
  EnterCriticalSection(FComletionRoutine.FIOCPInter);
  try
    //程序运行到这里表明上次发送的数据已经发送完成,现在使用此套接字在HASH表中得到此套接字上的相关信息。
FSendHash:=FComletionRoutine.FSendHashCtrl.SelSort(IoData.Socket);
FSendHash.IsCanSend:=True;
//从发送队列中得到下次需要发送的数据并进行发送。
    FSendBuffer:=FComletionRoutine.FSendHashCtrl.GetFirstBuffer(FSendHash);
    FComletionRoutine.FMemPool.ReleaseBuffer(IoData);
    while (FSendHash.IsCanSend) and (FSendBuffer<>nil) do
    begin
      FSendHash.IsCanSend:=False;
         //发送数据 
      if not FComletionRoutine.SendQueueData(FSendHash.Socket,FSendBuffer) then
      begin
        FSendHash.IsCanSend:=true;
        closesocket(FSendHash.Socket);
        break;
      end;
    end;
  finally
    LeaveCriticalSection(FComletionRoutine.FIOCPInter);
  end;
 
对于发送函数来说可以这样实现:
function TCompletionRoutine.SendData(Socket: TSocket;Data:PChar;DataLen: Integer): Boolean;
var
  p_Hash:PSendHash;
  p_SendBuffer:PSendBuffer;
begin
  Result:=True;
  //将此数据保存到此套接字对应的HASH信息中的发送队列中,并判断此套接字当前是否可以发送数据,如果可以,则将此发送队列中的第一个数据进行发送。
p_Hash:=FSendHashCtrl.AddSort(Socket,Data,DataLen);
while Assigned(p_Hash) and (p_Hash.IsCanSend) do
  begin
   
    p_Hash.IsCanSend:=false;
    p_SendBuffer:=FSendHashCtrl.GetFirstBuffer(p_Hash);
    if not SendQueueData(p_Hash.Socket,p_SendBuffer) then
    begin
      p_Hash.IsCanSend:=true;
      closesocket(p_Hash.Socket);
      break;
    end;
  end;
end;
 
相信大家看了我上面的描述,应该对如何使用完成例程对数据进行发送和接收有了了解。如果大家有什么好的优化方法,可以留言给我或者加我的QQ,我尽量再将完成例程进行优化。并将优化后的代码与大家共享。
我的QQ:513479626
本文转自狗窝博客51CTO博客,原文链接http://blog.51cto.com/fxh7622/94348如需转载请自行联系原作者

fxh7622