【发布时间】: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 (...) < 0)。而且,您没有检查listen()或accept()是否失败。 -
请阐明您的具体问题或提供更多详细信息以准确突出您的需求。正如目前所写的那样,很难准确地说出你在问什么。
-
嗨雷米,抱歉它没有陷入无限循环,在调用 socket() 方法后程序没有进一步执行,另外,感谢旁注。另外,我更新了问题以重现该问题。
标签: javascript c sockets webassembly emscripten