2015-06-11 1 views
0

У меня есть клиентская программа, написанная с сырым сокетом, взаимодействующим с сервером. Он использует «select» для опроса дескриптора сокета и получения сообщения с сервера. После получения сообщения я использую сокет ZMQ для отправки сообщения.ZMQ не работает с сырым сокетом в Linux, но работает в Windows

Это прекрасно работает в окнах. Но в Linux, после вызова функции отправки «ZMQ», я больше не могу получать сообщение с сервера. Кажется, что сырой сокет был каким-то образом затронут.

Программа представляет собой многопоточную программу, но я тщательно изучил ZMQ. Клиентская программа работает в потоке A, а сокет ZMQ используется только этим потоком A. Я думаю, что я правильно использовал ZMQ, так как он хорошо работает в Windows. Но как возникает проблема в Linux?

Кто-нибудь знает, если это нормально? Я подозреваю, что это проблема ZMQ. Пока я удаляю функцию отправки «ZMQ», программа работает хорошо. Кто-нибудь знает, как решить эту проблему? и почему он хорошо работает в Windows, а не в Linux?


Я нашел, что это не работает даже в ситуации с одной нитью. ZMQ автоматически создает для меня более десяти потоков. Я не использовать любой многопоточного на этот раз, и поток кода, как это:

create a raw socket A; 
connect to a business server B; 
STATE = 1 
while (raw socket A is connected){ 
    if (STATE==1){ 
    send(Request 1); 
    }else if (STATE==2){ 
    send(Request 2); 
    } 
    int ret = select(fd + 1, &readSet, &writeSet, &errorSet, &timeout); 
    if (ret > 0){ 
     if (FD_ISSET(fd, &readSet)) { 
     char buf[8192]; 
     int nResult = receive(buf, sizeof(buf)); 
     if (buf is X){ 
      zmq.send(messageX) 
      STATE=2 
     }else if (buf is Y){ 
      STATE=3 
     }else{...} 
     }// socket is ready for reading 
    } 
} 

После zmq.send (сообщение), я не могу получить любое новое сообщение !! Код на стороне сервера закрыт для меня, так что я не могу отлаживать его со стороны сервера. Если я удалю «zmq.send (message)», все будет хорошо. В Windows эта программа отлично работает.

ответ

0

Ну, трудно сказать, что неправильно, без кода. Но вам, вероятно, стоит взглянуть на версии ZMQ в Linux и Windows, потому что «форматы отправки» и т. Д. Могут отличаться в разных версиях, а все, что работает в одной версии, не будет в другом.

+0

Я тестировал zmq 3.3 и 4.0.5 и получил тот же результат. Думаю, это не имеет ничего общего с версией zmq. –

Смежные вопросы