【发布时间】:2015-03-16 19:55:37
【问题描述】:
我正在开发一个 C# Tcp Async 套接字服务器程序,该程序将简单地读取套接字数据并将其放入文件中。现在的问题是在发送实际文件内容之前,我正在发送客户端名称和文件名。请注意,我通过以下方式使用简单的 send() API 从 C++ MFC 应用程序发送这些数据。
CString csInitData = "Client_Name | File_Name <EOF>";
send(hSocket, (LPCTSTR)csInitData, csInitData.GetLength(), 0);
现在我如何在异步回调函数下面接收这些数据?无法弄清楚字节分解逻辑。
public void OnDataReceived(IAsyncResult ar)
{
StateObject state = (StateObject)ar.AsyncState;
Socket clientSocket = state.m_currentSocket;
int bytesRead = clientSocket.EndReceive(ar);
if (bytesRead > 0)
{
//HERE I WANT TO RECEIVE THOSE DATA AND CREATE FOLDER AND FILE WITH THOSE NAMES RECEIVED FROM CLIENT
//Process 'state.dataBuffer'//DATA INSIDE THIS BYTE BUFFER
string fileName = ""; //FILE NAME SHOULD GO HERE
string folderName = ""; //CLIENT NAME SHOULD GO HERE
BinaryWriter writer;
if (!File.Exists(folderName+fileName))
{
Directory.CreateDirectory(folderName);
writer = new BinaryWriter(File.Open(folderName+fileName, FileMode.Create));
}
else
{
writer = new BinaryWriter(File.Open(folderName+fileName, FileMode.Append));
}
writer.Write(state.dataBuffer, 0, bytesRead);
writer.Flush();
writer.Close();
// Recursively receive the rest file.
try
{
clientSocket.BeginReceive(state.dataBuffer, 0, StateObject.BufferSize, 0, new AsyncCallback(OnDataReceived), state);
}
catch
{
if (!clientSocket.Connected)
{
MessageBox.Show("Catched from OnDataReceived!");
}
}
}
else
{
// Signal if all the file received.
}
}
【问题讨论】:
-
"无法确定字节分解逻辑。" - 你能更具体地说明你遇到的困难吗?有很多事情我会在这里做不同的事情,但我宁愿专注于你的主要问题。哪个是...?
-
当我从客户端套接字接收数据时,我想将字节以字符串的形式保存到
单个变量中,以便我可以进一步处理它并继续读取下一个套接字数据. -
字符串不适合二进制数据;如果我正确理解您的评论,我怀疑您只是想使用
MemoryStream作为缓冲区