Сергей, со стороны load generator можно использовать порты выше 1024 и до 65К включительно, т.е. в терминологии языка си нужно последовательно
- создаете сокет
- bind его на специфический ай-пи и порт
- send / accept ну и так далее фразы в разговоре между load generator и сервер
код где-то примерно такой. Главноe это bind свою локальную структуру на свой ip и специфический указанный порт
Code: Select all
struct sockaddr_in local; /* socket info about our local */
int mysocket; /* socket used to send/receive */
socklen_t socksize = sizeof(struct sockaddr_in);
memset(&local, 0, sizeof(local)); /* zero the struct before filling the fields */
local.sin_family = AF_INET; /* set the type of connection to TCP/IP */
local.sin_addr.s_addr = htonl(<один из ip адресов локальной NIC card goes here>); /* set our address to any interface */
local.sin_port = htons(<порт от 1024 и до 65К goes here>); /* set the local port number */
/* create socket */
mysocket = socket(AF_INET, SOCK_STREAM, 0);
/* bind local information to mysocket */
bind(mysocket, (struct sockaddr *)&local, sizeof(struct sockaddr));
/* other steps */
Когда один ip address полностью исчерпает все порты, на той же машине нужно будет добавить второй ip адресс и так далее. Т.е. условно, если есть 10 ip адресов и 50 тыс. свободных портов, то можно создать до 500 тыс. outgoing ресурсов. Далее мы упираемся в NIC карточку/карточки, поскольку там данные пихаются хоть и быстро (для 1G NIC карточки), но последовательно.
Привязывать (bind) можно только к внешнему адресу, 127.0.0.х не подойдет, поскольку Вы пытаетесь использовать internal loopback address для коммуникации наружу. Вот если бы и сервер и load generator сидели бы на oдной машине, то такой фокус удался бы без проблем. Тестовый инстанс кассанды, для примера, именно так и инсталируется, каждая нода на свой адрес: 127.0.0.1, 127.0.0.2, и так далее.
Только пожалуйста не создавайте тысячи средов на одной машине по одному на каждую комбинацию ip:port, используйте select
Задача сохранять на самом деле status каждой комбинации ip:port, что бы понимать, какой ее статус в каждый момент времени
- она только bind,
- она что-то отправила и ждет получения,
- она получила и требует анализа,
- она проанализировала и ждет след. отправки
- и так далее.
пробегать ее в while(1) и в зависимости от статуса делать следующий шаг.