我正在使用boost :: asio库.
我一直在尝试在端口80上运行我的服务器,但无法让它这样做.以下是我的代码中的罪魁祸首,评论中的结果如下:
// This runs fine, and the webpage is visible on localhost:8000
tcp::acceptor a(*io_service, tcp::endpoint(tcp::v4(), 8000));
// This throws an error (at this line)
tcp::acceptor a(*io_service, tcp::endpoint(tcp::v4(), 80));
// This runs fine, but the webpage is NOT visible on localhost or localhost:80
tcp::acceptor a(*io_service, tcp::endpoint());
Run Code Online (Sandbox Code Playgroud)
我注意到端点只接受四位数的端口号.这可能与它有关吗?
如何在端口80上看到我的页面运行?谢谢!
通常,作为客户端从哪个源端口发送数据并不重要,但我仍然想要进行一些测试.所以我试图将我的客户端的套接字绑定到一个特定的端口,但即使我在我的本地机器上运行客户端和服务器(使用localhost作为目标地址),服务器告诉我我的源端口是59000.我初始化我的套接字像这样:
tcp::socket socket(io_service,tcp::endpoint(tcp::v4(),2000));
Run Code Online (Sandbox Code Playgroud)
有可能做我想做的事吗?我试图找出我的路由器在消息通过时是否更改了端口.这就是我正在玩的NAT遍历的东西.
我使用 boost 的 HTML Server 3 示例作为异步消息的学习工具(http://www.boost.org/doc/libs/1_53_0/doc/html/boost_asio/examples.html#boost_asio.examples.http_server_3)处理。
我已经采取了这个例子,并将其变成一个带有服务器对象的库,我可以在我的程序中实例化。我对上面的示例所做的唯一一件事就是删除 main.cpp 并将其编译为库。它的工作范围是我可以在代码中实例化服务器对象,并从命令行向它传递消息。
我正在努力的是如何优雅地终止服务器。从示例代码中我看到了这一点:
server::server(const std::string& address, const std::string& port,
std::size_t thread_pool_size,
Handler &handler)
: thread_pool_size_(thread_pool_size),
signals_(io_service_),
acceptor_(io_service_),
new_connection_(),
request_handler_(handler)
{
// Register to handle the signals that indicate when the server should exit.
// It is safe to register for the same signal multiple times in a program,
// provided all registration for the specified signal is made through Asio.
signals_.add(SIGINT);
signals_.add(SIGTERM);
signals_.async_wait(boost::bind(&server::handle_stop, this));
Run Code Online (Sandbox Code Playgroud)
因此设置了一个异步线程来监听信号并响应它们
我在程序的线程中实现了该服务器对象,如下所示:
class ServerWorker
{
public: …Run Code Online (Sandbox Code Playgroud) 根据这个页面,使用没有Boost的Asio应该是相当简单的,但我仍然无法编译任何include看起来像这些任何文件的文件:
#include <asio>
#include <asio.hpp>
#include <asio/version.hpp>
Run Code Online (Sandbox Code Playgroud)
我已经将我的编译器设置为使用c ++ 11(它已经在做了,虽然我确实切换gnu++11到了c++11),并且我已经#define ASIO_STANDALONE 在我正在尝试的各种包含之前放置了.
除此之外,是否还需要一些额外的工作来访问c ++ 11 Asio标头?我只是file not found在使用上述任何尝试进行编译时遇到错误.
我正在使用 Clion,它使用 MinGW 和 Cmake。当我尝试使用独立asio库时,我得到了
undefined reference to `WSAStartup@8'
undefined reference to `WSASetLastError@4'
undefined reference to `closesocket@4'
...
Run Code Online (Sandbox Code Playgroud)
我相信我必须链接C:/Windows/System32/ws2_32.dll图书馆。我尝试添加如下内容-L C:/Windows/System32 -lws2_32:
set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} ${GCC_COVERAGE_LINK_FLAGS} -static -lws2_32")
Run Code Online (Sandbox Code Playgroud)
但这没有帮助。我该如何修复这些错误?
我有一个Python应用程序调用C++ boost python库,它都可以工作.但是,我有一个回调C++到Python的场景,其中来自boost线程的C++调用python,我在C++端获得访问冲突.如果我使用python线程执行完全相同的回调,它可以完美地工作.因此我怀疑我不能简单地使用boost线程从C++回调Python,但需要做一些额外的工作吗?
单线程应用程序。
它不是每次都发生,只有在高负载 1.5 小时后才会发生。
套接字实现或 boost asio 是否有可能以某种方式执行此操作:
现在通过在我的变量中保存状态来解决,忽略接受成功。
Linux 2.6 (fedora)。提升 1.46.0
PS:当然可能有我的错误......但如果不是这样的话,它可以顺利运行几天。
我只是创建一个非常简单的C++类,它为我提供了几个方法,如connect()和read(),而不是公开所有Boost.Asio的套接字调用.
现在,我正在尝试找出如何创建一个只读取所需字节数的方法:
SocketClient::read(int bytes, char* data); //reads desired amount of bytes and puts them in data, size of data>bytes!
Run Code Online (Sandbox Code Playgroud)
不幸的是,我read_byte在Boost.Asio中找不到任何功能.我不想丢弃已收到但尚未读取的字节.
考虑这个简短的代码片段,其中一个 boost::deadline_timer 中断了另一个:
#include <iostream>
#include <boost/bind.hpp>
#include <boost/function.hpp>
#include <boost/asio.hpp>
static boost::asio::io_service io;
boost::asio::deadline_timer timer1(io);
boost::asio::deadline_timer timer2(io);
static void timer1_handler1(const boost::system::error_code& error)
{
std::cout << __PRETTY_FUNCTION__ << " time:" << time(0) << " error:" << error.message() << " expect:Operation canceled." << std::endl;
}
static void timer1_handler2(const boost::system::error_code& error)
{
std::cout << __PRETTY_FUNCTION__ << " time:" << time(0) << " error:" << error.message() << " expect:success." << std::endl;
}
static void timer2_handler1(const boost::system::error_code& error)
{
std::cout << __PRETTY_FUNCTION__ << " …Run Code Online (Sandbox Code Playgroud) 在doc/html/boost_asio/example/cpp03/ssl/client.cpp - 1.58.0的示例中,它加载了一个名为的文件ca.pem,但在哪里可以下载它?我试图从Firefox导出一个,并尝试使用我的系统中的那个/usr/share/ca-certificates/mozilla/GeoTrust_Global_CA.crt,但是示例程序只返回消息
Verifying /C=US/O=GeoTrust Inc./CN=GeoTrust Global CA
Handshake failed: certificate verify failed
Run Code Online (Sandbox Code Playgroud)
有什么建议吗?非常感谢.