私は、非同期ソケットを使用する単純なTCPサーバーを持っています。私が直面してるの挑戦はこれです:マルチスレッドソケットサーバー - データを受信
私は、次のTCPサーバのクラスを持っている:
public class tcp_server {
const int max_clients = 300;
const int max_buffer_size = 10;
public AsyncCallback pfnWorkerCallBack;
private Socket m_mainSocket;
private Socket[] m_workerSocket = new Socket[max_clients];
private int m_clientCount = 0;
...
public void OnClientConnect(IAsyncResult asyn) { }
public void WaitForData(System.Net.Sockets.Socket soc, int socket_id) { }
public void OnDataReceived(IAsyncResult asyn)
public class SocketPacket
{
public System.Net.Sockets.Socket m_currentSocket;
public byte[] dataBuffer = new byte[max_buffer_size];
public int socket_id = -1;
}
}
ここOnDataRecieved関数の完全なコードは次のとおりです。
public void OnDataReceived(IAsyncResult asyn)
{
try
{
SocketPacket socketData = (SocketPacket)asyn.AsyncState; // cast
int iRx = 0;
iRx = socketData.m_currentSocket.EndReceive(asyn);
char[] chars = new char[iRx + 1];
System.Text.Decoder d = System.Text.Encoding.UTF8.GetDecoder();
int charLen = d.GetChars(socketData.dataBuffer, 0, iRx, chars, 0);
WaitForData(socketData.m_currentSocket, socketData.socket_id);
}
catch (ObjectDisposedException)
{
log("OnDataReceived: Socket has been closed\n");
}
catch (SocketException se)
{
log(se.Message);
}
}
max_buffer_sizeは10に設定されていますサーバーに100バイトを送信すると、onDataRecieveは10回実行されます。
私は3つの問題を抱えて:
私はすべて100バイト「を集める」と、受信したデータ内のコマンドをチェックします別の関数に渡す必要があります。データサイズが常に事前にわかっているわけではないので、クライアントはパケットの最後に4バイトの 'パケットエンド識別子'を追加する。どのように/どこでこの一時バッファを定義することができますか?そのため、onDataRecieveはそれを埋めるでしょう。もし見つかったら、データをコマンド識別関数に渡しますか?
クライアントは、(同じ接続上の)別のスレッドから多くのデータを送信することがあります。受信したパケットごとに複数の一時バッファを用意する方法が必要です。バッファをいっぱいになるまで待ってから、コマンド識別機能を満たしてからバッファをクリア/削除します。例えば
:
- クライアント(スレッド/パケット#1) - >サーバ(不完全なデータ、スレッドが何らかの理由でハング)
- クライアント(スレッド/パケット#2) - >サーバ(完全データ、バッファをID FUNCTをコマンドに渡されます)
- クライアント(スレッド/パケット#1) - >サーバー(第一パケットのデータの残りの部分は、ID funcをコマンドに渡されるバッファに到着)
外部(public)からこのバッファにアクセスできるようにする必要があります。そのバッファがいっぱいになってから別のクラスのバッファを使い始めることができます。
私はそれが理にかなっていると思います。どうすればこれを達成できますか?
誰でも少なくとも正しい方向で私を指し示すことができます。私はこれを行う例を見つけることができません。 – user1002194