0

私は単純なソケット プログラミング アプリケーションを C で作成しました。このコードはループバック アドレスで動作しています。また、このプログラムは、2 台のコンピューター (1つのサーバーと 1 つのクライアント) が同じネットワークにある場合にうまく機能します (私は大学の LAN ネットワークで試しました)。クライアントの「接続」メソッドでエラーが表示されます。クライアントがサーバーに接続できません。助けてください。ほとんどすべてを試しましたが、何も役に立たなかったので、助けてください。できるだけ早く助けてください。今月。ありがとうございます!

コードは次のとおりです。Client.cの場合

#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <errno.h>
#include <string.h>
#include <sys/types.h>
#include <fcntl.h>

int chat();
int main(){
chat();
}

int chat()
{

  int clientid, n = 0;
  char msgsend[512], msgrecv[512];
  struct sockaddr_in client; 


  memset(msgrecv, '0', sizeof(msgrecv));

  clientid = socket(AF_INET, SOCK_STREAM, 0);
  if(clientid == -1){
    printf("Could not create a socket!\n");
    return -1;
  }

  client.sin_family = AF_INET;
  client.sin_addr.s_addr = /*INADDR_ANY;*/inet_addr("10.200.56.187");
  client.sin_port = htons(5001);


  printf(" Trying to connect...");

  if(connect(clientid, (struct sockaddr*)&client, sizeof(client)) < 0){
    printf("Error:Connection failed\n");
    return -1;
  }
  printf("Connected");
  while(1){
    printf("please enter your reply\n");
    gets(msgsend);

    send(clientid, msgsend, sizeof(msgsend) - 1, 0);
    n = recv(clientid, msgrecv, sizeof(msgrecv) - 1, 0);

    if(n < 0){
      printf("Read error\n");
    }
    printf("\n");
    printf("server says:");
    msgrecv[n] = 0;
    fputs(msgrecv, stdout);
    printf("\n");
  }
  return 0;
}



And here is the code:
for server.c


    #include <sys/socket.h>
    #include <netinet/in.h>
    #include <arpa/inet.h>
    #include <stdio.h>
    #include <stdlib.h>
    #include <unistd.h>
    #include <errno.h>
    #include <string.h>
    #include <sys/types.h>
    #include<fcntl.h>

    int chat();
    int main(){
      chat();
      }
    int chat(){

      int serverid, clientid, n = 0, len;
      char msgsend[512], msgrecv[512];
      struct sockaddr_in server,client;

      serverid = socket(AF_INET, SOCK_STREAM, 0);

      memset(&server, '0', sizeof(server));
      memset(msgrecv, '0', sizeof(msgrecv));

      server.sin_family = AF_INET;
      server.sin_addr.s_addr = htonl(INADDR_ANY);
      server.sin_port = htons(5001);

      bind(serverid, (struct sockaddr*)&server, sizeof(server));

      if( listen(serverid, 10) == -1){
        printf("ERROR");
        return -1;
      }
      len = sizeof(client);
        clientid = accept(serverid, (struct sockaddr*)&client, &len);
      while(1){



        n =  recv(clientid, msgrecv, sizeof(msgrecv) - 1, 0);
        if(n < 0){
          printf("Error while reading...\n");
          return -1;
        }

        printf("client says:");
        msgrecv[n] = 0;
        fputs(msgrecv, stdout);
        printf("\n");
        printf("enter your reply\n");
        gets(msgsend);
        send(clientid, msgsend, sizeof(msgsend) - 1, 0);
        printf("\n");
      }
      return 0;
    }
4

3 に答える 3

1

サーバーアドレスにプライベート IPを使用しています。プライベート IP は、外部のローカル/プライベート ネットワークからアドレス指定できません。

于 2013-08-21T17:46:55.983 に答える
0

プライベート IP は 1 つのことです。接続しようとしているサーバーは、独自のネットワーク内にあるか、少なくとも dns で解決できる必要があります。

また、サーバーに接続しようとするときは、常に gethostbyname() などの呼び出しを使用してサーバー名に関連付けられた IP を取得しようとします。これは、DNS 更新のためにサーバーの IP が変更される可能性があるためですが、ホスト名はほとんど常に同じままです。

于 2013-08-22T05:20:41.080 に答える
0

他の人が見つけたように、基礎となるネットワークに注意する必要があります。静的 IP を取得しても、アプリと通信できない場合があります。考えられる理由は次のとおりです。

  • 途中のホストマシンまたはルーター/モデムのファイアウォール。
  • 両方のネットワークのルーターでの NAT 構成

ネットワークの問題を診断するには、ping、traceroute、telnet (および場合によっては他のネットワーク ツール) を使用する必要があります。

より深い分析には tcpdump を使用できます。

于 2013-08-23T06:39:45.747 に答える