gpt4 book ai didi

c - 在 C 中同时执行两个本地套接字服务器

转载 作者:太空宇宙 更新时间:2023-11-04 11:32:40 25 4
gpt4 key购买 nike

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

但是当我尝试在 Ubuntu 的 2 个不同终端中执行 2 个服务器时,执行的第二个服务器被拒绝。我猜这是由于 IP 在同一个本地主机或其他什么(很抱歉,但我对通信协议(protocol)了解不多)

如何在同一台机器上运行多个服务器?我们的老师告诉我们使用VMWare运行另一个Linux OS,并尝试同时运行,但对我来说这个解决方案与我的想法相去甚远......我将发布服务器和客户端连接语句,虽然我不知道是否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);

非常感谢您。

最佳答案

UDP 服务器的每个实例都必须监听另一个端口。您代码中的关键行是这样的:

serv_addr.sin_port = htons(SERV_UDP_PORT);

看起来您将端口号作为常量 (SERV_UDP_PORT)。要让多台服务器同时运行,您需要为每台服务器分配一个端口。

在您的情况下,最好的解决方案可能是有一个命令行参数来定义您启动服务器的端口。

每个客户端还需要知道连接到哪个端口(当然还有地址)。因此,让您的客户端接受类似的命令行参数。

关于c - 在 C 中同时执行两个本地套接字服务器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10152896/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com