2010-06-01 5 views
0

J'essaie de créer une application MFC (client) qui se connecte à un serveur ("localhost", port 1234), le serveur répond au client et le client lit à partir de la réponse du serveur.Travailler avec des sockets dans MFC

Le serveur est en mesure de recevoir les données du client et il renvoie la réponse à la socket d'où il l'a reçu, mais je ne parviens pas à lire la réponse depuis le client.

Je crée un CAsyncSocket pour me connecter au serveur et envoyer des données et un CAsyncSocket avec des méthodes surchargées onAccet et onReceive pour lire la réponse du serveur. S'il vous plaît dites-moi ce que je fais mal. Tout d'abord, je ne vois pas où vous envoyez les données au client (sur le serveur)

class ServerSocket:public CAsyncSocket{ 
    public: 
    void OnAccept(int nErrorCode){ 
     outputBox->SetWindowTextA("RECEIVED DATA"); 
     CAsyncSocket::OnAccept(nErrorCode); 
    } 
}; 

//in ApplicationDlg I have: 

socket.Create(); 
socket.Connect("127.0.0.1",1234); 
socket.Send(temp,strlen(temp)); //this should be sending the initial message 

if(!serverSocket.Create()) //this should get the response i guess... 
    AfxMessageBox("Could not create server socket"); 

if(!serverSocket.Listen()) 
    AfxMessageBox("Could not listen to socket"); 

Répondre

1

Vous devez savoir que toutes les opérations réseau prennent du temps. Maintenant, puisque vous utilisez la classe CAsyncSocket de MFC, il exécute toutes les opérations de façon asynchrone (ne vous bloque pas). Mais le retour de la fonction ne signifie pas que c'est déjà terminé.

Regardons les lignes de code suivantes:

socket.Connect("127.0.0.1",1234); 
socket.Send(temp,strlen(temp)); //this should be sending the initial message 

Le premier est l'appel à Connect, qui ne très probablement pas complète immédiatement. Ensuite, vous appelez Send, mais votre socket n'est pas encore connecté! Il vous renvoie définitivement un code d'erreur, mais comme vous ne vous souciez pas de vérifier sa valeur de retour, vous attendez simplement avec plaisir de recevoir quelque chose. Donc, la prochaine règle pour vous, mon ami, devrait être de vérifier chaque valeur de retour pour chaque fonction que vous appelez, en particulier quand il s'agit de réseau où les erreurs sont légitimes et se produisent fréquemment.

Vous ne devez commencer à envoyer qu'après l'appel de OnConnect.

0

Deuxièmement, Accepter() ne signifie pas les données reçues. Accepter signifie que vous avez une nouvelle connexion entrante, pour laquelle vous devez créer une autre socket, à laquelle les données doivent être envoyées.

+0

je sais que je voulais juste voir si je reçois une connexion entrante et il semble que je ne sais pas – fanq

+0

le serveur est une autre application résidant sur localhost (ce n'est pas la même application MFC) – fanq

+0

Voulez-vous dire que OnAccept() est pas appelé? –