QUdpSocket bind problem
-
@JulsPower What is return value of error().
-
@JulsPower What is return value of error().
-
@JulsPower
I checked the relevant source code and I can see that the error code without an error message could be WSANOTINITIALISED, which stands for WSAStartup failed. I guess it could be a mismatch or missing winsock library in the debug environment.
https://learn.microsoft.com/zh-cn/windows/win32/winsock/windows-sockets-error-codes-2bool QNativeSocketEnginePrivate::nativeBind(const QHostAddress &a, quint16 port) { QHostAddress address = a; if (address.protocol() == QAbstractSocket::IPv4Protocol) { if ((address.toIPv4Address() & 0xffff0000) == 0xefff0000) { // binding to a multicast address address = QHostAddress(QHostAddress::AnyIPv4); } } qt_sockaddr aa; QT_SOCKLEN_T sockAddrSize = 0; setPortAndAddress(port, address, &aa, &sockAddrSize); if (aa.a.sa_family == AF_INET6) { // The default may change in future, so set it explicitly int ipv6only = 0; if (address.protocol() == QAbstractSocket::IPv6Protocol) ipv6only = 1; ::setsockopt(socketDescriptor, IPPROTO_IPV6, IPV6_V6ONLY, (char*)&ipv6only, sizeof(ipv6only) ); } int bindResult = ::bind(socketDescriptor, &aa.a, sockAddrSize); if (bindResult == SOCKET_ERROR && WSAGetLastError() == WSAEAFNOSUPPORT && address.protocol() == QAbstractSocket::AnyIPProtocol) { // retry with v4 aa.a4.sin_family = AF_INET; aa.a4.sin_port = htons(port); aa.a4.sin_addr.s_addr = htonl(address.toIPv4Address()); sockAddrSize = sizeof(aa.a4); bindResult = ::bind(socketDescriptor, &aa.a, sockAddrSize); } if (bindResult == SOCKET_ERROR) { int err = WSAGetLastError(); WS_ERROR_DEBUG(err); switch (err) { case WSANOTINITIALISED: //### break; case WSAEADDRINUSE: case WSAEINVAL: setError(QAbstractSocket::AddressInUseError, AddressInuseErrorString); break; case WSAEACCES: setError(QAbstractSocket::SocketAccessError, AddressProtectedErrorString); break; case WSAEADDRNOTAVAIL: setError(QAbstractSocket::SocketAddressNotAvailableError, AddressNotAvailableErrorString); break; default: break; } #if defined (QNATIVESOCKETENGINE_DEBUG) qDebug("QNativeSocketEnginePrivate::nativeBind(%s, %i) == false (%s)", address.toString().toLatin1().constData(), port, socketErrorString.toLatin1().constData()); #endif return false; } #if defined (QNATIVESOCKETENGINE_DEBUG) qDebug("QNativeSocketEnginePrivate::nativeBind(%s, %i) == true", address.toString().toLatin1().constData(), port); #endif socketState = QAbstractSocket::BoundState; return true; }
-
@JulsPower
You can try the following code before executing the bind() function#include <winsock2.h> #include <ws2tcpip.h> #pragma comment(lib, "ws2_32.lib") .... WSAData wsadata; int err = WSAStartup(MAKEWORD(2,0), &wsadata); if (err != 0) { qWarning("QTcpSocketAPI: WinSock v2.0 initialization failed."); } ....
-
@JulsPower
You can try the following code before executing the bind() function#include <winsock2.h> #include <ws2tcpip.h> #pragma comment(lib, "ws2_32.lib") .... WSAData wsadata; int err = WSAStartup(MAKEWORD(2,0), &wsadata); if (err != 0) { qWarning("QTcpSocketAPI: WinSock v2.0 initialization failed."); } ....
@Hanson said in QUdpSocket bind problem:
@JulsPower
You can try the following code before executing the bind() function#include <winsock2.h> #include <ws2tcpip.h> #pragma comment(lib, "ws2_32.lib") .... WSAData wsadata; int err = WSAStartup(MAKEWORD(2,0), &wsadata); if (err != 0) { qWarning("QTcpSocketAPI: WinSock v2.0 initialization failed."); } ....
WSAStartup return 0 so no error there
but the bind function continue to return false -
@JulsPower
emmm... I can't figure it out anymore :)
Or you can download the qt source code and debug it. -
@JulsPower
Can you show me where in your code calling WSAGetLastError()? -
@JulsPower
Can you show me where in your code calling WSAGetLastError()?@Hanson said in QUdpSocket bind problem:
@JulsPower
Can you show me where in your code calling WSAGetLastError()?b = m_UdpSocket->bind(QHostAddress::Any, 55555); auto state = m_UdpSocket->state(); QMessageBox::information(this, "info", QString(b?"true ":"false ") + QString::number(state) + QString::number(WSAGetLastError()));
show while debugging it shows false 010106
-
I replicated the samething in a new project using qmake instead of cmake. lo and behold it works in debugging mode...
seem ill be using qmake@JulsPower
Maybe same as this question
https://stackoverflow.com/questions/48597996/qtcpserver-return-unknown-error-on-listen-function-only-under-debugger
https://developercommunity.visualstudio.com/t/native-cmake-support-application-debug-launch-is-b/562174So the reason could be that when debugging the program with cmake project, the environment variables were cleared and the SystemRoot variable was missing, which caused WSASocket to fail to load the related components.
-
-
@JulsPower I understand you probably lack the motivation and time to do it, but it would be interesting to see the differences in the build between cmake generated makefile an qmake generated makfile. Obviously the two are building/linking differently. Smells like a build flag isn't the same in cmake debug