我创建了一个小程序。以下是其中的相关部分:
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";
}
}
基本上,我想在 localhost:77 打开一个 tcp 套接字。我想向其中写入一些数据,获取响应,然后输出响应。但是,现在该端口已关闭,因为大多数端口在 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。
答案1
您似乎对“监听”端口的含义有些困惑。为了监听端口上的传入连接,应用程序必须明确告知操作系统它愿意接受该端口上的连接。正如 Bert 在他的回答中提到的,监听端口 77(使用默认配置)需要 root 权限。
如果你想创建一个简单的“测试”服务器,可以设置在指定的端口上监听,并且可以与之交互,请查看 netcat
命令. 基本上你要这样做:
sudo nc -l 77
现在尝试运行您的 Qt 应用程序。您应该看到正在运行的终端中显示“Hello Server” netcat
。如果您将超时时间更改QTcpSocket::waitForReadyRead()
为较大的值(例如30000
,等于 30 秒),则可以尝试将回复发送回您的应用程序。
例如,netcat
再次启动命令并运行您的 Qt 应用程序。终端显示“Hello Server”后,在终端中输入一些内容并按下键Return。您的 Qt 应用程序应该将您输入的内容打印到控制台。
答案2
如果您使用 authbind 启动 tomcats,那么我们就不需要 iptables 或任何重定向规则软件,希望此链接能够有所帮助。