【发布时间】:2017-09-11 20:48:58
【问题描述】:
我正在做一个C语言TCP连接的小项目,标题中提到了我的代码的问题。以下是我的代码的上传部分
客户端:
FILE * fp = fopen(f2d, "rb+");
if(fp == NULL) perror("Fail to upload(client)");
else
{
fseek(fp, 0, SEEK_END);
int filesize = ftell(fp);
memset(buf, '\0', MAX_SIZE);
sprintf(buf, "%d", filesize);
send(serverSocket, buf, strlen(buf), 0); //send the filesize to the server
rewind(fp);
int byteNum = 0, z = 0;
printf("Uploading......\n");
while((z += byteNum) < filesize)
{
memset(buf, '\0', MAX_SIZE);
byteNum = fread(&buf, sizeof(char), sizeof(buf), fp);
printf("Bytes read to buf : %d\n", byteNum);
send(serverSocket, buf, sizeof(buf), 0);
printf("Totally sent bytes: %d\n", z);
}
printf("Upload completed.\n");
}
fclose(fp);
服务器端:
printf("Upload Requested.\n");
f2df = fopen(buf + 4, "wb+");
if(f2df == NULL) perror("Fail to upload(server)");
else
{
memset(buf, 0, MAX_SIZE);
recv(clientSocket, buf, sizeof(buf), 0); //receive the filesize
int filesize = atoi(buf);
int recvNum = 0, recv_Num = 0;
while((recvNum += recv_Num) < filesize)
{
memset(buf, 0, MAX_SIZE);
recv_Num = recv(clientSocket, buf, sizeof(buf), 0);
fwrite(&buf, sizeof(char), sizeof(buf), f2df);
printf("Bytes received from recv: %d\n", recv_Num);
printf("Totally received bytes: %d\n", recvNum);
}
printf("Upload completed.\n");
}
fclose(f2df);
我的代码的想法是发送和接收字节,直到达到文件大小。但是以非常高的频率(嗯,有时它运行正常,所有字节都传输到服务器),服务器似乎错过了从客户端发送的一些字节(并且“recv”函数的返回值将在之后为零)客户端已将所有字节发送到服务器,这使得 while 循环的终止条件永远无法达到),然后在服务器端导致不定式循环。 附言所有其他功能都没有问题(例如发送和接收文件大小,文件大小的实际数量......等),我已经测试了它们。而且客户端也没有问题。
以下是问题的截图
任何人都可以帮助我解决这个问题,我已经尝试解决这个问题好几个星期了,提前非常感谢!
【问题讨论】:
-
recv_Num可能小于sizeof(buf) -
^^^ @joop 所说的。你这样做:'recv_Num = recv(clientSocket, buf, sizeof(buf), 0);',但是在加载 ''recv_Num' 之后,你立即这样做:'fwrite(&buf, sizeof(char), sizeof( buf), f2df);'.
-
另外,在此之前,您忽略从这里返回的结果:'recv(clientSocket, buf, sizeof(buf), 0);'。
-
哦...你在客户端做了同样的傻事,加载 byteNum: 'byteNum = fread(&buf, sizeof(char), sizeof(buf), fp);'然后在下面的发送中忽略它:'send(serverSocket, buf, sizeof(buf), 0);'。
-
这个:'memset(buf, '\0', MAX_SIZE);'两端都是多余的,货物崇拜的垃圾。
标签: c