从消息文件名UDP

问题描述 投票:0回答:1

我在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个回答
0
投票

功能fopen需要一个空终止字符串,所以你必须从接收缓冲区确保文件名是将其传递给fopen前空终止。在代码中执行片段中的文件名可能跟随机数据,如果你不打电话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';
}

同时添加的修改将使得程序更加健壮。

在真正的代码,你应该加入错误处理的,可能表明它们的返回值的误差的所有功能。

© www.soinside.com 2019 - 2024. All rights reserved.