У меня есть небольшая программа, которую я создал. Вот соответствующий фрагмент этого:
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";
}
}
По сути, я хочу открыть tcp-сокет на localhost: 77. Я хочу записать в него некоторые данные, получить ответ, а затем вывести ответ. Однако прямо сейчас этот порт закрыт, так как большинство портов по умолчанию находятся в Ubuntu. Так что сейчас он не может подключиться к этому порту для прослушивания. Из того, что я исследовал, iptables кажется единственным способом открыть порт для прослушивания. Поэтому я запускаю эту строку на своем компьютере:
sudo iptables -A INPUT -p tcp --dport 77 -j ACCEPT
Однако порт 77 все еще не открыт.
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
netstat не показывает, что он открыт. Также у меня все еще есть та же проблема с моей программой: она не может подключиться к 77.
Вы, кажется, немного смущены относительно того, что означает "слушание" на порте. Для прислушиваний к входящим соединениям на порте приложение должно явно сказать операционной системе, что это готово принять соединения на том порте. Как Bert упомянул в своем ответе, слушающий на порте 77 будет (с конфигурацией по умолчанию), требуют полномочий пользователя root.
Если Вы хотите создать простой "тестовый" сервер, который может быть установлен, слушают на указанном порте и что можно взаимодействовать с, смотреть на netcat
команда. В основном Вы хотите сделать это:
sudo nc -l 77
Теперь попытайтесь запустить свое спокойное приложение. Необходимо видеть "Привет Сервер", отображенный в терминале, который работает netcat
. Если Вы изменяете тайм-аут в QTcpSocket::waitForReadyRead()
к чему-то большому (как 30000
, равняйтесь 30 секундам), можно экспериментировать с передачей обратно ответов на приложение.
Например, запуститесь netcat
управляйте снова и запустите свое спокойное приложение. После дисплеев терминала "Привет Сервер", введите что-то в терминал и нажмите клавишу Return. Ваше спокойное приложение должно распечатать то, что Вы ввели к консоли.
Если вы используете authbind для запуска tomcats, тогда нам не нужны iptables или какие-либо программы для перенаправления правил, надеюсь, эта ссылка будет полезной.