来自消息 UDP 的文件名

filename from the message UDP

我在 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);

函数 fopen 需要一个以 nul 结尾的字符串,因此在将其传递给 fopen 之前,您必须确保接收缓冲区中的文件名以 nul 结尾。如果您在调用 recvfrom.

之前未将 buf 填充为 '[=15=]',则通过代码片段中的实现,文件名后可能会跟有随机数据

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

发送文件名包括'[=15=]':

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

在这种情况下,接收方将获得一个包含 '[=15=]' 的缓冲区。但是最好检查接收到的字符串实际上是否以 '[=15=]'.

结尾

或者在收到字符串后追加一个'[=15=]'

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

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

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