Тест производительности не работает с nanomsg (шина)
Я хотел бы использовать nanomsg
как шинная система. Поэтому я попытался написать тест производительности и протестировать его на двух компьютерах.
Сначала я написал сервер, который подключается к другому серверу:
#include <nanomsg/nn.h>
#include <nanomsg/bus.h>
#include <string.h>
#include <stdio.h>
#include <assert.h>
int main(int argc, char *argv[]) {
if (argc == 2) {
int socket = nn_socket (AF_SP_RAW, NN_BUS);
assert(nn_bind (socket, "tcp://*:27384") != -1);
assert(nn_connect (socket, argv[1]) != -1);
assert(nn_device(socket, -1) != -1);
nn_close(socket);
}
}
В моем случае я запускаю эти команды как:
На первом ПК:
./server tcp://192.168.1.11:27384
На втором ПК:
./server tcp://192.168.1.241:27384
Они связаны, чтобы доказать это, я использовал nanocat
и подключил его локально к серверу:
На первом ПК:
nanocat --bus --connect tcp://127.0.0.1:27384 --data foo --interval 1 --ascii
На втором ПК:
nanocat --bus --connect tcp://127.0.0.1:27384 --data bar --interval 1 --ascii
На первом ПК я получал 'bar' каждую секунду, на втором ПК 'foo', также каждую секунду.
Вот я и написал сейчас приемник.
#include <nanomsg/nn.h>
#include <nanomsg/bus.h>
#include <string.h>
#include <stdio.h>
#include <assert.h>
int main(int argc, char *argv[]) {
int socket = nn_socket (AF_SP, NN_BUS);
assert(nn_connect (socket, "tcp://127.0.0.1:27384") != -1);
sleep(1);
unsigned char buffer[4096];
while(1) {
int n = nn_recv(socket, buffer, 4096, 0);
if (n > 0) {
nn_send(socket, buffer, strlen(buffer), 0);
}
}
nn_close(socket);
}
Он получает сообщение и отправляет его обратно.
Тогда я написал отправителю:
#include <nanomsg/nn.h>
#include <nanomsg/bus.h>
#include <stdio.h>
#include <unistd.h>
#include <time.h>
#include <string.h>
#define NANO_PER_SEC 1000000000.0
int main(int argc, char *argv[]) {
int socket = nn_socket (AF_SP, NN_BUS);
nn_connect (socket, "tcp://127.0.0.1:27384");
sleep(1);
unsigned char buffer[4096];
int i = 0;
for (i = 0; i < 1024; i++) {
buffer[i] = 'a';
}
buffer[i] = '\0';
struct timespec start, end;
double start_sec, end_sec, elapsed_sec;
double average;
double m[4096];
for (i = 0; i < 4096; i++) {
clock_gettime(CLOCK_REALTIME, &start);
int ns = nn_send(socket, buffer, strlen(buffer), 0);
int nr = nn_recv(socket, buffer, 4096, 0);
clock_gettime(CLOCK_REALTIME, &end);
start_sec = start.tv_sec + start.tv_nsec/NANO_PER_SEC;
end_sec = end.tv_sec + end.tv_nsec/NANO_PER_SEC;
m[i] = end_sec - start_sec;
}
elapsed_sec = 0.0;
for (i = 0; i < 4096; i++) {
elapsed_sec = elapsed_sec + m[i];
}
average = (elapsed_sec / 4096.0) * 1000000.0;
printf("Average: %.3f micros\nWhole: %.12f seconds\n", average, elapsed_sec);
nn_close(socket);
}
Отправитель передает получателю 4096 раз по 1 Кбайт и измеряет время, поэтому я получаю все время и среднее время.
Сначала я тестирую его только на одном ПК локально, в трех открытых терминалах bash.
Первый терминал:
./server tcp://192.168.1.11:27384
Второй терминал:./receiver
Третий терминал:./sender
Итак, я получил от программы "отправитель" этот вывод:
Average: 60.386 micros
Whole: 0.247341632843 seconds
Затем я попытался запустить это:
На первом ПК:
./server tcp://192.168.1.11:27384
./receiver
На втором ПК:
./server tcp://192.168.1.241:27384
./sender
Но он застрял, первый компьютер с "получателем" не получает никаких сообщений от второго компьютера, на котором работает "отправитель". Я не понимаю, что не так, потому что с nanocat
это работает отлично.
Может кто-нибудь, пожалуйста, помогите мне?