2

emscriptenを使用してコンパイルされたWebアプリケーションから生のTCPサーバーに接続する際に問題があります。アプリの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

しかし、Webバージョンから接続しようとすると、クライアントが接続して突然切断します:

サーバー端末リターン:

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

誰かが何か考えがありますか?

4

1 に答える 1

0

コードが Web ブラウザーのランタイムに戻れるようにする必要があります。while(1) の永遠のループがあり、ブラウザーが応答しないためにアプリを強制終了していると思われますか?

Emscriptem が提案したメイン ループの設計を使用している場合 ( https://kripken.github.io/emscripten-site/docs/porting/emscripten-runtime-environment.html#implementing-an-asynchronous-main-loop-in- cc ) 変数をグローバル スコープに移動し、コードから 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
}

これにより、少なくともブラウザでコードをテストできるようになります。幸運を!

于 2016-07-14T23:17:33.207 に答える