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(©File, 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);
,应该可以解决无法正确读取文件的问题。
我正在制作一个将文件从客户端复制到服务器的程序。我必须在复制之前将文件的长度发送到服务器。这两个程序都工作正常,直到我在程序的客户端部分添加 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(©File, 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);
,应该可以解决无法正确读取文件的问题。