c++ - Winsock两次发送消息c ++
问题描述
所以我的问题是,当我在 do-while 循环中使用 WinSock“发送”时,PUTTY 会收到两次。
char sendBuffer[] = "this is my message to the world";
do
{
iResult = recv(clientSocket, recvBuffer, DEFAULTBUFFERLEN, 0);
if(iResult > 0)
{
std::cout << "Received bytes: " << iResult << std::endl;
std::cout << recvBuffer << std::endl;
//Successful receive, now send back a message
Message("Now it's your turn to say something!");
//std::cin.getline(sendBuffer, DEFAULTBUFFERLEN);
std::cin.get();
iSendResult = send(clientSocket, sendBuffer, sizeof(sendBuffer), 0);
if(iSendResult == SOCKET_ERROR)
{
Message("Error with send. ERROR: " + WSAGetLastError());
closesocket(clientSocket);
WSACleanup();
return 8;
}
std::cout << "Bytes sent: " << iSendResult << std::endl;
}
else if(iResult == 0)
{//Nothing has been received, client has disconnected
Message("Closing connection with client");
}else
{// there was an errror and the connection needs to be closed
Message("Error Receiving. Error: " + WSAGetLastError());
closesocket(clientSocket);
WSACleanup();
return 9;
}
}while(iResult > 0);
代码运行良好,编译和整体运行顺利,唯一的问题是发送调用由于某种原因发送了两次。
我在此之前调用一次发送只是为了说“欢迎来到服务器”,但实际上只发送一次。只有这一位发送两次。我正在使用 mingw 进行编译,这是我的构建脚本
g++ server.cpp -o server -lws2_32 -lwsock32
编辑:根据我的调试器,代码在收到来自客户端的初始消息时运行一次,然后再次运行并在再次运行时接收“\r\n”,因此重复消息而不等待新的客户端消息
解决方案
因此,经过一些调试后,我发现了问题,当您按 Enter 时,腻子会发送一条额外的消息(或类似的东西。因此,解决方案是使用具有以下条件的 if 语句包装处理接收到的消息的代码:
if((std::string)recvBuffer != "\r\n" || (std::string)recvBuffer != "\n")
推荐阅读
- laravel - Laravel 5.6 可以轻松验证多个输入字段
- python - 编程菜鸟需要 OOP 建议
- java - 简单 ViewModel 项目中的 NullPointerException
- java - 单击 xpath 徽标 alt 不可能
- c# - 以编程方式从 Dynamics CRM SLA 中检索“适用时间”和“成功标准”
- c# - 什么是聚合函数?
- ruby-on-rails - 如何从表中选择 6 条随机记录
- javascript - 加载另一个页面后单击链接时,Javascript添加类活动?
- windows-10 - 安排任务以静默方式运行
- android - 如何为 android 的 API 编写单元测试用例?