gpt4 book ai didi

c++ - TCP 中的垃圾值和缓冲区差异

转载 作者:可可西里 更新时间:2023-11-01 02:36:06 26 4
gpt4 key购买 nike

第一个问题:我对 TCP 中的缓冲区感到困惑。我正在尝试解释我的问题,我阅读了这份文档 TCP Buffer ,作者说了很多关于 TCP 缓冲区的内容,这很好,对初学者来说是一个很好的解释。我需要知道的是这个 TCP 缓冲区与我们在基本客户端服务器程序 (Char *buffer[Some_Size]) 中使用的缓冲区是相同的缓冲区还是由 TCP 内部保存的一些不同的缓冲区?

我的第二个问题是,当我打印数据时,我正在通过套接字从客户端向服务器发送前缀长度为(This is data From me)的字符串数据在控制台和我的字符串一起打印一些垃圾值也像这样 "This is data From me zzzzzz 1/2 1/2 ....." ?.然而,我通过右移 char *recvbuf = new char[nlength>>3]; nlength to 3 bits 来修复它,但为什么我需要这样做?

我的第三个问题与第一个问题相关,如果没有像 TCP Buffer 这样的东西并且它只关于 Char *buffer[some_size] 那么我的程序有什么不同会注意到使用这样的静态内存分配缓冲区和使用动态内存分配缓冲区使用 char *recvbuf = new char[nlength];。简而言之,哪个最好,为什么?

客户端代码

int bytesSent;
int bytesRecv = SOCKET_ERROR;
char sendbuf[200] = "This is data From me";

int nBytes = 200, nLeft, idx;
nLeft = nBytes;
idx = 0;
uint32_t varSize = strlen (sendbuf);
bytesSent = send(ConnectSocket,(char*)&varSize, 4, 0);
assert (bytesSent == sizeof (uint32_t));
std::cout<<"length information is in:"<<bytesSent<<"bytes"<<std::endl;
// code to make sure all data has been sent
while (nLeft > 0)
{
bytesSent = send(ConnectSocket, &sendbuf[idx], nLeft, 0);
if (bytesSent == SOCKET_ERROR)
{
std::cerr<<"send() error: " << WSAGetLastError() <<std::endl;
break;
}
nLeft -= bytesSent;
idx += bytesSent;
}

std::cout<<"Client: Bytes sent:"<< bytesSent;

服务器代码:

int bytesSent;
char sendbuf[200] = "This string is a test data from server";
int bytesRecv;
int idx = 0;
uint32_t nlength;
int length_received = recv(m_socket,(char*)&nlength, 4, 0);//Data length info
char *recvbuf = new char[nlength];//dynamic memory allocation based on data length info
//code to make sure all data has been received
while (nlength > 0)
{
bytesRecv = recv(m_socket, &recvbuf[idx], nlength, 0);

if (bytesRecv == SOCKET_ERROR)
{
std::cerr<<"recv() error: " << WSAGetLastError() <<std::endl;
break;
}
idx += bytesRecv;
nlength -= bytesRecv;
}

cout<<"Server: Received complete data is:"<< recvbuf<<std::endl;
cout<<"Server: Received bytes are"<<bytesRecv<<std::endl;
WSACleanup();
system("pause");
delete[] recvbuf;
return 0;

最佳答案

您无条件地从客户端发送 200 个字节,但在服务器中您只收到字符串的实际长度,并且该长度包括字符串终止符。

所以首先你没有收到所有发送的数据(这意味着你将填满系统缓冲区),然后你没有正确终止字符串(这导致在尝试时输出“垃圾”打印字符串)。

要解决此问题,在客户端中仅发送字符串的实际长度(varSize 的值),并在接收服务器中为终止符再分配一个字符,这当然是您需要的添加。

关于c++ - TCP 中的垃圾值和缓冲区差异,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21601965/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com