c++ - 附加的套接字字符数组
问题描述
如图所示,字符串变量和字符变量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);
}
解决方案
不保证对方发送的字符全部在一条消息中发送。所以在 PuTty 方面,当用户键入时,Reddit
return我们不知道所有这些数据将如何通过网络发送。
您的屏幕截图看起来与您的叙述不同,因为没有第二个 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,因为缓冲区末尾会缺少空终止符
您可能会感兴趣:
- 输入结束导致的recv问题
- 问题,因为 recv 调用与 send 调用不匹配
- 类似的问题,但以重组几个 recv 接收到的数据为例。您可以调整它以仅处理整行(即直到收到换行符)。
推荐阅读
- node.js - 将 node.js 应用程序部署到 Heroku 构建成功,但应用程序错误
- reactjs - React JS - 关闭后重置模式
- javascript - 提升具有多个层的 React 应用程序的状态
- vue.js - Vuejs - 在运行时解析深度嵌套的 v-model 属性
- jquery - AD B2C - 为每个字段自定义必填字段消息
- python - 导入函数时出现“无”类型错误
- azure-pipelines - 如何锁定发布管道 Azure Devops Server
- c# - 将数据从视图传输到控制器
- sql - 来自 SQL 的 Spark(Databricks)非托管表不处理标头
- apache-spark - PySpark JDBC Teradata Connection