C#Tcp异步套接字数据读取逻辑
我正在开发一个C#Tcp异步套接字服务器程序,它将简单地读取套接字数据并将其放入文件中。现在的问题是在发送实际的文件内容之前,我要发送客户端名称和文件名。请注意,我用下面的方式用C++ Smand()API从C++ MFC应用程序发送这些数据。p>C#Tcp异步套接字数据读取逻辑,c#,c++,sockets,C#,C++,Sockets,我正在开发一个C#Tcp异步套接字服务器程序,它将简单地读取套接字数据并将其放入文件中。现在的问题是在发送实际的文件内容之前,我要发送客户端名称和文件名。请注意,我用下面的方式用C++ Smand()API从C++ MFC应用程序发送这些数据。p> CString csInitData = "Client_Name | File_Name <EOF>"; send(hSocket, (LPCTSTR)csInitData, csInitData.GetLength(), 0); 对
CString csInitData = "Client_Name | File_Name <EOF>";
send(hSocket, (LPCTSTR)csInitData, csInitData.GetLength(), 0);
对于缓冲,听起来您需要
MemoryStream
:
// Somewhere to put the data:
// for simplicity, I'll assume an instance field is fine; could
// also be tracked via async-state object, if preferred
private MemoryStream backlog = new MemoryStream();
if (bytesRead > 0)
{
// we want to append, so move to the end
backlog.Position = backlog.Length;
// copy new data into the buffer
backlog.Write(state.dataBuffer, 0, bytesRead);
...
}
一般反馈:
- 不要在这里使用
;只要BinaryWriter
就可以了流
- 在文件流上使用
和
- 在字段中有一个缓存的委托实例,这样您就不需要每次
一个委托(如果将目标实例作为状态传递,这甚至可以是new
)static
- 使用
路径。组合
,最好提前一次,以避免大量字符串连接
- 检查同步完成情况;在回调中,检查
,如果CompletedSynchronously
,则立即退出;开始工作时,捕获true
,检查IAsyncResult
,如果CompletedSynchronously
true
- 考虑使用较新的异步API-
(不过这是一个相当重要的变化)ReceiveAsync
- 不要通过IO方法
MessageBox
MemoryStream
作为缓冲区,如果我能正确理解你的评论,那么我刚刚开始使用C。请给我看一个小样本。@hypheni的MemoryStream
缓冲区好吗?好的,请给我一点时间给editWell thaks,让我快速回复。我从中得到了一个例子。不过,若你们能提供一个,那个就太好了。不过,现在我不得不从内存缓冲区解析数据。我想知道。如何解析客户端发送的初始数据,并将其保存在服务器端的单个变量中。@hypheni在每次“接收”时将数据复制到MemoryStream
,直到结束:所有数据都在积压工作中。所以:从这里开始读吧。顺便说一句:读取并不是“初始数据”-它是所有的数据;如果套接字关闭,将永远不会收到更多数据。
// Somewhere to put the data:
// for simplicity, I'll assume an instance field is fine; could
// also be tracked via async-state object, if preferred
private MemoryStream backlog = new MemoryStream();
if (bytesRead > 0)
{
// we want to append, so move to the end
backlog.Position = backlog.Length;
// copy new data into the buffer
backlog.Write(state.dataBuffer, 0, bytesRead);
...
}