2016-04-06 69 views
0

ソケットで最初のサーバークライアントアプリケーションを作成する際に問題が発生します。サーバーのソケットアドレスをlocalhostに、そしてポートを55555にハードコードしました。クライアントから別のターミナルで./player localhost 55555と入力すると、サーバーに何も起こりません。私は、サーバーが "Rock"というデータを受け取り、 "Client:ready。\ nGo \ nGo \ n Client:Rock"という文字列を出力すると思います。代わりに、サーバーはプレーヤーに反応しないで待機し続けます。私は実際にサーバーに接続していないと思ったので、プレーヤーアドレスに "localhost"というソケットアドレスをハードコードしようとしましたが、ポートは55555(ハードコーディングされています)にも接続されました。 ./playerコマンドを実行しようとしましたが、「接続:接続が拒否されました」というメッセージが表示されます。私は、ハードコーディングされplayer.cUnixサーバークライアント接続:接続が拒否されました

referee.c(これはサーバです)

#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(クライアント)

#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

#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

エラーのために 'bind()'と 'listen()'の結果をチェックする必要があります。 – EJP

答えて

1

これは間違っている:

server.sin_port = 55555; 

は、それは次のようになります。

server.sin_port = htons(55555); 
+0

Btwサーバーが実際にポート55555でリッスンしているかどうかを簡単に確認したい場合は、サーバーの実行中に別のシェルウィンドウから "telnet 127.0.0.1 55555"を実行してみてください。 telnetが「接続が拒否されました」と言うと、サーバーは実際に何らかの理由でそのポートでリッスンしていません。 –

+0

私はtelnetを持っています127.0.0.1 55555 試行127.0.0.1 ... 127.0.0.1に接続しました。 エスケープ文字は '^]'です。 外部ホストによって接続が閉じられました。 – Tzheng

+0

私はserver.sin_portをserver.sin_port = htons(55555)に変更しました。私のhp = gethostname( "localhost");私はhp = gethostname( "127.0.0.1")に変更しました。まだ動作していません – Tzheng

0

server.sin_port = 55555; 

を変更する:

server.sin_port = htons(55555); 

が働いています。

+0

私はこれを試しましたが、同じことが起こりました。あなたは "Client:ready。\ nGo \ n Client:Rock"という行を印刷するようにサーバーを取得しますか?また、私はreferee.c内の私のbind()のテストを実行し、-1を返すようです。だから私はエラーが今バインドであると考えている – Tzheng

+0

yes.bind()は私のためにうまくいきます。以前に同じプロセスが実行されているかどうかを確認するにはps -eを実行します。 –

+0

私の出力は次のようになります。 バインド:成功 ペーパー、はさみ、ロックゲームが始まります。 プレーヤーを待っています... 聴解::成功 クライアント:準備完了。 Go クライアント:ロック –

関連する問題