Salut à tous, je suis sur le point de m'arracher les cheveux. J'ai ce client qui essaie de se connecter à un serveur, tout semble bien se passer, en utilisant gethostbyname()
, socket()
, bind()
, mais en essayant de connect()
il se bloque juste là et le serveur ne voit rien du client. Je sais que le serveur fonctionne parce qu'un autre client (aussi en C) peut se connecter très bien. Qu'est-ce qui fait que le serveur ne voit pas cette connexion entrante? Je suis au bout de mes peines ici. Les deux clients différents sont assez similaires aussi je suis encore plus perdu.C socket programmation: connect() se bloque
if (argc == 2) {
host = argv[1]; // server address
}
else {
printf("plz read the manual\n");
exit(1);
}
hserver = gethostbyname(host);
if (hserver) {
printf("host found: %p\n", hserver);
printf("host found: %s\n", hserver->h_name);
}
else {
printf("host not found\n");
exit(1);
}
bzero((char *) &server_address, sizeof(server_address)); // copy zeroes into string
server_address.sin_family = AF_INET;
server_address.sin_addr.s_addr = htonl(hserver->h_addr);
server_address.sin_port = htons(SERVER_PORT);
bzero((char *) &client_address, sizeof(client_address)); // copy zeroes into string
client_address.sin_family = AF_INET;
client_address.sin_addr.s_addr = htonl(INADDR_ANY);
client_address.sin_port = htons(SERVER_PORT);
sockfd = socket(AF_INET, SOCK_STREAM, 0);
if (sockfd < 0)
exit(1);
else {
printf("socket is opened: %i \n", sockfd);
info.sock_fd = sockfd;
rv = fcntl(sockfd, F_SETFL, O_NONBLOCK); // socket set to NONBLOCK
if(rv < 0)
printf("nonblock failed: %i %s\n", errno, strerror(errno));
else
printf("socket is set nonblock\n");
}
timeout.tv_sec = 0; // seconds
timeout.tv_usec = 500000; // micro seconds (0.5 seconds)
setsockopt(sockfd, SOL_SOCKET, SO_RCVTIMEO, &timeout, sizeof(struct timeval));
rv = bind(sockfd, (struct sockaddr *) &client_address, sizeof(client_address));
if (rv < 0) {
printf("MAIN: ERROR bind() %i: %s\n", errno, strerror(errno));
exit(1);
}
else
printf("socket is bound\n");
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");
Toute idée ou idée est profondément grandement appréciée.
-Fourier
EDIT: Si la prise est pas mis sur la non-bloc, puis il se bloque. Si la prise est réglée sur la non-bloc, je reçois ERROR connect() 115: Operation now in progress
[EINPROGRESS] O_NONBLOCK est défini pour le descripteur de fichier pour la prise et la connexion ne peut pas être immédiatement établie; la connexion doit être établie de manière asynchrone.
Je voudrais également mentionner que le serveur et le client tournent sur des ordinateurs les uns à côté des autres, connectés par un routeur.
Pouvez-vous nous donner la valeur de errno? – ereOn
errno est 115 mais il est résolu maintenant. Merci beaucoup –
Stupide pensée: le serveur permet-il à plusieurs clients de se connecter? Après le "accept()" cela engendre-t-il un thread, un childprocess ou utilise select() pour redémarrer acceptant() des connexions entrantes ET gérer le trafic du client qui vient de se connecter? – haavee