Erreur bind: Address already in use

andoid
Messages postés
108
Date d'inscription
samedi 31 mars 2012
Statut
Membre
Dernière intervention
16 juin 2013
- 25 févr. 2012 à 23:15
omarF
Messages postés
82
Date d'inscription
dimanche 25 janvier 2009
Statut
Membre
Dernière intervention
24 novembre 2012
- 24 nov. 2012 à 14:03
Bonjour
j'ai mon programme suivant qui marche et je suis en route pour creer mon serveur pour l'instant le client qui se connecte je lui envoi juste le message bonjour.
Mais mon probléme se trouve au niveau du port en effet si je lance le programme la premiere j'arrive a communiquer avec le client par contre si je réexecute le programme j'ai ce message bind:Address already in use voici le code de mon serveur:


#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include
#include
#define INVALID_SOCKET -1
#define SOCKET_ERROR -1
#define closesocket(s) close(s)
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include<signal.h>
#define PORT 23
#define TAILLE 100



typedef int SOCKET;
typedef struct sockaddr_in SOCKADDR_IN;
typedef struct sockaddr SOCKADDR;


int main(void)
{

int erreur = 0;
char buf[TAILLE]= "Bonjour !";;


/* Socket et contexte d'adressage du serveur */
SOCKADDR_IN sin;
SOCKET sock;
socklen_t recsize = sizeof(sin);

/* Socket et contexte d'adressage du client */
SOCKADDR_IN csin;
SOCKET csock;
socklen_t crecsize = sizeof(csin);

int sock_err;


if(!erreur)
{
/* Création d'une socket */
sock = socket(AF_INET, SOCK_STREAM, 0);

/* Si la socket est valide */
if(sock != INVALID_SOCKET)
{
printf("La socket %d est maintenant ouverte en mode TCP/IP\n", sock);

/* Configuration */
sin.sin_addr.s_addr = htonl(INADDR_ANY); /* Adresse IP automatique */
sin.sin_family = AF_INET; /* Protocole familial (IP) */
sin.sin_port = htons(PORT); /* Listage du port passage au format réseau */
sock_err = bind(sock, (SOCKADDR*)&sin, recsize);

/* Si la socket fonctionne */
if(sock_err != SOCKET_ERROR)
{
/* Démarrage du listage (mode server) */
sock_err = listen(sock, 5);
printf("Listage du port %d...\n", PORT);

/* Si la socket fonctionne */
if(sock_err != SOCKET_ERROR)
{
signal(SIGCHLD,SIG_IGN);
/*Pour que le pére detruit à lui seul les processus zombie on place ce code avant la boucle fausse signal(SIGCHLD,SIG_IGN)*/

/*Pour un serveur parallel c'est là que je vais mettre ma boucle while(1) */
/* Attente pendant laquelle le client se connecte */
printf("Patientez pendant que le client se connecte sur le port %d...\n", PORT);
csock = accept(sock, (SOCKADDR*)&csin, &crecsize);
/*Aprés le teste sur la socket csock je peux faire un fork() pour que le fils s'occupe du traitement des demandes de service des clients */
printf("Un client se connecte avec la socket %d de %s:%d\n", csock, inet_ntoa(csin.sin_addr), htons(csin.sin_port));


sock_err=send(csock,buf,32,0);
if(sock_err!=SOCKET_ERROR)
{
printf("Message envoyé\n");
shutdown(csock,1);

}
else
perror("send");


}

else
perror("listen");
}
else
perror("bind");

/* Fermeture de la socket client et de la socket serveur */
printf("Fermeture de la socket client\n");
closesocket(csock);
printf("Fermeture de la socket serveur\n");
closesocket(sock);
printf("Fermeture du serveur terminée\n");
}
else
perror("socket");


}

return EXIT_SUCCESS;
}

1 réponse

omarF
Messages postés
82
Date d'inscription
dimanche 25 janvier 2009
Statut
Membre
Dernière intervention
24 novembre 2012

24 nov. 2012 à 14:03
Bonjour,
Tu dois utiliser la fontion
int setsockopt(int socket, int level, int option_name,const void *option_value, socklen_t option_len);

voici un exemple:
setsockopt(sock,SOL_SOCKET,SO_REUSEADDR, &reponse, sizeof(int));

SO_REUSEADDR: t'autorise à réutiliser ladresse
0