我尝试并在网上查找了大量的页面,发现没有任何东西适合 Windows 并且始终工作,我通过 TCP 协议(protocol)尝试了这个(逐字节流式传输,直到你遇到 3 - 我尝试过没有 3 的文件:PPPP,3 是指 ASCII 值 3,而不是数字“3”)。
服务器端:
int sendFile(SOCKET s, const char* file_path)
{
FILE* fp = fopen(file_path, "rb");
int i, err = 0, bytesSent, isOk = 1;
char ch = 0;
if(!fp)
{
fclose(fp);
return 1;
}
while(ch != EOF && isOk)
{
fread(&ch, sizeof(char), 1, fp);
if(ch != EOF)
{
bytesSent = send(s, &ch, sizeof(char), 0);
if(bytesSent <= 0)
{
return 1;
}
}
else
{
isOk = 0;
}
}
ch = 3;
bytesSent = send(s, &ch, sizeof(char), 0);
fclose(fp);
return 0;
}
客户端:
int recvFile(SOCKET s, const char* file_path)
{
FILE* fp = fopen(file_path, "wb");
int bytesRecieved;
char ch;
if(!fp)
{
fclose(fp);
return 1;
}
bytesRecieved = recv(s, &ch, sizeof(char), 0);
if(bytesRecieved <= 0)
{
return 1;
}
while(ch != 3)
{
fwrite(&ch, sizeof(char), 1, fp);
putch(ch);
bytesRecieved = recv(s, &ch, sizeof(char), 0);
if(bytesRecieved <= 0)
{
return 1;
}
}
fclose(fp);
return 0;
}
套接字运行良好,发送和接收良好(我说的是发送常规消息,没有这些功能)。 它没有返回 1,只是变成了无限循环。 不知道为什么它不起作用,知道吗?我彻底绝望了。
最佳答案
您应该使用 feof 而不是与 EOF 进行比较从文件读取时的功能。 EOF只是某些函数返回的错误代码,而不是文件中的实际字符。
另外,我注意到带有字符 3 的东西似乎是表示文件结束的一种方式。您应该考虑标准化数据传输。您可以在通信开始时发送文件的大小,然后客户端准确读取文件的大小,以避免包含该字符的文件出现问题(3 仍然是有效字符)。
要获得灵感,请查看 old project我的实现了这种行为(尽管它仅限于 Linux)。
关于c - 发送和接收文件 - 套接字 - c - windows,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25181320/