Abrindo uma porta para escutar

2

Eu tenho um pequeno programa que criei. Aqui está uma parte relevante:

void TcpSocket::ConnectSocket()
{
    socket = new QTcpSocket(this);
    socket->connectToHost("localhost", 77);

    if(socket->waitForConnected(3000)){
        qDebug() << "Connected";

        socket->write("Hello Server\n\r\n");
        socket->waitForBytesWritten(1000);
        socket->waitForReadyRead(3000);
        qDebug() << "Reading: " << socket->bytesAvailable();
        qDebug() << socket->readAll();
        socket->close();
    }
    else {
        qDebug() << "Could not connect";
    }
}

Basicamente, quero abrir um soquete TCP no localhost: 77. Eu quero escrever alguns dados para ele, obter uma resposta e, em seguida, gerar a resposta. No entanto, agora que a porta está fechada, como a maioria das portas estão no Ubuntu por padrão. Então, agora não pode se conectar a essa porta para ouvir. Bem, pelo que eu pesquisei, o iptables parece ser a única maneira de abrir uma porta para ouvir. Então eu corro esta linha na minha máquina:

sudo iptables -A INPUT -p tcp --dport 77 -j ACCEPT

No entanto, a porta 77 ainda não está aberta.

sudo netstat -tulpn
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name
tcp        0      0 127.0.0.1:53            0.0.0.0:*               LISTEN      1199/dnsmasq    
tcp        0      0 127.0.0.1:631           0.0.0.0:*               LISTEN      1004/cupsd      
tcp        0      0 127.0.0.1:5432          0.0.0.0:*               LISTEN      1157/postgres   
tcp        0      0 127.0.0.1:3306          0.0.0.0:*               LISTEN      1121/mysqld     
tcp6       0      0 ::1:631                 :::*                    LISTEN      1004/cupsd      
udp        0      0 127.0.0.1:53            0.0.0.0:*                           1199/dnsmasq    
udp        0      0 0.0.0.0:68              0.0.0.0:*                           1070/dhclient   
udp        0      0 0.0.0.0:39617           0.0.0.0:*                           990/avahi-daemon: r
udp        0      0 0.0.0.0:5353            0.0.0.0:*                           990/avahi-daemon: r
udp6       0      0 :::57021                :::*                                990/avahi-daemon: r
udp6       0      0 :::5353                 :::*                                990/avahi-daemon: r

O netstat não mostra que esteja aberto. Também ainda tenho o mesmo problema com o meu programa: ele não pode se conectar a 77.

    
por JohnMerlino 30.05.2013 / 04:07

2 respostas

13

Você parece estar um pouco confuso sobre o que significa "ouvir" em uma porta. Para escutar conexões de entrada em uma porta, um aplicativo deve informar explicitamente ao sistema operacional que está disposto a aceitar conexões nessa porta. Como Bert mencionou em sua resposta, ouvir na porta 77 irá (com a configuração padrão) exigir privilégios de root.

Se você quiser criar um servidor simples de "teste" que possa ser configurado para escutar em uma porta específica e com o qual você possa interagir, dê uma olhada no netcat comando . Basicamente você quer fazer isso:

sudo nc -l 77

Agora tente executar seu aplicativo Qt. Você deverá ver "Hello Server" exibido no terminal que está executando netcat . Se você alterar o tempo limite em QTcpSocket::waitForReadyRead() para algo grande (como 30000 , igual a 30 segundos), poderá experimentar o envio de respostas para seu aplicativo.

Por exemplo, inicie o comando netcat novamente e execute seu aplicativo Qt. Depois que o terminal exibir "Hello Server", digite algo no terminal e pressione a tecla Return . Seu aplicativo Qt deve imprimir o que você digitou no console.

    
por Nathan Osman 30.05.2013 / 06:43
0

Se você usa authbind para iniciar os tomcats, então não precisamos de iptables ou qualquer software de regras de redirecionamento espera que este link seja uma ajuda completa.

link

    
por PKumar 30.12.2015 / 16:38