c# TCP套接字不接收消息
c# TCP socket not receiving messages
我是 c# 套接字的新手,看不到我的代码中的问题。
我有一个 C++ 应用程序,当我的 C# 应用程序连接到它的套接字时,它会发送一系列 8 条消息。
我知道 c++ 应用程序可以工作,因为它已经在其他地方进行了测试。
这是我的 C# 套接字创建代码
m_tcpESSClient = new TcpClient(AddressFamily.InterNetwork);
m_tcpESSClient.ReceiveBufferSize = 4096;
m_tcpESSClient.BeginConnect(
IPAddress.Parse("127.0.0.01"),
8082,
new AsyncCallback(ConnectCallback2),
m_tcpESSClient);
这是连接回调
private void ConnectCallback2(IAsyncResult result)
{
m_tcpESSClient.EndConnect(result);
State state = new State();
state.buffer = new byte[m_tcpESSClient.ReceiveBufferSize];
state.offset = 0;
NetworkStream networkStream = m_tcpESSClient.GetStream();
networkStream.BeginRead(
state.buffer,
state.offset,
state.buffer.Length,
ReadCallback2,
state
);
}
这是读取回调
private void ReadCallback2(IAsyncResult result)
{
NetworkStream networkStream = m_tcpESSClient.GetStream();
int byteCount = networkStream.EndRead(result);
State state = result.AsyncState as State;
state.offset += byteCount;
// Show message received on UI
Dispatcher.Invoke(() =>
{
ListBox.Items.Add("Received ");
});
state.offset = 0;
networkStream.BeginRead(
state.buffer,
state.offset,
state.buffer.Length,
ReadCallback2,
state);
问题是c++应用程序发送的所有消息都没有收到。
请任何人看看我的套接字代码有什么问题。
TCP 没有消息的概念。 TCP 对流进行操作。
这意味着即使 C++ 应用程序可能会发出八个单独的 Write
调用,您也可能会通过单个 Read
(或需要多个 Read
来接收所有这些数据读取单个 Write
) 写入的数据。您添加到列表框中的项目与 C++ 应用程序发送给您的 "messages" 数量无关。
要真正识别单个消息,您需要在 TCP 流之上有一个基于消息的协议。您不能只依赖个人 Read
。在任何情况下,您都需要解析通过套接字接收到的数据。
我是 c# 套接字的新手,看不到我的代码中的问题。 我有一个 C++ 应用程序,当我的 C# 应用程序连接到它的套接字时,它会发送一系列 8 条消息。 我知道 c++ 应用程序可以工作,因为它已经在其他地方进行了测试。
这是我的 C# 套接字创建代码
m_tcpESSClient = new TcpClient(AddressFamily.InterNetwork);
m_tcpESSClient.ReceiveBufferSize = 4096;
m_tcpESSClient.BeginConnect(
IPAddress.Parse("127.0.0.01"),
8082,
new AsyncCallback(ConnectCallback2),
m_tcpESSClient);
这是连接回调
private void ConnectCallback2(IAsyncResult result)
{
m_tcpESSClient.EndConnect(result);
State state = new State();
state.buffer = new byte[m_tcpESSClient.ReceiveBufferSize];
state.offset = 0;
NetworkStream networkStream = m_tcpESSClient.GetStream();
networkStream.BeginRead(
state.buffer,
state.offset,
state.buffer.Length,
ReadCallback2,
state
);
}
这是读取回调
private void ReadCallback2(IAsyncResult result)
{
NetworkStream networkStream = m_tcpESSClient.GetStream();
int byteCount = networkStream.EndRead(result);
State state = result.AsyncState as State;
state.offset += byteCount;
// Show message received on UI
Dispatcher.Invoke(() =>
{
ListBox.Items.Add("Received ");
});
state.offset = 0;
networkStream.BeginRead(
state.buffer,
state.offset,
state.buffer.Length,
ReadCallback2,
state);
问题是c++应用程序发送的所有消息都没有收到。 请任何人看看我的套接字代码有什么问题。
TCP 没有消息的概念。 TCP 对流进行操作。
这意味着即使 C++ 应用程序可能会发出八个单独的 Write
调用,您也可能会通过单个 Read
(或需要多个 Read
来接收所有这些数据读取单个 Write
) 写入的数据。您添加到列表框中的项目与 C++ 应用程序发送给您的 "messages" 数量无关。
要真正识别单个消息,您需要在 TCP 流之上有一个基于消息的协议。您不能只依赖个人 Read
。在任何情况下,您都需要解析通过套接字接收到的数据。