У меня есть клиентская программа, написанная с сырым сокетом, взаимодействующим с сервером. Он использует «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 эта программа отлично работает.
Я тестировал zmq 3.3 и 4.0.5 и получил тот же результат. Думаю, это не имеет ничего общего с версией zmq. –