const
  MAX_PACKETSIZE = 2048;
type
  PDataHeader = ^TDataHeader;
procedure RECV;
var
  Hdr: PDataHeader;
  Buffer: array [0..MAX_PACKETSIZE - 1] of Char;
begin
  FillChar(Buffer, MAX_PACKETSIZE, 0);
  Hdr := Pointer(@Buffer);
  Socket.ReceiveBuf(Hdr^, SizeOf(TDataHeader));    //先接收包头,包头中含有包长度信息
  Socket.ReceiveBuf((Buffer + SizeOf(TDataHeader))^, Hdr^.iLen - SizeOf(TDataHeader));//就是执行到上面这句弹出了对话框报错
windows socket error:由于系统缓冲区空间不足或列队已满,不能执行套接字上的操作。(10055),on API‘recv’ 
不知问题出在哪

解决方案 »

  1.   

    SizeOf(TDataHeader) 得到的大小是 16
    Hdr^.iLen 大小是20 。 而我的缓冲是2048 ,为什么会 缓冲不足了
      

  2.   

    发现问题并不像我以为的是缓冲的原因,问题的症结在于 sClientRead 消息被触发了两次,第二次“要接收的字节数是0” ,而出错的。 不知道为什么我客户端只send了一次,而服务器的sClientRead 消息却被触发了两次。
      

  3.   

    我觉得你不应该调用两次ReceiveBuf.你可以定义一个中间缓冲区,把数据一次性的读到这个中间缓冲区中再做操作.
      

  4.   

    打开任务管理器->进程->菜单中“查看”->选择列->将“句柄计数”选中然后看看哪些进程的句柄数居高不下,再将对应进程关掉(有进程上万个句柄,那肯定出错了)然后,再试试看操作成不成功。这个错误一般是系统的句柄资源/还是内存(不太记得)给占光而导致的。我以前也遇到。
      

  5.   

    对上面的问题,我想应该不是系统缓冲的原因,而是sClientRead 消息被触发了两次的原因(第二次触发时要接收的字节数就是0),我现在的解决方案是     
          i:=Socket.ReceiveLength;
          if i<SizeOf(TDataHeader) Then
             exit;
    基本上还能凑合着用。
      

  6.   

    现在我到是发现另一个问题,为什么用SizeOf(A),如果A是类type,得到的一定是4; 而如果A是record type,得到的才是正常的数字。  
        我现在就想把A类的对象a发送出去,因为SizeOf(A)得到的是4 就不正确了。