0 votes

programmation des sockets dans le client

J'ai écrit ce programme en C++ et sur la plate-forme Linux.

J'ai écrit un programme de socket client et serveur.

Dans ce programme client, j'ai écrit la fonction socket et immédiatement après, je fais d'autres actions qui ne dépendent pas du tout du socket (j'ai écrit 2 boucles for pour d'autres logiques).

Ensuite, j'ai préparé les structures requises pour le socket et j'ai écrit la fonction de connexion... dans cette fonction, je reçois une erreur comme quoi je ne peux pas me connecter parce que connect renvoie -1...

Mais pour le même programme, si j'écris la logique de la boucle for au-dessus de la fonction socket et immédiatement après les structures et la fonction connect, cela fonctionne bien.

Quelle peut être la raison pour laquelle je ne parviens pas à l'obtenir ? Veuillez m'aider à cet égard. Voici mon code


ici index1 et index 2 sont des variables entières simples...La chaîne de configuration est un tableau de caractères contenant 127.0.0.1:7005(adresse et numéro de port)...adresse et port sont des variables de tableau de caractères pour stocker l'adresse et le numéro de port....

struct sockaddr_in s1;

for(index1=0;configstring[index1]!=':';index1++)
{
    address[index1] = configstring[index1];
}
address[index1++]='\0';

for(index2=0;configstring[index1]!='\0';index1++,index2++)
{
    port[index2] = configstring[index1];
}
port[index2++]='\0';

int port_num = changeto_int(port);

if((sock_fd = socket(AF_INET,SOCK_STREAM,0)) == -1)
{
    printf("unable to create a socket\n");
    return 0;
}

s1.sin_family=AF_INET;
s1.sin_port=htons(port_num);
s1.sin_addr.s_addr=inet_addr(address);
memset(s1.sin_zero, '\0', sizeof s1.sin_zero);
int errno;

if(connect(sock_fd,(struct sockaddr *)&s1,sizeof(s1)) == -1)
{
    printf("error:unable to connect\n");
    printf("Error in connect(): %s\n", strerror( errno));
    return -1;
}

2voto

Artyom Points 17387

Tout d'abord, il ne faut jamais faire une chose pareille :

int errno;

errno est déjà défini pour vous.

De plus, je vous suggère d'utiliser perror() au lieu de

printf("Error in connect(): %s\n", strerror( errno));

Troisièmement, vous ne peut appeler printf et ensuite strerror( errno) parce que printf aurait changé la valeur de errno en succès.

Troisièmement, je vous suggère de prendre des exemples sur Internet et de vous en inspirer.

Je suggère de lire man select_tut il existe de nombreux exemples de codes bien écrits sur la façon de faire et sur ce qu'il faut faire.

1voto

gahooa Points 38006

De temps en temps, on tombe sur un livre qui dépasse de la tête, des épaules et du torse tous les autres livres existants.

Si vous voulez VRAIMENT comprendre la mise en réseau au niveau du système d'exploitation (c'est là que la mise en réseau "se produit"), procurez-vous un exemplaire de Programmation avancée dans l'environnement UNIX(R) . Il vous donne les bases, l'histoire et le mode d'emploi de la programmation sous UNIX, avec une grande partie du contenu consacrée au réseau et à l'IPC.

0voto

Suroot Points 3079

Avez-vous essayé d'appeler strerror sur errno ? connect() renvoyant -1 signifierait que errno a été défini et devrait fournir plus d'informations sur votre erreur.

printf("Error in connect(): %s\n", strerror(errno));

0voto

Adam Hawes Points 4153

Avez-vous envisagé que votre récepteur n'écoute pas correctement les connexions ?

Comme d'autres l'ont dit, utilisez perror pour vérifier errno et imprimer un débogage utilisable sur la console.

Sans votre exemple de code, il est impossible de vous aider. Il peut y avoir un million de raisons. Peut-être y a-t-il un pare-feu sur votre machine qui bloque les connexions ? Peut-être que le serveur n'écoute pas ou qu'il est sur un port incorrect (vous avez bien converti l'ordre des octets du réseau, n'est-ce pas ?) Le client se connecte peut-être à une mauvaise adresse ou à un mauvais port. Vous n'avez peut-être pas configuré vos structures correctement.

Je recommande la lecture de La programmation des prises de Beej Doo-Daa pour une bonne introduction aux sockets sous Unix (et ensuite sous Windows).

0voto

Warrior Points 607

Struct sockaddr_in s1 ;

Pourriez-vous essayer le memset de s1, au début de votre programme. J'ai fait l'expérience de quelque chose de similaire.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X