2013-01-16 1 views
0

Je veux recevoir des octets dans un tableau de client tcp. J'ai un tableau d'octets dataToRecieve, dans lequel je reçois ces octets.recevoir des octets dans un tableau à partir du client tcp dans C#

Mais j'ai quelques problèmes ici, quelqu'un peut-il vérifier mon code:

while (true) { 
    try {       
     Socket handler = mainSocket.Accept(); 
     byte[] dataToRecieve = new byte[handler.ReceiveBufferSize]; 
     int[] dataArray = new int[1024]; 
     handler.Receive(dataToRecieve); 
     //////SOME CODE 
     int i = handler.Send(msg); 
     handler.Shutdown(SocketShutdown.Both); 
     handler.Close(); 
    } 
catch(Exception) {} 
--------//////some code 

Maintenant, je veux recevoir des octets dans un tableau d'octets & que le convertir dans le tableau int (mais les données doivent être un tableau int) ........

+0

quel problème avez-vous? –

+0

Un problème immédiat - vous ne regardez pas la valeur de retour pour ['Socket.Receive'] (http://msdn.microsoft.com/en-us/library/8s4y8aff.aspx). Vous n'êtes pas ** garanti ** qu'un appel à 'Send()' à une extrémité, avec un nombre d'octets particulier, entraînera un appel à 'Receive()' gagnant le même nombre d'octets. –

Répondre

0

Eh bien, votre code a déjà un problème ici:

handler.Receive(dataToRecieve); 

Vous ne tenez pas compte de la valeur retournée par Receive, pour vous dire combien d'octets ont été réellement lus. C'est presque toujours une mauvaise idée. De même, vous supposez que vous recevez toutes les informations dont vous avez besoin en un seul appel. Habituellement, vous deviez soit boucler jusqu'à ce que vous ayez lu toutes les données - soit en sachant que vous attendiez un certain montant, soit en lisant jusqu'à ce que soit plus de données.

Une fois que vous avez les données dans un tableau d'octets, la conversion en un tableau d'entiers dépend du format dans le tableau d'octets. Vous pouvez être en mesure d'utiliser simplement Buffer.BlockCopy, mais c'est seulement si l'endianness dans le tableau d'octets correspond à l'endianness en mémoire. Sinon, vous pouvez simplement créer un tableau de la bonne taille, et d'écrire une boucle:

int[] integers = new byte[size/4]; 
for (int i = 0; i < integers.Length; i++) 
{ 
    integers[i] = BitConverter.ToInt32(bytes, i * 4); 
} 

Cependant, encore une fois que vous devez considérer le boutisme. Ma bibliothèque MiscUtil a une classe EndianBitConverter qui vous permet de spécifier l'endianness de vos données.

Questions connexes