我在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
需要一个空终止字符串,所以你必须从接收缓冲区确保文件名是将其传递给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';
}
同时添加的修改将使得程序更加健壮。
在真正的代码,你应该加入错误处理的,可能表明它们的返回值的误差的所有功能。