2009-05-08 9 views
1

J'ai ce morceau de code qui reçoit une série de messages:Socket recevant uniquement une partie du message C#

byte[] buffer = new byte[10240]; 
//... 
sock.Receive(buffer); 
string response = message(buffer); 
Console.WriteLine("Message Recieved"); 
if (!verifyUser(response, sock)) 
Console.WriteLine("User Invalid"); 
//... 
static private bool verifyUser(string userString, Socket sock) 
{ 
    string[] userData = userString.Split(' '); 
    int i = 0; 
    while (true) 
    { 
     if (userData[0].ToUpper() != "USER") 
     { 
      byte[] buffer = message("WHO"); 
      sock.Send(buffer); 
      userData = userString.Split(' '); 
      i++; 
      if (i > 4) 
      { 
         return false; 
        } 
        continue; 
       } 
       else 
        break; 
      } 
Console.WriteLine("Connection recieved from " + userData[1] + " with hash of "/* + userData[2]*/); 
} 

Le problème que je vais avoir est que si je soumets le nom d'utilisateur unkwntech tout ce qui s'affiche, il unkwnt, et la deuxième valeur ne semble jamais arriver là. l'application d'envoyer les données ressemble à ceci:

static void Main(string[] args) 
     { 
      Socket sock = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.IP); 
      EndPoint remoteEP = new IPEndPoint(IPAddress.Parse("127.0.0.1"), 200); 
      sock.Connect(remoteEP); 
      byte[] buffer = Encoding.ASCII.GetBytes("USER unkwntech a3f5h4a35sfg");//Made up hash 
      sock.Send(buffer); 
      sock.Receive(buffer); 
      Console.WriteLine(Encoding.ASCII.GetString(buffer)); 
      Console.ReadLine(); 
     } 
+0

Pourriez-vous afficher la définition de la fonction "message"? Avez-vous débogué l'application? Quand les données sont-elles perdues? –

Répondre

7

Vous êtes en supposant que lorsque vous envoyez, toutes les données se retrouvent dans un seul paquet, et que vous recevrez toutes les données en une seule fois à l'autre bout. Ce n'est pas comme ça que fonctionne TCP/IP. C'est un protocole de streaming - vous ne devriez jamais faire d'hypothèses sur la quantité de données que vous recevrez à la fois.

Fondamentalement, vous devez lire dans le flux jusqu'à ce que vous ayez lu toutes les données et que le socket ait été fermé, ou jusqu'à ce que vous ayez "assez" de données. Si vous contrôlez le protocole et qu'il s'agit d'un protocole conversationnel, cela rend la vie beaucoup plus facile si chaque message que vous envoyez est préfixé par sa longueur - cela signifie que l'autre extrémité sait combien de données il faut attendre.

1

Vérifiez la valeur de retour de votre appel Socket.Receive. Il renvoie le nombre d'octets reçus. Vous pouvez mettre cet appel en boucle et lire jusqu'à ce que vous obteniez le nombre d'octets que vous attendez. Vous devriez également vous prémunir contre une boucle infinie en définissant un nombre maximum d'essais, ou comme John l'a suggéré, en vérifiant l'état du socket. En outre, ne supposez pas qu'une valeur de retour de zéro signifie que vous avez lu le message entier. Si votre protocole a préfixé chaque message par sa longueur, pour être vraiment pare-balles votre protocole devrait également définir un octet de marqueur pour marquer la fin de l'en-tête de longueur préfixée. Lire un octet à la fois jusqu'à ce que vous voyiez l'octet marqueur. Puis calculez la longueur du message et lisez en plus gros morceaux jusqu'à ce que vous ayez tout lu. Socket.Receive définit une surcharge qui vous permet de spécifier le nombre d'octets que vous souhaitez recevoir. (Cependant, vous n'êtes pas certain d'en recevoir autant, vous devez donc toujours vérifier la valeur de retour.)

Questions connexes