TUrlPck = record
      UrlSize:Integer;
      Url:PChar;
    end;function sendData(Buffer:Pchar;size:integer):boolean;
begin
  Result := send(FSocketHandle,tmpBuff^,Size,0) = size;
end;procedure EnterUrl;
var
  url:TUrlPck;
url.Url := 'www.163.com';
url.UrlSize := 11;
sendData(@url,sizeof(TUrlPck) + 11);
end;接收端:
procedure DoProcessUrl(data:pchar:size:integer);
var
  url:TUrlPck;
begin
  Move(data^,url,Size); //url.url值不正确,其它值正常,为什么呢?我查看了TCP得到的原始char值和发送的值是一    样的,为什么move后会得不到值,我在发送端调用同样的move方法可以得到正确的值
end;

解决方案 »

  1.   

    TUrlPck = record 
          UrlSize:Integer; 
          Url:PChar; 
        end;
    不能这么写,而是要:
    TUrlPck = record 
          UrlSize:Integer; 
          Url:array[0..255] of Char; 
        end;
    或:
    TUrlPck = record 
          UrlSize:Integer; 
          Url:string[255]; 
        end;
      

  2.   

    我是不想浪费多于的空间(定长)。
    为什么我在发送端用move就可以给结构体赋值?而且值正常?发送后就不行了?而且接收端得到的数据和发送出去的数据一个,就是调用move时结果不同
      

  3.   

    因为在TUrlPck = record 
          UrlSize:Integer; 
          Url:PChar; 
        end;
    中,发送时,Url元素你只是发送了一个地址(PChar,指针类型),其实255个字节在包中是很小的.
    如果你确实觉得浪费空间,可以这样:
    type
      PDWORD=^DWORD;
    var
      Buf: Pointer;
      P: PDWORD;
      PC: PChar;
    begin
      GetMem(Buf,255);
      P:=Buf;
      PC:=Pointer(DWORD(Buf)+SizeOf(DWORD));
      P^:=UrlSize;//Url的长度
      PC:=Url;//Url的内容字符.
      sendData(Buf,UrlSize);
    end;到了接收端,首先看接受内容的前4字节的大小,再来取后面的内容
      

  4.   

    关于楼主的结构体的定义,我原来的帖子曾经讨论过,就是发送大于255字节的那个,用PChar是不行的,如楼上所说
      

  5.   

    我就是前4个字节为数据包的大小来进行处理的,为了简化代码才没写出来,我是为了解决IOCP的粘包问题才这样做的
    我在发送端和接收端的数据都是一样的,我对过了,只是在调用move方法后,填充到结构中的pchar值不一样