2009-12-28 156 views
0

我有,我正在嘗試使用send()方法..至今沒有運氣發送結構一個UDP服務器...如何通過UDP套接字連接發送課程?

這是我在用的:

H,G是結構。 ..

發送側:

IFormatter formatter = new BinaryFormatter(); 
MemoryStream stream = new MemoryStream(); 
formatter.Serialize(stream, H); 
Byte[] buffer = stream.ToArray(); 
stream.Close(); 

和在接收器側:

IFormatter formatter = new BinaryFormatter(); 
Stream s = new MemoryStream(buffer.Data); 
ClientAnswerStruct G = (ClientAnswerStruct)formatter.Deserialize(s); 
s.Close(); 
MessageBox.Show(G.name); 

但我得到這個錯誤:

Unable to find assembly 'UdpClientSample, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null'. 

「UdpClientSample」恰好是正在發送數據到服務器的客戶端程序的標題。所以我想知道如果它超過系列化能夠通過UDP連接發送結構嗎?

在那裏有解釋Iamamac說什麼的突破嗎?

+0

你是什麼意思發送一類的思想?你想序列化並通過遠程發送? – GrayWizardx 2009-12-28 05:16:53

+1

@Y_Y:你可能要考慮不這樣做,直到你瞭解到一個類和一個實例之間的差異。 – 2009-12-28 05:25:06

+1

是的..序列化... – 2009-12-28 05:25:39

回答

2

我沒有看到整個代碼,但我想在服務器和客戶端是兩個不同的可執行文件,並ClientAnswerStruct類在兩側形成兩次。當接收器對數據進行反序列化時,它會嘗試重建一個ClientAnswerStruct對象,但找不到它的定義(請注意,它是在發送端定義的,儘管在接收端有一個名爲ClientAnswerStruct的類,但它們並不相同) 。

正確的做法是在獨立類庫中定義ClientAnswerStruct類,並讓服務器和客戶端代碼包含它(C#術語中的「添加引用」)。

+0

你猜對了! – 2009-12-28 20:49:43

+0

如果我在序列化結構後將其保存到文件中並將文件發送到客戶端會怎麼樣?客戶能夠讀取和反序列化嗎? – 2009-12-28 21:17:39

+1

@Y_Y只需將其序列化併發送字節數組。這裏的關鍵是確保客戶能夠找到結構的定義。你需要做的是把定義放在一個獨立的dll項目中,並讓服務器和客戶端項目引用它。 – iamamac 2009-12-29 04:06:27

0

我會建議澄清一下你的問題。 。 。我假設你試圖在C或C++中使用以下函數?

ssize_t send(int socket, const void *buffer, size_t length, int flags);

讓我們知道您有什麼具體的問題,比如:錯誤信息,不工作的示例代碼等

如果你談論的是C++,比結構是一類除在一個結構中,所有成員默認都是公共的。技術上(但重要的是)你不是發送一個類或一個結構體,而是一個對象或原始數據類型的實例。

-bn

+0

我收到此錯誤: 無法找到程序集'UdpClientSample,Version = 1.0.0.0,Culture = neutral,PublicKeyToken = null'。 – 2009-12-28 06:27:44

0

lamamac已經告訴,這似乎不是你使用的代碼或函數的問題。這只是你添加了一個名爲UdpClientSample的應用程序的引用,但是當你啓動你的應用程序時,它找不到所需的應用程序。

解決此問題的第一個最簡單的方法是在項目中選擇參考,右鍵單擊它,選擇屬性並將複製本地設置爲true。

如果應用程序現在開始運行,你應該做一個關於load orderusing AssemblyResolveusing ILMerge