做一个SOCKET通信传递字符的程序,因为在发送的时候并不是每次都会将你给定的字符全部发送出去,如果底层的SOCKET缓冲区
空间不够的话,就只会发送部分字符,如果全部是中文件,而缓冲区的空间只有奇数字节,则会将最后一个中文字符截断,这样在服务器收到数据后,如果发现长度不够,且最后一个中文字符让截断了,就在下一个包收到的时候将两截合并起来.就用下面的代码进行了分解测试.帮忙看一下有什么BUG
var
  S:String;
  i:Word;
  S3:Array [0..1] of Byte;
  PStr:PChar;
begin
  S:=Trim(edt_Str.Text);
  if Length(S)<=0 then
    Exit;
  //第一个字符
  edt_StrHex1.Text:=IntToHex(Byte(S[1]),2);
  //第二个字符
  edt_StrHex2.Text:=IntToHex(Byte(S[2]),2);
  //组合数字
  S3[0]:=Byte(S[1]);
  S3[1]:=Byte(S[2]);
  i:=PWord(@S3)^;
  edt_StrHex3.Text:=IntToHex(i,4);  //合并还原
  PStr:=PChar(@i);
  edt_Str2.Text:=S;
end;

解决方案 »

  1.   

    你全部用widechar就不存在这样问题啊
      

  2.   

    SOCKET 是按单字节发送的吧。如果发送的内容全部都是中文有1000个汉字,SOCKET缓冲区中只有999字节长的空间了,则发送SendText返回是999,
    第500个汉字只发了一半,剩余的部分用Copy(S,1000,2000)来发送。自己的通信格式也不能保存不让截断的。