捐赠 | 广告 | 注册 | 发布 | 上传 | 关于我们    
  沪ICP备05001939号 DELPHI盒子 | 盒子论坛 | 盒子文章 | 盒子问答悬赏 | 最新更新 | 论坛检索 | 下载中心 | 高级搜索    
  精品专区 | 繁體中文 | 奖励公告栏 | 直通车账号登陆 | 关闭GOOGLE广告 | 临时留言    
 
广告
评论:自己整的IOCP服务端VCL
sisha 39055 2009/11/17 17:15:26
procedure TCustomProcessor.Execute;
里面
只有 

     if errcode = ERROR_NETNAME_DELETED then
        FServer.DoClientDisConnect(HandleData^.Socket);


not GetQueuedCompletionStatus
里面只有     if errcode = ERROR_NETNAME_DELETED then??
才需要 
        FServer.DoClientDisConnect(HandleData^.Socket);
sisha 39054 2009/11/17 17:13:07
procedure TIOCPServer.DoDataReceive(Socket: TSocket);
begin
  Lock;
  try
    if Assigned(OnDataReceive) then OnDataReceive(Socket);
  finally
    UnLock;
  end;
end;

这个Lock 问题很大。。。
cyf_fly 38318 2009/8/7 23:48:29
能否发个demo看看
snoopy_teng 38232 2009/7/31 20:23:32
procedure TServerForm.IOCPServerDataReceive(SocketHandle: Cardinal);
var
  AConnection: TConnection;
  Node: TNode;
  PS: PTSession;
  pOutData: array of char;
  RecvLen: Integer;
  HeadLen, PacketLen: integer;
  PHead: PTHead;
  PClient: PTClient;
  PMsgtoSender: PTMsgtoSender;
begin
  PS := GetSession(SocketHandle);
  if PS = nil then exit;
  AConnection := TConnection(PS^.Connection);
  if AConnection = nil then Exit;
  HeadLen := SIZE(P_HEAD);
  TStretchBuffer(PS^.RevBuffer).Lock;
  try
    RecvLen := AConnection.RecvIOData.Overlapped.InternalHigh;
    TStretchBuffer(Ps^.RevBuffer).WriteBuffer(@AConnection.RecvIOData.Buffer[0], RecvLen);
    while TStretchBuffer(PS^.RevBuffer).BufferSize >= HeadLen do
softbug 37964 2009/7/13 23:40:39
IOCPServer1DataReceive(SocketHandle: Cardinal)

怎么用?
yao_ming 37687 2009/6/9 3:58:25
算你这个包装得好一点...
zhousan 37542 2009/5/22 13:51:12
对不起,帖错地方了。。
snoopy_teng 37541 2009/5/22 8:30:20
楼上的贴错代码了  我没写过这样的代码  根本就没有ScktIocp.pas这个单元 也没有出现这样的BUG
zhousan 37532 2009/5/21 11:35:44
//修正一个bug 
//接收到数据直接在上次数据基础上覆盖,若上次数据较多,则会多出一段垃圾数据
//单元:ScktIocp.pas

function TServerClientWinSocket.WorkBlock(var Block: PBlock;
  Transfered: DWORD): DWORD;
var
  ErrCode: Integer;
  Flag, BytesSend: Cardinal;
begin
  Result := RESPONSE_SUCCESS;
  with Block^.Data do
  try
    case Block^.Data.Event of
      seRead:
      begin
        {利用内存流来保存收到的数据,有可能造成频繁的内存重新分配,可以改进}
        Lock;
        FStream.Clear;         //<<---接收到流前先清空原内容,
        FStream.Write(Buffer, Transfered);
        UnLock;
        Self.Event(Self, seRead);        
        if not PrepareRecv(Block) then
          Result := RESPONSE_FAIL;
      end;
      seWrite:
      begin
//        Self.Event(Self, seWrite);
        Dec(wsaBuffer.len, Transfered);
        if wsaBuffer.len <= 0 then
        begin
          { 发送完成,将Block置空,返回到FBlock的可使用的缓区中 }
          Block.Data.IsUse := False;
          Block := nil;
        end else
        begin
          { 数据还没发送完成,继续发送 }
          Flag := 0;
          Inc(wsaBuffer.buf, Transfered);
          FillChar(Overlapped, SizeOf(Overlapped), 0);
          if SOCKET_ERROR = WSASend(FSocket, @wsaBuffer, 1, BytesSend,
          Flag, @Overlapped, nil) then
          begin
          ErrCode := WSAGetLastError;
          if ErrCode <> ERROR_IO_PENDING then
          Error(Self, eeSend, ErrCode);
          end;
        end;
      end;
    end;
  except
    Result := RESPONSE_FAIL;
  end;
end;
blueflag 37529 2009/5/20 23:07:25
咋用地?效果如何??????????
shileizi 37527 2009/5/20 12:38:02
DEMO,发个
dinkysoft 37522 2009/5/19 22:31:38
先顶顶
第一页 上一页 下一页 最后页 有 12 条纪录 共1页 1 - 12
 用户名:
 密 码:
自动登陆(30天有效)
 
  DELPHI盒子版权所有 1999-2023 V4.01 粤ICP备10103342号-1 更新RSS列表