编辑:制定一个解决方案 - 结果发现谷歌搜索204.204.204.204让我得到了更多描述性请求。
诚实。束手无策。我不知道如何花一整天时间在Flask(服务器)和Javascript(客户端)上花费10分钟。我需要这个在C ++中运行并允许客户端通过同一台机器上的BlueStacks端口进行连接。客户端并不重要,因为我甚至无法做到这一点。
我尝试过WinSocks,我尝试过WxWidget的网络实现,我甚至试过了一些随机的C ++包装器。所有这些都失败了(通常在示例中!如同,复制粘贴和错误无处不在)。所以我最终回到了WinSockets,并在YouTube上关注了一个教程。
int ServerStuff() {
WSADATA WsData;
WORD ver = MAKEWORD(2, 2);
int wsOK = WSAStartup(ver, &WsData);
if (wsOK != 0) {
wxLogMessage("Can't initialize Winsock! Quitting");
return false;
}
//Create a socket
SOCKET listening = socket(AF_INET, SOCK_STREAM, 0);
if (listening == INVALID_SOCKET) {
wxLogMessage("Can't create a socket! Quitting");
return false;
}
//Bind the ip and port to a socket
sockaddr_in hint;
hint.sin_family = AF_INET;
hint.sin_port = htons(54000);
hint.sin_addr.S_un.S_addr = INADDR_ANY; //Could also use inet_pton
bind(listening, (sockaddr*)&hint, sizeof(hint));
//Tell winsock the socket is for listening
listen(listening, SOMAXCONN);
//Wait for a connection
sockaddr_in client;
int clientSize = sizeof(client);
SOCKET clientSocket = accept(listening, (sockaddr*)&client, &clientSize);
//if (clientSocket == INVALID_SOCKET) {
// wxLogMessage("Client Invalid Socket");
// return false;
//}
char host[NI_MAXHOST]; //Client's remote name
char service[NI_MAXHOST]; //Service (port) the client is connected on
ZeroMemory(host, NI_MAXHOST);
ZeroMemory(service, NI_MAXHOST);
if (getnameinfo((sockaddr*)&client, sizeof(client), host, NI_MAXHOST, service, NI_MAXSERV, 0) == 0) {
wxLogMessage("Can't initialize Winsock! Quitting");
}
else {
inet_ntop(AF_INET, &client.sin_addr, host, NI_MAXHOST);
wxLogMessage(host);
int wut = client.sin_port;
wxString mystring = wxString::Format(wxT("%i"), wut);
wxLogMessage("Connected on port");
wxLogMessage(mystring);
//wxLogMessage(to_string(ntohs(client.sin_port)));
}
wxLogMessage("Got this far somehow");
//Close listening socket - we don't need it anymore - later on we'll learn how to accept multiple client
closesocket(listening);
//while loop: accept and echo message back to client
char buf[4096];
while (true)
{
ZeroMemory(buf, 4096);
//Wait for client to send data
int bytesReceived = recv(clientSocket, buf, 4096, 0);
if (bytesReceived == SOCKET_ERROR) {
//wxLogMessage("ERROR in recv");
break;
}
if (bytesReceived == 0) {
wxLogMessage("Client Disconnected");
break;
}
//Echo back to client
send(clientSocket, buf, bytesReceived + 1, 0);
//Close the socket
closesocket(clientSocket);
//Cleanup winsock
WSACleanup();
wxLogMessage("Welp");
}
}
// event handlers
void MyFrame::OnQuit(wxCommandEvent& WXUNUSED(event))
{
// true is to force the frame to close
ServerStuff();
//Close(true);
}
在YouTube视频(“使用C ++创建TCP服务器” - 不允许发布链接)这可行!命令窗口打开,无限空白,直到他连接客户端,然后客户端发送消息,服务器回复相同的确切消息。
不是我的。我只是冲过去,然后关闭。我的日志用于立即退出注释代码,它说明客户端套接字无效,所以我评论了它。现在我的输出是: 204.204.204.204 连接端口 52428 远远不知何为
我不知道该怎么办。我只是想通过同一台机器的TCP连接发送数据。我很困惑这是多么困难。似乎有些随机进程会立即尝试作为客户端连接到我的服务器?但是当我明确托管54000时,为什么允许在端口52428上连接?
我的目标: 启动服务器 使用BlueStacks中的Java App连接到服务器 将数据从服务器发送到客户端
计算机作为服务器更有意义,因为会有多个BlueStacks实例,我宁愿不必“生成”多个程序/服务器来处理我正在做的事情。
答案 0 :(得分:1)
我在套接字代码中看到了一些错误。
如果WSACleanup()
成功,则不会致电WSAStartup()
,之后会出现问题。
如果closesocket()
成功,则不会致电socket()
,之后会出现问题。
未将您传递给sockaddr_in
的{{1}}清零。结构中的随机字节可能导致bind()
失败。
忽略bind()
,bind()
,listen()
和accept()
的返回值。
未正确处理send()
的返回值。成功时返回0,而不是失败。
向客户端发送+1额外字节,而不是从客户端收到。如果客户端发送的字节数少于缓冲区可容纳的字节数,则由于getnameinfo()
调用,该额外字节将为0x00。但是如果客户端实际上发送了足够的字节来完全填充缓冲区,那么你将从你不拥有的内存中发送一个额外的字节。如果你真的想在回显的所有内容之后发送一个空终止符,请明确地这样做。否则,真正的echo服务器应该只发回它收到的内容,不多也不少。
尝试更像这样的事情:
ZeroMemory()