scktcomp.pas源代码问题(100分)

  • 主题发起人 主题发起人 zuping
  • 开始时间 开始时间
Z

zuping

Unregistered / Unconfirmed
GUEST, unregistred user!
深入学习scktcomp.pas源代码,发现有这样的代码看不懂,需要大虾解释一下。

1、SO_SYNCHRONOUS_NONALERT是setsockopt什么选项,什么含义??

procedure TServerWinSocket.Accept(Socket: TSocket);
var
ClientSocket: TServerClientWinSocket;
ClientWinSocket: TSocket;
Addr: TSockAddrIn;
Len: Integer;
OldOpenType, NewOpenType: Integer;
begin
Len := SizeOf(OldOpenType);
if getsockopt(INVALID_SOCKET, SOL_SOCKET, SO_OPENTYPE, PChar(@OldOpenType),
Len) = 0 then
try
if FServerType = stThreadBlocking then
begin
NewOpenType := SO_SYNCHRONOUS_NONALERT;
setsockopt(INVALID_SOCKET, SOL_SOCKET, SO_OPENTYPE, PChar(@NewOpenType), Len);
end;
Len := SizeOf(Addr);
ClientWinSocket := WinSock.accept(Socket, @Addr, @Len);
if ClientWinSocket <> INVALID_SOCKET then
begin
ClientSocket := GetClientSocket(ClientWinSocket);
if Assigned(FOnSocketEvent) then
FOnSocketEvent(Self, ClientSocket, seAccept);
if FServerType = stThreadBlocking then
begin
ClientSocket.ASyncStyles := [];
GetServerThread(ClientSocket);
end;
end;
finally
Len := SizeOf(OldOpenType);
setsockopt(INVALID_SOCKET, SOL_SOCKET, SO_OPENTYPE, PChar(@OldOpenType), Len);
end;
end;
2、TServerWinSocketOnClientWrite事件发生原理是什么?客户端怎么会引发服务端的异步事件???
 
Client.Send -> Server.ClientRead
Server.Send -> Client.Read
 
我第二个问题是,当客户端的TClientSocket组件发出读请求时,服务端的TServerSocket居然会引发TServerWinSocket.OnClientWrite事件,我想知道其中的原因?为什么会引发,客户端的需求,服务端是怎么知道的??
 
TCPsocket通信就象两个管子,一边是服务端一边是客户端 ,就象下面的图
< =========
client server
=========>
客户端发出请求,首先要写过去,服务端要收到这个请求,才可以做出响应
 
我知道这个,我想知道的是为什么会引发服务端的TServerSocket居然会引发TServerWinSocket.OnClientWrite事件,具体是如何实现的?我对TCP/IP协议的相关报文格式详细查看,也没有发现协议中有要求服务端提供数据的特别标记,怎么回事??????????????????
 
实际上是通过某些特定的 Tcp报文来实现的,
tcp像一条虚拟的电路,有他的控制信号,

你可以用网络嗅探的工具 如: sniffer等看一下,
他发送了什么报文
 
SO_SYNCHRONOUS_ALERT = $10;
SO_SYNCHRONOUS_NONALERT = $20;

字面的意思是,同步警报,和无同步警报
 
lich, 什么Tcp报文导致远程的套知晓对方的数据读需求啊??!
 
后退
顶部