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.
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. –
Assurez-vous que tous les pare-feu sur les deux machines sont désactivés ... beaucoup de pare-feu filtrera les paquets UDP entrants. –
@Jeremy Friesner Je m'en suis assuré. Pour être sûr à 100%, j'ai désinstallé complètement les firewalls sur les deux PC. –