//标识是什么类型的数据
THeadPick=Packed Record
ID:Word;
end;
//用户信息
TUserInfo=Packed Record
Nname:String[16];
PassWord:String[16];
end;
//用户登录时发的包
TLogonPick=Packed Record
HeadPick:THeadPick;
UserInfo:TUserInfo;
end;
//传送文件时发的包
TFilePick=Packed Record
HeadPick:THeadPick;
FileInfo:Array[0..5000] of Char;
end;客户端向服务器发了一个数据包 ,每个数据包都是头结构体和数据结构体两部分组成,要根据不同的
头结构体来确定是什么数据.就是说先要读出THeadPick这一部分.如果客户端发送了一个TLogonPick 包
procedure TTCPServerSocket_Obj.TCPServerExecute(AThread: TIdPeerThread);
var
NewasHeadPick:THeadPick;
NewUserInfo:TUserInfo;
begin中用
AThread .Connection .ReadBuffer (NewasHeadPick,SizeOf (THeadPick));
读取后,读取用户信息
AThread .Connection .ReadBuffer (NewUserInfo,SizeOf (TUserInfo));
时就不正确了.是不是每次执行AThread .Connection .ReadBuffer后将Socket缓冲区中的数据都删除了????--------------------------------------
如果是用
AThread .Connection .Socket .Recv(NewasHeadPick,SizeOf (THeadPick));
读取后,读取用户信息
AThread .Connection .ReadBuffer (NewUserInfo,SizeOf (TUserInfo));
就正确了.我的理解是AThread .Connection .Socket .Recv 执行时只是读取了NewasHeadPick后将Socket缓冲区中的NewasHeadPick
删除了,
而AThread .Connection .ReadBuffer读取后,将Socket缓冲区清空了.
如果Socket缓冲区中没有数据AThread .Connection .ReadBuffer就阻塞了.end;我对系统的Socket接收数据缓冲区在什么时候会全部清空,什么时候只清除读取了的数据,如果读取时缓冲区没有数据什么情况下
读操作直接返回,什么情况下会阻塞不是很清楚,哪位老大知道给讲一下吧.或者告诉一下在什么书上讲了.还有系统的Socket发送缓冲区也有类型的问题,也说一下吧.
THeadPick=Packed Record
ID:Word;
end;
//用户信息
TUserInfo=Packed Record
Nname:String[16];
PassWord:String[16];
end;
//用户登录时发的包
TLogonPick=Packed Record
HeadPick:THeadPick;
UserInfo:TUserInfo;
end;
//传送文件时发的包
TFilePick=Packed Record
HeadPick:THeadPick;
FileInfo:Array[0..5000] of Char;
end;客户端向服务器发了一个数据包 ,每个数据包都是头结构体和数据结构体两部分组成,要根据不同的
头结构体来确定是什么数据.就是说先要读出THeadPick这一部分.如果客户端发送了一个TLogonPick 包
procedure TTCPServerSocket_Obj.TCPServerExecute(AThread: TIdPeerThread);
var
NewasHeadPick:THeadPick;
NewUserInfo:TUserInfo;
begin中用
AThread .Connection .ReadBuffer (NewasHeadPick,SizeOf (THeadPick));
读取后,读取用户信息
AThread .Connection .ReadBuffer (NewUserInfo,SizeOf (TUserInfo));
时就不正确了.是不是每次执行AThread .Connection .ReadBuffer后将Socket缓冲区中的数据都删除了????--------------------------------------
如果是用
AThread .Connection .Socket .Recv(NewasHeadPick,SizeOf (THeadPick));
读取后,读取用户信息
AThread .Connection .ReadBuffer (NewUserInfo,SizeOf (TUserInfo));
就正确了.我的理解是AThread .Connection .Socket .Recv 执行时只是读取了NewasHeadPick后将Socket缓冲区中的NewasHeadPick
删除了,
而AThread .Connection .ReadBuffer读取后,将Socket缓冲区清空了.
如果Socket缓冲区中没有数据AThread .Connection .ReadBuffer就阻塞了.end;我对系统的Socket接收数据缓冲区在什么时候会全部清空,什么时候只清除读取了的数据,如果读取时缓冲区没有数据什么情况下
读操作直接返回,什么情况下会阻塞不是很清楚,哪位老大知道给讲一下吧.或者告诉一下在什么书上讲了.还有系统的Socket发送缓冲区也有类型的问题,也说一下吧.
解决方案 »
- delphi三层SocketConnection与scktsrvr服务问题!!
- 问一串口问题
- 关于delphi的数据库时间,日期查询问题?
- 请问:如何将Query产生的数据保存到一个文本文件里?
- 大家说说CSDN都有哪些缺点,为什么人气这么差,根本没有高手过来,提个问题几天没人应。 我们还有必要守住这片田地吗?
- 通过什么方法将数据集的记录的图片与记录同步显示出来?
- 谁手里有delphi code arrange expert 感激不尽 [email protected]
- 请问谁有或知道李维的ADO_MTS_COM+那本书或者下载?谢谢!
- 谁能告诉我这是DBGRid的问题还是ACCESS数据库的问题??
- 关于用李维书的一个问题,
- 初学者的一个问题
- 请问谁知道TreeView的底层实现方式.讨论一下.
读取后,读取用户信息
AThread .Connection .ReadBuffer (NewUserInfo,SizeOf (TUserInfo));这样是没问题的。
--------------------------------
是不是每次执行AThread .Connection .ReadBuffer后将Socket缓冲区中的数据都删除了????
是删除了。
------------------------------
Indy控件都是基于阻塞式的,如果跟踪的话,会发现如果客户端没有数据时,程序就等停在AThread .Connection .ReadBuffer (NewasHeadPick,SizeOf (THeadPick));这一句
就是说他一直等到取到相同长度的数据后才继续向下执行。