2016-04-06 28 views
0

İlk sunucu-istemci uygulamamı yuvalarla oluştururken bazı sorunlar yaşıyorum. Sunucunun soket adresini localhost ve portu 55555 olarak kodladım. İstemciden ayrı bir terminalde ./player localhost 55555 komutunu kullanarak bağlanmaya çalıştığımda, sunucuya hiçbir şey olmuyor. Olması gerektiğine inanıyorum, sunucu "Kaya" olan verileri alır sonra "Müşteri: hazır. \ NGo \ n İstemci: Rock" yazdırır. Bunun yerine, sunucu oyuncuya tepki vermeden beklemeye devam eder. Aslında sunucuya bağlı olmadığından şüpheliyim, bu yüzden "localhost" soketini player connect'e ve 55555 portuna (ayrıca hardcoded) sokmaya çalıştım. ./player komutunu çalıştırmayı denedim ve "Connect: Connection Reddedildi" mesajını veriyor. Benim sert kodlu player.c düzeltmek nasıl merakUnix sunucu istemcisi Bağlantı: Bağlantı reddedildi

referee.c (bu sunucu)

#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 (istemci)

#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 sabit kod ile adres/bağlantı noktası

#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

Hatalar için 'bind()' ve 'listen()' sonucunu kontrol etmeniz gerekir. – EJP

cevap

1

Bu yanlıştır:

server.sin_port = 55555; 

Olmalıdır:

server.sin_port = htons(55555); 
+0

Btw sunucunuzun gerçekte 55555 numaralı bağlantı noktasını dinlediğini doğrulamanın kolay bir yolunu istiyorsanız, sunucu çalışırken başka bir kabuk penceresinden "telnet 127.0.0.1 55555" yapmayı deneyebilirsiniz. Telnet, "bağlantı reddedildi" den şikayet ederse, sunucunuz aslında o porttan hangi nedenle olursa olsun dinlemez. –

+0

Telnet var 127.0.0.1 55555 127.0.0.1 çalışıyor ... 127.0.0.1'e bağlandı. Kaçış karakteri '^]' dir. Bağlantı yabancı ana makine tarafından kapatıldı. – Tzheng

+0

Sunucu.sin_port'umu server.sin_port = htons (55555) olarak değiştirdim; ayrıca benim hp = gethostname ("localhost"); Hp = gethostname ("127.0.0.1") olarak değiştirdim; hala çalışmıyor – Tzheng

0

için

server.sin_port = 55555; 

değiştirme:

server.sin_port = htons(55555); 

çalışıyor.

+0

Bunu denedim, ama aynı şey oldu. Sunucuyu "İstemci: hazır. \ NGo \ n İstemci: Rock" satırını yazdıracak şekilde alıyor musunuz? Ayrıca referee.c benim bind() üzerinde bir test çalıştırdık ve -1 dönmek gibi görünüyor. Bu yüzden, hata şu anda bağlantıda olduğunu düşünürüm – Tzheng

+0

yes.bind() benim için iyi çalışıyor. Aynı işlemin daha önce çalışıp çalışmadığını görmek için ps -e yapın. –

+0

benim çıktı şunun gibidir: bind: Başarı Kağıt, Makas, Rock oyunu başlatmak. Oynatıcı bekleniyor ... dinle :: Başarı İstemci: hazır. Git İstemci: Rock –