【问题标题】:problem with comparing two string/chars in c++在 C++ 中比较两个字符串/字符的问题
【发布时间】:2020-09-07 20:18:37
【问题描述】:

所以我创建了一个 java 服务器和一个 c++ 客户端。 java服务器向c++客户端发送带有printwriter的消息以执行命令(数据传输正确,没有问题) 我使用 strcmp() 检查客户端使用 recv() 收到的字符串是否是我想要的字符串,但是当我尝试检查它时,它不起作用。我尝试打印出带有接收缓冲区的行,但没有发现任何问题。

这是接收和检查缓冲区的代码(c++,忽略一些值,因为这是一小段代码)

    char buffer[1024];

    if (recv(s, buffer, sizeof(buffer), 0) == SOCKET_ERROR) {
        cout << "Error CR#001" << endl;
        return -1;
    }

    if (strcmp(buffer, "||clear") == 0) {
        system("cls");
        return 1;
    }

【问题讨论】:

  • 它不起作用 -- 你需要准确地指明“它不起作用”是什么意思。
  • char buffer[1024]; 不是 C++ 字符串。这是一个字符数组。你确定那是c++代码吗?
  • 如果这是 C++,请使用 std::string。这只是花哨的 C 代码。
  • 你有什么证据证明缓冲区中接收到的任何内容将始终以 C 库函数(如 strcmp)所需的 \0 空字节终止?你有什么证据证明每次调用recv 都会收到来自套接字的完整消息,而不是部分消息,你必须再试一次才能收到其余的消息?所示代码缺少网络客户端必须正确实现的许多必需检查和逻辑。
  • 这可能会使用换行符或回车+换行符,具体取决于您的协议。仔细检查您的规格。

标签: c++ sockets networking


【解决方案1】:

在 c++ 中,您可以使用std::string 来表示buffer

const ssize_t MAX_BYTES = 1024;
ssize_t noreceivedbytes;
std::string buffer;

buffer.reserve(MAX_BYTES + 1);
noreceivedbytes = recv(s, buffer.data(), MAX_BYTES, 0)
if (noreceivedbytes <= 0) {
    cout << "Error CR#001" << endl;
    return -1;
}
buffer.data()[noreceivedbytes] = '\0';

if (buffer == "||clear") {
    system("cls");
    return 1;
}

更安全的完整性解决方案:

#define MAX_BYTES = 1024;
ssize_t noreceivedbytes;
chat buffer[MAX_BYTES];

noreceivedbytes = recv(s, buffer, MAX_BYTES - 1, 0)
if (noreceivedbytes <= 0) {
    cout << "Error CR#001" << endl;
    return -1;
}
buffer[noreceivedbytes] = '\0';

if (strcmp(buffer, "||clear") == 0) {
    system("cls");
    return 1;
}

请注意:

这个答案只会让你越过冰山一角。在处理套接字时,还有很多事情可能会出错(正如 cmets 中的其他人所提到的)。

recv() 不保证从服务器发送的整个数据块将被完全读取。你很容易得到像"||cle""||c"这样的部分字符串。

您需要做的最少的事情是在循环中从套接字接收字节,直到您手头有可以合理解析和匹配的东西。

最简单的方法是定义一个非常原始的协议,该协议先于按照其大小发送的有效负载数据(在将大小从接收到的数据中转换为整数值时,请注意字节序问题)。
有了这些,您将确切知道在完成有效负载块之前必须读取多少字节,这样就可以合理地对其进行解析和比较。

如何详细地完成所有这些将导致此处有待回答。关于这个主题有整本书都写过(我推荐Stevens, "Unix network programming")。

【讨论】:

  • 更安全,但如果recv 提供“||cle”或“||clearand more tokens that were sent later...”,您仍然会陷入困境。
  • @user4581301 不幸的是,这两种解决方案都是如此,但一个完整的安全解决方案在这里会走得太远。它只是为了演示与套接字 c-API 交互的完整 c++ 代码应该做什么,并且至少要确保数据正在形成一个有效的 c 样式字符串。
  • 几乎所有 TCP 都是如此。有了 TCP,就没有办法逃避。
  • @user4581301 见here
  • @user4581301 不,只是如何在有效的 c++ 中执行容易出错和有缺陷的代码;-)
猜你喜欢
  • 2013-10-29
  • 1970-01-01
  • 2017-09-18
  • 1970-01-01
  • 1970-01-01
  • 2016-01-04
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多