C#Tcp异步套接字数据读取逻辑

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); 对

我正在开发一个C#Tcp异步套接字服务器程序,它将简单地读取套接字数据并将其放入文件中。现在的问题是在发送实际的文件内容之前,我要发送客户端名称和文件名。请注意,我用下面的方式用C++ Smand()API从C++ MFC应用程序发送这些数据。p>
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);

    ...         
}