2009-03-30 10 views
0

En C# lors de la simulation d'un LAN-Messenger, j'utilise l'adresse de bouclage juste pour tester le code actuel et je peux recevoir le premier message que j'envoie. Cependant, il n'y a pas de messages atteindre les socket.Is-il quelque chose à voir avec l'élimination d'un tampon de prise .please aider Ceci est la fonction de rappel lorsqu'une connexion est faite:Réception de messages via un socket

private void accepted(IAsyncResult iar) 
    { 
     Socket server = (Socket)iar.AsyncState; 
     Socket client = server.EndAccept(iar); 
     if (client.Connected) 
     { 
      try 
      { 
       client.BeginReceive(receive, 0, receive.Length, System.Net.Sockets.SocketFlags.None, new AsyncCallback(rec), client); 
      } 
      catch (ArgumentException) 
      { 
       MessageBox.Show("arguments incorrect in begin-receive call", "Error", MessageBoxButtons.OK); 
      } 
      catch (SocketException) 
      { 
       MessageBox.Show("error in accessing socket while receiving", "Error", MessageBoxButtons.OK); 
      } 
      catch (ObjectDisposedException) 
      { 
       MessageBox.Show("socket closed while receiving", "Error", MessageBoxButtons.OK); 
      } 
      catch (Exception) 
      { 
       MessageBox.Show("error while receiving", "Error", MessageBoxButtons.OK); 
      } 

     } 

Ceci est la fonction de rappel lorsque la méthode begin-réception est exécuté :

void rec(IAsyncResult ar) 
    { 

     StringBuilder receivedData; 
     //String oldvalue; 
     Socket remote = (Socket)ar.AsyncState; 
     int recv = remote.EndReceive(ar); 
     receivedData = new StringBuilder(Encoding.ASCII.GetString(receive, 0, recv)); 
     //MessageBox.Show(receivedData.ToString(), "received", MessageBoxButtons.OK); 
     StringBuilder sb = new StringBuilder(this.textBox1.Text); 
     sb.AppendLine(receivedData.ToString()); 
     if (textBox1.InvokeRequired) 
     { 
      this.Invoke((MethodInvoker)delegate { this.textBox1.Text = sb.ToString(); }); 

     } 
     remote.Close(5); 
     return; 
    } 

A-t-il quelque chose à voir avec un type de données stringbuilder ou string pour assigner les données reçues à une variable.

+0

Veuillez fournir le code pour l'envoi et la réception. –

Répondre

1

Voici un tutoriel en 2 parties sur la programmation C# socket, avec le code source ...

http://www.devarticles.com/c/a/C-Sharp/Socket-Programming-in-C-Part-I/1/

http://www.devarticles.com/c/a/C-Sharp/Socket-Programming-in-C-sharp-Part-II/

Quel est le problème dépend entièrement de votre conception. Êtes-vous en train d'interroger? Ou, attendez-vous des événements?

La source est le fichier download.zip attaché à cette page: http://www.developerfusion.com/article/3918/socket-programming-in-c-part-1/

+0

Je ne pense pas que ce soit nécessaire.Je suis sûr que c'est un code simple qui doit être ajouté. Je reçois le premier message envoyé.Cependant, après cela, aucun message ne vient. – Avik

1

Jetez un oeil à ce sujet. Notez comment WaitForData s'appelle lui-même. Ceci permet de recevoir le deuxième message et les suivants.

Vous n'attendez plus de données.

private void OnClientConnect(IAsyncResult asyn) 
    { 
     m_Client = m_Listener.EndAccept(asyn); 
     WaitForData(); 
    } 
    private void WaitForData() 
    { 
     buffer = new byte[1024]; 
     m_Client.BeginReceive(buffer, 0, buffer.Length, SocketFlags.None, new AsyncCallback(OnDataReceived), null); 
    } 
    private void OnDataReceived(IAsyncResult asyn) 
    { 
     int iRx = 0; 
     iRx = m_Client.EndReceive(asyn); 

     if (iRx > 0) 
     { 
      PacketReceiver.BytesReceived(buffer); 
     } 

     if (m_Client.Connected == true) 
      WaitForData(); 
    } 
+0

J'ai essayé de rendre mon code aussi similaire que possible .. Rien ne semble fonctionner. Je pense que c'est une erreur logique. Y at-il de toute façon je peux obtenir de l'aide. Les messages arrivent la 1ère fois. Rien de plus après. – Avik

+0

- Je veux dire l'ensemble de votre code réseau. –

+0

Je pense que je comprends ce qui se passe .. La méthode de début-acceptation est appelée qu'une seule fois. En dehors de l'utilisation des threads, y a-t-il un moyen de faire cet appel asynchrone pour commencer - accepter en continu? – Avik

0

Vous avez oublié d'appeler BeginReceive dans votre méthode rec:

Voici ce que votre code devrait être:

void rec(IAsyncResult ar) 
{ 
    StringBuilder receivedData; 
    //String oldvalue; 
    Socket remote = (Socket)ar.AsyncState; 
    int recv = remote.EndReceive(ar); 
    receivedData = new StringBuilder(Encoding.ASCII.GetString(receive, 0, recv)); 
    //MessageBox.Show(receivedData.ToString(), "received", MessageBoxButtons.OK); 
    StringBuilder sb = new StringBuilder(this.textBox1.Text); 
    sb.AppendLine(receivedData.ToString()); 
    if (textBox1.InvokeRequired) 
    { 
    this.Invoke((MethodInvoker)delegate { this.textBox1.Text = sb.ToString(); }); 

    } 
    remote.BeginReceive(receive, 0, receive.Length, System.Net.Sockets.SocketFlags.None, new AsyncCallback(rec), remote); 
    //remote.Close(5); 
    return; 
} 

Bien sûr, ce code ne ferme pas la prise à la place attendra plus Les données. Si dans votre méthode d'envoi vous créez un socket différent pour chaque message, vous devez appeler BeginAccept au lieu de BeginReceive.

Espérons que cela aide

Questions connexes