【问题标题】:TCP server doesn't receive the right bytes number from clientTCP 服务器没有从客户端收到正确的字节数
【发布时间】: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


【解决方案1】:

检查整个客户端和服务器代码并修复:

1) 所有那些您没有正确处理从系统调用返回的结果的时间。这尤其适用于 recv() 返回的结果,它可以是负数、(错误)、零、(对等方关闭连接)或小于或等于请求的字节数的某个正数 - 你唯一的方法可以确定已将多少字节读入缓冲区。忘记调用中请求的字节数以及之前的任何 memset/bzero,和/或 strlen/之后,它返回,它们都是不充分的/误导性的。

2) 所有那些你假设的时候,仅仅因为你请求 X 字节的 recv() 并且 recv() 返回一个正数,那个数字就是 X。

3) 在所有那些你调用任何 str* C 风格库的时候,调用任何不是 100% 保证为 NULL 终止的缓冲区。

【讨论】:

    【解决方案2】:

    主要问题是(不是)处理 send() 返回值,因为即使没有任何错误条件,send() 也可能返回小于请求的值(例如,如果缓冲区已满)。在客户端中的每个循环周期之后,您将 z 增加读取到 buf 的字节数,但忽略可能已发送的字节数较少。这导致客户端循环在没有发送所有数据的情况下完成的结果,尽管这样说是错误的。改变那个 e。 G。到:

                                printf("Uploading......\n");
                                while (z < filesize)
                                {
                                        byteNum = fread(buf, sizeof(char), sizeof buf, fp);
                                        printf("Bytes read to buf : %d\n", byteNum);
                                        int sent = 0;
                                        while (byteNum > 0)
                                        {
                                            int ret = send(serverSocket, buf+sent, byteNum, 0);
                                            if (ret < 0) { perror("send"); goto fail; }
                                            sent += ret, byteNum -= ret;
                                            printf("Totally sent bytes: %d\n", z += ret);
                                        }
                                }
                                printf("Upload completed.\n");
    

    【讨论】:

      猜你喜欢
      • 2019-01-09
      • 1970-01-01
      • 2018-06-05
      • 2013-08-20
      • 1970-01-01
      • 1970-01-01
      • 2017-12-29
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多