c - 发送和接收文件 - 套接字 - c - windows

标签 c windows file sockets

我尝试并在网上查找了大量的页面,发现没有任何东西适合 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/

相关文章:

c - 在 C 中初始化数组中的元素不会插入到另一个数据结构中

c - 如果CHAR_BIT != 8,其他类型的大小是多少?

c++ - MySQL 与二进制文件速度

java - SpringBoot项目gradle build 'bootRepackage'任务失败,因为无法重命名jar

java - 如何在Java中迭代某个目录的文件?

python - 文件上的第二个文件处理程序行为异常

C:计数字母直到插入特定条目

windows - 以全屏/信息亭模式启动桌面 PWA

c++ - unicode 窗口中的非 unicode WM_CHAR

c - 使用dirent循环c中目录中的html文件