【发布时间】:2018-06-18 00:05:18
【问题描述】:
所以我的问题是,当我在 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”,因此重复消息无需等待新消息客户留言
【问题讨论】:
-
你调试过这个吗?你确定你的循环没有迭代两次吗?
-
所以,是的,它迭代了两次,但只等待接收信息,在这两次迭代中一次
-
所以你是 receiving 两次,所以你的接收缓冲区不够大,无法容纳 Putty 发送的整个消息。所以放大一下。
Winsock::send()不会发送两次。 -
看一下编辑,问题是有一条额外的消息来自Putty,它读取的接收消息只是“\r\n”
标签: c++ sockets network-programming winsock2