Socket de Programmation en C(Client Serveur Exemple)
Je suis totalement nouveau dans la programmation sous unix et ont écrit le code suivant pour le client et le serveur de programmation. Lorsque j'essaie d'exécuter le code client, il dit: "Connexion refusée". Quelqu'un pourrait s'il vous plaît dites-moi ce que pourrait être la raison de cela.
Code Serveur :
#include<stdio.h>
#include<stdlib.h>
#include<sys/types.h>
#include<sys/socket.h>
#include <errno.h>
#include<string.h>
#include <netinet/in.h>
#include <arpa/inet.h>
int main(void)
{
int sockid,newsockid;
socklen_t addr_size;
char *msg="What a beautiful morning!";
int len, bytes_sent;
sockid=socket(AF_INET,SOCK_STREAM,0);
if(sockid==-1)
{
perror("socket");
exit(1);
}
else
printf("created");
struct sockaddr_in serveraddr,clientaddr;
bzero((char *)&serveraddr,sizeof(serveraddr));
serveraddr.sin_family=AF_INET;
serveraddr.sin_port=htons(7400);
serveraddr.sin_addr.s_addr=INADDR_ANY;
if(bind(sockid,(struct sockaddr *)&serveraddr,sizeof(serveraddr))<0)
{
perror("bind");
return -1;
}
listen(sockid,5);
addr_size=sizeof(clientaddr);
newsockid=accept(sockid,(struct sockaddr *)&clientaddr,&addr_size);
len = strlen(msg);
bytes_sent = send(sockid, msg, len, 0);
close(sockid);
}
Code Client :
#include<stdio.h>
#include<stdlib.h>
#include<sys/types.h>
#include<sys/socket.h>
#include <errno.h>
#include<string.h>
#include <netinet/in.h>
#include <arpa/inet.h>
int main(void)
{
int byte_count;
struct sockaddr_in serveraddr;
char *servername;
char buf[256];
socklen_t addr_size;
int sockfd;
sockfd=socket(AF_INET,SOCK_STREAM,0);
bzero(&serveraddr,sizeof(serveraddr));
serveraddr.sin_family=AF_INET;
serveraddr.sin_port=htons(11378);
servername=gethostbyname("localhost");
inet_pton(AF_INET,servername,&serveraddr.sin_addr);
addr_size=sizeof(serveraddr);
if(connect(sockfd,(struct sockaddr *)&serveraddr,addr_size)==-1)
{
perror("connect");
exit(1);
}
byte_count = recv(sockfd, buf, sizeof buf, 0);
printf("recv()'d %d bytes of data in buf\n", byte_count);
close(sockfd);
}
Un début d'aide serait appréciée.
Merci.
Connection refused
signifie "aucun de ces numéro de téléphone, le numéro que vous avez composé est inconnu" en termes de ip-adresse et/ou numéro-port.Vérifiez comment
servername
est initialisé. Et: Ne compiler avec tous les avertissements sur (-Wall -Wextra -pedantic
pour gc), puis sur fix le code jusqu'à ce que pas plus de mises en garde pop-up!j'ai fait quelques changements.. annuler les changements de port. Est-il autre chose que je dois faire?
Il y a un problème conceptuel: L'appel du client à
recv()
pourrait bloquer comme sa en essayant de recevoir plus que ce que le serveur va envoyer."Un début d'aide serait appréciée": je pourrais vous envoyer mon taux horaire, si vous êtes intéressé.
OriginalL'auteur user2725511 | 2013-08-28
Vous devez vous connecter pour publier un commentaire.
Vous êtes de passage
servername
àinet_pton()
mais il n'est pas initialisé ! Doncinet_pton()
échouera. Vous devriez vérifier sa valeur de retour.Le deuxième problème, c'est que vous n'êtes pas à l'aide de
gethostbyname()
correctement.Jetez un oeil à la page de manuel, vous verrez quegethostbyname()
est pris arguments et retourne un pointeur vers unestruct hostent
, pas un pointeur verschar
comme vous l'avez fait. Votre compilateur ne pas vous avertir à ce sujet, car vous ne comprennent pasnetdb.h
.Vous devriez vérifier les valeurs de retour de tous les functiond que vous utilisez, c'est d'éviter de tels problèmes. Vous devrait permettre à certains drapeaux de votre compilateur (comme alk dit dans la question des commentaires, -W -Wextra -Wall-pedantic sont vraiment de grands drapeaux).
Ok.. Le code mis à jour est tel.. sockfd=socket(AF_INET,SOCK_STREAM,0); bzero(&serveraddr,sizeof(serveraddr)); serveraddr.sin_family=AF_INET; serveraddr.sin_port=htons(11378); servername=gethostbyname("localhost"); inet_pton(AF_INET,servername,&serveraddr.sin_addr);
Veuillez mettre à jour le code votre question (ne pas publier la mise à jour du code dans un commentaire, il est difficile de les lire 🙂 )
Ajouter un peu de vérification des erreurs dans votre code, et de lire question à propos de
gethostbyname("localhost")
.toujours pas de succès" alors, quelle est l'erreur actuelle. Où êtes-vous? Ce n'est pas de travail?
OriginalL'auteur nouney
vérifier le port. le port du serveur 7400 mais le client essaie de se connecter avec numéro de port 11378 donc seulement la connexion a été refusée.
OriginalL'auteur Jeyamaran
Assurez-vous d'inclure errno.h dans votre programme.
Ajouter la ligne
printf("%s", strerr(errno));
dans votre programme après un échec. Tout appel de défaillance du système jeux de corriger errno le rendant simple pour diagnostiquer le problème.OriginalL'auteur NeilBlue
Bien, vous devez être sûr que votre serveur est en cours d'exécution et à l'écoute sur le port approprié (7400). Il suffit de cocher: "netstat -tanp" si il y a quelque chose à l'écoute sur le port 7400 et puis essayez de vous connecter.
Plus au point, le serveur n'est pas s'exécute sur le port 11378. Si c'est un client ou un serveur d'erreur est discutable.
OriginalL'auteur user2699113