LINUX.ORG.RU

Куда пропадают пакеты?

 ,


0

1

Есть два приложения, использующих zmq, на первом развернут zmq_router

void *context = zmq_ctx_new ();
mitm_socket = zmq_socket (context, ZMQ_ROUTER);
int rc = zmq_bind (mitm_socket, "tcp://*:5556");
....
zmq_send(mitm_socket,((struct osmocom_ms*)ms)->name,strlen(((struct osmocom_ms*)ms)->name)+1,ZMQ_SNDMORE);
    
    if(zmq_send (mitm_socket, json_dumps(root,0), strlen(json_dumps(root,0))+ 1,ZMQ_NOBLOCK) == -1){
		//zmq_close (requester);
    	//zmq_ctx_destroy (context);
    	vty_notify(ms,"Inside send\n");
		return -2;
	}
На втором zmq_dealer (оно слушает сразу 2 сокета, в данном случае интересен только osmo)
int ling_period_osmo=3000;
    int recv_timeout_osmo=3000;
    void *osmo_context = zmq_ctx_new ();
    void *osmo_socket = zmq_socket (osmo_context, ZMQ_DEALER);
    zmq_setsockopt (osmo_socket, ZMQ_IDENTITY,identity, sizeof(identity));
    zmq_setsockopt (osmo_socket, ZMQ_LINGER, &ling_period_osmo, sizeof(int));
    zmq_setsockopt (osmo_socket, ZMQ_RCVTIMEO, &recv_timeout_osmo, sizeof(int));
    if(zmq_connect (osmo_socket, "tcp://localhost:5556") == -1){
        printf("Couldn't connect to osmocom\n");
        return NULL;
    }
rc=receive_message_from_router(main_socket, &buffer);
        printf("Thread %d: recv status from bts %d\n",*(int*)arg, rc);
        if(rc < 0){
            //printf("Waiting from osmo\n");
            rc=receive_message_from_router(osmo_socket, &buffer);
f(rc >=0){
                printf("Thread %d:Reseive from osmo   ",*(int*)arg);
            }
        }
        else
            printf("Thread %d:Reseive from bts ",*(int*)arg);
......
int receive_message_from_router(void * responder,zmq_msg_t *buffer){
    zmq_msg_t last;
    zmq_msg_init (&last);
    zmq_msg_t message;
    zmq_msg_init (&message);
    int result;
    while(1){
        result = zmq_msg_recv (&message, responder, 0);

        if(result == -1)
            return -1;
       else
           printf("Data from router \"%s\"\n",zmq_msg_data(&message));
        int64_t more;           //  Multipart detection
        more = 0;
        size_t more_size = sizeof (more);
        zmq_getsockopt (responder, ZMQ_RCVMORE, &more, &more_size);

        if (!more){
            zmq_msg_copy (&last, &message);
            break;

        }//  Last message part
    }
     zmq_msg_copy (buffer, &last);
     zmq_msg_close(&last);
     zmq_msg_close (&message);
    return 0;
}
Так вот, zmq_dealer шлет некоторую команду, когда приложение с zmq_router её выполнит оно шлет дилеру какое оно хорошее (или не хорошее). Так вот, столкнулся с такой бедой, что время от времени zmq_router замолкает полностью. Команды принимает, приложение их выполняет, ф-ция zmq_send возвращает не -1. А вот пакета нет, ни zmq_dealer, ни в wireshark-е его не видно (тут я конечно могу наврать, в полотенце вывода пакет можно просто не рассмотреть). С чем такое поведение может быть связано? Никакой корреляции с внешними событиями проследить не могу. Сетевое соединение надежное.

★★★

Последнее исправление: cetjs2 (всего исправлений: 1)

Я бы поставил отладочную печать прямо перед вызовом zmq_send() в route'ре. Вдруг в нём что-то клинит и он «забывает» вызывать отправку сообщения.

И, разве не нужно делать free() на то, что возвращает json_dumps() ну и поверять, что не NULL?

mky ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.