Привязка Haskell ZeroMQ не работает для сокета REQ

Итак, я едва смог установить libzmq на рабочий стол Windows, а затем zeromq-haskell с помощью Cabal. Я хотел протестировать API, связав программу Python с программой Haskell в приложении типа hello-world.

Итак, самый простой шаблон, который я вижу, — это шаблон «запрос-ответ». Сначала я попытался сделать сервер на хаскеле (REP) и клиент на python (REQ), но это с треском провалилось, что бы я ни делал. Сгенерированное сообщение об исключении было Исключение: получение: сбой (без ошибок).

Поэтому я заглядываю внутрь исходного кода System.ZMQ и System.ZMQ.Base и вижу, что при вызове c_zmq_recv вызывается ошибка, которая, в свою очередь, сопоставляется непосредственно с вызовом ffi (?) C api. Поэтому я думаю, что, возможно, я не выполнил установку должным образом, но затем я попытался сделать клиент на Haskell, а сервер на python, и я заметил, что он работает без каких-либо проблем, так что, возможно, интерфейс recv здесь не проблема.

Вот приведенный ниже код haskell с функциями клиента и сервера.

import System.ZMQ
import Control.Monad (forM_,forever)
import Data.ByteString.Char8 (pack,unpack)
import Control.Concurrent (threadDelay)

clientMain :: IO ()
clientMain = withContext 1 (\context->do
    putStrLn "Connecting to server"
    withSocket context Req $ (\socket-> do
        connect socket "tcp://127.0.0.1:5554"
        putStrLn $ unwords ["Sending request"]
        send socket (pack "Hello...") []
        threadDelay (1*1000*1000)
        reply<-receive socket []
        putStrLn $ unwords ["Received response : ",unpack reply]))

serverMain :: IO ()
serverMain = withContext 1 (\context-> do
    putStrLn "Listening at 5554"
    withSocket context Rep $ (\socket-> do
        connect socket "tcp://127.0.0.1:5554"
        forever $ do 
            message<-receive socket [] -- this throws an IO Exception
            putStrLn $ unwords ["Received request : ",unpack message]
            threadDelay (1*1000*1000)
            send socket (pack "World") [] ))

main :: IO ()
main = serverMain -- replace with clientMain and it works

Теперь я действительно не удосужился протестировать все другие способы связи (push/pull, подписка/публикация, пара и т. д.), и для того, что мне нужно, сервер python/клиент haskell, вероятно, лучше, но мне любопытно, какая погода у меня будет. m делаю что-то не так или если какая-либо часть моего кода каким-либо образом нарушена.

заранее спасибо


person omu_negru    schedule 06.06.2012    source источник
comment
Какая у вас ошибка? Какая версия zeromq?   -  person Don Stewart    schedule 06.06.2012
comment
ошибка является исключением: получите, и я использую версию 2.2 (не удалось успешно собрать 3.2 на моем компьютере с Windows)   -  person omu_negru    schedule 06.06.2012
comment
Вы пытались обернуть свою функцию serverMain в withSocketsDo, как указано в сетевые документы? Раньше я не использовал network с Windows, но вспомнил эту маленькую загвоздку.   -  person ScottWest    schedule 07.06.2012
comment
функция withSocketsDo не имеет значения. Тем временем я проверил версию библиотеки Python, и это 2.1.1. Может ли быть так много несовместимости между версиями?   -  person omu_negru    schedule 07.06.2012


Ответы (1)


Вам нужно связать один из сокетов (обычно сервер), кажется, они оба подключаются.

Попробуйте изменить connect socket "tcp://127.0.0.1:5554" на bind socket "tcp://127.0.0.1:5554" в функции serverMain.

person Ben Ford    schedule 14.06.2012