gpt4 book ai didi

c++ - 获取 recv 函数的缓冲区长度

转载 作者:行者123 更新时间:2023-11-30 04:06:37 24 4
gpt4 key购买 nike

我编写了一个简单的 FTP 应用程序,可以在客户端和服务器之间来回发送文件,并且运行良好。最近,我编写了一个用于客户端和服务器的套接字库,其中一些功能发生了变化,我无法思考如何让它工作。目前我正在将库集成到我的服务器上。

问题是我的部分规范是用库隐藏套接字句柄,所以我将“recv”和“send”包装在通过引用传递 char 指针的库函数中。在我实现这个之前,我将 char[] 直接传递给 recv 函数,这对我的目的来说已经足够好了。现在我使用的是 char*,似乎我需要知道传入消息的确切长度,因为我的 char* 与发送数据和垃圾字符一起输出。

这是我的服务器代码的一部分:

while (true)
{
command = (char*)malloc(sizeof(char)*32);
int bytesRecv = socketObject.receiveData('c', &command, 32);

if(_stricmp(command,"mput") == 0)
{
while( true ) {

SizeCheck = 0;
FileSize = 0;

fileName = (char*)malloc(sizeof(char)*1024);

bytesRecv = socketObject.receiveData('c', &fileName, 1024);

if(_stricmp(fileName,"goodbye") == 0)
{
break;
}

while( true )
{
char GotFileSize[1024];
GotFileSize = (char*)malloc(sizeof(char)*1024);
socketObject.receiveData('c', &sentSize, 1024);


FileSize = atoi(GotFileSize);

if (FileSize > 0)
{
break;
}
}

mfcc = (char*)malloc(sizeof(char)*FileSize);
FILE *fp;
if( (fp = fopen(fileArray, "wb")) == NULL)
{
std::cout << "fopen has caused an error" << endl;
}

while(SizeCheck < FileSize){
int Received = socketObject.receiveData('f', &mfcc, FileSize);

if(Received != SOCKET_ERROR)
{
std::cout << "Before fwrite" << std::endl;
int written = fwrite(mfcc, 1, FileSize, fp);
SizeCheck += Received;
fflush(fp);
}
}//while transfer
}//while true
}//end mput if

这是我的接收函数:

int Socket::receiveData( char socketType, char** data, int size)
{
if(socketType != 'f' && socketType != 'c')
{
return -1;
}
if(socketType == 'f')
{
int bytes = recv( fAccepted, *data, size, 0);
return bytes;
}
else if(socketType == 'c')
{
int bytes = recv( cAccepted, *data, size, 0);
if (bytes == SOCKET_ERROR) {
printf("send failed: %d\n", WSAGetLastError());
}
return bytes;
}

return -1;
}

我已经阅读了一些关于 recv 的资料,它告诉我应该以某种方式发送文件名的大小和文件名,或者在循环中编译完整的字符串。我不确定这些方法是否适合我正在尝试做的事情,或者是否有更简单的方法。

最佳答案

receiveData 函数非常好:它将接收到的字节写入缓冲区,并返回接收到的字节数。

缓冲区中的所有其他字节都可以而且应该被忽略。在您当前的代码中,每次接收数据时,您都会将整个 缓冲区写入文件,即使 receiveData 准确告诉您应该写入多少数据。

也就是说,你不应该这样做

int written = fwrite(mfcc, 1, FileSize, fp);

而是

int written = fwrite(mfcc, 1, Received, fp);

您应该考虑使用更合理的缓冲区大小,例如 1500 字节(网络数据包的常用 MTU)或 1MB(应该毫无问题地适合 RAM),而不是整个文件大小。

顺便说一下,不需要将data 作为双指针传递,或者像您所说的那样,作为对指针的引用传递。只需将其作为普通指针传递即可。但这与您的“垃圾数据”问题无关。

关于c++ - 获取 recv 函数的缓冲区长度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22825124/

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