当前位置:主页>销售管理软件> 列表

Socket 三个很难的问题 30分+20分

仓库管理软件版1楼: 刚开始学习Socket 有二个问题没有搞懂。
1、IdTCPClient.WriteBuffer(VData,sizeof(VData),true)发完数据后是不是会自动关闭连接。如何避免,除了重连接的方法。
2、WinSock 中一些同步和异步的函数是如何解释(有什么区别)?
3、 TcpClient1.ReceiveBuf() ;
IdTCPClient1.ReadBuffer()
两个组件都可读数据,数据是谁提供给它的,如何提供?

2楼: 1:idtcpclient.connect;
....
idtcpclient.disconnect;

呵呵,其它的不会! 如管家婆库存管理软件

3楼: 谢谢你的回答:
第一小题意思是 如何不让它自动关闭连接。:)

4楼: 1、我刚写了一个测试程序不会出现了怪。看来不会自动关闭的。
2、同步这样理解不知有没错。客服端收到内容时可能有很次累积的,异步可进行一起处理。同步情况客服端一接到内容,就触发处理的事物。不知错了没有。等待高手回答。
3、用AThread.Connection下的方法向客服端返回信息。

5楼: 2,"同步"指提交一个SOCKET请求之后,直到系统完成操作或超时后才返回
的方式."异步"指提交SOCKET请求之后马上返回,系统在后台进行真正
的操作,当操作完成后向程序发送消息的方式.不建议采用同步方式
3,下面这个函数看对你有帮助没,
Cs: TClientSocket;
procedure TCsObject.CsWait;
var
pm: PMsgPack;
p: pointer;
Stream: TWinSocketStream;
begin
while CS.Socket.Connected do
begin
try
Stream := TWinSocketStream.Create(CS.Socket, 60000);
pm := AllocMem(MSGHEADERSIZE); { initialize the buffer }
try
{ give the client 60 seconds to start writing }
if Stream.WaitForData(60000) then
begin
Stream.ReadBuffer(pm^, MSGHEADERSIZE);
p := AllocMem(pm^.Length);
try
Stream.ReadBuffer(p^, pm^.Length);
case pm^.MsgType of
{ now process the request }
AppMsg_XXFB: Process_AppMsg_XXFB(Cs.Socket, TAppMsg_XXFB(p^));
AppMsg_SvrInfos: Process_APPMsg_SvrInfos(Cs.Socket, TAppMsg_SvrInfos(p^));

APPMSG_DISCONNECT:
begin
CS.Socket.Close;
CS.Close;
Break;
end;
end
finally
FreeMem(p, pm^.Length);
end;
end
else
Cs.Socket.Close;
finally
freemem(pm, MSGHEADERSIZE);
Stream.Free;
end;
except
on E: Exception do
begin
FErrorString := E.Message;
HandleException;
end;
end;

end;
end;

6楼: TO IT书生
谢谢您的回答:)
您的意思同步指阻塞式 异步就是指非阻塞式。
您程序大体意思是:ReadBuffer(pm^, MSGHEADERSIZE)读出包头信息,再根据包头中定义的包体长,读包体数据是不是?
使用过ReadBuffer缓存中被读出的数据会被删除是吗?
刚开始用Socket 有点满头雾水。多指导一下?小弟再次谢过。

仓库管理软件版7楼: 〔您程序大体意思是:ReadBuffer(pm^, MSGHEADERSIZE)读出包头信息,再根据包头中定义的包体长,读包体数据是不是?〕
这一行就是读包数据的:AppMsg_XXFB: Process_AppMsg_XXFB(Cs.Socket, TAppMsg_XXFB(p^));


另外在代码中自定义了数据格式,
TAppMsg_XXFB = record
XXBH: DWORD;
XXLX:DWORD;
FBRQ:TDate;
XXNR: array[0..899] of char;
FILENAME: string[255];

在这个函数中做处理
procedure TCsObject.Process_AppMsg_XXFB(AWinSocket: TCustomWinSocket;
AAppMsg: TAppMsg_XXFB);
begin
WriteMsgRzxx(AAppMsg);//在这里具体处理数据。
Application.ProcessMessages;
end;
------------------
对了上个回贴中的 pm: PMsgPack;
{消息包类型,在下面列出,发送消息包时,应先给TAppMsg结构
赋值,并得到确切记录大小,以写入MsgPack.length, 然后
把TAppMsg结构的}
PMsgPack = ^TMsgPack;
TMsgPack = record
MsgType: DWord;
MsgFlag: DWord;
Length: DWord;
MsgData: DWord;
end;
说的有点乱,你自己看看吧,呵呵。

8楼: 终于搞定了。

9楼: 接受答案了.