У меня проблема с подключением к необработанному TCP-серверу из скомпилированного веб-приложения с помощью emscripten.
Когда я подключаюсь из Deskopt версии приложения, все прекрасно работает.
На моем VPS я загружаю, компилирую и запускаю websockify:
./websockify 0.0.0.0:1235 127.0.0.1:1234
затем я собираю и запускаю свой сервер,
код: http://pastebin.com/KiehDrvk (из сети BeeJ)
Мой клиентский код очень прост (только для целей тестирования),
немного кода:
TCPsocket sock;
struct sockaddr_in sock_addr;
/* Allocate a TCP socket structure */
sock = (TCPsocket)malloc(sizeof(*sock));
if ( sock == NULL ) {
SDLNet_SetError("Out of memory");
goto error_return;
}
/* Open the socket */
sock->channel = socket(AF_INET, SOCK_STREAM, 0);
if ( sock->channel == INVALID_SOCKET ) {
SDLNet_SetError("Couldn't create socket");
goto error_return;
}
/* Connect to remote, or bind locally, as appropriate */
if ( (ip->host != INADDR_NONE) && (ip->host != INADDR_ANY) ) {
// ######### Connecting to remote
memset(&sock_addr, 0, sizeof(sock_addr));
sock_addr.sin_family = AF_INET;
sock_addr.sin_addr.s_addr = ip->host;
sock_addr.sin_port = ip->port;
/* Connect to the remote host */
if ( connect(sock->channel, (struct sockaddr *)&sock_addr, sizeof(sock_addr)) == SOCKET_ERROR && errno != EINPROGRESS ) {
SDLNet_SetError("Couldn't connect to remote host");
goto error_return;
}
while (1);
}
Поэтому, когда я запускаю это на рабочем столе, клиент подключается к серверу и ждет, как я ожидал.
Возвращение серверного терминала:
selectserver: new connection from 91.211.105.49 on socket 5
Терминал Websockify
None because is from desktop
Но когда я пытаюсь подключиться из веб-версии, клиент подключается и внезапно отключается:
Возвращение серверного терминала:
selectserver: new connection from 127.0.0.1 on socket 6
selectserver: socket 6 hung up
hung up: Success
Терминал Websockify
1: got client connection from 91.211.105.49
1: forking handler process
1: using plain (not SSL) socket
1: using protocol HyBi/IETF 6455 13
1: connecting to: 127.0.0.1:1234
1: client closed connection
1: handler exit
У кого-нибудь есть идеи?
Вы должны позволить своему коду вернуться во время выполнения веб-браузера. У вас есть некоторое время (1) вечный цикл, и я подозреваю, что ваш браузер отключает ваше приложение из-за неотзывчивости?
Если вы используете Emscriptem предложенный дизайн для основного цикла (https://kripken.github.io/emscripten-site/docs/porting/emscripten-runtime-environment.html#implementing-an-asynchronous-main-loop-in-c-c) вы можете просто переместить ваши переменные в глобальную область и удалить цикл while (1) из вашего кода.
// (1) put all your variables here (global scope)
int main() {
// (2) put your connect code here (without the while(1) loop)
#ifdef __EMSCRIPTEN__
// void emscripten_set_main_loop(em_callback_func func, int fps, int simulate_infinite_loop);
emscripten_set_main_loop(one_iter, 60, 1);
#else
while (1) {
one_iter();
// Delay to keep frame rate constant (using SDL)
SDL_Delay(time_to_next_frame());
}
#endif
}
// The "main loop" function.
void one_iter() {
// process input
// render to screen
}
Это должно позволить вам хотя бы протестировать ваш код в браузере. Удачи!
Других решений пока нет …