C, Sockets: Connexion Refusée erreur
J'ai un module d'acquisition de données à partir de laquelle je voudrais recueillir des données à partir du port Ethernet. Je vais y venir dans les étapes, actuellement, je voudrais juste connect
au serveur à partir d'un client. J'ai utilisé Beej du guide pour obtenir le C de base de code. Mais je reçois cette erreur de connexion connect: Connection refused.
C'est ce que je fais:
-
Le réseau IP mentionnée ici est IP STATIQUE que j'ai configuré.
-
Le numéro de port est fixé à 50000 sur le côté Serveur et du côté client me connecter à cette adresse IP sur le port 50000.
-
- Je construire et exécuter le côté serveur de l'application, puis essayez de vous connecter en exécutant côté client de l'application.
Un doute sur le côté serveur, côté serveur de l'application returns
avant que je commence le client de l'application côté, donc, dois-je le garder en cours d'exécution (while(1);
) afin que je puisse vous connecter à partir du côté client?
Du problème, suis-je oublier quelque chose ici? À l'aide!
Je suis coller le très légèrement modifié (IP et les numéros de port sont différents) Beej du code C pour côté Serveur et côté Client ici:
Serveur.c
/*
** server.c
*/
#include <stdio.h>
#include <string.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netdb.h>
#include <arpa/inet.h>
#include <netinet/in.h>
int main(int argc, char *argv[])
{
//code for a server waiting for connections
//namely a stream socket on port 3490, on this host's IP
//either IPv4 or IPv6.
int sockfd;
struct addrinfo hints, *servinfo, *p;
int rv;
memset(&hints, 0, sizeof hints);
hints.ai_family = AF_UNSPEC; //use AF_INET6 to force IPv6
hints.ai_socktype = SOCK_STREAM;
hints.ai_flags = AI_PASSIVE; //use my IP address
if ((rv = getaddrinfo(NULL, "50000", &hints, &servinfo)) != 0)
{
fprintf(stderr, "getaddrinfo: %s\n", gai_strerror(rv));
exit(1);
}
//loop through all the results and bind to the first we can
for(p = servinfo; p != NULL; p = p->ai_next)
{
if ((sockfd = socket(p->ai_family, p->ai_socktype,
p->ai_protocol)) == -1)
{
perror("socket");
continue;
}
if (bind(sockfd, p->ai_addr, p->ai_addrlen) == -1)
{
close(sockfd);
perror("bind");
continue;
}
break; //if we get here, we must have connected successfully
}
if (p == NULL)
{
//looped off the end of the list with no successful bind
fprintf(stderr, "failed to bind socket\n");
exit(2);
}
freeaddrinfo(servinfo); //all done with this structure
}
Client.c
/*
** client.c
*/
#include <stdio.h>
#include <string.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netdb.h>
#include <arpa/inet.h>
#include <netinet/in.h>
int main(int argc, char *argv[])
{
//code for a client connecting to a server
//namely a stream socket to www.example.com on port 80 (http)
//either IPv4 or IPv6
int sockfd;
struct addrinfo hints, *servinfo, *p;
int rv;
memset(&hints, 0, sizeof hints);
hints.ai_family = AF_UNSPEC; //use AF_INET6 to force IPv6
hints.ai_socktype = SOCK_STREAM;
if ((rv = getaddrinfo("192.168.2.4", "50000", &hints, &servinfo)) != 0)
{
fprintf(stderr, "getaddrinfo: %s\n", gai_strerror(rv));
exit(1);
}
//loop through all the results and connect to the first we can
for(p = servinfo; p != NULL; p = p->ai_next)
{
if ((sockfd = socket(p->ai_family, p->ai_socktype,
p->ai_protocol)) == -1)
{
perror("socket");
continue;
}
if (connect(sockfd, p->ai_addr, p->ai_addrlen) == -1)
{
close(sockfd);
perror("connect");
continue;
}
break; //if we get here, we must have connected successfully
}
if (p == NULL)
{
//looped off the end of the list with no connection
fprintf(stderr, "failed to connect\n");
exit(2);
}
freeaddrinfo(servinfo); //all done with this structure
}
OriginalL'auteur HaggarTheHorrible | 2012-07-16
Vous devez vous connecter pour publier un commentaire.
Votre code serveur est manquant
listen()
etaccept()
code pour "attendre" pour une connexion en appelant listen() et en effectuant ensuite uneaccept()
à accepter de nouvelles connexions. N'est pas l'exemple que vous utilisez montrer comment faire cela? En général, vous aurez également la fourche d'un nouveau thread pour chaque nouvelle connexion.Voir http://www.linuxhowtos.org/C_C++/socket.htm pour plus d'informations.
Voici un lien vers une implémentation plus complète: http://www.thegeekstuff.com/2011/12/c-socket-programming/
J'ai vérifié un code qui ont fait de ces, mais les résultats même problème.serveur.c client.c
Votre serveur semble être à l'écoute sur le port 9999 alors que votre client tente de se connecter au port FTP_PORT (21). Changer votre client pour utiliser le port 9999 connecter.
OriginalL'auteur HeatfanJohn
Oui, vous avez besoin pour garder le serveur en cours d'exécution. Dans votre programme de serveur que vous avez créé le socket en utilisant
socket()
et lié à une adressebind()
, maintenant, vous devez commencer à l'écoute pour les connexions entrantes. Cela se fait avec lalisten()
appel. Une fois la socket est à l'écoute pour les connexions entrantes, vous devez utiliser leaccept()
appel à accepter une connexion et d'obtenir le support pour la communication avec le client.Comme un exemple rapide, après la
freeaddrinfo
vous pouvez ajouter le code suivant:Ce code a la carence qu'un seul client à la fois est manipulé. Il ya quelques façons de gérer simultanément plusieurs clients: de multiples processus à l'aide de
fork()
, plusieurs threads, ou d'interrogation. Chacune de ces approches sont, à mon avis, en dehors de la portée de cette question.OriginalL'auteur Geoff Reedy
Veuillez jeter un oeil à votre Serveur.fichier c: il ne s'agit pas d'écouter() à tous!
Si le serveur cible n'écoute pas sur le port spécifié, alors il serait de retour paquet RST lors de la réception de paquet SYN à partir du client, afin de connect() serait de retour avec "Connexion refusée".
Flux Normal des fonctions à côté serveur socket -> bind -> listen -> accepter :
Veuillez vous référer à https://beej.us/guide/bgnet/html/multi/syscalls.html#listen
OriginalL'auteur Xu Hong
Je recevais le message d'erreur "connexion refusée" en raison de ne pas avoir l'entrée de l'hôte distant dans le fichier /etc/hosts. L'entrée devrait être présent des deux côtés. Dans les machines Client /etc/hosts, il devrait y avoir une entrée de la machine serveur et vice-versa dans le schéma ci-dessous.
<ip address> <hostname with domain> <alias hostname>
Cela a résolu l'erreur où j'ai été en getaddrinfo ().
OriginalL'auteur Adithya Gokhale