2010-12-04 3 views
0

Ok. J'ai donc un simple programme client qui envoie des images via UDP à une adresse IP spécifiée. À l'adresse IP spécifiée, un programme serveur écoute et devrait recevoir les images. Lorsque j'essaie les deux programmes sur localhost (c'est-à-dire qu'ils fonctionnent tous deux à 127.0.0.1), cela fonctionne et le serveur reçoit les images. Lorsque j'essaie de placer le client et les programmes serveur sur différents PC dans le même réseau, cela ne fonctionne pas.Problème avec une application client/serveur UDP simple

147.232.24.163 est l'adresse IP du serveur, 147.232.24.150 est l'adresse IP du client.

Voici mon programme client:

// Initialize UDP.  
    struct sockaddr_in server;  
    int n_sent; 
    int socketId = socket(AF_INET, SOCK_DGRAM, 0);  
    if (socketId < 0)  
    {  
    cout << "Problem creating socket." << endl;  
    }  
    server.sin_family = AF_INET;  
    server.sin_addr.s_addr = inet_addr("147.232.24.163");  
    // Establish the server port number - we must use network byte order!  
    server.sin_port = htons(42001); 

    for (int iter = 0; iter < 60; iter++)  
    { 
     // load image into jpegBuf 

     n_sent = sendto(socketId, reinterpret_cast<char*> (&jpegBuf[0]), jpegBuf.size(), 0, (struct sockaddr*) &server, sizeof(server));  
     if (n_sent < 0) {  
     cout << "Problem sending data." << endl;  
     }  
    } 

    close(socketId); 

Voici mon programme serveur:

int main() 
{ 
    int bufferSize = 1024000; 
    int iSockFd = -1; 
    int iLength = 0; 
    struct sockaddr_in servAddr, cliAddr; 
    char buff[bufferSize]; 
    iSockFd=socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP); 
    memset(&servAddr, 0, sizeof(servAddr)); 
    memset(&cliAddr, 0, sizeof(cliAddr)); 

    servAddr.sin_family = AF_INET; 
    servAddr.sin_addr.s_addr = inet_addr("147.232.24.163"); 
    servAddr.sin_port = htons(42001); 
    int cliAddrLen = sizeof(struct sockaddr_in); 
    int bindRet = bind(iSockFd, (struct sockaddr*)&servAddr, sizeof(servAddr)); 
    cout << "Bind returned " << bindRet << endl; 

    int i = 0; 
    while (true) 
    { 
     int iRcvdBytes=recvfrom(iSockFd, buff, bufferSize, 0, 
     (struct sockaddr*)&cliAddr, (socklen_t*)&cliAddrLen); 

     if (0 == i % 5) 
     { 
      cout << "Received " << iRcvdBytes << " bytes from the client" << endl; 
     } 


     i++; 
    } 
    close(iSockFd); 
    return 0; 
} 

Toutes les idées pourquoi il ne fonctionne pas? Je ne reçois aucun message d'erreur.

+0

J'ai simplifié les programmes afin qu'il n'y ait que les choses essentielles liées à la socket. Je sais que c'est difficile de lire des extraits de code très longs. –

+1

Assurez-vous que tous les pare-feu sur les deux machines sont désactivés ... beaucoup de pare-feu filtrera les paquets UDP entrants. –

+0

@Jeremy Friesner Je m'en suis assuré. Pour être sûr à 100%, j'ai désinstallé complètement les firewalls sur les deux PC. –

Répondre

2

Ce n'est pas une solution mais votre code devrait vérifier iRcvdbytes pour l'erreur de la même manière que le code d'envoi vérifie le résultat de sendto.

Un retour de 0 signifie que le socket a été fermé avec élégance (si orienté connexion - cela ne devrait pas s'appliquer ici), SOCKET_ERROR signifie une erreur (dans WinSock2 au moins).

La socket du côté d'envoi doit être créée avec IPPROTO_UDP, et non 0. Cela pourrait certainement causer votre défaillance.

+0

Merci. Je vais essayer lundi (je n'aurai pas le temps d'aller au laboratoire plus tôt) et je vous dirai si cela pourrait causer le problème. –

+0

recvfrom renverra 0 sur fermeture gracieuse uniquement sur les sockets orientés connexion. –

+0

@Luis - merci, j'ai ajouté une clarification –