2010-07-09 6 views
0
private static Socket ConnectSocket(string server, int port) 
{ 
    Socket s = null; 
    IPHostEntry hostEntry = null; 

    hostEntry = Dns.GetHostEntry(server); 

    foreach (IPAddress address in hostEntry.AddressList) 
    { 
     IPEndPoint ipe = new IPEndPoint(address, port); 
     Socket tempSocket = 
      new Socket(ipe.AddressFamily, SocketType.Stream, ProtocolType.Tcp); 

     tempSocket.Connect(ipe); 

     if (tempSocket.Connected) 
     { 
      s = tempSocket; 
      break; 
     } 
     else 
     { 
      continue; 
     } 
    } 
    return s; 
} 

//... 

Socket s = ConnectSocket(server, port); 

//... 

do 
{ 
    bytes = s.Receive(bytesReceived, bytesReceived.Length, 0); // 1 
    page = page + Encoding.UTF8.GetString(bytesReceived, 0, bytes); // 2 
} 
while (bytes == 1024); 

Ceci est une "page" donnée circoncise (sans fin). Si entre "//1" et "//2" écrivez System.Threading.Thread.Sleep(100), alors tout fonctionne.TcpClient.Receive - données tronquées

Répondre

0

Je ne vois pas comment cela pourrait fonctionner. Il n'y a pas de surcharge de réception avec seulement trois paramètres. En outre, vous avez placé bytesReceived.Length dans une position incorrecte.

s.Receive(bytesReceived, 0, bytesReceived.Length); 

Edit: Ohh. Vous utilisez le zéro pour SocketFlags. N'utilisez pas de nombres magiques.

Ensuite, il n'y a rien qui dit que 1024 octets doivent arriver à chaque fois, TCP n'est pas construit comme ça. TCP garantit seulement que tous les octets arriveront, pas quand et comment.

Vous devez connaître le nombre d'octets que vous allez recevoir ou déconnecter à l'autre extrémité lorsque tout est envoyé.