gpt4 book ai didi

c - 通过 C 中的套接字发送和接收文件

转载 作者:太空宇宙 更新时间:2023-11-04 08:38:17 24 4
gpt4 key购买 nike

我注意到 C++ 和 C# 等有一个内置函数,但 C 没有。 (我在 Windows 机器上)。

所以我写了这两个函数,但它们不起作用,它们只是卡住了(我怀疑是发送函数,因为当客户端接收时,根据函数返回值,他只是得到一个错误)。

功能如下(服务端和客户端之间的socket是正常的,我已经测试过了):

int recvFile(SOCKET s, const char* file_path)
{
FILE* fp = fopen(file_path, "wb");
char* file_buf = malloc(sizeof(char)*PACKAGE_LEN); //so it will be 0
int bytesRecieved, bytesWritten;
if(!fp)
{
fclose(fp);
free(file_buf);
return 1;
}

do
{
bytesRecieved = recv(s, file_buf, PACKAGE_LEN, 0); //receiving that file buffer in the size of PACKAGE_LEN (maximum chunk size).
if(bytesRecieved != PACKAGE_LEN)
{
fclose(fp);
free(file_buf);
return 1; //if there's an error...
}
if(!charPresent(file_buf, PACKAGE_LEN, EOF)) //as long as there's no EOF character in the file buffer received now.
{
fwrite(file_buf, sizeof(char), PACKAGE_LEN, fp); //write to file normally.
}
}
while(!charPresent(file_buf, PACKAGE_LEN, EOF)); // do it as long there's no EOF in the file buffer.
fwrite(file_buf, sizeof(char), indexOf(file_buf, PACKAGE_LEN, EOF), fp); //the last time you write the file buffer including the EOF is outside the loop.

fclose(fp);
free(file_buf);

return 0;
}

int charPresent(const char* str, size_t size, char ch)
{
int i;
for(i = 0 ; i < size ; i++)
{
if(str[i] == ch)
{
return 1;
}
}

return 0;
}

int indexOf(const char* str, size_t size, char ch)
{
int i;
for(i = 0 ; i < size ; i++)
{
if(str[i] == ch)
{
return i;
}
}

return -1;
}

(尽管在函数 charPresent()IndexOf 方面没有太多地方会出错 - 我没有使用 strlen() 是故意的,因为 \0 未 promise 在该缓冲区中)。和...:

int sendFile(SOCKET s, const char* file_path)
{
FILE* fp = fopen(file_path, "rb");
int i, err = 0, bytesSent, isOk = 1;
char* file_buf = malloc(sizeof(char)*PACKAGE_LEN);
char ch = 0;
if(!fp)
{
fclose(fp);
free(file_buf);
return 1;
}
while(ch != EOF && isOk)
{
i = 0;
do
{
do
{
err = ((fread(&ch, sizeof(char), 1, fp)) != 1);
file_buf[i] = ch;
}
while(err); //keep reading until read successfully.
i++;
if(i == PACKAGE_LEN) //means we achieved the maximum chunk size.
{
isOk = 0; //to exit the inner loop.
}
}
while(ch != EOF && isOk);
bytesSent = send(s, file_buf, PACKAGE_LEN, 0); //sending the file buffer over the socket.
if(bytesSent != PACKAGE_LEN)
{
fclose(fp);
free(file_buf);
return 1; //return an error (it is taken care of later on).
}
isOk = 1; // so the loop won't stop because we achieved only one chunk.
}

fclose(fp);
free(file_buf);

return 0;
}

我做错了什么? :P我想到了一个替代方法,它只是找出文件的长度并循环 FILE_LEN/PACKAGE_LEN + ((!(FILE_LEN%PACKAGE_LEN))?(0):(1)) 并在最后一次运行只是发送带有 EOF 的那个,但我认为基本上是相同的概念。

最佳答案

您的代码真的无法挽救。你应该诚实地重新开始。

在编写任何代码之前,请查看使用 TCP 的其他协议(protocol)的一些协议(protocol)规范。您可以查看 FTP、HTTP、SMTP 等。

请特别注意它们如何分隔消息。请记住,TCP 是一种字节流协议(protocol)——它不保留消息边界。

我强烈建议您不厌其烦地编写规范。这样,如果您的代码不起作用,您可以找出哪一侧不符合规范。 (如果它们都是,但仍然不起作用,则规范被破坏。)否则,无法找出问题所在,因为没有关于什么是正确的声明。

此外,您不能以这种方式使用 EOF。没有代表文件结尾的字符。每个可能的字符值都可以包含在一个文件中。没有表示“文件结尾”的“额外”字符。

关于c - 通过 C 中的套接字发送和接收文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25177456/

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