Node.js 到 C++ 客户端:未从 socket.emit 接收消息

Posted

技术标签:

【中文标题】Node.js 到 C++ 客户端:未从 socket.emit 接收消息【英文标题】:Node.js to c++ client: not receiving message from socket.emit 【发布时间】:2017-12-22 22:27:02 【问题描述】:

我正在尝试在 c++ 客户端和 node.js 服务器之间进行通信。我可以将数据发送到服务器,但我无法将任何消息发送回客户端。我对 socket.emit 的简单理解是,它应该发送一条可通过在基本 Windows 消息循环中的 FD_READ 消息上调用 recv() 来检索的消息。我可能在那里遗漏了一些东西。

这是相关的客户端代码:

s = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
if (s == INVALID_SOCKET)

    MessageBox(hwnd, TEXT("3"), TEXT(""), MB_OK | MB_ICONEXCLAMATION);
    return 0;


long hostname = inet_addr("192.168.1.70");
target.sin_family = AF_INET;
target.sin_port = htons(server_port_num);
target.sin_addr.s_addr = hostname;

if (connect(s, (SOCKADDR *)&target, sizeof(target)) == SOCKET_ERROR)

    MessageBox(hwnd, TEXT("999"), TEXT(""), MB_OK | MB_ICONEXCLAMATION);
    return 0;


WSAAsyncSelect(s, hwnd, CUST_MSG, FD_READ | FD_CONNECT | FD_CLOSE);

我发送数据,在服务器控制台接收并输出:

int nret = send(s, buffer, strlen(buffer), 0);

然后我尝试在接收数据的同一服务器事件中发回一些数据:

this.socket.on('data', function (buffer) 
    try 
        logger.warn(buffer + "\n");
        socket.emit('message', 'psst, wanna buy some macaroni?');
        //that.messageHandler(that, buffer);
     catch (err) 
        logger.warn('Protocol ' + err + ' ' + that.socket.remoteAddress);
        that.dispose();
    
);

我有一个消息循环,但它没有检测到从 socket.emit() 发送的消息:

MSG msg;
while (GetMessage(&msg, NULL, 0, 0) > 0)

    if (numBytes > 0) 
        wchar_t buffer[256];
        wsprintfW(buffer, L"%d", numBytes);
        MessageBox(hwnd, buffer, TEXT(""), MB_OK | MB_ICONEXCLAMATION);
    

    TranslateMessage(&msg);
    DispatchMessage(&msg);



//MESSAGE LOOP FUNCTION:
LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)

switch (message) //handle the messages

case CUST_MSG: //Is a message being sent?

    switch (lParam) //If so, which one is it?
    
    case FD_ACCEPT:
        MessageBox(hwnd, TEXT("accept"), TEXT(""), MB_OK | MB_ICONEXCLAMATION);
        accept(wParam, NULL, NULL);
        break;
    case FD_CONNECT:
        MessageBox(hwnd, TEXT("connect"), TEXT(""), MB_OK | MB_ICONEXCLAMATION);
        break;
    case FD_READ:
        char buffer[80];
        int byte_num;
        memset(buffer, 0, sizeof(buffer));
        byte_num = recv(wParam, buffer, sizeof(buffer) - 1, 0);
        MessageBox(hwnd, TEXT("READING"), TEXT(""), MB_OK | MB_ICONEXCLAMATION);

        numBytes += byte_num;
        break;
    case FD_CLOSE:
        //MessageBox(hwnd, TEXT("close"), TEXT(""), MB_OK | MB_ICONEXCLAMATION);
        break;
    

当我稍微更改程序并将数据从客户端发送到客户端时,相同的循环会正确检测消息。我试过弄乱bind()、listen()、recv(),但我永远无法使用node.js获取FD_READ消息。我尝试过在同一台计算机上运行客户端和服务器,以及在同一本地网络上运行不同的计算机。

【问题讨论】:

【参考方案1】:

要将数据写入 Node.js 中的套接字,请使用 socket.write()

见https://nodejs.org/api/net.html#net_socket_write_data_encoding_callback

【讨论】:

以上是关于Node.js 到 C++ 客户端:未从 socket.emit 接收消息的主要内容,如果未能解决你的问题,请参考以下文章

数据未从 node.js 保存在 MongoDB 中

node.js中使用net模块创建服务器和客户端

C SOCKS5 代理接口未从代理服务器接收任何内容。

C++ 变量值未从标头传递到主

如何使用 socks4a 从 node.js 连接到隐藏服务?

Socket.IO 对 Node.js 有啥作用