各位,我想在ClientSocket连接服务端的时候就把一个附加信息给传过去,采用以下代码:
TShopInfo = Record
    ShopNo: Integer; //分店号
    ShopName: String; //分店名称
  End;  pShopInfo = ^TShopInfo;var
  lshop: pShopInfo;
begin
  lShop := new(pShopInfo);
  lshop.ShopNo := 8888;
  FClientSocket.Socket.Data := lShop;
  if not FClientSocket.Active then
    FClientSocket.Open
  else
  begin
    FClientSocket.Close;
    FClientSocket.Open;
  end;
end;服务端在onClientconnect事件中添加以下代码:
var
  i,j:integer;
  lShopInfo: pShopInfo;
begin
  lShopInfo := Socket.Data;//这里发现Socket.Data为nil,并没有接受到传的附加信息
end哪位知道的高手给指点一二,在此先谢过了!

解决方案 »

  1.   

    你的FClientSocket并没有发送数据啊
    你可以通过第三放工具进行测试的
      

  2.   

    to:lyguo 
       我最主要的目的就是在初次连接时把附加信息发送给服务端,然后服务端记录下这个客户端与附加信息的关系。如果可以这样实现,处理起来就比较方便了,不需要再专门发包给服务器传递附加信息;to:fangsp 
       我发数据是另外处理的,不在连接的时候发送;
      

  3.   

    FClientSocket.Socket.Data := lShop; 
    這句有問題。應該用FClientSocket.Socket.SendBuf或SendText進行發送。服務端,應該在ClentRead事件中接收發送的數據;Socket.ReceiveBuf()或Socket.ReceiveText進行接收數據;
      

  4.   

    TShopInfo = Record 
        ShopNo: Integer; //分店号 
        ShopName: String; //分店名称 (*这个改掉比如ShopName: String[60]*)
      End; 
      

  5.   

    谢谢楼上的,但我试了一下,直接把ShopName: String; //分店名称这个字段给去掉,
    TShopInfo = Record 
        ShopNo: Integer; //分店号 
    End; 
    服务端收到仍然收不到DATA的数据。是不是初次连接时ClientSocket根本没把Data数据发送到服务端啊?
      

  6.   

    一、定义
      TShopInfo = Record 
        ShopNo: Integer; //分店号
        ShopName: String[60]; //分店名称
      End;  PShopInfo = ^ TShopInfo;  TNetData = record
        Length: Integer;
        ShopInfo: TShopInfo;
      end;  PNetData = ^TNetData;二、服务端拖一下TServerSocket设置Port为12345,OnClientRead写如下代码:
    procedure TForm1.ServerSocket1ClientRead(Sender: TObject;
      Socket: TCustomWinSocket);
    var
      NetData: PNetData;
      iLen: Integer;
      pBuffer: PChar;
    begin
      if Socket.Data = Nil then
        begin
          new(NetData);
          Socket.Data := NetData;
          NetData.Length := 0;
        end
      else
        NetData := Socket.Data;  iLen := Socket.ReceiveLength;  if iLen > (sizeof(TShopInfo) - NetData.Length) then
        iLen := sizeof(TShopInfo) - NetData.Length;  pBuffer := @NetData.ShopInfo;  Inc(pBuffer,NetData.Length);  iLen := Socket.ReceiveBuf(pBuffer^, iLen);  Inc(NetData.Length,iLen);  if NetData.Length = sizeof(tshopInfo) then
        begin
          Socket.Data := Nil;
          try
            //DoWithShopInfoPtr(@NetData.ShopInfo);
          finally
            Dispose(NetData);
          end;
        end;
    end;三、客户拖一个TClientSocket,Port设置为12345,OnConnect代码如下
    procedure TForm1.ClientSocket1Connect(Sender: TObject;
      Socket: TCustomWinSocket);
    var
      NetData: PNetData;
      iLen,iSent: Integer;
      pBuffer: PChar;
    begin
      New(NetData);
      try
        netData.ShopInfo.ShopNo := 8888;
        netdata.ShopInfo.ShopName := '店名';
        netData.Length := sizeof(TShopInfo);    iLen := sizeof(TNetData);    pBuffer := NetData;    while iLen > 0 do
          begin
            iSent := Socket.SendBuf(pBuffer^,iLen);
            Dec(iLen,iSent);
            Inc(pBuffer,iSent);
          end;  finally
        Dispose(NetData);
      end;
    end;
      

  7.   

    其它发送类似于Connect的代码,而接收类似于ClientRead的代码。