[Solved] QUdpSocket binding issue
-
I have been using Qt for desktop applications programming for a quite long time, but I am totally a newbie in network programmings. Recently I am developing a program to remotely control my Sony camera via WIFI.
According to the official API document, I need to use SSDP to discover the camera and get the LOCATION, which is an address where API commands sent. I use a QUdpSocket object to send SSDP request, but I never got complete reply from the server. This problem has puzzled me for a couple of days. Fortunately, finally I fixed it by myself. I post it here. Hope someone who are also as newbie as I know how to do when encountering the same problem. Below is the description:
My first attempt is this:
QHostAddress hostAddress = QHostAddress("239.255.255.250"); int SSDP_HOST = 1900; QUdpSocket *udpSocket = new QUdpSocket(this); udpSocket->bind(hostAddress, SSDP_PORT); udpSocket->joinMulticastGroup(hostAddress); connect(udpSocket, SIGNAL(readyRead()), this, SLOT(processPendingDatagrams()));
By doing this way, I will never get complete reply from the host. Like this:
SSDP request M-SEARCH * HTTP/1.1
HOST: 239.255.255.250:1900
MAN: "ssdp:discover"
MX: 1
ST: urn:schemas-sony-com:service:ScalarWebAPI:1At the beginning, I totally have no idea how to debug. I thought I missed some step to setup the network configuration, but actually it was not. Then I looked the example provided in the help document, and found in the example code, the udpSocket did not bind to the host address. So I revised my code as this:
QHostAddress hostAddress = QHostAddress("239.255.255.250"); int SSDP_HOST = 1900; QUdpSocket *udpSocket = new QUdpSocket(this); udpSocket->bind(QHostAddress::AnyIPv4, SSDP, QUdpSocket::SharedAddress); udpSocket->joinMulticastGroup(hostAddress); connect(udpSocket, SIGNAL(readyRead()), this, SLOT(processPendingDatagrams()));
Then I got full response from the server (camera):
NOTIFY * HTTP/1.1
HOST: 239.255.255.250:1900
CACHE-CONTROL: max-age=1800
LOCATION: http://192.168.122.1:61000/scalarwebapi_dd.xml
NT: upnp:rootdevice
NTS: ssdp:alive
SERVER: FedoraCore/2 UPnP/1.0 MINT-X/1.8.1
USN: uuid:000000001000-1010-8000-B272BF6D76E5::upnp:rootdeviceIn conclusion, the lesson learned from this is this: If you want to use the same QUdpSocket object to send and receive UDP datagram to the client and from the server, you need to bind the QUdpSocket object to a different IP address, but the same port of the server's. Otherwise, you cannot get full reply.
Hope this could help others. Thanks.
-
Where is the sample code ?
-
Hi,
@Richard-Lee said in [Solved] QUdpSocket binding issue:
At the beginning, I totally have no idea how to debug. I thought I missed some step to setup the network configuration, but actually it was not. Then I looked the example provided in the help document, and found in the example code, the udpSocket did not bind to the host address. So I revised my code as this:
QHostAddress hostAddress = QHostAddress("239.255.255.250");
int SSDP_HOST = 1900;
QUdpSocket *udpSocket = new QUdpSocket(this);
udpSocket->bind(QHostAddress::AnyIPv4, SSDP, QUdpSocket::SharedAddress);
udpSocket->joinMulticastGroup(hostAddress);
connect(udpSocket, SIGNAL(readyRead()), this, SLOT(processPendingDatagrams()));If you mean the Qt Documentation example, they are all linked in the QUdpSocket documentation details.
-
@SGaist I mean SSDP sampple code !
-
@sonichy well, they did post what he used to do the connection and I quoted it as well.