0

这就是我正在做的事情。基本上,我在 linux C 中有一些代码处理一堆数据,然后我需要将这些数据发送到可以“实时”绘制数据的 C# 应用程序。所以我所做的就是将数据保存到一个文件中,让 C# 应用程序只监视文件更改,然后更新图表。但这真的没有那么好。该文件正在读取它正在更频繁地更改而不是它并不有趣。因此,在听取了一些有用的人的建议后,我决定学习如何使用套接字发送数据。

这就是我现在正在做的事情。C 中的处理数据使用套接字内容发送到 C#。完全有效。但问题就在这里。我需要在发送信息后使用 usleep(10000) ,或者使用 getchar() 并慢慢发送每个值。否则,我在尝试将发送的值转换为双精度时出现错误。

错误读取“System.FormatException:输入字符串的格式不正确。在 System.Number.ParseDouble(字符串值,NumberStyles 选项,NumberFormatInfo numfmt)。

sprintf(line, "%.4f", value[i][j]);
write(sock, line, 128);
usleep(10000);

C# 代码取自此处的示例:http: //www.codeproject.com/Articles/463947/Working-with-Sockets-in-Csharp

问题在这里:

content = Encoding.ASCII.GetString(buffer, 0, bytesRead);
chart4.Series["Graph"].Points.Add(Convert.ToDouble(content.ToString()));  

那么为什么当我在发送数据后暂停时它会起作用,但如果我不暂停就发送它就不行呢?我发送的太快了吗?

另外,如果我有 4 个不同的图表需要接收恒定的数据流,我应该有 4 个不同的套接字,每个套接字都有不同的端口号,这样我就知道哪个正在接收数据?对不起菜鸟问题。我正在尝试自己学习这些东西。我还在上学,还没有学到任何类似的东西。

4

1 回答 1

2

TCP 套接字是流。他们没有消息的概念。当您发送太快时,一个呼叫中会收到多个发送呼叫,这会导致尝试解析多个号码的一部分。

我建议您选择以下选项之一:

  1. 在每个样本之间添加分隔符。
  2. 使用基于消息而不是基于流的协议。
  3. 编写固定大小的消息。例如,只需发送原始的 8 个字节double并使用 aBinaryReader来读取它们。
于 2013-04-12T15:17:29.003 回答