0

大学の課題として DHCP サーバーをシミュレートしようとしています。複数のクライアントが BROADCAST を使用してこれらのサーバーにメッセージを送信するため、少なくとも 2 台のサーバー (または最大 255 台) を実行する必要があります (255 台のサーバーのみという制限はこのためです)。

しかし、Ubuntuで2つの異なる端末で2つのサーバーを実行しようとすると、実行された2番目のサーバーが拒否されます。同じローカルホストのIPか何かが原因だと思います(申し訳ありませんが、通信プロトコルについてあまり知りません)

同じマシンで複数のサーバーを実行するにはどうすればよいですか? 私たちの先生は、VMWare を使用して別の Linux OS を実行し、両方を実行しようとすることについて教えてくれましたが、私にとって、この解決策は私の考えとはかけ離れています... サーバーとクライアントの接続ステートメントを投稿します。 C ステートメント、または OS 構成などに問題があります。

サーバ:

int sockfd, newsockfd, clilen, n;
struct sockaddr_in  cli_addr, serv_addr ;
char host_name[200];
int size = sizeof(struct DHCP);
char buffer[size];
struct MACIP *macip;

if ((sockfd = socket(AF_INET, SOCK_DGRAM,0)) < 0) {
    printf("server: can't open datagram socket\n");
    return -1;
}

serv_addr.sin_family        = AF_INET;
serv_addr.sin_addr.s_addr   = htonl(0); 
serv_addr.sin_port          = htons(SERV_UDP_PORT);

if (bind(sockfd, (struct sockaddr *) &serv_addr, sizeof(serv_addr)) <0) {
    printf("server: can't bind local address\n");
    return -1;
}

クライアント:

int sockfd, n, clilen;
struct sockaddr_in  serv_addr, cli_addr;
char serv_host_addr[30];
int size = sizeof(struct DHCP);
char buffer[size];  

printf("Dirección IP del servidor (a.b.c.d) => ");
gets(serv_host_addr);

if ((sockfd = socket(AF_INET, SOCK_DGRAM, 0)) < 0) {
    perror("client: can't open datagram socket");
    return -1;
}

int opt=1;
if (setsockopt(sockfd, SOL_SOCKET, SO_BROADCAST,&opt, sizeof(opt))<0) {
    perror("Error opcion socket");
    close(sockfd);
    return 1;
}

bzero((char *)&cli_addr,sizeof(cli_addr));
cli_addr.sin_family         = AF_INET;
if (bind(sockfd, (struct sockaddr *) &cli_addr,sizeof(cli_addr)) < 0)  {
    perror("client: can't bind a port");
    return -1;
}

serv_addr.sin_family        = AF_INET;
inet_pton(AF_INET, serv_host_addr,&serv_addr.sin_addr);
//serv_addr.sin_addr.s_addr = inet_addr(serv_host_addr);
serv_addr.sin_port          = htons(SERV_UDP_PORT);

事前にどうもありがとうございました。

4

3 に答える 3

1

UDP サーバーのすべてのインスタンスは、別のポートでリッスンする必要があります。コードの重要な行は次のとおりです。

serv_addr.sin_port = htons(SERV_UDP_PORT);

ポート番号を定数として持っているようです ( SERV_UDP_PORT)。複数のサーバーを同時に実行するには、サーバーごとに別のポートが必要です。

あなたの場合のおそらく最善の解決策は、サーバーを起動するポートを定義するコマンドライン引数を持つことです。

各クライアントは、接続先のポート (およびもちろんアドレス) も認識する必要があります。したがって、クライアントが同様のコマンドライン引数を受け入れるようにします。

于 2012-04-14T23:56:07.130 に答える
0

alias interfaces既存のインターフェースでセットアップしようとするかもしれません。次にalias interfaces、それぞれ独自のIPアドレスを取得します。

lo通常割り当てられているループバックインターフェイス()を使用する127.0.0.1と、このインターフェイスへのこのようなエイリアスはlo:0lo:1...と呼ばれ、IPアドレス,,...を伝送し127.0.0.2ます127.0.0.3

これを実現する方法の詳細については、を参照してくださいman ifconfig

于 2012-04-14T12:21:44.517 に答える
0

複数のサーバーを実行するには、同じネットワーク インターフェイスの異なるポートでリッスンする必要があります。同じネットワーク上で異なる ips を持つ 2 つのネットワーク インターフェイス (wifi とイーサネットなど) を使用することで回避できます。

于 2012-04-14T11:39:37.343 に答える