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

时间:2012-04-14 10:32:48

标签: c linux sockets dhcp

我正在尝试将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);

非常感谢你。

3 个答案:

答案 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:0lo:1 ...并且携带IP地址127.0.0.2127.0.0.3,....

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