История изменений
Исправление iliyap, (текущая версия) :
Пусть демоны слушают запросы на одном и том же TCP порту, но на разных IP-адресах. Для запуска на одном хосте подойдут адреса 127.0.0.2, 127.0.0.3, … Чтобы их не нужно было добавлять на интерфейс lo, можно использовать опцию IP_FREEBIND.
int fd;
int opt;
struct sockaddr_in local;
fd = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP);
opt = 1;
setsockopt(fd, SOL_IP, IP_FREEBIND, &opt, sizeof(opt));
memset(&local, 0, sizeof(local));
local.sin_family = AF_INET;
local.sin_port = htons(12345);
local.sin_addr.s_addr = htonl(INADDR_LOOPBACK + 1); /* 127.0.0.2 */
bind(fd, (struct sockaddr *)&local, sizeof(local));
listen(fd, 128);
Демон при запуске может пробовать сбиндиться на адреса из списка 127.0.0.2…127.0.0.100, сядет на первый незанятый. А cli утилита пусть пытается сконнектиться со всеми адресами 127.0.0.2…127.0.0.100, и общается со всеми демонами, до которых удалось установить коннект.
Исходная версия iliyap, :
Пусть демоны слушают запросы на одном и том же TCP порту, но на разных IP-адресах. Для запуска на одном хосте подойдут адреса 127.0.0.2, 127.0.0.3, … Чтобы их не нужно было добавлять на интерфейс lo, можно использовать опцию IP_FREEBIND.
int fd;
int opt;
struct sockaddr_in local;
fd = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP);
opt = 1;
setsockopt(fd, SOL_IP, IP_FREEBIND, &opt, sizeof(opt));
memset(&local, 0, sizeof(local));
local.sin_family = AF_INET;
local.sin_port = htons(12345);
local.sin_addr.s_addr = htonl(INADDR_LOOPBACK + 1); /* 127.0.0.2 */
bind(fd, (struct sockaddr *)&local, sizeof(local));
listen(fd, 128);