【问题标题】:filename from the message UDP来自消息 UDP 的文件名
【发布时间】:2019-02-04 16:56:52
【问题描述】:

我在 C(客户端,服务器)UDP 中有简单的程序。客户端将带有文件名或源的消息发送到文本文件,服务器打开此文件并显示第一行。 如何格式化buf才能正确打开文件?

客户

bzero(buf,BUF_SIZE);
fgets(buf, BUF_SIZE-1, stdin);
n = sendto(sfd, buf, strlen(buf), 0, rp->ai_addr, rp->ai_addrlen);

服务器

peer_addr_len = sizeof(struct sockaddr_storage);
n = recvfrom(sfd, buf, BUF_SIZE, 0,
            (struct sockaddr *) &peer_addr, &peer_addr_len);
FILE *fp;
char buff[255];
fp = fopen(buf,"r");

fgets(buff, 255, (FILE *)fp);
printf("First line: %s \n", buff);

fclose(fp);

【问题讨论】:

    标签: c string udp fopen


    【解决方案1】:

    函数fopen 需要一个以nul 结尾的字符串,因此在将其传递给fopen 之前,您必须确保接收到的缓冲区中的文件名是以nul 结尾的。如果您在调用'\0' 之前没有用'\0' 填充buf,则在您的代码sn-ps 中的实现文件名可能后跟随机数据。

    有不同的选项可以满足这个要求。

    发送文件名包括'\0':

    /* use strlen(buf)+1 to include the terminating '\0' */
    n = sendto(sfd, buf, strlen(buf)+1, 0, rp->ai_addr, rp->ai_addrlen);
    

    在这种情况下,接收者将获得一个包含'\0' 的缓冲区。但最好检查接收到的字符串是否实际上以'\0' 结尾。

    或者在收到字符串后附加一个'\0'

    /* use BUF_SIZE-1 to reserve at least 1 byte for '\0' */
    n = recvfrom(sfd, buf, BUF_SIZE-1, 0,
            (struct sockaddr *) &peer_addr, &peer_addr_len);
    if(n >= 0) {
        buf[n] = '\0';
    }
    

    添加这两个修改将使程序更加健壮。

    在实际代码中,您应该为所有可能以其返回值指示错误的函数添加错误处理。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-07-15
      • 2015-02-21
      • 2018-11-01
      • 2020-06-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多