2013-04-12 28 views
0

下面是我在做什麼。基本上我有一些代碼在Linux C處理一堆數據,然後我需要發送到一個C#應用程序,可以在「實時」圖形數據圖形。所以我在做的是將數據保存到一個文件中,讓C#應用程序只是監視文件更改,然後更新圖形。但那真的不是那麼好。該文件正在閱讀,它正在改變更多,而不是隻是沒有樂趣。所以在聽取了一些有幫助的人們的建議後,我決定了解如何使用套接字發送數據。插座到Windows C#發出

因此,這裏是我現在正在做什麼。 C中的進程數據使用套接字發送給C#。完全可以工作。但這是問題。我需要在發送信息後使用usleep(10000),或者使用getchar()並緩慢發送每個值。否則,我會嘗試將發送的值轉換爲double。

錯誤讀取「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個不同的插座等每一個不同的端口號,所以我知道哪一個是收到的數據?對於noob問題抱歉。我試圖自己學習這些東西。我仍然在學校,甚至還沒有學到任何東西,甚至遠程類似。

回答

2

TCP套接字流。他們沒有消息的概念。當您發送速度過快時,會在一次呼叫中收到幾個發送呼叫,這會導致嘗試解析幾個號碼的部分。

我建議您選擇這些選項之一:

  1. 添加在每個樣本之間的分隔符。
  2. 使用基於消息而不是基於流的協議。
  3. 編寫固定大小的消息。例如,只需發送double的原始8字節並使用BinaryReader來讀取它們。
+0

感謝您的答覆。這些方法之一是否比另一種更好?在我看來,添加分隔符是最簡單的,但也許不是最好的方法。 –

+0

在這方面有許多學派。我個人會選擇#3,但請記住,沒有爲C指定native double的格式,所以如果您直接寫出字節,C程序可能無法移植到其他平臺。 –

+0

哦,它也是有意義的,每個圖表將有自己的套接字端口號?我不知道如何告訴哪個圖表應該接收什麼信息。 –