2012-07-25 2 views
0

J'essaie d'établir une communication entre un ordinateur de poche et un PC.Connexion socket dans CF 3.5 C#

Je le code suivant, pour le client :

public void connect(string IPAddress, int port) 
    { 
       // Connect to a remote device. 
     try 
     { 
      IPAddress ipAddress = new IPAddress(new byte[] { 192, 168, 1, 10 }); 
      IPEndPoint remoteEP = new IPEndPoint(ipAddress, port); 
      // Create a TCP/IP socket. 
      client = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); 
      // Connect to the remote endpoint. 
      client.BeginConnect(remoteEP, new AsyncCallback(ConnectCallback), client); 
      if (connectDone.WaitOne()){ 
       //do something.. 
      } 
      else{ 
       MessageBox.Show("TIMEOUT on WaitOne"); 
      } 
     } 
     catch(Exception e){ 
       MessageBox.Show(e.Message); 
     } 
     } 

Mon problème est que quand je lance deux d'entre eux dans un PC, ils communiquent très bien, mais le même code dans un projet SmartDevice n » t connecter avec le serveur qui exécute sur le PC et il me donne cette erreur:

System.Net.Sockets.SocketException: A connection attempt failed because the connected party did not properly respond after a period of time, or stablished connection failed 
because connected host has failed to respond 

Qu'est-ce que je manque?

REMARQUE: Le IPAddress est codé en dur dans le code


EDIT: voici un autre code que je prends from a MSDN example. Cela ne marche pas non plus, il dit qu'il n'est pas possible de lire. Le code du serveur dans ce cas est le même que l'exemple, le code client ont une modification:

private void button1_Click(object sender, EventArgs e) 
{ 
    // In this code example, use a hard-coded 
    // IP address and message. 
    string serverIP = "192.168.1.10";//HERE IS THE DIFERENCE 
    string message = "Hello"; 
    Connect(serverIP, message); 
} 

Merci d'avance pour toute aide!

+0

Je ne vois pas beaucoup de gens en utilisant les [IPAddress] (http://msdn.microsoft.com/en-us/library/t4k07yby.aspx) constructeurs, donc je pense cette. Avez-vous essayé la méthode statique 'IPAddress ipAddress = IPAddress.Parse (" 192.168.1.10 ");'? – jp2code

+0

@ jp2code Je ne peux pas utiliser'Parse 'dans ma FC. Une autre idée? Merci –

+0

Ew. De quelle version CF es-tu? – jp2code

Répondre

1

Pour mon « appareil mobile » client, j'envoyer des données à l'hôte « PC » en utilisant ceci:

private void Send(string value) { 
    byte[] data = Encoding.ASCII.GetBytes(value); 
    try { 
    using (TcpClient client = new TcpClient(txtIPAddress.Text, 8000)) { 
     NetworkStream stream = client.GetStream(); 
     stream.Write(data, 0, data.Length); 
    } 
    } catch (Exception err) { 
    // Log the error 
    } 
} 

Pour l'hôte, vous êtes mieux d'utiliser un fil ou BackgroundWorker où vous pouvez laisser un TcpListener objet rester assis et attendre:

private void Worker_TcpListener(object sender, DoWorkEventArgs e) { 
    BackgroundWorker worker = (BackgroundWorker)sender; 
    do { 
    string eMsg = null; 
    int port = 8000; 
    try { 
     _listener = new TcpListener(IPAddress.Any, port); 
     _listener.Start(); 
     TcpClient client = _listener.AcceptTcpClient(); // waits until data is avaiable 
     int MAX = client.ReceiveBufferSize; 
     NetworkStream stream = client.GetStream(); 
     Byte[] buffer = new Byte[MAX]; 
     int len = stream.Read(buffer, 0, MAX); 
     if (0 < len) { 
     string data = Encoding.UTF8.GetString(buffer); 
     worker.ReportProgress(len, data.Substring(0, len)); 
     } 
     stream.Close(); 
     client.Close(); 
    } catch (Exception err) { 
     // Log your error 
    } 
    if (!String.IsNullOrEmpty(eMsg)) { 
     worker.ReportProgress(0, eMsg); 
    } 
    } while (!worker.CancellationPending); 
} 
+0

J'ai un code assez similaire au vôtre pris d'un exemple MDSN. Je vais mettre à jour ma question avec ce code pour que vous puissiez le vérifier. –