0

我正在尝试将 DHCP 服务器模拟为大学任务。需要执行至少 2 个服务器(或更多,最多 255 个),因为多个客户端将使用 BROADCAST 向这些服务器发送消息(这就是“仅”255 个服务器的限制的来源)。

但是当我试图在 Ubuntu 的 2 个不同终端中执行 2 个服务器时,执行的第二个服务器被拒绝。我猜这是由于同一本地主机上的 IP 或其他原因(对不起,我对通信协议不太了解)

如何在同一台机器上运行多个服务器?我们的老师告诉我们使用VMWare运行另一个Linux操作系统,并尝试运行两者,但对我来说这个解决方案与我的想法相去甚远......我将发布服务器和客户端连接语句,虽然我不知道是否C 语句或操作系统配置等存在问题。

服务器:

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

要运行多个服务器,它们应该侦听同一网络接口上的不同端口。您可以通过在具有不同 ips 的同一网络上使用两个网络接口(例如 wifi 和以太网)来摆脱困境。

于 2012-04-14T11:39:37.343 回答
0

alias interfaces您可能会尝试在现有界面上进行设置。这样alias interfaces就得到了各自的ip地址。

lo使用典型已分配的环回接口 ( ),127.0.0.1然后可以调用此接口的此类别名lo:0, lo:1... 并将携带 ip 地址127.0.0.2, 127.0.0.3, ....

有关如何实现此目的的详细信息,请参阅man ifconfig

于 2012-04-14T12:21:44.517 回答