我尝试通过网络查找TONS页面,发现NOTHING适合窗口并且始终正常工作,我通过TCP协议尝试了这个(逐字节流直到你碰到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,它只是变成了一个无限循环。 不知道为什么它不起作用,任何想法?我非常绝望。
答案 0 :(得分:0)
您应该在从文件中读取时使用feof函数,而不是与EOF进行比较。 EOF只是某些函数返回的错误代码,而不是文件中的实际字符。
另外,我注意到带有字符3的东西似乎是一种表示文件结尾的方法。您应该考虑规范化数据传输。您可以在通信开始时发送文件大小,并且客户端准确读取文件的大小,以避免包含该字符的文件出现问题(3仍然是有效字符)。
要获得灵感,请查看我的old project实现此行为(虽然它只是linux)。
答案 1 :(得分:0)
我曾经因为比用于写入的内容小的块读取tcp socket而遇到了麻烦。在套接字上,您可以写入确定长度(写入或发送)的数据包,如果读取的大小较短,实现可能会丢弃数据包的末尾。
从recv上的手册页:所有三个例程[recv,recvfrom,recvmsg]在成功完成时返回消息的长度。如果消息太长而无法容纳在提供的缓冲区中,则可能会丢弃多余的字节,具体取决于接收消息的套接字类型。
在阅读时,你应该总是使用一个大小至少等于写作中使用的最长缓冲区的缓冲区。
您可以转储收到的内容以进行确认。