2013-05-19 3 views
0

J'écris un serveur/client socket simple. Voici le serveur partie:Socket C: Connexion refusée [Errno 111]

#include <iostream> 
#include <sys/types.h> 
#include <sys/socket.h> 
#include <string.h> 
#include <arpa/inet.h> 
#include <unistd.h> 
#include <stdio.h> 
#include <time.h> 

using namespace std; 

int main() { 
int listenfd; 
int connfd; 
sockaddr_in servaddr; 
char buf[100]; 
time_t ticks; 

if(listenfd = socket(AF_INET,SOCK_STREAM,0) < 0) 
    cout << "listenfd" << endl; 
bzero(&servaddr,sizeof(servaddr)); 
servaddr.sin_family = AF_INET; 
servaddr.sin_addr.s_addr = htonl(INADDR_ANY); 
servaddr.sin_port = htons(10000); 

bind(listenfd,(const struct sockaddr*)&servaddr,sizeof(servaddr)); 

listen(listenfd,5); 

for(;;) { 
    connfd = accept(listenfd,(struct sockaddr *)NULL,NULL); 
    //cout << "accept link" << endl; 
    ticks = time(NULL); 
    snprintf(buf,sizeof(buf),"%.24s\r\n",ctime(&ticks)); 
    //cout << buf << endl; 
    write(connfd,buf,strlen(buf)); 
    close(connfd); 
} 
} 

Et voici le client partie:

#include <netinet/in.h> 
#include <iostream> 
#include <unistd.h> 
#include <sys/types.h> 
#include <sys/socket.h> 
#include <errno.h> 
#include <string.h> 
#include <stdlib.h> 
#include <stdio.h> 
#include <arpa/inet.h> 
using namespace std; 
#define MAX 100 
int main(int argc,char **argv) { 
    int socketfd; 
    int n; 
    char buf[MAX+1]; 
    sockaddr_in servaddr; 

    if(argc !=2) 
     cout << "stdin error " << endl; 

    if((socketfd = socket(AF_INET,SOCK_STREAM,0)) < 0) 
     cout << " socekt error " << endl; 
    bzero(&servaddr,sizeof(servaddr)); 
    servaddr.sin_family = AF_INET; 
    servaddr.sin_port = htons(10000); 
    if(inet_pton(AF_INET,argv[1],&servaddr.sin_addr) <= 0) 
     cout << "inet_pton error" << endl; 
    cout << "prepare linking" << endl; 
    if(connect(socketfd,(const struct sockaddr*)&servaddr,sizeof(struct sockaddr)) < 0) 
    { 
     cout << " connet error" << endl; 
     cout << strerror(errno); 
    } 
    while((n = read(socketfd,buf,MAX)) >0) { 
     buf[n] = 0; 
     if(fputs(buf,stdout) == EOF) 
      cout << "cout error" << endl; 
    } 
    if(n < 0) 
      cout << "read error" << endl; 
    exit(0); 
} 

Je commence d'abord le serveur et exécuter le client comme: ./client 127.0.0.1, mais la connexion a échoué avec errno 111 J'utilise le système Ubuntu 12.04.

Répondre

4

Dans votre code serveur, vous avez:

if(listenfd = socket(AF_INET,SOCK_STREAM,0) < 0) 

Le problème est de faire la priorité des opérateurs C. Parce que la comparaison < a une priorité que l'affectation plus, votre déclaration sera mis listenfd à la valeur booléenne de la signification du bit x < y, parce que le socket aura plus de chance de réussir, il sera probablement mis à 0 (false), entrée par conséquent standard (le descripteur de fichier 0).

Si vous devez utiliser les raccourcis C (je sais qu'ils sont à portée de main, mais parfois ils sont moins lisibles que les solutions de rechange), vous devez utiliser la variante:

if ((listenfd = socket (AF_INET, SOCK_STREAM, 0)) < 0) 

comme vous l'avez déjà fait dans votre code client:

if ((socketfd = socket (AF_INET, SOCK_STREAM, 0)) < 0) 
Questions connexes