问题现象:在服务端接收到的结构是乱码
vc中的结构
struct File_CMD
{
int m_msg;//操作码
char filename[512];//文件名或其它的
char user[32];//用户名
char PworCrc[32];//密码或CRC值
int SESSION;//连接标志,用来保持连接的
    int m_ok;
LARGE_INTEGER Filesize;//文件大小
LARGE_INTEGER m_begin;//开始字
LARGE_INTEGER m_end;//结束
};
根据vc中的结构改的
记录的定义
type
client_record=record
 m_msg:integer;//操作码
 filename:string[255];//文件名或其它的
 user:string[32];//用户名
 PworCrc:string[32];//密码或CRC值
 SESSION:integer;//连接标志,用来保持连接的
  m_ok:integer;
 Filesize:integer;//文件大小
 m_begin:integer;//开始字
 m_end:integer;//结束
end;
下面是主要代码
procedure TForm1.Button1Click(Sender: TObject);
begin
ClientSocket1.Active:=true;
end;procedure TForm1.ClientSocket1Disconnect(Sender: TObject;
  Socket: TCustomWinSocket);
begin
memo1.Lines.Add(ClientSocket1.Socket.RemoteHost);
end;procedure TForm1.Button2Click(Sender: TObject);
begin
GetMem(Buffer1,sizeof(xinxi));
ClientSocket1.Socket.SendBuf(Buffer1,sizeof(xinxi)) ;
end;procedure TForm1.FormCreate(Sender: TObject);
var
user,pass:string ;begin
//user:=SetLenth('test',32);
 xinxi[0].m_msg:=1;//操作码
 xinxi[0].filename:='s.text';//文件名或其它的
 xinxi[0].user:='test';//用户名
 xinxi[0].PworCrc:='test';//密码或CRC值
 xinxi[0].SESSION:=3;//连接标志,用来保持连接的
  xinxi[0].m_ok:=0;
xinxi[0].Filesize:=100000;//文件大小
xinxi[0].m_begin:=0;//开始字
xinxi[0].m_end:=100000;//结
end;procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
FreeMem(Buffer1,sizeof(xinxi));
end;

解决方案 »

  1.   

    File_CMD = record
      m_msg:integer;
      filename:array[0..511] of char;
      user:array[0..31] of char;
      PworCrc:array[0..31] of char;
      SESSION:integer;
      m_ok:integer;
      Filesize:LARGE_INTEGER;
      m_begin:LARGE_INTEGER;
      m_end:LARGE_INTEGER;
    end;
      

  2.   

    首先string[32];//这种表示会因为user[0]导致2变数据格式不一样,网络编程的包最好都不要用string变量packed 应该没有作用,月亮兄的结构已经对齐了。
    至于你说乱码就要看你怎么发送怎么接收了,估计代码有问题。结构体记得填充0后在初始化数据。
    如果还有问题好好分析你2边数据
      

  3.   

    ClientSocket1.Socket.SendBuf(Buffer1,sizeof(xinxi)) ;  这里ClientSocket1.Socket.SendBuf(Buffer1^,sizeof(xinxi)) ; 注意看原型是 const buf; 无类型引用, 是指针的要取出地址服务器这边的 RecvBuf 也是同样楼上的兄弟不知哪来的, string[xx] 是可以的
      

  4.   

    我把GetMem(Buffer1,sizeof(xinxi)); 
    ClientSocket1.Socket.SendBuf(Buffer1,sizeof(xinxi)) ;
    这两句修改为
    ClientSocket1.Socket.SendBuf(xinxi,sizeof(xinxi)) ;
    还是不得行,还是有乱码。乱码出现的位置是记录的第二个字段的第一位。
      

  5.   

    问题我已经解决,就是client_record = record
       m_msg: integer; //操作码
            filename: array[0..254] of char
    ; //文件名或其它的
        user:  array[0..31]of char; //用户名
        PworCrc: array[0..31]of char; //密码或CRC值
        SESSION: integer; //连接标志,用来保持连接的
        m_ok: integer;
        Filesize: int64; //文件大小
        m_begin: int64; //开始字
        m_end: int64; //结束  end;
    就可以了,还是谢谢大家