私はこれに少し立ち往生しています...
シナリオ:
VL64 などの文字列でエンコードされたコード化されたデータを送受信するためのソケット処理ゲーム エミュレーター。約 4000 のソケット リクエストなどをサポートする必要があります。
現時点では、AsyncCallback を使用して非同期サーバーの役割などを実行しています。
コード:
private static SnowTcpListener mServer;
mServer = new SnowTcpListener(new IPEndPoint(IPAddress.Any, "IP"), backlog, new OnNewConnectionCallback(SessionManager.HandleIncomingConnection));
Backlog は、Socket バックログの int です。
SnowTcpListener
/// <summary>
/// Callback to be invoked upon accepting a new connection.
/// </summary>
/// <param name="Socket">Incoming socket connection</param>
public delegate void OnNewConnectionCallback(Socket Socket);
/// <summary>
/// Reality simple asynchronous TCP listener.
/// </summary>
public class SnowTcpListener : IDisposable // Snow prefix to avoid conflicts with System.Net.TcpListener
{
private Socket mSocket;
private OnNewConnectionCallback mCallback;
public SnowTcpListener(IPEndPoint LocalEndpoint, int Backlog, OnNewConnectionCallback Callback)
{
mCallback = Callback;
mSocket = new Socket(LocalEndpoint.AddressFamily, SocketType.Stream, ProtocolType.Tcp);
mSocket.Bind(LocalEndpoint);
mSocket.Listen(Backlog);
BeginAccept();
}
public void Dispose()
{
if (mSocket != null)
{
mSocket.Dispose();
mSocket = null;
}
}
private void BeginAccept()
{
try
{
mSocket.BeginAccept(OnAccept, mSocket);
}
catch (Exception) { }
}
private void OnAccept(IAsyncResult Result)
{
try
{
Socket ResultSocket = (Socket)mSocket.EndAccept(Result);
mCallback.Invoke(ResultSocket);
}
catch (Exception) { }
BeginAccept();
}
SessionManager.HandleIncomingConnection:
public static void HandleIncomingConnection(Socket IncomingSocket)
{
bool Reject = ModerationBanManager.IsRemoteAddressBlacklisted(IncomingSocket.RemoteEndPoint.ToString().Split(':')[0]);
Output.WriteLine((Reject ? "Rejected" : "Accepted") + " incoming connection from " + IncomingSocket.RemoteEndPoint.ToString() + ".",
OutputLevel.Informational);
if (Reject)
{
try
{
IncomingSocket.Close();
}
catch (Exception) { }
return;
}
lock (mSyncRoot)
{
uint Id = mCounter++;
mSessions.Add(Id, new Session(Id, IncomingSocket));
}
}
そして、新しい「セッション」を作成します
public Session(uint Id, Socket Socket)
{
mId = Id;
mSocket = Socket;
mBuffer = new byte[512];
mPongOk = true;
mSocket.SendBufferSize = 512;
BeginReceive();
}
どの int が BeginRecieve() を呼び出すか
private void BeginReceive()
{
try
{
if (mSocket != null)
{
//TODO: BeginRecieve();
mSocket.BeginReceive(mBuffer, 0, mBuffer.Length, SocketFlags.None, new AsyncCallback(OnReceiveData), mSocket);
}
}
catch (Exception)
{
SessionManager.StopSession(mId);
}
}
OnRecieveData()
private void OnReceiveData(IAsyncResult Result)
{
int ByteCount = 0;
try
{
if (mSocket != null)
{
ByteCount = mSocket.EndReceive(Result);
}
}
catch (Exception) { }
if (ByteCount < 1 || ByteCount >= mBuffer.Length)
{
SessionManager.StopSession(mId);
return;
}
ProcessData(ByteUtil.ChompBytes(mBuffer, 0, ByteCount));
BeginReceive();
}
さらにコードが必要な場合は、お問い合わせください。
接続が別のスレッドになるように作成するにはどうすればよいですか、または特定の量のセッションに到達して遅れているだけのように、ソケットのエクスペリエンスをどのように改善しますか。バッファを増やそうとしましたが、悪化しました。
私は今、私のテザーの終わりに来ました.私は考えることができるほとんどすべてを試しました.
この非常に長い投稿をお読みいただきありがとうございます。質問が明確でない場合は、わかりやすくしてください。
乾杯マイク