Je suis d'erreur au moment de l'exécution qui “Ne peut pas assigner une adresse demandée” en C sous Linux (Centos)
Lorsque j'attribue cette adresse , il est dit cannot assign requested address
. Mais quand j'ai mis l'adresse locale (127.0.0.1) il l'accepte. Pourquoi???
char* hostname = "192.168.1.8";
int sockfd;
struct sockaddr_in my_addr; //my address information
struct sockaddr_in their_addr; //connector's address information
socklen_t addr_len;
int numbytes;
char buf[MAXBUFLEN];
int port =5000;
if ((sockfd = socket(AF_INET, SOCK_DGRAM, 0)) == -1) {
perror("socket");
exit(1);
}
try
{
my_addr.sin_family = AF_INET; //host byte order
my_addr.sin_addr.s_addr = inet_addr(hostname);
printf("Accepted/n");
//automatically fill with my IP
my_addr.sin_port = htons(5000); //short, network byte order
memset(&(my_addr.sin_zero), 'int sockfd;
struct sockaddr_in my_addr; //my address information
struct sockaddr_in their_addr; //connector's address information
socklen_t addr_len;
int numbytes;
char buf[MAXBUFLEN];
int port =5000;
if ((sockfd = socket(AF_INET, SOCK_DGRAM, 0)) == -1) {
perror("socket");
exit(1);
}
try
{
my_addr.sin_family = AF_INET; //host byte order
my_addr.sin_addr.s_addr = inet_addr(hostname);
printf("Accepted/n");
//automatically fill with my IP
my_addr.sin_port = htons(5000); //short, network byte order
memset(&(my_addr.sin_zero), '\0', 8); //zero the rest of the struct
if (bind(sockfd, (struct sockaddr *)&my_addr, sizeof(struct sockaddr)) == -1)
{
perror("bind");
exit(1);
}
while (1)
{
addr_len = sizeof(struct sockaddr);
if ((numbytes = recvfrom(sockfd, buf, MAXBUFLEN-1 , 0,
(struct sockaddr *)&their_addr, &addr_len)) == -1) {
perror("recvfrom");
exit(1);
}
//printf("got packet from %s\n",inet_ntoa(their_addr.sin_addr));
//printf("packet is %d bytes long\n",numbytes);
buf[numbytes] = '\0';
//printf("packet contains \"%s\"\n",buf);
}
close(sockfd);
}
catch(...)
{
', 8); //zero the rest of the struct
if (bind(sockfd, (struct sockaddr *)&my_addr, sizeof(struct sockaddr)) == -1)
{
perror("bind");
exit(1);
}
while (1)
{
addr_len = sizeof(struct sockaddr);
if ((numbytes = recvfrom(sockfd, buf, MAXBUFLEN-1 , 0,
(struct sockaddr *)&their_addr, &addr_len)) == -1) {
perror("recvfrom");
exit(1);
}
//printf("got packet from %s\n",inet_ntoa(their_addr.sin_addr));
//printf("packet is %d bytes long\n",numbytes);
buf[numbytes] = 'int sockfd;
struct sockaddr_in my_addr; //my address information
struct sockaddr_in their_addr; //connector's address information
socklen_t addr_len;
int numbytes;
char buf[MAXBUFLEN];
int port =5000;
if ((sockfd = socket(AF_INET, SOCK_DGRAM, 0)) == -1) {
perror("socket");
exit(1);
}
try
{
my_addr.sin_family = AF_INET; //host byte order
my_addr.sin_addr.s_addr = inet_addr(hostname);
printf("Accepted/n");
//automatically fill with my IP
my_addr.sin_port = htons(5000); //short, network byte order
memset(&(my_addr.sin_zero), '\0', 8); //zero the rest of the struct
if (bind(sockfd, (struct sockaddr *)&my_addr, sizeof(struct sockaddr)) == -1)
{
perror("bind");
exit(1);
}
while (1)
{
addr_len = sizeof(struct sockaddr);
if ((numbytes = recvfrom(sockfd, buf, MAXBUFLEN-1 , 0,
(struct sockaddr *)&their_addr, &addr_len)) == -1) {
perror("recvfrom");
exit(1);
}
//printf("got packet from %s\n",inet_ntoa(their_addr.sin_addr));
//printf("packet is %d bytes long\n",numbytes);
buf[numbytes] = '\0';
//printf("packet contains \"%s\"\n",buf);
}
close(sockfd);
}
catch(...)
{
';
//printf("packet contains \"%s\"\n",buf);
}
close(sockfd);
}
catch(...)
{
- Probablement parce que votre machine locale de l'adresse n'est pas 192.168.1.8?
- Aussi, vous avez marqués ce que C mais je vois une
try { ... } catch (...) { ... }
bloc. Faut-il le C++?
Vous devez vous connecter pour publier un commentaire.
Si l'erreur se produit sur le
bind
(c'est pas évident en fonction de votre contenu de la question depuis le message d'erreur que l'état n'apparaît pas dans le code), c'est probablement parce que l'adresse n'est pas disponible.C'est généralement parce qu'il est déjà en cours d'utilisation, ou ne sont pas disponibles sur l'hôte actuel.
À quelques exceptions près, vous pouvez généralement que de les lier à des adresses IP attribuées aux interfaces locales. Vous devez vérifier que
192.168.1.8
est dans cette classe. C'est une donnée que127.0.0.1
sera une interface locale (donc pourquoi ça fonctionne), et queINADDR_ANY
fonctionnera aussi bien - c'est probablement le "adresse", vous devez utiliser sauf si vous avez un réel besoin de vous limiter à une seule interface.Vous devriez vérifier la
errno
la suite de l'échec de la fonction et le match contre le possibilités.Comme un de côté, et ce n'est probablement pas pertinent à votre problème, la manière dont vous utilisez le
sockaddr_in
structure (définition des champs puis en désactivant le reste) semble être moins de portable pour moi.Je pense qu'il serait plus sûr pour effacer le lot alors simplement ce que vous désirez, après cela, quelque chose comme:
Au moins de cette façon, l'ordre des champs dans la structure n'affectera pas votre code.
Vous pouvez voir le problème avec le code suivant. Tout d'abord, la condition d'en-têtes:
Alors l'argument de la vérification et de la création de la socket.
Ensuite la liaison elle-même:
Lorsque vous exécutez avec certains arguments, vous pouvez le voir, il fonctionne bien pour le cas où les adresses IP appartiennent à des interfaces (
127.0.0.1
et192.168.0.101
) mais pas pour ceux qui ne le font pas, comme192.168.0.102
:Et, à partir du lien à la
bind
homme page ci-dessus, nous voyons: