1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071 |
- using System;
- using System.Collections.Generic;
- using System.Linq;
- using System.Net;
- using System.Net.Sockets;
- using System.Runtime.InteropServices;
- using System.Text;
- using SuperSocket.Common;
- using SuperSocket.SocketBase;
- using SuperSocket.SocketBase.Command;
- using SuperSocket.SocketBase.Logging;
- using SuperSocket.SocketBase.Protocol;
- namespace SuperSocket.SocketEngine
- {
- abstract class TcpSocketServerBase : SocketServerBase
- {
- private readonly byte[] m_KeepAliveOptionValues;
- private readonly byte[] m_KeepAliveOptionOutValues;
- private readonly int m_SendTimeOut;
- private readonly int m_ReceiveBufferSize;
- private readonly int m_SendBufferSize;
- public TcpSocketServerBase(IAppServer appServer, ListenerInfo[] listeners)
- : base(appServer, listeners)
- {
- var config = appServer.Config;
- uint dummy = 0;
- m_KeepAliveOptionValues = new byte[Marshal.SizeOf(dummy) * 3];
- m_KeepAliveOptionOutValues = new byte[m_KeepAliveOptionValues.Length];
- //whether enable KeepAlive
- BitConverter.GetBytes((uint)1).CopyTo(m_KeepAliveOptionValues, 0);
- //how long will start first keep alive
- BitConverter.GetBytes((uint)(config.KeepAliveTime * 1000)).CopyTo(m_KeepAliveOptionValues, Marshal.SizeOf(dummy));
- //keep alive interval
- BitConverter.GetBytes((uint)(config.KeepAliveInterval * 1000)).CopyTo(m_KeepAliveOptionValues, Marshal.SizeOf(dummy) * 2);
- m_SendTimeOut = config.SendTimeOut;
- m_ReceiveBufferSize = config.ReceiveBufferSize;
- m_SendBufferSize = config.SendBufferSize;
- }
- protected IAppSession CreateSession(Socket client, ISocketSession session)
- {
- if (m_SendTimeOut > 0)
- client.SendTimeout = m_SendTimeOut;
- if (m_ReceiveBufferSize > 0)
- client.ReceiveBufferSize = m_ReceiveBufferSize;
- if (m_SendBufferSize > 0)
- client.SendBufferSize = m_SendBufferSize;
- if (!Platform.SupportSocketIOControlByCodeEnum)
- client.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.KeepAlive, m_KeepAliveOptionValues);
- else
- client.IOControl(IOControlCode.KeepAliveValues, m_KeepAliveOptionValues, m_KeepAliveOptionOutValues);
- client.NoDelay = true;
- client.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.DontLinger, true);
- return this.AppServer.CreateAppSession(session);
- }
- protected override ISocketListener CreateListener(ListenerInfo listenerInfo)
- {
- return new TcpAsyncSocketListener(listenerInfo);
- }
- }
- }
|