2010-12-04 2 views
0

Ok. Also habe ich ein einfaches Client-Programm, das Bilder über UDP an eine bestimmte IP-Adresse sendet. Bei der angegebenen IP hört ein Serverprogramm zu und sollte die Bilder erhalten.Problem mit einfacher UDP-Client/Server-Anwendung

Wenn ich beide Programme auf localhost versuche (d. H. Sie laufen beide bei 127.0.0.1), funktioniert es und der Server empfängt die Bilder. Wenn ich versuche, den Client und die Serverprogramme auf verschiedenen PCs im selben Netzwerk zu installieren, funktioniert es nicht.

147.232.24.163 ist die Server-IP, 147.232.24.150 ist die Client-IP.

Hier ist mein Client-Programm:

// 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); 

mein Server-Programm ist hier:

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; 
} 

Irgendwelche Ideen, warum es nicht funktioniert? Ich bekomme keine Fehlermeldungen.

+0

Ich habe die Programme so vereinfacht, dass es nur die wesentlichen sockelbezogenen Sachen gibt. Ich weiß, dass es ein Problem ist, sehr lange Code-Snippets zu lesen. –

+1

Stellen Sie sicher, dass alle Firewalls auf den beiden Computern deaktiviert sind ... viele Firewalls filtern eingehende UDP-Pakete. –

+0

@ Jeremy Friesner habe ich dafür gesorgt. Um 100% sicher zu sein, habe ich Firewalls auf beiden PCs komplett deinstalliert. –

Antwort

2

Dies ist keine Lösung, aber Ihr Code sollte iRcvdbytes auf Fehler überprüfen, genauso wie der Sendecode das Ergebnis von sendto überprüft.

Eine Rückgabe von 0 bedeutet, dass der Socket ordnungsgemäß geschlossen wurde (wenn verbindungsorientiert - das sollte hier nicht gelten), SOCKET_ERROR bedeutet einen Fehler (zumindest in WinSock2).

Der Socket auf der Sendeseite muss mit IPPROTO_UDP erstellt werden, nicht 0. Dies könnte definitiv Ihren Fehler verursachen.

+0

Danke. Ich werde es am Montag versuchen (ich werde keine Zeit haben, früher ins Labor zu gehen) und Sie wissen lassen, ob das das Problem verursachen könnte. –

+0

recvfrom gibt 0 zurück und schließt nur bei verbindungsorientierten Sockeln. –

+0

@Luis - danke, ich habe eine Klarstellung hinzugefügt –