打开端口进行监听

打开端口进行监听

我创建了一个小程序。以下是其中的相关部分:

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 或任何重定向规则软件,希望此链接能够有所帮助。

https://askubuntu.com/a/685306/377678

相关内容