【发布时间】:2014-03-03 08:13:49
【问题描述】:
第一个问题:我对 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 右移到 3 位 来修复它,但为什么我需要这样做呢?
我的第三个问题与第一个问题有关,如果没有像 TCP 缓冲区这样的东西,它只与 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;
}
【问题讨论】:
-
检查
ntohl(),htonl()以正确管理消息长度前缀。 -
我知道它们(ntohl 和 htonl()),但我真的需要它们,因为我的客户端服务器在相同的 Windows 架构上。不是吗?
-
它们不需要在同一台主机上运行这些东西,但网络编程的目的通常是在不同主机之间交换数据。
-
试过了,但还是没用 谢谢!
标签: c++ tcp network-programming