Emscripten — & gt; websockify — & gt; сырой tcp неожиданно повесил трубку

У меня проблема с подключением к необработанному 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

У кого-нибудь есть идеи?

2

Решение

Вы должны позволить своему коду вернуться во время выполнения веб-браузера. У вас есть некоторое время (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
}

Это должно позволить вам хотя бы протестировать ваш код в браузере. Удачи!

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]