djdgf4 发表于 2024-8-25 22:22

QT 服务器和客户端 连接不上

本帖最后由 djdgf4 于 2024-8-27 21:05 编辑

初学QT,写了个服务/客户端,但是怎么都连接不上
在connectToServer判断的时候没有输出,直接跳出去了,然后就是断连。在程序启动的时候就是表现为,服务端初始化完成,服务启动,然后客户端启动,但是连接不上。
我尝试使用telnet用两个终端各自连接服务器:

(base) Popen 127.0.0.1 1234sssssss> telnet
telnet> open 127.0.0.1 1234
Trying 127.0.0.1...
Connected to 127.0.0.1.
Escape character is '^]'

. (WechatMSG) PS D:\GitClone\WeChatMsg> telnet
telnet> open 127.0.0.1 1234
Trying 127.0.0.1...
Connected to 127.0.0.1.
Escape character is '^]'.
1

并且发送消息,但是没有其他反应,也无法显示客户端id,显然client没有来连接上

(base) PS C:\Users\Theonesssssssss> telnet
telnet> open 127.0.0.1 12345
Trying 127.0.0.1...
Connected to 127.0.0.1.
Escape character is '^]'.


服务端存在Server: started.字样,但是没有Client connected: 输出使用client.exe程序的时候,点击connect没有反应,点击disconnect会在client界面出现Disconnected from server. Attempting to reconnect...
我客户端的出错位置的逻辑是
void TCPClient::connectToServer()
{
    qDebug() << "Attempting to connect to server...";
    socket->connectToHost("127.0.0.1", 1234);// 连接到本地主机的1234端口
      if (socket->waitForConnected(3000)) {
      displayArea->append("Connected to server.");
    } else {
                displayArea->append("Failed to connect to server. Error: " + socket->errorString());
    }
}

void TCPClient::onConnectClicked()
{
    qDebug() << "Connect button clicked.";
    connectToServer();// 连接到服务器
}
https://www.52pojie.cn/forum.php?mod=image&aid=2719862&size=300x300&key=939ed1f6ce48b865&nocache=yes&type=fixnone&ramdom=JpdM5
我是直接使用qmake编译的,因为不太会建立QT工程

make clean && qmake client.pro && make -k
make clean && qmake server.pro && make -k


(base) PS C:\Users\Theonesssssssss> Get-NetTCPConnection -LocalPort 1234

LocalAddress                        LocalPort RemoteAddress                     RemotePort State       AppliedSetting OwningProcess
------------                        --------- -------------                     ---------- -----       -------------- -------------
::                                  1234      ::                                  0          Listen                     12708
127.0.0.1                           1234      127.0.0.1                           59759      Established Internet       11812
127.0.0.1                           1234      0.0.0.0                           0          Listen                     11812


附上代码
client.rar || https://前缀1drv.ms/u/s!AuA35fjcaGBNiHmBQGwfyNF-EFSR?e=uOYMRx

server.rar   ||1drv.ms/u/s!AuA35fjcaGBNiHpiRDVRG0z4pP0U?e=dDwn9P

这里是我的调试信息,(Theonesssssssss@Stein-Gate) ~/TCP/tcp1 - Copy (2)/client % gdb debug/./client.exe
GNU gdb (GDB) 15.1
Copyright (C) 2024 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.
Type "show copying" and "show warranty" for details.
This GDB was configured as "x86_64-w64-mingw32".
Type "show configuration" for configuration details.
For bug reporting instructions, please see:
<https://www.gnu.org/software/gdb/bugs/>.
Find the GDB manual and other documentation resources online at:
    <http://www.gnu.org/software/gdb/documentation/>.

For help, type "help".
Type "apropos word" to search for commands related to "word"...
Reading symbols from debug/./client.exe...
(gdb) b connectToServer
Breakpoint 1 at 0x140001d3c: file client.cpp, line 50.
(gdb) r
Starting program: D:\msys64\home\Theonesssssssss\TCP\tcp1 - Copy (2)\client\debug\client.exe













warning: Connect button clicked.

Thread 1 hit Breakpoint 1, TCPClient::connectToServer (this=0x5ffd80) at client.cpp:50
warning: Source file is more recent than executable.
50          qDebug() << "Attempting to connect to server...";
(gdb) l 47,64
47
48      void TCPClient::connectToServer()
49      {
50          qDebug() << "Attempting to connect to server...";
51          socket->connectToHost("127.0.0.1", 1234);// 杩炴帴鍒版湰鍦颁富鏈虹殑1234 绔彛
52            if (socket->waitForConnected(3000)) {
53            displayArea->append("Connected to server.");
54          } else {
55                      displayArea->append("Failed to connect to server. Error: " + socket->errorString());
56          }
57      }
58
59      void TCPClient::onConnectClicked()
60      {
61          qDebug() << "Connect button clicked.";
62          connectToServer();// 杩炴帴鍒版湇鍔″櫒
63      }
64
(gdb) n
warning: Attempting to connect to server...
51          socket->connectToHost("127.0.0.1", 1234);// 杩炴帴鍒版湰鍦颁富鏈虹殑1234 绔彛
(gdb) bt
#0TCPClient::connectToServer (this=0x5ffd80) at client.cpp:51
#10x00007ff779101eb8 in TCPClient::onConnectClicked (this=0x5ffd80) at client.cpp:57
#20x00007ff779104899 in QtPrivate::FunctorCall<QtPrivate::IndexesList<>, QtPrivate::List<>, void, void (TCPClient::*)()>::call(void (TCPClient::*)(), TCPClient*, void**) (
    f=(void (TCPClient::*)(TCPClient * const)) 0x7ff779101e46 <TCPClient::onConnectClicked()>, o=0x5ffd80, arg=0x5fbf20)
    at D:/msys64/mingw64/include/QtCore/qobjectdefs_impl.h:152
#30x00007ff779104a8c in QtPrivate::FunctionPointer<void (TCPClient::*)()>::call<QtPrivate::List<>, void>(void (TCPClient::*)(), TCPClient*, void**) (
    f=(void (TCPClient::*)(TCPClient * const)) 0x7ff779101e46 <TCPClient::onConnectClicked()>, o=0x5ffd80, arg=0x5fbf20)
    at D:/msys64/mingw64/include/QtCore/qobjectdefs_impl.h:185
#40x00007ff77910494a in QtPrivate::QSlotObject<void (TCPClient::*)(), QtPrivate::List<>, void>::impl(int, QtPrivate::QSlotObjectBase*, QObject*, void**, bool*) (which=1,
    this_=0xe2dd00, r=0x5ffd80, a=0x5fbf20, ret=0x0)
    at D:/msys64/mingw64/include/QtCore/qobjectdefs_impl.h:418
#50x00007ffa0d39257c in ?? () from D:\msys64\mingw64\bin\Qt5Core.dll
#60x00007ffa06b336c2 in ?? () from D:\msys64\mingw64\bin\Qt5Widgets.dll
#70x00007ffa06b352c6 in ?? () from D:\msys64\mingw64\bin\Qt5Widgets.dll
#80x00007ffa06b354bf in ?? () from D:\msys64\mingw64\bin\Qt5Widgets.dll
#90x00007ffa06a88690 in ?? () from D:\msys64\mingw64\bin\Qt5Widgets.dll
#10 0x00007ffa06a4853e in ?? () from D:\msys64\mingw64\bin\Qt5Widgets.dll
#11 0x00007ffa06a5058b in ?? () from D:\msys64\mingw64\bin\Qt5Widgets.dll
#12 0x00007ffa0d2a4298 in ?? () from D:\msys64\mingw64\bin\Qt5Core.dll
#13 0x00007ffa06a4e3ff in ?? () from D:\msys64\mingw64\bin\Qt5Widgets.dll
#14 0x00007ffa06a9f61b in ?? () from D:\msys64\mingw64\bin\Qt5Widgets.dll
#15 0x00007ffa06aa2a07 in ?? () from D:\msys64\mingw64\bin\Qt5Widgets.dll
#16 0x00007ffa06a4853e in ?? () from D:\msys64\mingw64\bin\Qt5Widgets.dll
#17 0x00007ffa0d2a4298 in ?? () from D:\msys64\mingw64\bin\Qt5Core.dll
#18 0x00007ffa04a37bd4 in ?? () from D:\msys64\mingw64\bin\Qt5Gui.dll
#19 0x00007ffa04a0eecc in ?? () from D:\msys64\mingw64\bin\Qt5Gui.dll
#20 0x00007ffa0d300b02 in ?? () from D:\msys64\mingw64\bin\Qt5Core.dll
#21 0x00007ffa0bd44185 in ?? ()
   from D:\msys64\mingw64\share\qt5\plugins\platforms\qwindows.dll
#22 0x00007ffa0d2a25a3 in ?? () from D:\msys64\mingw64\bin\Qt5Core.dll
#23 0x00007ffa0d2ab3a5 in ?? () from D:\msys64\mingw64\bin\Qt5Core.dll
#24 0x00007ff7791014a3 in qMain (argc=1, argv=0xf03f80) at main.cpp:9
#25 0x00007ff779103a0f in WinMain ()
#26 0x00007ff7791012e9 in __tmainCRTStartup ()
    at C:/M/B/src/mingw-w64/mingw-w64-crt/crt/crtexe.c:258
#27 0x00007ff7791013d6 in WinMainCRTStartup ()
    at C:/M/B/src/mingw-w64/mingw-w64-crt/crt/crtexe.c:148
(gdb) n
152         virtual void connectToHost(const QString &hostName, quint16 port, OpenMode mode = ReadWrite, NetworkLayerProtocol protocol = AnyIPProtocol);
(gdb) n
51          socket->connectToHost("127.0.0.1", 1234);// 杩炴帴鍒版湰鍦颁富鏈虹殑1234 绔彛
(gdb) n
warning: onecore\net\netprofiles\service\src\nsp\dll\namespaceserviceprovider.cpp(613)\nlansp_c.dll!00007FFAB782F6BD: (caller: 00007FFAE0CEACF6) LogHr(1) tid(968) 8007277C No such service is known. The service cannot be found in the specified name space.

52            if (socket->waitForConnected(3000)) {
(gdb) n
TCPClient::onConnectClicked (this=0x5ffd80) at client.cpp:58
58
(gdb) n
QtPrivate::FunctorCall<QtPrivate::IndexesList<>, QtPrivate::List<>, void, void (TCPClient::*)()>::call(void (TCPClient::*)(), TCPClient*, void**) (
    f=(void (TCPClient::*)(TCPClient * const)) 0x7ff779101e46 <TCPClient::onConnectClicked()>, o=0x5ffd80, arg=0x5fbf20)
    at D:/msys64/mingw64/include/QtCore/qobjectdefs_impl.h:153
153             }
(gdb) n
QtPrivate::FunctionPointer<void (TCPClient::*)()>::call<QtPrivate::List<>, void>(void (TCPClient::*)(), TCPClient*, void**) (
    f=(void (TCPClient::*)(TCPClient * const)) 0x7ff779101e46 <TCPClient::onConnectClicked()>, o=0x5ffd80, arg=0x5fbf20)
    at D:/msys64/mingw64/include/QtCore/qobjectdefs_impl.h:186
186             }
(gdb) n
QtPrivate::QSlotObject<void (TCPClient::*)(), QtPrivate::List<>, void>::impl(int, QtPrivate::QSlotObjectBase*, QObject*, void**, bool*) (which=1, this_=0xe2dd00,
    r=0x5ffd80, a=0x5fbf20, ret=0x0)
    at D:/msys64/mingw64/include/QtCore/qobjectdefs_impl.h:419
419                     break;
(gdb) r
The program being debugged has been started already.
Start it from the beginning? (y or n) n
Program not restarted.
(gdb) n
425             }
(gdb) l
420               case Compare:
421                     *ret = *reinterpret_cast<Func *>(a) == static_cast<QSlotObject*>(this_)->function;
422                     break;
423               case NumOperations: ;
424               }
425             }
426         public:
427             explicit QSlotObject(Func f) : QSlotObjectBase(&impl), function(f) {}
428         };
429         // implementation of QSlotObjectBase for which the slot is a functor (or lambda)

这里可以看到直接跳出来了

Run till exit from #00x00007ffa0bd44185 in ?? ()
   from D:\msys64\mingw64\share\qt5\plugins\platforms\qwindows.dll
0x00007ffa0d2a25a3 in ?? () from D:\msys64\mingw64\bin\Qt5Core.dll
(gdb) finish
Run till exit from #00x00007ffa0d2a25a3 in ?? ()
   from D:\msys64\mingw64\bin\Qt5Core.dll
warning: Disconnect button clicked.
warning: Disconnected from server. Attempting to reconnect...
warning: Disconnect button clicked.








ZoRoLOVE 发表于 2024-8-26 06:24

下一个调试工具,用调试工具分别当做服务器、客户端和你的客户端、服务器连接,看看是哪的问题。服务器开启端口监听了没有?Qt Creator 里有tcp通讯的实例,你可以看看官方例子。

liuenzhuo 发表于 2024-8-26 08:17

防火墙?

djdgf4 发表于 2024-8-26 23:16

ZoRoLOVE 发表于 2024-8-26 06:24
下一个调试工具,用调试工具分别当做服务器、客户端和你的客户端、服务器连接,看看是哪的问题。服务器开启 ...

我用了Ai写了个脚本开启防火墙和端口监听,但是,结果是相同的。
然后我尝试用Wireshark捕获,问了ai是以
> > 运行你的服务器和客户端:
>
>   在捕获进行时,启动你的服务器和客户端。可以使用你编写的程序,或者使用 netcat 来创建一个简单的服务器和客户端连接。例如:
>         在一个终端中作为服务器监听:
>
>         bash
>
> nc -l 127.0.0.1 1234
>
> 在另一个终端中作为客户端连接:
>
> bash
>
>   nc 127.0.0.1 1234
>
> 发送和接收一些消息来生成流量。
但是发现这样获得的好像是两个终端之间的流量,我开不开服务器都不影响。不太懂网络这块,不知道怎么排查
页: [1]
查看完整版本: QT 服务器和客户端 连接不上