我有一个我创建的小程序。这是其中的一个相关部分:
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";
}
}
Run Code Online (Sandbox Code Playgroud)
基本上,我想在 localhost:77 打开一个 tcp 套接字。我想向其中写入一些数据,获得响应,然后输出响应。但是,现在该端口已关闭,因为默认情况下大多数端口都在 ubuntu 中。所以现在它无法连接到该端口进行侦听。根据我的研究,iptables 似乎是打开侦听端口的唯一方法。所以我在我的机器上运行这条线:
sudo iptables -A INPUT -p tcp --dport 77 -j ACCEPT
Run Code Online (Sandbox Code Playgroud)
但是,端口 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
Run Code Online (Sandbox Code Playgroud)
netstat 没有显示它是打开的。另外我的程序仍然有同样的问题:它无法连接到 77。
Nat*_*man 17
您似乎对端口上的“侦听”是什么意思有些困惑。为了侦听端口上的传入连接,应用程序必须明确告诉操作系统它愿意接受该端口上的连接。正如 Bert 在他的回答中提到的,监听端口 77 将(使用默认配置)需要 root 权限。
如果你想创建一个简单的“测试”服务器,它可以设置监听指定端口并且可以与之交互,请查看命令 netcat
. 基本上你想这样做:
sudo nc -l 77
Run Code Online (Sandbox Code Playgroud)
现在尝试运行您的 Qt 应用程序。您应该会在正在运行的终端中看到“Hello Server” netcat。如果您将超时更改为QTcpSocket::waitForReadyRead()较大的值(例如30000,等于 30 秒),您可以尝试将回复发送回您的应用程序。
例如,netcat再次启动命令并运行您的 Qt 应用程序。在终端显示“Hello Server”后,在终端中输入一些内容并按下Return键。您的 Qt 应用程序应该打印您在控制台中输入的任何内容。
| 归档时间: |
|
| 查看次数: |
88900 次 |
| 最近记录: |