2016-10-24 10 views
1

내 질문에 대한 몇 가지 스레드를 본 적이 있지만 여전히 문제를 해결할 수없는 것 및 응답을 충분하지 않습니다. 그래서 여기에 과제가 있습니다 : 저는 2 대의 PC를 가지고 있습니다. 하나는 간단한 테스트 데이터로 100 개의 UDP 패킷을 전송해야하며 다른 머신은 데이터 그램을 읽어야합니다.QUdpSocket 클라이언트 - 서버 원격 호스트에 연결할 수 없습니다.

서버는 : 다음과 같이 내 코드는

m_socket.udp = 새로운 QUdpSocket (이);

if (m_socket.udp->bind(QHostAddress("192.168.32.154"), 1234)) { 
    m_socket.udp->connectToHost(QHostAddress("192.168.32.154"), 1234); 
    m_socket.udp->waitForConnected(); 
} 
connect(m_socket.udp, SIGNAL(connected()), 
     this, SLOT(handleConnection())); 
connect(m_socket.udp, SIGNAL(readyRead()), 
     this, SLOT(readyReadUdp())); 

이렇게 ... 먼저 - 컴퓨터 1의 IP 바인딩이 실패합니다. IP로 지정해서는 안됩니다.

클라이언트는 간단하다 : 와이어 샤크에서 볼 때

p_socket = new QUdpSocket(this); 
p_socket->connectToHost(QHostAddress("192.168.32.94"), 1234); 
connect(p_socket, SIGNAL(connected()), this, SLOT(writeDgram())); 
.... 
void writeDgram() { 
    p_socket->write(QByteArray("test")); 
} 

그래서 클라이언트 코드, 내 서버 시스템에 제공됩니다. 하지만 내 서버 Qt 코드가 실패합니다. 도움이 필요 하신가요?

+0

좀 더 구체적으로 알려주세요. wireshark에서 뭘 봤니? "첫째로, 기계 1의 IP에 대한 바인딩이 실패"한다는 것은 무엇을 의미합니까? – Prabhu

+0

나는 원격 호스트에 바인딩하고있다. 예를 들면 192.168.32.150 포트는 1234 번 포트이고 1 번 머신은 192.168.32.150이다. 기다리고있는 머신에 100 개의 데이터 그램을 보낸다. 2 개의 UDP 소켓을 연결하는 간단한 예가 좋습니다. 그러나이 예는 2 대의 컴퓨터 사이에 있어야합니다. –

+0

2 대의 컴퓨터간에 데이터 그램을 거의 교환하지 않는 것이 있습니까? 아직 답변이 없습니까? –

답변

1

그러나 어느 누구도 방화벽을 설치할 수 있다고 제안하지 않았습니다. 그것이 문제였습니다. 방화벽을 제거하면이 문제가 해결되었습니다.

0

나는 그런 식으로 들어오는 연결을 처리하기 위해 설치 또 다른 UDP 소켓을했습니다 :

void Server::handleConnection() 
{ 
    std::cout << "Connected to host" << std::endl; 
    m_inaddr = new QUdpSocket(this); 
    connect(m_inaddr, SIGNAL(readyRead()), 
      this, SLOT(readyReadUdp())); 

    QHostAddress addr = m_socket.udp->peerAddress(); 
    quint16 port = m_socket.udp->peerPort(); 

    bool conn = m_inaddr->bind(45678); 

    if (conn) { 
     m_inaddr->connectToHost(addr, port); 
     std::cout << "Bound to: " << addr.toString().toStdString() 
        << " port:" 
        << port << std::endl; 
    } 

} 

을하지만 적절한 방법을 작동하지 않는 것 같다. 내가 연결되면 피어 호스트와 포트를 읽을 수 있지만 inaddress에 대한 보조 소켓은 무엇에 바인딩되어야합니까? 나는 UDP와 혼동을 느낀다. [편집] 그냥 readyReadUdp() 슬롯에 침입 적이라고 추가하려면, 나는 거기에 중단 점을 넣었습니다. 판독기는 대기 상태이지만 슬롯은 절대 호출되지 않습니다. 그래서 나는 읽을 준비가 된 것이 아무것도 없다고 생각합니다.