我想使用非常方便的Boost async_read_until来读取消息,直到我得到\r\n\r\n分隔符.
我喜欢使用这个分隔符,因为它很容易使用telnet进行调试并生成多行命令.我只是通过两条新线发出命令结束的信号.
我打电话async_read_until是这样的:
void do_read()
{
boost::asio::async_read_until(m_socket,
m_input_buffer,
"\r\n\r\n",
std::bind(&player::handle_read, this, std::placeholders::_1, std::placeholders::_2));
}
Run Code Online (Sandbox Code Playgroud)
我的处理程序现在看起来像这样:
void handle_read(boost::system::error_code ec, std::size_t nr)
{
std::cout << "handle_read: ec=" << ec << ", nr=" << nr << std::endl;
if (ec) {
std::cout << " -> emit on_disconnect\n";
} else {
std::istream iss(&m_input_buffer);
std::string msg;
std::getline(iss, msg);
std::cout << "dump:\n";
std::copy(msg.begin(), msg.end(), std::ostream_iterator<int>(std::cout, ", "));
std::cout << std::endl;
do_read();
}
}
Run Code Online (Sandbox Code Playgroud)
我想像std::getline示例一样使用,但在我的系统上,这可以保留\r角色.如您所见,如果我连接到服务器并写入hello加上两个CRLF,我会得到这个转储服务器端:
handle_read: …Run Code Online (Sandbox Code Playgroud) 我一直想知道真正的用例是什么__declspec(dllimport)。我知道建立共享库需要使用导出其符号__declspec(dllexport),然后该库的用户将这些符号用作__declspec(dllimport)。
然后,您应该使用一个特殊的定义来构建共享库,该定义将启用dllexport该属性,如果未设置该标志,则将符号定义为dllimport。
但是,我一点也没用过dllimport,它只是有效。
我有两个项目:
进出口
有一个小的Util类,它是用EXPORTING定义的
Util.h:
#ifndef _UTIL_H_
#define _UTIL_H_
#if defined(EXPORTING)
# define EXPORT __declspec(dllexport)
#else
# define EXPORT // I should use __declspec(dllimport) but client will try out
#endif
class EXPORT Util {
public:
static void test();
};
#endif // !_UTIL_H_
Run Code Online (Sandbox Code Playgroud)
然后在源文件Util.cpp中:
#include <iostream>
#include "Util.h"
void Util::test()
{
std::cout << "Testing..." << std::endl;
}
Run Code Online (Sandbox Code Playgroud)
如您所见,当用户使用此文件时,没有什么复杂的事,根本不会定义EXPORT(应该将其定义为dllimport)。
客户端exe
Main.cpp:
#include <Util.h>
int main(void)
{
Util::test();
return …Run Code Online (Sandbox Code Playgroud) 我正在尝试将参数传递给其他页面.我有一个图像类别,该列表在会话范围内,我的标题模板中为每个类别创建了一个链接.
我想重定向到新页面,并传递所选类别.
<h:dataTable id="categoryMenu" value="#{menuBean.listCategory}" var="category">
<h:column>
<h:link value="#{category.name}"
outcome="/image/imageList.xhtml" >
</h:link>
</h:column>
</h:dataTable>
Run Code Online (Sandbox Code Playgroud)
但是现在我希望与ImageListBean.java关联的页面imageList.xhtml获得所选类别.
我通过使用f:param请求GET参数尝试了很多事情,但是因为我的ImageListBean.java必须是视图作用域,所以它不起作用.
我正在编写一个非常小的 C UDP 客户端。我知道当您将数据发送到服务器时,会选择一个随机端口作为源端口。我也知道你可以使用 bind 来指定你想要响应的端口。
但是不知道什么时候端口是随机选择的?例如,我想依靠发件人地址来跟踪用户。它目前只有在客户端没有关闭时才有效,端口仍然相同,那么简单的 memcmp 就足以检测到相同的客户端。
这个小代码将使用相同的源端口,直到它退出:
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netdb.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <err.h>
int main(void)
{
int s, error, ch;
struct addrinfo hints, *res;
memset(&hints, 0, sizeof (struct addrinfo));
hints.ai_family = AF_INET;
hints.ai_socktype = SOCK_DGRAM;
if ((error = getaddrinfo("localhost", "9988", &hints, &res)))
errx(1, "%s", gai_strerror(error));
if ((s = socket(res->ai_family, res->ai_socktype, 0)) < 0)
err(1, "socket");
while ((ch = fgetc(stdin)) != EOF)
sendto(s, &ch, 1, 0, res->ai_addr, res->ai_addrlen); …Run Code Online (Sandbox Code Playgroud) 我正在设计一个仅限网络的游戏.我想在服务器端和客户端之间共享存储在C++类中的游戏数据.
这样做的好处是可以将数据放在同一个地方,从而简化了维护工作.但是,我的课程设计有问题,因为:
换句话说,我不想在服务器上安装图形库,反之亦然.
该课程可能如下所示:
class Fire : public Spell {
private:
/* some data */
public:
void execute(Player &p)
{
// call server actions
}
void draw(Player &p)
{
// call rendering and such
}
};
Run Code Online (Sandbox Code Playgroud)
Execute是仅用于服务器的功能,draw用于客户端.我真的不想使用宏来确定数据的哪一侧,因为它往往是丑陋和不可维护的.
我正在寻找一种精心设计的方法来实现这一目标.
你会做什么/使用什么?
c++ ×3
boost ×1
boost-asio ×1
c ×1
jsf ×1
linker ×1
parameters ×1
sockets ×1
udp ×1
visual-c++ ×1