1,593
社区成员
发帖
与我相关
我的任务
分享
procedure TServerSockMaster.gOnAccept(Socket: TCustomWinSocket);
var
SocketExt: TSocketExt;
ABuffer: TSockBuffer;
begin
Lock;
try
{$IFDEF DEBUG_SOCKET_MASTER}
LogDebug(Format('SockMaster: Accept socket from IP: %s, Port: %u', [Socket.RemoteAddress, Socket.RemotePort]));
{$ENDIF}
if FSocketList.Count >= FSocketMax then
begin
{$IFDEF DEBUG_SOCKET_MASTER}
LogDebug(Format('SockMaster: Socket count over %u, close it.', [FSocketMax]));
{$ENDIF}
Socket.Close;
Exit;
end;
// Use idle sokcet.
if FIdleSocket.Count <> 0 then
begin
SocketExt := FIdleSocket.Items[0];
FIdleSocket.Delete(0);
SocketExt.FSocket := Socket;
SocketExt.FCreateTime := Now;
SocketExt.FLastRecv := 0;
end else
SocketExt := TSocketExt.Create(Socket);
if SocketExt <> nil then
begin
FSocketList.Add(SocketExt);
// Post message to main form to notify socket connected.
ABuffer := FBufferMaster.GetBuf;
Assert(ABuffer <> nil);
ABuffer.FSocketHanlde := Socket.Handle;
ABuffer.FRemoteIP := Socket.RemoteAddress;
ABuffer.FRemotePort := Socket.RemotePort;
PostMessage(FHD_RECV, FWM_MSG_STATE, Integer(True), Integer(ABuffer));
{$IFDEF DEBUG_SOCKET_MASTER}
LogDebug(Format('SockMaster: SocketExt Count is %u', [FSocketList.Count]));
{$ENDIF}
end
else
begin
{$IFDEF DEBUG_SOCKET_MASTER}
LogDebug('SockMaster: Create SocketExt failed, Close it');
{$ENDIF}
Socket.Close;
end;
finally
Unlock;
end;
end;
procedure TServerSockMaster.gOnDisconnect(Socket: TCustomWinSocket);
var
ASocketExt: TSocketExt;
Index: Integer;
ABuffer: TSockBuffer;
begin
Lock;
try
{$IFDEF DEBUG_SOCKET_MASTER}
LogDebug(Format('SockMaster: Disconnect socket from IP: %s, Port: %u', [Socket.RemoteAddress, Socket.RemotePort]));
{$ENDIF}
ASocketExt := Lookup(Socket.Handle);
if ASocketExt = nil then
begin
{$IFDEF DEBUG_SOCKET_MASTER}
LogDebug(Format('SockMaster: Socket from IP: %s, Port: %u Disconnect, but can''t find it in local',
[Socket.RemoteAddress, Socket.RemotePort]));
{$ENDIF}
Exit;
end;
// Delete socketext from working-socket list.
Index := FSocketList.IndexOf(ASocketExt);
Assert(Index <> -1);
FSocketList.Delete(Index);
Assert(ASocketExt <> nil);
// Add socketext to idle list.
ASocketExt.FSocket := nil;
ASocketExt.FCreateTime := 0;
FIdleSocket.Add(ASocketExt);
// Post message to main form to notify socket disconnected.
ABuffer := FBufferMaster.GetBuf;
Assert(ABuffer <> nil);
ABuffer.FSocketHanlde := Socket.Handle;
ABuffer.FRemoteIP := Socket.RemoteAddress;
ABuffer.FRemotePort := Socket.RemotePort;
PostMessage(FHD_RECV, FWM_MSG_STATE, Integer(False), Integer(ABuffer));
finally
Unlock;
end;
end;
procedure TServerSockMaster.gOnClientError(Socket: TCustomWinSocket;
ErrorEvent: TErrorEvent; var ErrorCode: Integer);
begin
Lock;
LogWarn(Format('Socket(%s:%d) ErrorEvent %u, ErrorCode = %u', [
Socket.RemoteAddress, Socket.RemotePort, Integer(ErrorEvent), ErrorCode]));
try
ErrorCode := 0;
Socket.Close;
finally
Unlock;
end;
end;
procedure TServerSockMaster.gOnRead(Socket: TCustomWinSocket);
var
ABuffer: TSockBuffer;
RecvLength: Integer;
ASocketExt: TSocketExt;
Buf: array[0..BUFFER_SIZE-1] of Byte;
begin
Lock;
try
ASocketExt := Lookup(Socket.Handle);
if ASocketExt <> nil then
ASocketExt.FLastRecv := Now;
if FSockMode = SOCK_MSG_MOD_PCK then
begin
RecvLength := Socket.ReceiveLength;
if RecvLength = 0 then
Exit;
ABuffer := FBufferMaster.GetBuf;
Assert(ABuffer <> nil);
if RecvLength > SizeOf(ABuffer.FBuffer) then
begin
{$IFDEF DEBUG_SOCKET_MASTER}
LogError(Format('SockMaster: Recv Data from (%s:%u), Length is %u over %u, close it',
[Socket.RemoteAddress, Socket.RemotePort, RecvLength, SizeOf(ABuffer.FBuffer)]));
{$ENDIF}
// TODO: 必须释放缓冲区
FBufferMaster.PutBuf(ABuffer);
Socket.Close;
Exit;
end;
ABuffer.FLength := RecvLength;
Socket.ReceiveBuf(ABuffer.FBuffer, RecvLength);
ABuffer.FRemoteIP := Socket.RemoteAddress;
ABuffer.FRemotePort := Socket.RemotePort;
ABuffer.FSocketHanlde := Socket.Handle;
{$IFDEF DEBUG_SOCKET_MASTER}
LogDebug(Format('SockMaster: Recv Data from (%s:%u), Length is %u',
[Socket.RemoteAddress, Socket.RemotePort, RecvLength]));
{$ENDIF}
{$IFDEF DEBUG_DUMP}
dump(PChar(@ABuffer.FBuffer[0]), ABuffer.FLength);
{$ENDIF}
// 向接收句柄发送消息
Assert(FHD_RECV <> 0);
Assert(FWM_MSG_RECV <> 0);
if (FHD_RECV <> 0) and (FWM_MSG_RECV <> 0) then
PostMessage(FHD_RECV, FWM_MSG_RECV, 0, Integer(ABuffer));
end
else if FSockMode = SOCK_MSG_MOD_STREAM then
begin
if ASocketExt <> nil then
begin
if Socket.ReceiveLength > 0 then
begin
RecvLength := Socket.ReceiveBuf(Buf, SizeOf(buf));
ASocketExt.FRingBuffer.WriteBuffer(Buf, RecvLength);
recvParse(ASocketExt);
end;
end;
end;
finally
Unlock;
end;
end;