0

C の 2 つのプログラム (常にクライアントとサーバーのように) との接続に問題があります。私の問題は、特定の ip アドレス (自分の ip アドレス) を使用したい場合、両方の間の接続が機能しなかったことです。これで、私のプログラムは動作します: addr.sin_addr.s_addr = htonl(INADDR_ANY); しかし、現時点では、この行を次のように変更します:addr.sin_addr.s_addr = inet_addr(ip); 接続の問題があるので、問題は使用している IP アドレスにあると思います。このコマンドでIPアドレスを取得します:/sbin/ifconfig | grep inet したがって、エラーがどこにあるのかわかりません。私のclient.c:

int client_conversation(int port) { 
  struct sockaddr_in addr;
  int s,c,r;
  char tampon[SIZE];
  char *ip = "XXX.XXX.X.XX";
  struct hostent *nameHost;

  nameHost = gethostbyname("localhost");
  if(nameHost == NULL) { 
    fprintf(stderr,"%s: host inconnue\n","localhost");
    exit(1);
  }
  s = socket(PF_INET,SOCK_STREAM,0);
  if(s == -1) { 
    perror("socket: ");
    exit(1);
  }
  addr.sin_family = AF_INET;
  addr.sin_port = htons(port);
  /**addr.sin_addr.s_addr = htonl(INADDR_ANY);*/
  addr.sin_addr.s_addr = inet_addr(ip);
  memcpy(&(addr.sin_addr.s_addr),nameHost->h_addr_list[0],nameHost->h_length);
  c = connect(s,(struct sockaddr *)&addr,sizeof(struct sockaddr));
  if(c == -1) { 
    fprintf(stderr,"Connexion impossible\n");
    exit(1);
  }
  if((r = read(s,tampon,SIZE)) > 0) {
    write(1,tampon,r);
  }
  close(s);
  return 0;
}

私の server.c :

int serveur_conversation(int port) { 
  struct sockaddr_in addr;
  int s,l,a;
  socklen_t m;
  char *message = "salut";
  char *ip = "XXX.XXX.X.XX";
  s = socket(PF_INET,SOCK_STREAM,0);
  if(s == -1) { 
    perror("socket : ");
    exit(1);
  }
  addr.sin_family = AF_INET;
  addr.sin_port = htons(port);
  /**addr.sin_addr.s_addr = htonl(INADDR_ANY);*/
  addr.sin_addr.s_addr = inet_addr(ip);
  if(bind(s,(struct sockaddr *)(&addr),sizeof(addr)) == -1) {
    perror("bind : ");
    close(s);
    exit(1);
  }
  l = listen(s,100);
  if(l == -1) {
    perror("listen :");
    exit(1);
  } 
  do { 
    a = accept(s,(struct sockaddr *)(&addr),&m);
    if(a == -1) {
      perror("accept :");
      exit(1);
    }
    int pid = fork();
    if(pid == 0) {
      if((write(a,message,strlen(message))) == -1) {
    printf("Impossible d'envoyer le message\n");
    exit(1);
      }
      exit(1);
    }
  }while(1);
  return 0;
}

私には表示されないエラーが表示された場合は、教えてください。

4

1 に答える 1

0

私が見ているように、クライアント側では「localhost」に接続します

nameHost = gethostbyname("localhost");
...
memcpy(&(addr.sin_addr.s_addr),nameHost->h_addr_list[0],nameHost->h_length);

サーバーサイトでは、IP「XXX.XXX.X.XX」にバインドします。

char *ip = "XXX.XXX.X.XX"
...
addr.sin_addr.s_addr = inet_addr(ip);

クライアントでは、正しい形式を使用してローカルホストの IP を取得します。

nameHost = gethostbyname("localhost");

サーバーでも同じことをしなければならないと思うので、どちらも「localhost」または「192.168.1.25」のような固定定数 IP のいずれかの同じ IP を使用します。そのため、クライアントで接続が拒否されています。

于 2013-05-12T11:11:32.663 に答える