J'ai un serveur et un client fonctionnant sur deux machines différentes où le client send()
s mais le serveur ne semble pas recevoir le message. Le serveur utilise select()
pour surveiller les sockets pour les connexions/messages entrants. Je peux voir que lorsque le serveur accepte une nouvelle connexion, il met à jour le tableau fd_set
mais renvoie toujours 0 malgré les messages send()
du client. La connexion est TCP et les machines sont séparées par un routeur de sorte que les paquets qui tombent sont hautement improbables.Programmation socket S: client send() mais serveur select() ne le voit pas
J'ai le sentiment que ce n'est pas select()
mais peut-être send()
/sendto()
du client qui peut être le problème, mais je ne suis pas sûr de savoir comment s'y prendre localisant la zone de problème.
while(1)
{
readset = info->read_set;
ready = select(info->max_fd+1, &readset, NULL, NULL, &timeout);
}
ci-dessus est le code côté serveur où le serveur a un fil qui fonctionne select()
indéfiniment.
rv = connect(sockfd, (struct sockaddr *) &server_address, sizeof(server_address));
printf("rv = %i\n", rv);
if (rv < 0)
{
printf("MAIN: ERROR connect() %i: %s\n", errno, strerror(errno));
exit(1);
}
else
printf("connected\n");
sleep(3);
char * somemsg = "is this working yet?\0";
rv = send(sockfd, somemsg, sizeof(somemsg), NULL);
if (rv < 0)
printf("MAIN: ERROR send() %i: %s\n", errno, strerror(errno));
printf("MAIN: rv is %i\n", rv);
rv = sendto(sockfd, somemsg, sizeof(somemsg), NULL, &server_address, sizeof(server_address));
if (rv < 0)
printf("MAIN: ERROR sendto() %i: %s\n", errno, strerror(errno));
printf("MAIN: rv is %i\n", rv);
ce qui est du côté client où il se connecte et envoie des messages et retourne
connected
MAIN: rv is 4
MAIN: rv is 4
Quel est le contenu de 'info-> read_set'? A-t-il été correctement initialisé en utilisant 'FD_SET'? – qrdl
J'ai initialisé en utilisant FD_SET mais maintenant que vous le mentionnez, j'ai bricolé avec FD_SET et j'ai constaté que je faisais quelque chose de mal. Je vous créditerais si je le pouvais :) –
'sizeof (somemsg)' est 4 parce que 'somemsg' a le type' char * ', et les pointeurs ont une taille de 4 octets sur votre système. Donc, vous n'envoyez que les 4 premiers octets de 'somemsg'. Vous devriez déclarer 'somemsg' être de type' char [] ', pas' char * '. –