Server/client 当我在 C 中添加函数时,程序无法运行

Server/client program doesn't work when I add a function in C

我正在制作一个将文件从客户端复制到服务器的程序。我必须在复制之前将文件的长度发送到服务器。这两个程序都工作正常,直到我在程序的客户端部分添加 int sizeFile = getSizeFile(originalFile); 。突然间(在我添加函数之后)我服务器中的 while() 循环卡在了 recv()。我的客户端中的 while() 只循环一次然后中断。

为什么我的程序在添加 getSizeFile() 函数之前可以正常运行,我该如何解决?

函数:

int getSizeFile(FILE* file)
{
    // get file size
    FILE *f = file;
    fseek(f, 0L, SEEK_END);
    int sizeFile = ftell(f);
    return sizeFile;
}

服务器:

char ch[70];
printf("where do you want to save it(full path + name): ");
scanf_s("%s", ch, 70);

char c[70];
printf("which file you want to copy(full path + name): ");
scanf_s("%s", c, 70);

r = send(s, c, 70, 0); // B
if (r == SOCKET_ERROR)
{
    printf("2 error: %d\n", WSAGetLastError);
}

FILE* copyFile;
fopen_s(&copyFile, ch, "wb");
if (copyFile == NULL)
{
    printf("Error opening file\n");
}

char buf[BUFSIZE];
size_t size = BUFSIZE;
int counter = 0;

while (1)
    {
        int res = recv(s, buf, BUFSIZE, 0);
        if (res == SOCKET_ERROR)
    {
        printf("3 error %d\n", WSAGetLastError);
        break;
    }
    size = fwrite(buf, 1, res, copyFile);
    printf("size: %d\n", size);
    printf("res: %d\n", res);
    counter++;
    printf("counter: %d\n", counter);
}
fclose(copyFile);

客户:

    char c[70];
    res = recv(ClientSocket, c, 70, 0); // B
    if (res == SOCKET_ERROR)
    {
        printf("Server disconeccted\n");
        break;
    }
                
    FILE* originalFile;
    fopen_s(&originalFile, c, "rb");
    if (originalFile == NULL)
    {
        printf("Error opening file\n");
    }

    char buf[BUFSIZE];
    size_t size = BUFSIZE;
    int counter = 0;

    int sizeFile = getSizeFile(originalFile); // <-- this one

    while (size == BUFSIZE)
    {
    size = fread(buf, 1, BUFSIZE, originalFile);
    int r = send(ClientSocket, buf, size, 0);
    if (r == SOCKET_ERROR)
    {
        printf("1 error: %d\n", WSAGetLastError);
        break;
    }
    printf("size: %d\n", size);
    printf("r: %d\n", r);
    counter++;
    printf("counter: %d\n", counter);
}
fclose(originalFile);

将此作为评论,因为它只是重复了 Alex F 所说的话,但没有足够的声誉。在任何情况下,如果您在 getSizeFile(FILE* file) 中的 int sizeFile = ftell(f); 之后添加 rewind(f);,应该可以解决无法正确读取文件的问题。