2009-12-28 149 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