UDP recvfrom数据无法正常显示

Aar*_*ron 0 c sockets network-programming

Html文件具有以下内容

的helloworld.html

Hello World
Testing Echo Server
Run Code Online (Sandbox Code Playgroud)

服务器输出

在此输入图像描述

客户代码

//Pack contents into UDP packet and send
while(1) {
    //Check for Validity of File
    readSize = fread(buffer, 1, bufferSize, currentFile);
    if (readSize <= 0) {
        if (ferror(currentFile) != 0) {
            fprintf(stderr, "Unable to read from file %s\n", inputFile);
            free(buffer);
            fclose(currentFile);
            close(sDescriptor);
        }
        break;
    }
    //Send Data
    if (send(sDescriptor, buffer, readSize, 0) < 0) {
        fprintf(stderr,"Send failed\n");
        free(buffer);
        fclose(currentFile);
        close(sDescriptor);
        exit(1);
    }
}
Run Code Online (Sandbox Code Playgroud)

服务器代码

/* Receive Data & Print */
unsigned int len = sizeof(cad);
int size = sizeof(buffer);
while (1) {
    charactersRead = recvfrom(sd, buffer, size, 0, (struct sockaddr *)&cad, &len);
    /* Print Address of Sender */
    printf("Got a datagram from %s port %d\n", inet_ntoa(cad.sin_addr), ntohs(cad.sin_port));
    printf("%s\n", buffer);
    if (charactersRead < 0 ) {
      perror("Error receiving data");
    } else {
      printf("GOT %d BYTES\n", charactersRead);
      /* Got something, just send it back */
      //sendto(sd, buffer, charactersRead, 0,(struct sockaddr *)&cad, &length);
    }
  }
Run Code Online (Sandbox Code Playgroud)

如果需要更多信息,我愿意发帖.客户端将文件的内容作为UDP数据包发送,服务器接收并打印出来.但是,因为你可以破坏某些东西.我不知道为什么这样做,如果我在recvfromi中切换第三个参数的参数得到不同的输出.例如,如果我将尺寸设置得更大,它实际上会打印出整个内容,但最后会出现损坏的字符.确定尺寸的正确方法是什么?那就是问题.这是当size参数变大时会发生什么. 在此输入图像描述

这更接近预期,但仍存在损坏的位.

jan*_*anm 5

您在非空终止的缓冲区上使用printf().你收到的八个字节是"Hello Wo",其余的都没有损坏,只是在缓冲区末尾的内存中.显示输出时需要使用字节数.