目前我正在尝试编写一个程序(C++)来连接到我的 TS3 服务器并运行查询。
为了完成这个任务,我使用了一个套接字。当我使用 SocketTest 程序 ( http://sourceforge.net/projects/sockettest/ )对其进行测试时,套接字本身工作正常。不过,我无法连接到我的 TS3 服务器并运行查询。
我正在使用的代码(更具体地说是函数):
struct sockaddr_in addr;
WSAStartup(MAKEWORD(1, 1), &wD);
std::memset(&addr, 0, sizeof(struct sockaddr_in));
sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
addr.sin_family = AF_INET;
addr.sin_port = htons(10011);
addr.sin_addr.s_addr = inet_addr("127.0.0.1");
connect(sock, (struct sockaddr*)&addr, sizeof(addr));
send(sock, "use 1\n", sizeof("use 1\n"), MSG_OOB);
send(sock, "login ****** ********\n", sizeof("login ****** ********\n"), MSG_OOB);
send(sock, "clientpoke clid=2 msg=Hallo!\n", sizeof("clientpoke clid=2 msg=Hallo!\n"), MSG_OOB);
closesocket(sock);
WSACleanup();
如果我使用 SocketTest 程序测试我的代码(包括上面的函数),一切正常,客户端正在连接并且服务器接收消息,但它不适用于我的 TS3 服务器。TS3 服务器的日志没有显示连接客户端的迹象。
我的代码是否有任何问题,或者是否有其他原因导致这不适用于我的 TS3 服务器?
PS:我将localhost(127.0.0.1)添加到我的TS3服务器的服务器查询白名单中。
PSS:我测试了几台TS3服务器,还是一样。
解决方案(编辑):
解决方案似乎很简单。事实上,只要您连接到它或发送命令,TS3 服务器查询就会发送数据(欢迎消息、错误等)。为了让它工作,我只需要接收发送的数据,这就是一切。
代码如下:
char buffer[1024];
struct sockaddr_in addr;
WSAStartup(MAKEWORD(2, 2), &wD);
std::memset(&addr, 0, sizeof(struct sockaddr_in));
sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
addr.sin_family = AF_INET;
addr.sin_port = htons(10011);
addr.sin_addr.s_addr = inet_addr("127.0.0.1");
connect(sock, (struct sockaddr*)&addr, sizeof(addr));
send(sock, "use 1\n", strlen("use 1\n"), NULL);
recv(sock, buffer, sizeof(buffer), NULL);
send(sock, "login Daniel ********\n", strlen("login Daniel ********\n"), NULL);
recv(sock, buffer, sizeof(buffer), NULL);
send(sock, "clientpoke clid=1 msg=Hello!\n", strlen("clientpoke clid=1 msg=Hello!\n"), NULL);
recv(sock, buffer, sizeof(buffer), NULL);
closesocket(sock);
WSACleanup();
(我知道上面的代码没有错误检查,但我特意省略了。如果你在真实环境中运行这段代码,你显然需要一些错误检查。
除此之外,我还检查了我的环境中的错误在用这段代码说明我的问题之前。)
sizeof(buffer)
(在执行命令时使用代替strlen(buffer)
(或类似的东西)也很重要recv()
,否则接收发送的数据将不起作用。)