2013-04-09 1 views
1

Qt5에서 QTcpSocket 클래스의 새로운 바인드 기능을 사용하는 중에 문제가 있습니다. 이 문제를 이해하는 데 도움이 될 것입니다.Qt5 멀티 홈 네트워크에서 TCP 소켓 바인드

두 개의 NIC가 각각 별도의 IP 주소로 포함 된 멀티 홈 서버가 있습니다. 대상 라우팅 주소와 상관없이 원본 주소에서 보내는 NIC가 적절한 NIC 외부로 전송되도록 서버에서 라우팅을 설정했습니다. 즉, x.x.x.0에서 보내는 것은 eth0에서 나가고 x.x.x.1은 데이터를 누가 보내고 있는지에 관계없이 eth1에서 나가게됩니다. 이 NIC는 이더넷을 통해 장거리 Wifi 링크에 연결되어 스위치에 연결됩니다. 이 와이파이 링크는 투명한 다리 역할을하며 두 개의 이더넷 케이블로 보이지만 (대역폭은 제한적 임) 그러면 스위치가 컴퓨터에 연결됩니다. 목표는 서버와 컴퓨터간에 데이터를 전송하고 병렬로 두 개의 Wi-Fi 링크를 사용하여 대역폭을 늘리는 것입니다. 서버가 실제로 서버이지만 소프트웨어는 소프트웨어 서버로 실행되는 컴퓨터를 가지고 있습니다 (다른 서버가 연결될 때). 즉, 물리적 서버 (소프트웨어 클라이언트)가 TCP 소켓을 열고 청취 컴퓨터 (소프트웨어 서버)에 연결을 시도합니다.

Qt5의 바인드 기능을 사용하여 하나의 TCP 소켓을 eth0 IP 주소에 바인딩하고 다른 TCP 소켓을 eth1 IP 주소에 바인딩합니다. 나는이 프로그램이 PING이나 SCP를 통한 파일 전송과 같은 다른 프로그램에서도 작동하는지 확인했다. http://qt-project.org/doc/qt-5.0/qtnetwork/qabstractsocket.html#bind

bind를 호출하면 호출이 성공하고 로컬 IP 주소에 대한 후속 요청이 올바른 값을 반환합니다. 예 : socket-> bind (ip)는 true를 반환하고 socket-> localAddress()는 ip를 반환합니다. 그러나 connectToHost를 호출하면 연결 시도가 시작될 때 localAddress가 손실되고 연결 후 원하는 localAddress가 아닌 다른 localAddress가 연결됩니다.

아무도 무슨 일이 일어나고 있는지 밝힐 수 있습니까? 나는이 프로그램이 아주 큰 것처럼 소프트웨어 클라이언트/서버의 역할을 바꾸기 위해 소프트웨어를 다시 작성하는 것을 피하려고 노력하고있다. 도와 주셔서 감사합니다.

답변

0

Qt 프로젝트 버그 추적기에 open bug이 있습니다.