Kod tej pory jest w porządku, jak dalece jak to jest (oprócz tego, że zaległości z 1 wydaje się nadmiernie surowe), problem oczywiście pochodzi podczas próby accept
połączenia na obu gniazda słuchania, ponieważ accept
jest normalnie blokowanie połączenia (i "odpytywanie" przez próbę akceptacji z krótkimi przerwami na obu gniazdach na przemian spowoduje spalenie cykli maszynowych bez żadnego dobrego celu).
select na ratunek! -) select.select
(lub na lepszą OSs select.poll
lub nawet select.epoll
lub select.kqueue
... ale stare dobre select.select
prace wszędzie! -) pozwoli Ci wiedzieć, które gniazdo jest gotowy i kiedy, więc może odpowiednio accept
. W ramach tych linii, asyncore
i asynchat
zapewniają nieco więcej organizacji (i niezależny framework twisted
, oczywiście, dodaje lot takiej "asynchronicznej" funkcjonalności).
Alternatywnie, można poświęcić osobne wątki do obsługi dwóch gniazd słuchanie, ale w tym przypadku, jeśli funkcjonalność różnych gniazd musi wpływać na te same współdzielonych struktur danych, koordynacja (blokowanie & c) może stać się drażliwy. Z pewnością polecam wypróbowanie metody asynchronicznej pierwszy - to rzeczywiście prostsze, jak również oferuje możliwości znacznie lepsze osiągi! -)
Ale część, która nie działa, to dwa wiązania. – mRt
@ mRt, jakie objawy obserwujecie przy wywołaniach "bind"? Wydają się poprawne, ponieważ wiążą dwa porty na wszystkich dostępnych interfejsach (to oczywiście oznacza "host" w pustym łańcuchu). –