【发布时间】:2012-02-17 01:54:36
【问题描述】:
我有一个简单的 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 个问题:
1 我需要“收集”所有 100 个字节,然后将其传递给另一个函数,该函数将检查接收到的数据中的命令。客户端在数据包末尾添加 4 个字节的“数据包结束标识符”,因为数据大小并不总是事先知道的。我如何/在哪里可以定义这个临时缓冲区,所以 onDataRecieve 会填满它,如果找到 end ,将数据传递给命令识别函数?
2 客户端可能会从不同线程(在同一连接上)向我发送大量数据。我需要一种方法来为每个收到的数据包设置多个临时缓冲区,这样我就可以等到它们填满并将缓冲区先填满的那个传递给命令识别功能,然后清除/删除缓冲区。
例如:
- 客户端(线程/数据包#1)->服务器(数据不完整,线程由于某种原因挂起)
- 客户端(线程/数据包#2)->服务器(完整数据,缓冲区被传递到命令 ID 函数)
- 客户端(线程/数据包#1)->服务器(第一个数据包的其余数据到达,缓冲区传递给命令 id func)
3我需要能够从外部(公共)访问此缓冲区,以便在其他类填满时开始使用该缓冲区。
我希望这是有道理的。我怎样才能做到这一点?
【问题讨论】:
-
谁能给我指出正确的方向。我找不到任何这样做的例子。
标签: c# asynchronous