问题描述:
在调用send函数发送字符串A后,调用recv接收信息,成功接收字符串A。
再次调用send函数发送字符串B后,使用recv收到的信息 仍为字符串A ,但此次收到的消息的前N个字节被字符串B覆盖(“N”为 字符串B 的字节数)
期望输出:
99999
发送:99999 send函数返回值:5
接收:99999 recv函数返回值:5888
发送:888 send函数返回值:3
接收:888 recv函数返回值:37
发送:7 send函数返回值:1
接收:7 recv函数返回值:1
源码:
#include <iostream>
#include <thread> //用于使listen函数非阻塞
#include <WinSock2.h>
#pragma comment(lib, "ws2_32.lib")
#pragma warning(disable:4996)
using namespace std;
static void WSA(bool _mode_)
{
static unsigned int _count;
if (_mode_ && !_count)
{
WORD sockVersion = MAKEWORD(2, 2); //启动网络库
WSADATA data;
WSAStartup(sockVersion, &data);
}
if (!_mode_ && _count == 1)
{
WSACleanup(); //关闭网络库
}
if (_mode_ != 0) _count++;
else _count--;
}
class CSocket
{
public:
CSocket(const char* _IP, USHORT _port)
{
WSA(1);
clientSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
sockaddr_in sock_in;
sock_in.sin_family = AF_INET;
sock_in.sin_port = htons(_port);
sock_in.sin_addr.S_un.S_addr = inet_addr(_IP);
connect(clientSocket, (sockaddr*)&sock_in, sizeof(sock_in));
}
CSocket& operator<<(std::string str)
{
int len = send(clientSocket, str.c_str(), strlen(str.c_str()), 0); //send发送数据
cout << "发送:" << str << "\tsend函数返回值:" << len << endl;
return *this;
}
~CSocket()
{
closesocket(clientSocket);
WSA(0);
}
private:
SOCKET clientSocket;
};
class SSocket
{
public:
SSocket(const char* _IP, USHORT _port, size_t _listen_max)
{
WSA(1);
serverSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
sockaddr_in sock_in;
sock_in.sin_family = AF_INET;
sock_in.sin_port = htons(_port);
sock_in.sin_addr.S_un.S_addr = inet_addr(_IP);
bind(serverSocket, (sockaddr*)&sock_in, sizeof(sock_in));
std::thread _listen(&SSocket::_listen, this, _listen_max);
_listen.detach();
}
SSocket& operator>>(char* _str)
{
int len = recv(clientSocket, _str, 1488, 0); //recv接收数据
strcat(_str, "\0");
cout << "接收:" << _str << "\trecv函数返回值:" << len << endl;
return *this;
}
~SSocket()
{
closesocket(clientSocket);
WSA(0);
}
private:
void _listen(unsigned int _maxlen) //非阻塞地 listen 和 accept,由构造函数的std::thread调用
{
listen(serverSocket, _maxlen);
sockaddr_in client_sin;
size_t len = sizeof(client_sin);
clientSocket = accept(serverSocket, (sockaddr*)&client_sin, (int*)&len);
}
SOCKET serverSocket;
SOCKET clientSocket;
};
int main()
{
SSocket ss("0.0.0.0", 8888, 1); //初始化SSocket(服务器端套接字)
CSocket cs("127.0.0.1", 8888); //初始化CSocket(客户端套接字)
string _input_; //读取键盘输入后保存在此变量
char str[1488]{}; //开辟内存,用于保存recv接收到数据
while (true) //循环输入、输出
{
do
getline(cin, _input_); //输入信息,如果输入长度为零就重新输入
while (_input_.size() == 0);
cs << _input_; //传入客户端套接字
ss >> str; //服务器端套接字读取消息至字符串指针
}
}
请各位帮我找出以上代码的bug所在,以达到期望输出效果,谢谢!