0

我有一个 UDP 服务器,我正在尝试使用 send() 方法发送结构.. 到目前为止没有运气......

这就是我正在使用的:

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 所说的吗?

4

3 回答 3

2

没有看到完整的代码,但是我猜测服务端和客户端是两个不同的可执行文件,并且类在两边都ClientAnswerStruct定义了两次。当接收方反序列化数据时,它试图重构一个ClientAnswerStruct对象但找不到它的定义(注意它是在发送方定义的。虽然在接收方有一个名为的类ClientAnswerStruct,但它们并不相同)。

正确的方法是ClientAnswerStruct在独立的类库中定义类,并让服务器和客户端代码包含它(C# 术语中的“添加引用”)。

于 2009-12-28T07:00:49.870 回答
0

我建议稍微澄清一下你的问题。. . 我假设您正在尝试在 C 或 C++ 中使用以下函数?

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

让我们知道您遇到的具体问题,例如:错误消息、不起作用的示例代码等。

如果您在谈论 C++,那么结构是一个类,除了结构中的所有成员默认情况下都是公共的。从技术上讲(但重要的是),您发送的不是类或结构,而是对象或原始数据类型的实例。

-bn

于 2009-12-28T06:01:49.690 回答
0

正如 lamamac 已经说过的,这似乎不是您使用的代码或函数的问题。只是您添加了对名为UdpClientSample的应用程序的引用,但是当您启动应用程序时,它找不到所需的应用程序。

解决这个问题的第一个最简单的方法是在你的项目中选择引用,右键单击它,选择属性并将属性Copy Local设置为 true。

如果应用程序现在开始运行,您应该考虑加载顺序使用 AssemblyResolve使用 ILMerge

于 2009-12-28T08:17:13.380 回答