我的情况是这样的。
结构:
type
mail = record
mailname:string;
mailid:string;
end;
数组:
mailrd:array[0..100] of mail;要把整个mailrd数组都传过去。
结构:
type
mail = record
mailname:string;
mailid:string;
end;
数组:
mailrd:array[0..100] of mail;要把整个mailrd数组都传过去。
解决方案 »
- Missing operator or semicolon ,求高手
- delphi 綱絡問題
- UrlDownloadToFile这个函数怎么用呢?
- 求助!请教一个难题(拷贝当前屏幕到文件,在xp系统下,当用户切换以后,原用户的屏幕信息)
- 通过webbrowser控件打开一个页面,如何知道这个页面是否打开成功,有什么方法,比较紧急。谢谢大家
- 请教一个计算字段的问题
- fastreport 简单问题,请好心人帮忙
- ★DLL中如何使用MScomm控件?★
- 招聘DELPHI程序员,南京工作!待遇面议
- 如何用SQL语句实现,使多条重复的记录,只剩下一条记录,其余的都删掉?
- 江湖救急!一个关于ExpressBar的严重问题!
- Delphi 如何以字节数组的形式以套接字发送数据?
string用起来很方便,不过它可以说只是一个指针,所以sendbuf不能确定它有多少个字节要发( sizeof(string) = 4 )type
mail = record
mailname: string[255];
mailid: string[255];
end;mailrd:array[0..100] of mail;// init mailrd ..
socket.sendbuf(mailrd, sizeof(mailrd));client:
var
Data: array [0..100] of mail;
len: Integer;
begin
len := Socket.ReciveLength();
if Len = SizeOf(Data) then
begin
FillChar(Data, SizeOf(Data)); //初始化一下好
Socket.RecvBuf(Data, Len);
end else
raise Exception.Create('我不知道怎么接收其它数据');
end;
为什么传输数据用不完整。结果显示只有前15条数据。是什么原因呢。
用不用是缓存的设置,如是。又在哪里设置呢?
我的测试代码是://client:
procedure TForm1.ClientSocket1Read(Sender: TObject;
Socket: TCustomWinSocket);
var i:integer;
begin
i:=0;
len := Socket.ReceiveLength;
Socket.ReceiveBuf(mailrd, len);
while mailrd[i].mailid<>'' do
begin
listbox1.Items.add(mailrd[i].mailid);
listbox1.Items.add(mailrd[i].mailname);
i := i+1;
end;
end;//server:
写入测试数据到数组
procedure TForm1.Button3Click(Sender: TObject);
var
i:integer;
begin
for i:=0 to 20 do
begin
mailrd[i].mailname :='mail'+inttostr(i);
mailrd[i].mailid :=inttostr(i);
end;
for i:=0 to 20 do
begin
showmessage(mailrd[i].mailname + ' ' + mailrd[i].mailid);
end;
end;
//发送
procedure TForm1.Button2Click(Sender: TObject);
begin
Serversocket1.Socket.Connections[0].SendBuf(mailrd,sizeof(mailrd));
end;
unit Unit2;interfacetype
PMailData = ^TMailData;
TMailData = packed record
ID: string[20];
Name: string[20];
end;implementationend.procedure TForm1.Button1Click(Sender: TObject);
var
I: Integer;
Socket: TCustomWinSocket;
Data: array [0..100] of TMailData;
begin
if ServerSocket1.Socket.ActiveConnections <= 0 then Exit;
FillChar(Data, SizeOf(Data), 0);
for I := 0 to 100 do
begin
Data[I].ID := 'ID' + IntToStr(I);
Data[I].Name := 'Name' + IntToStr(I);
end;
Socket := Serversocket1.Socket.Connections[0];
Socket.SendBuf(Data, SizeOf(Data));
Memo1.Lines.Add('Send Data to: ' + Socket.RemoteHost);
end;procedure TForm1.ServerSocket1ClientConnect(Sender: TObject;
Socket: TCustomWinSocket);
begin
Memo1.Lines.Add(Format('%s connect server', [Socket.RemoteHost]));
end;******************************
Client:procedure TForm3.ClientSocket1Read(Sender: TObject;
Socket: TCustomWinSocket);
var
I, Len: Integer;
Data: array [0..100] of TMailData;
begin
FillChar(Data, SizeOf(Data), 0);
Len := Socket.ReceiveLength;
//有可能数据超过8k,Socket默认传输的一次单位的字节数是8k,如超过那么
//Socket.ReceiveLength总是8k,所以收数据时,还是Len = SizeOf(Data)看看
//我的TMailData设的比较小,所以没事,如果你把设成string[200],程序会错
if Len = SizeOf(Data) then
begin
FillChar(Data, SizeOf(Data), 0); //初始化一下好
Socket.ReceiveBuf(Data, SizeOf(Data));
for I := 0 to 100 do
begin
memo1.Lines.Add(Data[I].ID);
memo1.Lines.Add(Data[I].Name);
end;
end else
raise Exception.CreateFmt('我不知道怎么接收其它数据, Len: %d, SizeOf: %d', [Len, SizeOf(Data)]);
end;end.
分隔符$0 结束标志
$DDDDD [3] 100 $0 101 $0 102 $0
报头 数组下标 具体数据我就是这么做的。实现功能。完美。。呵呵
1)如果服务器准备好就发送数据。(问题一:可不可以解决指令放在接收文本中。数据放在socket.data中,如可以说说小例)。
2)如果超时中断发送。(问题二,如何判断超时呢。除了延时。clientsocket有没有此功能)
3)一对多(服务器对多台客户)的方式记录客户数组,数组下标一定能够完成connections[i]中的i的数据发送吗?(问题三,如不是还有什么好的方法呢。只限服务器操作)
4)经过一段的socket开发,发现我的程序有这样一个问题(问题四,服务器只监听并做接收指令并根据指令返回结果。当客户端发送指令时,经常不会有返回结果。好象就是单方通信。怎样做会稳定,可靠呢??)