2010-01-27 8 views
3

J'apprends la programmation de socket en c, j'ai écrit ce simple programme pour accepter les connexions sur le port 5072. Je me connecte avec telnet. Cela fonctionne bien la première fois, mais quand j'essaie de le lancer à nouveau immédiatement, il échoue montrant BIND: Adresse déjà utilisée, mais commence à nouveau à travailler après une minute ou deux. Qu'est-ce que je fais?BIND ERREUR: Adresse déjà utilisée

#include <stdio.h> 
#include <string.h> 
#include <sys/types.h> 
#include <sys/socket.h> 
#include <netdb.h> 
#include <arpa/inet.h> 
#include <stdlib.h> 


int main(){ 

//variables 

int listenfd, clientfd; 
socklen_t clilen; 
struct sockaddr_in cliaddr,servaddr; 

//getsocket 
if((listenfd = socket(AF_INET,SOCK_STREAM,0)) == -1){ 
perror("SOCKET"); 
exit(0); 
} 


//prep the servaddr 
bzero(&servaddr,sizeof servaddr); 
servaddr.sin_family = AF_INET; 
servaddr.sin_addr.s_addr = inet_addr ("127.0.0.1"); 
servaddr.sin_port = htons(5072); 


//bind 
if(bind(listenfd, (struct sockaddr *) &servaddr,sizeof servaddr)<0){ 
perror("BIND"); 
exit(0); 
} 



//listen 
if(listen(listenfd,20)<0){ 
perror("LISTEN"); 
exit(0); 

} 


//accept 
int counter = 1; 
clilen = sizeof cliaddr; 
while(counter<3){ 

clientfd = accept(listenfd,(struct sockaddr *) &cliaddr,&clilen); 
if(clientfd == -1){ 
perror("ACCEPT"); 
exit(0); 
} 
if(fork()==0){ 
close(listenfd); 
printf("CONNECTION NO. %d\n",counter); 
close(clientfd); 
exit(0); 
} 
counter++; 
close(clientfd); 
} 
close(listenfd); 
} 

Merci

+0

Veuillez poster le * plus petit * code qui montre le problème. –

+0

désolé, je ne savais pas s'il y avait une erreur dans l'appel de liaison ou la structure du processus enfant, donc j'ai posté le tout. Mais prendra soin de l'avenir. – abhishek

Répondre

8

Vous devez setsockopt(SO_REUSEADDR)

Voir this faq pour expliquer pourquoi.

-2

Ou simplement attendre quelques minutes. La pile TCP/IP reste sur le socket pendant deux fois la durée de vie maximale du segment après la fermeture, afin d'éviter que les paquets parasites de la première connexion n'apparaissent après la création d'un second, ce qui rendra tout confus.

+1

Cette réponse est-elle vraiment utile? Il demande ce qu'il fait mal - d'ailleurs, abhishek a déjà mentionné qu'attendre une minute résout le problème ... – Kimvais

Questions connexes