【发布时间】:2014-09-30 14:59:00
【问题描述】:
我尝试在网上查找大量页面,发现没有适合 Windows 并且始终有效,我通过 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,它只是变成了一个无限循环。 不知道为什么它不起作用,知道吗?我完全绝望了。
【问题讨论】:
-
我会先把 while(ch != 3) 改成 while(bytesReceived > 0 && ch != 3)
-
@ServéLaurijssen 我添加了另一种方式:P
-
用EOF比较一个字符是错误的(查一下),需要检查fread()的返回值