Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/150.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
从c+;连接websocket时出现问题+;用emscripten编译 尝试使用EcliScript编译的C++代码连接WebSoCult:PoC1.1.0StaseWebSoCoServer。使用编译的boost 1.69和一个常见示例连接到套接字 boost::asio::ssl::context-ctxt(context::sslv23_客户端); 设置验证模式(boost::asio::ssl::verify\u none); boost::asio::io_服务svc; tcp::解析器解析器(svc); tcp::resolver::query查询(“127.0.0.1”、“9980”, boost::asio::ip::解析器\查询\基础::数字\服务); tcp::resolver::iterator i=resolver.resolve(查询,ec); boost::asio::ssl::流s(svc,ctxt); s、 最低层()连接(*i,ec); s、 握手(boost::asio::ssl::stream::client,ec);_C++_Boost_Emscripten_Webassembly - Fatal编程技术网

从c+;连接websocket时出现问题+;用emscripten编译 尝试使用EcliScript编译的C++代码连接WebSoCult:PoC1.1.0StaseWebSoCoServer。使用编译的boost 1.69和一个常见示例连接到套接字 boost::asio::ssl::context-ctxt(context::sslv23_客户端); 设置验证模式(boost::asio::ssl::verify\u none); boost::asio::io_服务svc; tcp::解析器解析器(svc); tcp::resolver::query查询(“127.0.0.1”、“9980”, boost::asio::ip::解析器\查询\基础::数字\服务); tcp::resolver::iterator i=resolver.resolve(查询,ec); boost::asio::ssl::流s(svc,ctxt); s、 最低层()连接(*i,ec); s、 握手(boost::asio::ssl::stream::client,ec);

从c+;连接websocket时出现问题+;用emscripten编译 尝试使用EcliScript编译的C++代码连接WebSoCult:PoC1.1.0StaseWebSoCoServer。使用编译的boost 1.69和一个常见示例连接到套接字 boost::asio::ssl::context-ctxt(context::sslv23_客户端); 设置验证模式(boost::asio::ssl::verify\u none); boost::asio::io_服务svc; tcp::解析器解析器(svc); tcp::resolver::query查询(“127.0.0.1”、“9980”, boost::asio::ip::解析器\查询\基础::数字\服务); tcp::resolver::iterator i=resolver.resolve(查询,ec); boost::asio::ssl::流s(svc,ctxt); s、 最低层()连接(*i,ec); s、 握手(boost::asio::ssl::stream::client,ec);,c++,boost,emscripten,webassembly,C++,Boost,Emscripten,Webassembly,服务器输出如下 Request from 127.0.0.1:58152: GET / HTTP/1.1 Host: 127.0.0.1:9980 Connection: Upgrade Pragma: no-cache Cache-Control: no-cache Upgrade: websocket Origin: http://127.0.0.1:8887 Sec-WebSocket-Version: 13 Sec-WebSocket-Protocol: binary WebSocket

服务器输出如下

Request from 127.0.0.1:58152: GET / HTTP/1.1
Host: 127.0.0.1:9980
Connection: Upgrade
Pragma: no-cache
Cache-Control: no-cache
Upgrade: websocket
Origin: http://127.0.0.1:8887
Sec-WebSocket-Version: 13
Sec-WebSocket-Protocol: binary
WebSocket connection established.
Frame received (length=0, flags=0x0).
WebSocket connection closed.
但是,此代码在握手后挂起。它可以这样使用吗?还是有必要使用asio的异步调用


另外,如果您知道任何类似的示例,请与我们分享。

我总是告诉尝试WebAssembly的人

WebAssembly(在浏览器上下文中)是JavaScript。

即使您使用Emscripten在C/C++中编写代码,编译的字节码也会在浏览器的JavaScript引擎(如V8)中运行。这意味着WASM代码除了JavaScript API之外没有任何特殊的低级API。每个系统级函数都使用JavaScript进行仿真

这是什么意思?低级套接字控制(如设置SSL版本和SSL握手)没有意义,因为WASM代码只能用于联网,因此套接字由浏览器处理,而不是WASM代码

相反,您可以使用普通的BSD套接字。Emscripten将BSD套接字转换为JavaScript WebSocket。换句话说,您根本不能使用Poco库

像这样:

struct sockaddr_in addr;
ing res;
int fd = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP);
unsigned long nonblocking = 1;
fcntl(fd, F_SETFL, O_NONBLOCK);
memset(&addr, 0, sizeof(addr));
addr.sin_family = AF_INET;
addr.sin_port = htons(9980);
if (inet_pton(AF_INET, "127.0.0.1", &addr.sin_addr) != 1) {
  perror("inet_pton failed");
  finish(EXIT_FAILURE);
}
res = connect(server.fd, (struct sockaddr *)&addr, sizeof(addr));
顺便说一句,您被迫只使用异步(非阻塞)套接字操作,因为它是JSWebSockets

相关参考资料:


我很想知道
无符号长非阻塞=1
变量是如何使用的。