【问题标题】:Emscripten C struck at function socket()Emscripten C 攻击函数 socket()
【发布时间】:2023-01-25 22:59:36
【问题描述】:

在下面的代码中,程序执行在调用 socket() 函数后受到影响。

任何人都可以找到这个问题的原因和解决方案吗?

更新:(重现问题)在这里,我已经在没有使用 GCC 的 emscripten 的情况下执行了以下代码,并且它可以正常工作但在编译为 emscripten web assembly 后无法正常工作

#include <stdio.h>
#include <stdlib.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <unistd.h>

#define VNC_BASE 8080
#define DEFAULT_DISPLAY ":10"

int accept_connection (int port)
{
    int bound;
    int sock;
    struct sockaddr_in sin;
    int on = 1;
    sin.sin_family = AF_INET;
    sin.sin_addr.s_addr = INADDR_ANY;
    sin.sin_port = htons (/*VNC_BASE + port*/8080);

    printf("In\n"); // <-- Getting printed
    
    bound = socket (AF_INET, SOCK_STREAM, IPPROTO_IP);  // <-- Getting struck

    printf("Out : %d\n", bound);  // <-- Not Getting printed

    if (bound < 0)
    {
        perror ("socket");
        exit (1);
    }

    setsockopt (bound, SOL_SOCKET, SO_REUSEADDR, &on, sizeof (on));

    if (bind (bound, (struct sockaddr *) &sin,
              sizeof (struct sockaddr_in))) {
        perror ("bind");
        exit (1);
    }

    int lStatus = listen (bound, 1);

    printf("Listen status : %d\n", lStatus);

    sock = accept (bound, NULL, 0);

    printf("Accept status : %d\n", sock);

    close (bound);
    return sock;
}

int main()
{
    int clientw = accept_connection (10);
    printf("Client w : %d\n", clientw);
}

使用以下命令将代码编译为 webassembly

emcc ./test.c -s WASM=1 -o ./test.js -lwebsocket.js -s PROXY_POSIX_SOCKETS=1 -s USE_PTHREADS=1 -s PROXY_TO_PTHREAD=1

我做了这个 repo 来重现这个问题: https://github.com/AithaTarun/Webassembly/tree/main

期望在 8080 端口上创建一个支持 emscripten 的服务器进程

【问题讨论】:

  • 我对emscripten一无所知,但乍一看,你的C代码看起来不错。您是否尝试过在纯 C 环境(没有 emscripten,没有 javascript)中构建它以查看它是否仍然卡在 socker() 调用上?
  • 哈,是的,我已经尝试过,如果我构建代码并使用 GCC 执行它,它可以正常工作。
  • 这段代码没有循环,所以不会卡在socket()上死循环。 accept_connection() 是否在循环中被调用?请提供minimal reproducible example。另外,if (bind (...)) 应该是 if (bind (...) &lt; 0)。而且,您没有检查listen()accept() 是否失败。
  • 请阐明您的具体问题或提供更多详细信息以准确突出您的需求。正如目前所写的那样,很难准确地说出你在问什么。
  • 嗨雷米,抱歉它没有陷入无限循环,在调用 socket() 方法后程序没有进一步执行,另外,感谢旁注。另外,我更新了问题以重现该问题。

标签: javascript c sockets webassembly emscripten


【解决方案1】:

我也有同样的问题。。你找到问题了吗? 如果是这样,请帮助我。

提前致谢。

大师。

【讨论】:

猜你喜欢
  • 2019-01-04
  • 2015-01-17
  • 2013-12-23
  • 1970-01-01
  • 1970-01-01
  • 2017-06-22
  • 2015-03-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多