一段telnet程序,取路由器的ARP表,下面是接收的时候:...
while true do
begin
  buffer:='';
  len:=recv(socket,buffer,sizeof(buffer),0);
  if len=socket_error then 
  break;
  arp:=arp+copy(buffer,1,len);
  form1.memo1.lines.add(inttostr(len)+'BYTE');
  form1.memo1.lines.add(copy(buffer,1,len));
  ...
  根据接收到的数据判断,是否已经取完
  if 取完 then break;
end;  收的过程中偶尔会出问题,有时写入buffer的字节数少于len,造成循环无法结束。甚至一个都没有,执行的效果如下:
542BYTE:
   192.168.9.34 00-21-97-0e-a4-5e   dynamic           9
   192.168.9.36 00-e0-4c-39-18-93   dynamic           9
   192.168.9.38 00-e0-2a-0a-02-73   dynamic           9
   192.168.9.39 00-14-2a-f0-94-d4   dynamic           9
   192.168.9.44 00-e7-00-43-3f-93   dynamic           9
   192.168.9.45 00-21-97-08-bf-69   dynamic           9
   192.168.9.48 00-14-0b-4a-4b-9d   dynamic           9
   192.168.9.60 00-13-20-2c-63-87   dynamic           9
   192.168.9.63 00-1d-0f-15-63-64   dynamic           9511BYTE:
   192.168.9.64 00-e0-28-08-01-eb   dynamic           9
   192.168.9.65 00-15-58-02-5a-26   dynamic           9
   192.168.9.67 00-21-97-10-20-dd   dynamic           9
   192.168.9.68 00-e0-2b-0b-02-d4   dynamic           9
   192.168.9.70 00-21-97-0c-92-7f   dynamic           9
   192.168.9.73 00-15-f2-60-7d-03   dynamic           9
   192.168.9.74 00-14-2a-f0-98-a4   dynamic           9
   192.168.9.83 00-21-97-10-25-65   dynamic           9
   192.168.9.84 00-1b-fc-4b-60-87   dynamic           9
298BYTE: 
(这里为什么recv明明返回298可是buffer却是空的????????????)

解决方案 »

  1.   

    不全是哈,sniffer抓包看,那298字节是最后一个包,里面有9.84以后的好几个ARP记录。问题就在这里,按照我的理解,到来的数据先是放进一个系统缓冲区,recv函数只负责把数据从那里面copy到我们定义的buffer里,并返回系统缓冲区里面的字节数,应该是copy的时候出了问题,什么也没有copy出来就返回了。还有更特别的情况,sniffer显示服务器连发三个包,数据区的大小分别是500,500,470,我的程序里只recv了一次,直接返回1470,真正copy到buffer里面的数据却只有1200多,最后那个包有一半不见了这种情况怎么办呢??
      

  2.   

    应该是buffer里有#0,所以copy的时候会把#0后面的数据截断。建议buffer不要定义成string或char数组,不要用copy来处理。
    用CopyMemory(.....
      

  3.   

    我把form1.memo1.lines.add(copy(buffer,1,len))这句话直接改成form1.memo1.lines.add(buffer)
    也没用,说明recv(socket,buffer,sizeof(buffer),0)这里就出了问题,buffer是char类型数组,我应该用什么类型的呢?
      

  4.   

    form1.memo1.lines.add(buffer) 
    这样要buffer里都是可视字符才能显示完整,否则碰到#0就会断开串。无论定义成什么,不能直接Lines.Add(buffer);buffer:Array[0..2048] of Byte;
      

  5.   

    返回没问题,还有 一次性recv三个包原因是你没及时读取包,都堵在socket的缓冲里了。。其他都是读取方法错误,楼上已经说了
      

  6.   

    还有一个问题,你的buffer虽是char数组,但你仔细在接受前看看,sizeof(buffer)出来的大小不是原始大小。。而是你赋值过一次后的大小所以最好在用之前Setlength一下。。不然要丢包
      

  7.   

    抓包看了一下,出问题的那个包第一个字节是#0D,第二个字节正是#00非常感谢!我没弄明白的是:到底是memo不能显示,还是recv根本没有把#00以后的数据写入buffer这个数组,接着测试...
      

  8.   

    结果是buffer里面,一个字节也没有写进去!!!!连#0D都没有....事情严重了......试试byte数组....
      

  9.   

    如果你的buffer是string,sizeof(buffer)为4.