2009-12-28 4 views
0

J'ai un serveur UDP que j'ai été d'essayer d'envoyer des structures en utilisant la méthode envoyer() .. Pas de chance jusqu'à présent ...Comment envoyer une classe via une connexion socket UDP?

C'est ce que je suis en utilisant:

H, G sont des structures. ..

côté émetteur:

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

et sur le côté du récepteur:

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

Mais je reçois cette erreur:

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

« UdpClientSample » se trouve être le titre du programme client qui envoie les données au serveur ... Je me demande donc si cela prend plus de sérialisation être en mesure d'envoyer une structure via une connexion UDP?

Y a-t-il une percée qui explique ce que dit Iamamac?

+0

Que voulez-vous dire envoyer une classe?Voulez-vous le sérialiser et l'envoyer via un accès distant? – GrayWizardx

+1

@Y_Y: vous pouvez envisager de ne pas le faire jusqu'à ce que vous ayez appris la différence entre une classe et une instance. –

+1

Ouais .. Sérialiser ... –

Répondre

2

Je ne vois pas tout le code, mais je suppose que le serveur et le client est deux fichiers exécutables différents, et la classe ClientAnswerStruct est définie deux fois dans les deux côtés. Lorsque le destinataire désérialise les données, il tente de reconstruire un objet ClientAnswerStruct mais ne trouve pas sa définition (Notez qu'il est défini du côté de l'expéditeur, bien que du côté du destinataire il y ait une classe nommée ClientAnswerStruct, mais elles ne sont pas identiques) . La meilleure façon de procéder est de définir la classe ClientAnswerStruct dans une bibliothèque de classes autonome et de laisser le code du serveur et du client l'inclure ('ajouter une référence' dans la terminologie C#).

+0

Vous avez deviné juste! –

+0

Que faire si après avoir sérialisé la structure, l'enregistrer dans un fichier et envoyer le fichier au client? Le client serait-il capable de lire et de dé-sérialiser? –

+1

@Y_Y Juste le sérialiser et envoyer le tableau d'octets. La clé ici est de s'assurer que le client est capable de trouver la définition de la structure. Ce que vous devez faire est de mettre la définition dans un projet dll autonome, et de faire référence aux projets du serveur et du client. – iamamac

0

Je recommanderais de clarifier votre question un peu. . . Je suppose que vous essayez d'utiliser la fonction suivante en C ou C++?

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

Faites-nous savoir ce problème spécifique que vous rencontrez, tels que: les messages d'erreur, exemple de code qui ne fonctionne pas, etc.

Si vous parlez de C++, qu'un struct est une classe, sauf dans une structure, tous les membres sont publics par défaut. Techniquement (mais surtout) vous n'envoyez pas de classe ou de struct, mais une instance d'un objet ou d'un type de données primitif.

-bn

+0

Je reçois cette erreur: Impossible de trouver l'assembly 'UdpClientSample, Version = 1.0.0.0, Culture = neutre, PublicKeyToken = null'. –

0

Comme lamamac déjà dit, cela ne semble pas être un problème de votre code ou des fonctions que vous utilisez. C'est juste que vous avez ajouté une référence à votre application appelée UdpClientSample mais lorsque vous démarrez votre application, il ne trouve pas l'application nécessaire.

La première méthode la plus simple pour résoudre ce problème consiste à sélectionner la référence dans votre projet, cliquez avec le bouton droit de la souris, sélectionnez les propriétés et définissez la propriété Copier local à true.

Si l'application démarre maintenant vous devriez faire exécuter une réflexion sur la load order ou using AssemblyResolve ou using ILMerge

Questions connexes