Я использую emscripten для переноса проекта C++ в Интернет, а веб-приложение, которое будет взаимодействовать с моим кодом на C++, находится в NodeJs.Как использовать Socket.io с emscripten, используя библиотеку javascript?
Итак, я использую Socket.io на Node.js, и я тоже хочу использовать его с моим кодом на C++, поэтому я пошел с использованием библиотеки javascript, которая использует код socket.io, однако это не кажется Работа.
Я написал этот маленький пример, иллюстрирующий этот случай:
#include <iostream>
#include <stdlib.h>
#include <stdio.h>
#include <emscripten.h>
int val = 0;
extern "C"
{
extern void send_board(char* flat_board);
extern bool receive_board(char** _string_dest);
}
void one_iter()
{
#ifdef SEND
char* c = "test";
std::cout << val << std::endl;
if(val%1000 == 0){
send_board(c);
}
val++;
#else
char* c;
if(receive_board(&c)) std::cout << "Received:" << c << std::endl;
#endif
}
int main()
{
emscripten_set_main_loop(one_iter, 0, 1);
return 0;
}
и
mergeInto(LibraryManager.library, {
send_board: function(message) {
socket.on('connect', function(){
socket.emit('game_request_sender_pipeline', {
message: "Hi",
});
});
},
receive_board: function(_string_dest_in_c){
socket.on('connect', function(){
socket.on('game_request_receiver_pipeline' , function (message)
{
var msg = "Other side : " + message.message;
var buffer = Module._malloc(message.message.length + 1);
Module.writeStringToMemory(msg, buffer);
setValue(_string_dest_in_c, buffer, '*');
return true;
});
});
return false;
},
});
и я скомпилированного следующее:
// for the sending test
em++ main.cpp --js-library path_to_js_library.js -o socket.html -DSEND=1
// for the receiving test
em++ main.cpp --js-library path_to_js_library.js -o socket.html
и в коде сервера Node.js, У меня есть:
io.on('connection', function (socket) {
socket.on('game_request_sender_pipeline' , function (message)
{
console.log("game_request_sender_pipeline on.");
socket.broadcast.emit('game_request_receiver_pipeline', {
message: message.message,
});
console.log("game_request_receiver_pipeline emitted.");
});
});
Результат довольно странный, пока я не думал, что он не работает, я отменил сервер nodejs и перезапустил его, а затем результаты появились в консоли браузеров.
'one_iter (') является синхронным, но 'receive_board' кажется асинхронно. – zakki
Должен ли я реализовывать обратные вызовы для обхода асинхронного характера? –
Я так думаю. '3-й параметр 'emscripten_set_main_loop' имеет значение true, one_iter вызывается много раз. – zakki