2016-04-06 20 views
0

Ich habe einige Probleme beim Erstellen meiner ersten Server-Client-Anwendung mit Sockets. Ich habe die Socket-Adresse des Servers auf localhost und den Port als 55555 fest codiert. Wenn ich versuche, mich von Client in einem separaten Terminal mit dem Befehl ./player localhost 55555 zu verbinden, geschieht nichts mit dem Server. Was ich glaube, sollte passieren, dass der Server Daten empfängt, die "Rock" sind und dann "Client: bereit" ausdruckt. \ NGo \ n Client: Rock ". Stattdessen wartet der Server ohne Reaktion auf den Spieler. Ich vermutete, dass ich nicht wirklich mit dem Server verbunden bin, also habe ich versucht, die Socket-Adresse "localhost" in den player connect zu codieren, genauso wie den Port auf 55555 (auch hardcoded). Ich habe versucht, den Befehl ./player auszuführen und es spuckt "Connect: Connection Refused". Ich habe mich gefragt, wie ich konnte meine hart codiert player.cUnix-Server-Client Verbindung: Verbindung verweigert

referee.c (dies ist der Server) fix

#include <sys/socket.h> 
#include <netinet/in.h> 
#include <netdb.h> 
#include <stdio.h> 
#include <stdlib.h> 
#include <strings.h> 

int main(int argc, const char* argv[]) 
{ 
    char buf[1024]; 
    struct sockaddr_in localhost; 
    int listenSock, serviceSock, bytesRead; 
    size_t len = sizeof(localhost); 
    int port = 55555; 
    listenSock = socket(AF_INET, SOCK_STREAM, 0); 
    if (listenSock<0) { 
     perror("Socket"); 
     exit(1); 
    } 
    bzero((char*)&localhost, len); 
    localhost.sin_family = AF_INET; 
    localhost.sin_addr.s_addr = htonl(INADDR_ANY); 
    localhost.sin_port = htons(port); 
    bind(listenSock, (struct sockaddr*) &localhost, len); 
    printf("Paper, Scissors, Rock game start.\nWaiting for player...\n"); 
    listen(listenSock, 5); 
    do { 
     serviceSock = accept(listenSock, 0, 0); 
     if(serviceSock == -1){ 
      perror("Accept"); 
     } 
     else do { 
      bzero(buf, sizeof(buf)); 
      if((bytesRead = read(serviceSock, buf, 1024))<0) { 
       perror("Read"); 
      } 
      if(bytesRead > 0){ 
       printf("Client: ready.\nGo\n Client: %s\n", buf); 
      } 
     } while (bytesRead != 0); 
     close(serviceSock); 
    } while(1); 
} 

player.c (Client)

#include <sys/socket.h> 
#include <netinet/in.h> 
#include <netdb.h> 
#include <stdio.h> 
#include <strings.h> 
#include <string.h> 
#include <stdlib.h> 

int main(int argc, char* argv[]) { 
    int sock; 
    struct sockaddr_in server; 
    struct hostent *hp; 
    char buf[1024], *data = "Rock"; 
    sock = socket(AF_INET, SOCK_STREAM, 0); 
    if (sock < 0) { 
     perror("Socket"); 
     exit(1); 
    } 
    server.sin_family = AF_INET; 
    hp = gethostbyname(argv[1]); 
    if (hp == 0) { 
     fprintf(stderr, "%s: unknown host", argv[1]); 
     exit(1); 
    } 
    bcopy(hp->h_addr, &server.sin_addr, hp->h_length); 

    server.sin_port = htons(atoi(argv[2])); 
    if(connect(sock, (struct sockaddr *) &server, sizeof(server)) < 0) { 
     perror("Connect"); 
     exit(1); 
    } 
    if(write(sock, data, strlen(data)) < 0) { 
     perror("Write"); 
    } 
    close(sock); 
} 

player.c mit fest codierter Adresse/Port

#include <sys/socket.h> 
#include <netinet/in.h> 
#include <netdb.h> 
#include <stdio.h> 
#include <strings.h> 
#include <string.h> 
#include <stdlib.h> 

int main(int argc, char* argv[]) { 
    int sock; 
    struct sockaddr_in server; 
    struct hostent *hp; 
    char buf[1024], *data = "Rock"; 
    sock = socket(AF_INET, SOCK_STREAM, 0); 
    if (sock < 0) { 
     perror("Socket"); 
     exit(1); 
    } 
    server.sin_family = AF_INET; 
    hp = gethostbyname("localhost"); 
    if (hp == 0) { 
     fprintf(stderr, "%s: unknown host", argv[1]); 
     exit(1); 
    } 
    bcopy(hp->h_addr, &server.sin_addr, hp->h_length); 

    server.sin_port = 55555; 
    if(connect(sock, (struct sockaddr *) &server, sizeof(server)) < 0) { 
     perror("Connect"); 
     exit(1); 
    } 
    if(write(sock, data, strlen(data)) < 0) { 
     perror("Write"); 
    } 
    close(sock); 
} 
+0

Sie müssen das Ergebnis von 'bind()' und 'listen()' auf Fehler überprüfen. – EJP

Antwort

1

Das ist falsch:

server.sin_port = 55555; 

Es sollte:

server.sin_port = htons(55555); 
+0

Btw Wenn Sie möchten, dass Ihr Server tatsächlich Port55555 abgehört, können Sie versuchen, ein "Telnet 127.0.0.1 55555" aus einem anderen Shell-Fenster zu machen, während der Server läuft. Wenn telnet sich über "Verbindung abgelehnt" beschwert, dann hört Ihr Server aus irgendeinem Grund nicht wirklich auf diesem Port zu. –

+0

Ich habe Telnet 127.0.0.1 55555 versucht 127.0.0.1 ... Verbunden mit 127.0.0.1. Escape-Zeichen ist '^]'. Verbindung vom fremden Host geschlossen. – Tzheng

+0

Ich habe meinen server.sin_port in server.sin_port = htons geändert (55555); auch mein hp = gethostname ("localhost"); Ich wechselte zu hp = gethostname ("127.0.0.1"); es funktioniert immer noch nicht – Tzheng

0

Ändern

server.sin_port = 55555; 

zu:

server.sin_port = htons(55555); 

arbeitet.

+0

Ich habe das versucht, aber das gleiche ist passiert. Bekommen Sie den Server, um die Zeile "Client: bereit. \ NGo \ n Client: Rock" zu drucken. Ich habe auch einen Test auf meine bind() in referee.c ausgeführt und es scheint -1 zurückzugeben. So stelle ich fest, dass der Fehler jetzt bind ist – Tzheng

+0

yes.bind() funktioniert gut für mich. Machen Sie ps -e, um zu sehen, ob der gleiche Prozess bereits läuft. –

+0

meine Ausgabe ist wie folgt: bind: Erfolg Papier, Schere, Rock Spiel starten. Warten auf Player ... hören :: Erfolg Client: bereit. Go Kunde: Rock –

Verwandte Themen