小编mar*_*and的帖子

读取直到boost :: asio :: streambuf中的字符串分隔符

我想使用非常方便的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)

c++ boost boost-asio

6
推荐指数
1
解决办法
5053
查看次数

在Visual Studio中dllimport的用例

我一直想知道真正的用例是什么__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)

c++ linker visual-c++

3
推荐指数
1
解决办法
400
查看次数

JSF传递参数并重定向到视图范围

我正在尝试将参数传递给其他页面.我有一个图像类别,该列表在会话范围内,我的标题模板中为每个类别创建了一个链接.

我想重定向到新页面,并传递所选类别.

<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必须是视图作用域,所以它不起作用.

parameters jsf

2
推荐指数
1
解决办法
8042
查看次数

UDP 源端口是什么时候设置的?

我正在编写一个非常小的 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 sockets udp

2
推荐指数
1
解决办法
1076
查看次数

在服务器和客户端之间使用相同的数据

我正在设计一个仅限网络的游戏.我想在服务器端和客户端之间共享存储在C++类中的游戏数据.

这样做的好处是可以将数据放在同一个地方,从而简化了维护工作.但是,我的课程设计有问题,因为:

  1. 在服务器端,只需要逻辑
  2. 在客户端,您想要绘制,渲染等

换句话说,我不想在服务器上安装图形库,反之亦然.

该课程可能如下所示:

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++

2
推荐指数
1
解决办法
111
查看次数

标签 统计

c++ ×3

boost ×1

boost-asio ×1

c ×1

jsf ×1

linker ×1

parameters ×1

sockets ×1

udp ×1

visual-c++ ×1