我正在尝试将DHCP服务器模拟为大学任务。由于多个客户端将使用BROADCAST向这些服务器发送消息(这是'仅'255台服务器的限制来源),因此需要执行至少2台服务器(或多达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);
非常感谢你。
答案 0 :(得分:1)
您的UDP服务器的每个实例都必须侦听另一个端口。代码中的关键字是:
serv_addr.sin_port = htons(SERV_UDP_PORT);
看起来您将端口号作为常量(SERV_UDP_PORT
)。要使多个服务器同时运行,每个服务器都需要另一个端口。
在您的情况下,可能最好的解决方案是使用命令行参数来定义启动服务器的端口。
每个客户端都需要知道要连接的端口(和当然地址)。因此,让您的客户端接受类似的命令行参数。
答案 1 :(得分:0)
要运行多个服务器,它们应该侦听同一网络接口上的不同端口。您可以通过在具有不同ips的同一网络上使用两个网络接口(比如wifi和以太网)来逃避。
答案 2 :(得分: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
。