问题描述
我对 QT 还很陌生,所以请耐心等待。我有一个服务器应用程序,我必须连接到一个端口并获取一个数据包,该数据包基本上是一串 xml 内容。通信是古老的,并且可以很好地使用 https://www.binarytides.com/winsock-socket-programming-tutorial/ 中的示例返回数据,但是我正在尝试将此示例转换为新的 Qt5 连接语法并且失败了,非常感谢任何帮助或见解。以下是收到的服务数据包的响应示例。我需要将该 xml 抓取到内存中并对其进行操作。但是语法超出了我的范围。忘了提及我正在尝试使用命令行在 Windows 10 Visual Studio 2015 上运行并编译:cl /EHsc test.cpp
这似乎是需要改变的魔法:
if (connect(s,(struct sockaddr *)&server,sizeof(server)) < 0)
D:\git>test
Initialising Winsock...Initialised.
Socket created.
Connected
Data Send
Reply received
<?xml version="1.0" standalone="yes"?>
<zoneserver>
<name>SuperNova</name>
<status>up</status>
<users>
<connected>0</connected>
<cap>3000</cap>
<max>0</max>
<total>0</total>
<deleted>0</deleted>
</users>
<uptime>142751</uptime>
<timestamp>1609481513051</timestamp>
</zoneserver>
这是我在 QT 中的代码:
SOCKET s;
char *message,server_reply[2000];
int recv_size;
qDebug() << "\nInitialising Winsock...";
if (WSAStartup(MAKEWORD(2,2),&wsa) != 0)
{
qDebug() << "Failed.";
exit;
}
qDebug() << "Initialised.\n";
//Create a socket
if((s = socket(AF_INET,SOCK_STREAM,0 )) == INVALID_SOCKET)
{
qDebug() << "Could not create socket : " << WSAGetLastError();
}
qDebug() << "Socket created.\n";
server.sin_addr.s_addr = inet_addr("192.168.0.116");
server.sin_family = AF_INET;
server.sin_port = htons( 44455 );
//Connect to Remote Server
//try to connect...
int status = connect(s,sizeof(server));
if(status < 0)
{
qDebug() << "connect error";
exit;
}
qDebug() << "Connected";
//Send some data
message = "GET / HTTP/1.1\r\n\r\n";
if( send(s,message,strlen(message),0) < 0)
{
qDebug() << "Send Failed";
exit;
}
qDebug() << "Data Send\n";
//Receive a reply from the server
if((recv_size = recv(s,server_reply,2000,0)) == SOCKET_ERROR)
{
qDebug() << "recv Failed";
}
qDebug() << "Reply received\n";
//Add a NULL terminating character to make it a proper string before printing
server_reply[recv_size] = '\0';
qDebug() << server_reply;
但是在编辑器中我收到:
.cpp:407: error: no matching member function for call to 'connect'
在无关包含之后:
#include <winsock2.h>
#else
#include <sys/socket.h>
#endif
#pragma comment(lib,"ws2_32.lib") //Winsock Library
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)