我正在使用Boost.Asio在C++ 11中创建服务器应用程序.我创建了一个类,Server
它负责接受新的连接.它基本上只是:
void Server::Accept() {
socket_.reset(new boost::asio::ip::tcp::socket(*io_service_));
acceptor_.async_accept(*socket_,
boost::bind(&Server::HandleAccept, this, boost::asio::placeholders::error));
}
void Server::HandleAccept(const boost::system::error_code& error) {
if (!error) {
// TODO
} else {
TRACE_ERROR("Server::HandleAccept: Error!");
}
Accept();
}
Run Code Online (Sandbox Code Playgroud)
我找到了两种方法(我确定还有更多)来"修复" TODO
注释,即将套接字移动到应该去的地方.在我的情况下,我只想将它返回到拥有该Server
实例的类实例(然后将其包装在一个Connection
类中并将其插入到列表中).
Server
在其构造函数中有一个参数:std::function<void(socket)> OnAccept
调用它HandleAccept
.IServerHandler
或者其他什么,它有一个虚方法OnAccept
.Server
需要IServerHandler
在其构造函数的参数和类拥有实例的服务器实例扩展IServerHandler
,构建Server
以*this
作为参数.选项1与选项2的优缺点是什么?还有更好的选择吗?我的Connection
班级(OnConnectionClosed
)中遇到了同样的问题.此外,根据我决定如何设计系统,它可能需要一个OnPacketReceived
和OnPacketSent
回调.
我有一个方法,使用此代码通过TCP套接字接收文件:
FileOutputStream fileStream = new FileOutputStream(filename.getName());
while (totalRead < size) {
if (size - totalRead > CHUNKSIZE) {
read = getInputStream().read(buffer, 0, CHUNKSIZE);
} else {
read = getInputStream().read(buffer, 0, size - totalRead);
}
totalRead += read;
fileStream.write(buffer, 0, read);
fileStream.flush();
if (System.currentTimeMillis() > nextPrint) {
nextPrint += 1000;
int speed = (int) (totalRead / (System.currentTimeMillis() - startTime));
double procent = ((double)totalRead / size) * 100;
gui.setStatus("Reciving: " + filename + " at " + speed + " kb/s, " …
Run Code Online (Sandbox Code Playgroud) 我正在尝试用 Java 读取二进制文件。我需要读取无符号 8 位值、无符号 16 位值和无符号 32 位值的方法。执行此操作的最佳(最快、最美观的代码)是什么?我在 C++ 中做到了这一点,并做了类似的事情:
uint8_t *buffer;
uint32_t value = buffer[0] | buffer[1] << 8 | buffer[2] << 16 | buffer[3] << 24;
Run Code Online (Sandbox Code Playgroud)
但在 Java 中,如果 buffer[1] 包含一个因左移结果为 int (?) 而设置了符号位的值,则会导致问题。不是在特定位置仅 OR:ing 0xA5,而是在 0xFFFFA500 或类似的内容中 OR:s,这会“损坏”两个顶部字节。
我现在有一个代码,如下所示:
public long getUInt32() throws EOFException, IOException {
byte[] bytes = getBytes(4);
long value = bytes[0] | (bytes[1] << 8) | (bytes[2] << 16) | (bytes[3] << 24);
return value & 0x00000000FFFFFFFFL;
}
Run Code Online (Sandbox Code Playgroud)
如果我想转换四个字节 0x67 0xA5 0x72 0x50,结果是 …
我需要使用一些旧的遗留代码std::tr1::shared_ptr
.我需要包含的标题包含#include <tr1/memory>
和#include <tr1/functional>
.在我的代码我想用std::function
和std::bind
,因为我们的编译器支持这些.
这适用于gcc 4.6.3和4.7.3.在4.9.2,5.1.x和5.2.0中,这会导致编译器错误.它似乎是由于<tr1/functional>
-include 而发生的.
我写了一个重现这个问题的小例子:
#include <tr1/memory>
#include <functional>
#include <tr1/functional>
struct Foo {
void test(std::tr1::shared_ptr<int> i) {}
};
int main() {
Foo f;
std::function<void(std::tr1::shared_ptr<int>)> func = std::bind(&Foo::test, f, std::placeholders::_1);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
gcc-4.6.3,没有#include <tr1/functional>
,编译好.在我的本地机器上测试过.
gcc-4.6.3,用#include <tr1/functional>
,编译好.在我的本地机器上测试过.
gcc-5.1,没有#include <tr1/functional>
,编译OK:http://ideone.com/XrkAXT
gcc-5.1,带#include <tr1/functional>
编译器错误:http://ideone.com/sRWQLn
我没有使用任何std::tr1::function
或根本没有std::tr1::bind
,我从遗留代码中使用的唯一东西是一个std::tr1::shared_ptr
对象.
为什么#include <tr1/functional>
影响非tr1 …
下面给出了这个课程,这将打印20_20.现在直到第5行代码相同,我不希望T.a
当我改变值时改变值T1.a
.怎么解决?
class Test:
def __init__(self, val):
self.a = val
T = Test(10)
T1 = T
T1.a = 20
print T.a + '__' + T1.a
Run Code Online (Sandbox Code Playgroud)
预期产量为10_20.
c++ ×2
c++11 ×2
java ×2
boost-asio ×1
callback ×1
gcc ×1
interface ×1
python ×1
python-2.7 ×1
python-3.x ×1
tr1 ×1