对于使用完成例程来实现发送数据,其实现类似于接收方法。一下我大概讲述一下。
首先定义一个发送的回调函数:
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