我可以为您翻译文本。这篇文章涉及到C#异步套接字编程,作者参考了两个MSDN示例:服务器端和客户端。作者通过理解示例代码并使用其实现了自己的异步套接字。在示例中,服务器会检查是否出现了
如果我用我的部分替换原始部分,程序就会停止运行。 我猜测客户端在
还有其他好的示例代码吗?我只找到了这两个。
(证据。服务器应接收在线客户端并将它们放入循环缓冲区,从该缓冲区中读取和处理记录,并使用多个线程进行处理。) 编辑 如果我使用以下内容:
<EOF>
来确定数据流的结束并发送响应。作者想知道如何在不检查特殊文字的情况下确定数据流的结束。作者的想法是当bytesRead > 0
时调用handler.BeginReceive()
进行递归操作。具体内容请见以下:if (bytesRead > 0) {
// There might be more data, so store the data received so far.
state.sb.Append(Encoding.ASCII.GetString(
state.buffer,0,bytesRead));
// Check for end-of-file tag. If it is not there, read
// more data.
content = state.sb.ToString();
if (content.IndexOf("<EOF>") > -1) {
// All the data has been read from the
// client. Display it on the console.
Console.WriteLine("Read {0} bytes from socket. \n Data : {1}",
content.Length, content );
// Echo the data back to the client.
Send(handler, content);
} else {
// Not all data received. Get more.
handler.BeginReceive(state.buffer, 0, StateObject.BufferSize, 0,
new AsyncCallback(ReadCallback), state);
}
}
My idea
if (received > 0)
{
state.sb.Append(Encoding.ASCII.GetString(state.buffer, 0, received));
handler.BeginReceive(state.buffer, 0, StateObject.BufferSize, 0, new AsyncCallback(ReadCallback), state);
}
else
Send(handler, state.sb.ToString());
如果我用我的部分替换原始部分,程序就会停止运行。 我猜测客户端在
SendCallback()
中执行EndSend()
,并在StartClient()
中的receiveDone.WaitOne()
之后阻塞线程。我该怎么办?需要使用一个标记来确定流的结尾吗?还有其他好的示例代码吗?我只找到了这两个。
(证据。服务器应接收在线客户端并将它们放入循环缓冲区,从该缓冲区中读取和处理记录,并使用多个线程进行处理。) 编辑 如果我使用以下内容:
if (receive > 0)
state.sb.Append(Encoding.UTF8.GetString(state.buffer, 0, receive));
if (receive == StateObject.BufferSize)
state.listener.BeginReceive(state.buffer, 0, StateObject.BufferSize, SocketFlags.None, new AsyncCallback(ReceiveCallback), state);
else
Send(state.listener, state.sb.ToString());
一切看起来都很好,我猜。没问题吧?还是我漏了什么?
如果我将两个if组合起来,它又不起作用了。为什么?
if(receive > 0 || receive == StateObject.BufferSize)
-> if(receive > 0) // 不起作用。