我需要使用内置C++类型的参数从客户端进程向服务器进程发送(可能是一个)简单的单向命令(因此序列化非常简单).C++,Windows XP +.
我正在寻找一个不需要复杂配置的库,提供简单的界面,不需要数小时的学习时间,也没有商业使用限制.解决简单问题的简单方法.
Boost.Interprocess对于这个简单的任务来说太低级了,因为它不提供RPC接口.套接字也可能是一种过度杀伤,因为我不需要在机器之间进行通信.关于DCOM,CORBA等人也是如此.命名管道?从未使用过它们,WinAPI上的任何好库?的openmpi?
为什么我允许std::move在包含具有已删除移动语义的类型的字段的类上使用(情况1),但是不允许在这样的类的实例上使用它(情况2)?
我理解案例2.我已经明确删除了移动构造函数,所以如果我试图移动它,我会收到错误.但我希望在案例1中也会出现这种情况,这样的类也在被移动.
class TestNonMovable {
std::string ss;
public:
TestNonMovable(){}
TestNonMovable(const TestNonMovable&) {}
TestNonMovable(TestNonMovable&&) = delete;
};
class SomeClass {
TestNonMovable tnm;
};
int main() {
// case1: This compiles, my understanding is that for SomeClass::tnm compiler will use copy constrctor
SomeClass sc1;
SomeClass sc2 = std::move(sc1);
// case2: This does not compile, move constructor is explicitly deleted, compiler will not try using copy constructor
TestNonMovable tnm;
TestNonMovable tnm2 = std::move(tnm); //error: use of deleted function 'TestNonMovable::TestNonMovable(TestNonMovable&&)'
}
Run Code Online (Sandbox Code Playgroud) 你能否分享Boost :: MPL用法的任何实际例子(lambdas除外),只是为了让我更好地理解它的用途和实际应用领域?MPL文档教程有一个维度分析示例,但也许是因为它是一个这样的学术示例,它没有让我感觉到Boost :: MPL以及何时可以有效地使用它.
std::deque将元素存储在固定大小的“存储桶”(数组)中。不同的编译器使用不同的存储桶大小:
element_size < 256 ? 4096 : element_size * 16对于MSVC(尤其是MSVC)和GCC,如果双端队列元素的大小大于硬编码的大小,std::deque则std::list在大多数情况下会导致性能下降。
我认为Clang的效果更好,无论双端队列元素的大小如何,存储桶至少应包含16个元素。尽管在某些情况下,对于小元素,最小的bucket大小4096字节可能不是最佳的。
为什么没有std::deque用于存储桶大小的附加模板参数,其默认值是供应商认为合理的值?这不会破坏向后兼容性,但可以优化性能。
很容易忘记将构造函数标记为"显式":添加/删除args,使它们成为可选的等等.我知道的唯一可靠方法是将每个构造函数声明为显式,然后仅在设计需要隐式时才删除此关键字(谢谢标准,不仅允许单参数构造函数).但这看起来很难看.
不打算隐式构造函数打开(错误的)隐式转换的使用,例如在这里.这可能是偶然发生的,或者可能会破坏向后兼容性
那么为什么"显式"不是构造函数的默认特性,如果这会导致更少的错误?
ps是的,我读过Stroustrup的"C++的设计和演变",只是不记得他是否说过"明确的"那里
我有一个值(结构实例)被转换object为通用处理.我需要复制一下这个值.我不能明确地这样做,因为我只是拥有它,Type并且不知道它在编译时是什么.
默认情况下,我得到一份参考文献:var copy = objectOfMyStruct;.我想过制作一个明确的浅拷贝,MemberwiseClone()但我不能这样做,因为它是受保护的方法,我无法修改MyStruct.
Convert.ChangeType(objectOfMyStruct, typeOfMyStruct) 没有帮助,因为转换(实际上没有转换)发生在里面,它再次返回对象.
我怎么能这样做?
编辑:
我需要制作一个副本以保留原始值,并将其反序列化为传递给OnChangeHandler.简化的实施是:
var oldValue = type.GetValue(reference);
var newValue = oldValue; // something better is needed here
Deserialize(type, stream, ref newValue);
OnChange(oldValue, newValue);
type.SetValue(reference, newValue);
Run Code Online (Sandbox Code Playgroud)
复制是因为只发送了delta(更改),因此应该应用于原始值.
编辑2:
这个实现适用于原始类型,所以尽管int也是盒装的,我正在复制它而不是复制对它的引用.我只是不明白这一点.
这是一个需要的例子.
您可以在LINQPad中测试的此示例应该复制该结构而不将其转换回其未装箱的类型,这样当通过实现的接口调用它进行变异时,只会突变原始结构.因此问题是; 我该如何编写克隆方法?
void Main()
{
object original = new Dummy { Property = 42, Field = "Meaning of life" };
object clone = Clone(original);
((IDummy)original).Mutate(); // will modify the …Run Code Online (Sandbox Code Playgroud) 你有关于这个问题的任何信息吗?特别是boost :: shared_mutex和读写器互斥的任何问题?
读写器互斥体可能被滥用,例如频繁的写入锁定会降低性能,即使与简单的互斥锁相比也是如此.但是很多情况下许多读者经常需要一个可以被编写者很少修改的共享资源.
我试图理解C++ 11中的左值和右值.所以我写了一个测试代码:
int x = 10;
int foo() { return x; }
int& bar() { return x; }
int&& baz() { return 10; }
int main() {
int& lr1 = 10; // error: lvalue references rvalue
int& lr2 = x; // ok
int& lr3 = foo(); // error: lvalue references rvalue
int& lr4 = bar(); // ok
int& lr5 = baz(); // error: lvalue references rvalue
int&& rr1 = 10; // ok
int&& rr2 = x; // error: rvalue references …Run Code Online (Sandbox Code Playgroud) 我将二进制数据从客户端(Debian 6.0.3)发送到服务器(Windows Server 2003).为了绕过大多数防火墙,我使用HTTPS POST.客户端和服务器使用Boost.Asio和OpenSSL实现.首先,我实现了最简单的版本,它运行良好.
HTTP标头:
POST / HTTP/1.1
User-Agent: my custom client v.1
[binary data]
Run Code Online (Sandbox Code Playgroud)
([binary data]如果这很重要,则不是base64编码的)
然后,在另一台客户机上它失败了(连接到同一台服务器机器).行为不稳定.连接始终建立良好(端口443).大多数时候我通过SSL握手很好但服务器没有接收数据(几乎没有数据,有时实际收到一两个数据包).有时我收到SSL握手错误"短读".有时我收到无效数据.
客户端连接到服务器,握手,发送HTTP POST标头,然后无限发送二进制数据,直到出现错误.对于测试,我使用自定义生成的SSL证书.
服务器代码:
namespace ssl = boost::asio::ssl;
ssl::context context(io_service, ssl::context::sslv23);
context.set_options(ssl::context::default_workarounds | ssl::context::no_sslv2);
context.use_certificate_chain_file("server.pem");
context.use_private_key_file("server.pem", boost::asio::ssl::context::pem);
ssl::stream<tcp::socket> socket(io_service, context);
// standard connection accepting
socket.async_handshake(ssl::stream_base::server, ...);
...
boost::asio::async_read_until(socket, POST_header, "\r\n\r\n", ...);
...
Run Code Online (Sandbox Code Playgroud)
客户代码:
ssl::context context(io_service, ssl::context::sslv23);
context.load_verify_file("server.crt");
socket.reset(new ssl::stream<tcp::socket>(io_service, context));
socket->set_verify_mode(ssl::verify_none);
// standard connection
socket.async_handshake(ssl::stream_base::client, ...);
...
Run Code Online (Sandbox Code Playgroud)
(错误处理与不相关的代码一起被省略)
如您所见,这是最简单的SSL连接.怎么了?原因可能是防火墙吗?
我在同一个443端口上尝试了简单的TCP w/o SSL,这很好用.
编辑:
尝试添加"Content-Type:application/octet-stream",没有用. …
我正在研究SCTP协议.它的功能看起来很吸引 我担心的是社区的支持.是否有任何良好的跨平台(至少Linux和Windows)C++(或至少C)SCTP库?它是否支持异步方法?