C++クライアントとnode.jsサーバーの間で通信しようとしています。私はサーバーにデータを送ることができますが、クライアントにメッセージを返すことはできません。 socket.emitの簡単な理解は、基本ウィンドウのメッセージループでFD_READメッセージでrecv()を呼び出すことによって取得できるメッセージを送信する必要があるということです。私はそこに何か不足しているかもしれない。ここでNode.jsからC++へのクライアント:socket.emitからのメッセージを受信しません。
は、関連するクライアントコードです:
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を使ってFD_READメッセージを受け取ることはできません。私は、クライアントと同じコンピュータ上で実行されているサーバーと、同じローカルネットワーク上の異なるコンピュータを試しました。