消息UDP中的文件名

时间:2019-02-04 16:56:52

标签: c string udp fopen

我有一个使用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);

1 个答案:

答案 0 :(得分:0)

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

有多种选项可以满足此要求。

发送文件名,包括 '\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';
}

同时添加这两个修改将使程序更强大。

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