来自消息 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 值错误的函数添加错误处理。
我在 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 值错误的函数添加错误处理。