如何用SOCKET发送一个记录?

netyjynixa 2003-11-22 09:20:23
我想发送一个记录数据包,不知怎样用SOCKET在客户端发和服务器正确的收,各位帮忙,多谢!
...全文
47 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
zawload 2003-11-27
  • 打赏
  • 举报
回复
客户接收


type
TRecvMSG = Packed Record //接收数据格式
CommandID : Cardinal; //(Receive=0x3) (4字节)
Explanation : array[0..99] of char ; //[Explanation] (100) NOT NULL
SPNumber : array[0..20] of char ; //[varchar] (21) NOT NULL
UserID : array[0..20] of char ; //[varchar] (21) NOT NULL
ServiceType : array[0..9] of char ; //[varchar] (10) NOT NULL
FeeType : Cardinal ; //[int] NOT NULL
FeeValue : Cardinal ; //[int] NOT NULL
MessageContent : array[0..999] of char ; //[varchar] (1000) NOT NULL
Rserve : array[0..49] of char ; //[varchar] (50) NOT NULL
End ;
PRecvMSG=^TRecvMSG ;

.
.
..
.
.
.


Socket.ReceiveBuf(RecvMSG^,SizeOf(TRecvMSG)) ;
If RecvMSG^.CommandID = 3 Then
Begin
_SPNumber := RecvMSG^.SPNumber ;
_UserID := RecvMSG^.UserID ;
_ServiceType := RecvMSG^.ServiceType ;
_FeeType := RecvMSG^.FeeType ;
_FeeValue := RecvMSG^.FeeValue ;
_MessageContent := RecvMSG^.MessageContent ;
_Reserve := RecvMSG^.Rserve ;

.
.
.
.

zawload 2003-11-27
  • 打赏
  • 举报
回复
服务器端:
type
TSendMSG = Packed Record //发送数据格式
CommandID : Cardinal; //(Send=0x2)(4字节)
Explanation : array[0..99] of char ; //[Explanation] (100) NOT NULL
SPNumber : array[0..20] of char ; //[varchar] (21) NOT NULL
UserID : array[0..20] of char ; //[varchar] (21) NOT NULL
ServiceType : array[0..9] of char ; //[varchar] (10) NOT NULL
FeeType : Cardinal ; //[int] NOT NULL
FeeValue : Cardinal ; //[int] NOT NULL
MessageContent : array[0..999] of char ; //[varchar] (1000) NOT NULL
Rserve : array[0..49] of char ; //[varchar] (50) NOT NULL
End ;
PSendMSG=^TSendMSG ;


.
.
.
.

procedure PackSendMSG(SMSend : PSendMSG ; _Explanation,_SPNumber,_UserID,
_ServiceType:string;_FeeType,_FeeValue:Cardinal;_MessageContent,_Rserve:string) ;
var
i : integer ;
Begin

SMSend^.CommandID := 3 ; //发送数据发指令 3
for I:=0 to Length(_SPNumber)-1 do
SMSend^.SPNumber[i] := _SPNumber[i+1] ;

for I:=0 to Length(_UserID)-1 do
SMSend^.UserID[i] := _UserID[i+1] ;

for I:=0 to Length(_ServiceType)-1 do
SMSend^.ServiceType[i] := _ServiceType[i+1] ;

SMSend^.FeeType := _FeeType ;
SMSend^.FeeValue := _FeeValue ;

for I:=0 to Length(_MessageContent)-1 do
SMSend^.MessageContent[i] := _MessageContent[i+1] ;

for I:=0 to Length(_Rserve)-1 do
SMSend^.Rserve[i] := _Rserve[i+1] ;
End;

.
.
.






New(MySMSend) ;
FillChar(MySMSend^.SPNumber,21,#0) ;
FillChar(MySMSend^.UserID,21,#0) ;
FillChar(MySMSend^.ServiceType,10,#0) ;
MySMSend^.FeeType := 0 ;
MySMSend^.FeeValue := 0 ;
FillChar(MySMSend^.MessageContent,1000,#0) ;
FillChar(MySMSend^.Rserve,50,#0) ;
PackSendMSg(MySMSend,'',FSPNumber,FUserID,FServiceType,FFeeType,FFeeValue,FMessageContent,FReserve); //生成要发送数据



.
.
.
.
_SocketS.Socket.Connections[i].SendBuf(MySMSend^,sizeof(TSendMSG)); //实际发送数据


.
.
.
.



soundbug 2003-11-27
  • 打赏
  • 举报
回复
服务器端
var
MyStream: TMemoryStream;
ReceiveRecord: TYourRecord
begin
MyStream := TMemoryStream.Create;
try
YourSocket.ReadStream(MyStream);
MyStream.ReadBuffer(ReceiveRecord,SizeOf(ReceiveRecord));
//现在就可以对收到的记录ReceiveRecord进行处理了
finally
MyStream.Free;
end;
end;
soundbug 2003-11-27
  • 打赏
  • 举报
回复
如果是D7最好加上ScktComp单元
procedure TForm1.Button1Click(Sender: TObject);
var
Mystream: Tmemorystream;
YourRecord: TYourRecord;
begin
MyStream := TMemoryStream.Create;
MyStream.WriteBuffer(YourRecord,SizeOf(YourRecord));
try
try
YourSocket.SendStream(MyStream);
finally
MyStream.Free;
end;
except
end;
end;
netyjynixa 2003-11-26
  • 打赏
  • 举报
回复
我的意思是这样的,我想发送一个记录类型的数据包,用SOCKET发送,如何在客户端发及能在服务端正确的显示出来.分不够可以加请各位大侠赐教.
yzykjh 2003-11-24
  • 打赏
  • 举报
回复
发送OldVariant数据类型的数据。
netyjynixa 2003-11-23
  • 打赏
  • 举报
回复
没人知道?
stone565 2003-11-22
  • 打赏
  • 举报
回复
关注.....

1,594

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 网络通信/分布式开发
社区管理员
  • 网络通信/分布式开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧