j'ai fait un client et un serveur qui communiquent par socket TCP, mon serveur est en attente de connection alors que mon client se bloque au niveau de la connection en affichant une erreur; le client et le serveur sont sur la machine locale.
le programme client est:
#include <sys/socket.h>
#include <sys/types.h>
#include <netinet/in.h>
#include <unistd.h>
#include <stdlib.h>
#define MAX_SEND 100
int main()
{
int socket_connect, sockaddr_len;
struct sockaddr_in sockaddr_connect;
char buffer[MAX_SEND];
if(socket_connect = socket(AF_INET, SOCK_STREAM, 0) < 0)
{
printf("Socket creation errror !\n" );
return EXIT_FAILURE;
}
sockaddr_connect.sin_family = AF_INET;
sockaddr_connect.sin_port = htons(0);//5000;//6667;
sockaddr_connect.sin_addr.s_addr =inet_addr("127.0.0.1" );
sockaddr_len = sizeof(sockaddr_connect);
if(connect(socket_connect, (struct sockaddr*)&sockaddr_connect, sockaddr_len) < 0)
{
printf("Socket connection error !\n" );
return EXIT_FAILURE;
}
while(1)
{
printf("send>" );
scanf("%s", &buffer);
send(socket_connect, buffer, MAX_SEND,0);
}
close(socket_connect);
return 0;
}
# plus dinfos ?
Posté par left . Évalué à 2.
... = socket (PF_INET, ...)
t'as de la chance qu'en pratique, AF_INET = PF_INET
2. sockaddr_connect.sin_port = htons(0);
et t'espères pouvoir te connecter sur le port 0 ?
3. > man connect
...
If the connection or binding succeeds, zero is returned. On error, -1 is returned, and errno is set appropriately.
...
donc:
erreur = connect(...);
if (erreur==-1){
perror ("connect");
return EXIT_FAILURE;
}
et tu nous donnes le résulat ...
[^] # Re: plus dinfos ?
Posté par ham333 . Évalué à 1.
[^] # Re: plus dinfos ?
Posté par left . Évalué à 2.
donc, saches que en C:
a = b < c <=> a = (b < c)
donc, dans ton code, la ligne pourrie
if(socket_connect = socket(AF_INET, SOCK_STREAM, 0) < 0) { ...
doit être remplacée par:
socket_connect = socket(AF_INET, SOCK_STREAM, 0);
if (socket_connect < 0) {
...
ceci empechera d'avoir socket_connect qui vait toujours 0.
[^] # Re: plus dinfos ?
Posté par omnikron . Évalué à 1.
if((socket_connect = socket(AF_INET, SOCK_STREAM, 0)) < 0) {
...
}
# Port 0
Posté par peck (site web personnel) . Évalué à 3.
[^] # Re: Port 0
Posté par neologix . Évalué à -1.
Par contre, dans le cas d'un client comme ici, le client va se connecter sur un port aléatoire.
Il suffit de mettre ici le port utilisé par le serveur (passé dans struct sockaddr_in utilisé pour le bind).
[^] # Re: Port 0
Posté par left . Évalué à 1.
sans blagues ... démarre un tcpdump, juste pour voir. il y a un paquet TCP qui part pour une demande de connexion sur le port distant = 0
(localhost.localdomain.32812 > localhost.localdomain.0: S [...])
Tu confonds le port local et le port distant; La struct sockaddr passée en argument de la fonction connect sert à spécifier l'addresse distante, et n'a rien à voir avec le port local qui est utilisé.
Suivre le flux des commentaires
Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.