首页 > 解决方案 > 附加的套接字字符数组

问题描述

如图所示,字符串变量和字符变量cout不止一次。我有ZeroMem() buff我怎样才能对其进行规范化,以便它可以输出“Invader Said:Reddit”而不是“Invader Said:RedditInvader Reddit”。

char buff[4096];
string serverMessage = "GET OUT MY SERVER!";

while (true) {
    ZeroMemory(buff, 4096);

    int bytesRecived = recv(clientSocket, buff, 4096, 0);

    if (bytesRecived == SOCKET_ERROR) {
        cerr << "Error in recv()! Qutting!" << endl;
    }

    if (bytesRecived == 0) {
        cout << "Client Disconnected" << endl;
        break;
    }

    cout << "Invader Said: " << buff;
    send(clientSocket, (char*)serverMessage.c_str(), serverMessage.length(), 0);
}

问题可视化

标签: c++sockets

解决方案


不保证对方发送的字符全部在一条消息中发送。所以在 PuTty 方面,当用户键入时,Redditreturn我们不知道所有这些数据将如何通过网络发送。

您的屏幕截图看起来与您的叙述不同,因为没有第二个 Reddit:

Invader said: RedditInvader said: 

这是我基于它的理解。

在第一个循环中:

  • 您将一次收到 6 个字符
  • 没有错误,所以第一个if主体没有被执行
  • 没有空缓冲区,因此if不执行第二个主体。
  • 您打印Invader said:,然后是收到的字符Reddit
  • 您向 Putty 发送第一条消息

循环继续。在第二次迭代中:

  • 您收到相当于return(打印出来时看起来像换行符的 1 或 2 个字符)
  • 没有错误,所以第一个if主体没有被执行
  • 没有空缓冲区,因此if不会执行第二个主体。
  • 您 print Invader said:,然后是收到的字符,看起来像换行符
  • 您向 Putty 发送第二条消息

我不能告诉更多(断点?或recv()仍在等待,因为你没有 Ctrl+D?...)

这是唯一的解释。如果您一次收到所有 PuTty 字符,您将获得不同的输出:

Invader said: Reddit
Invader said:              (or something else, but on a new line)  

break备注1:它与您的问题无关,但是如果您遇到错误,您的程序将继续尝试打印输出并循环,因为在这种情况下您没有预见到a

备注 2:它也没有链接,但是如果您一次恰好收到 4096 个字符,您的输出可能会导致 UB,因为缓冲区末尾会缺少空终止符

您可能会感兴趣:


推荐阅读