【发布时间】:2015-05-02 16:21:38
【问题描述】:
我正在用 C 语言开发一个客户端/服务器程序。服务器向客户端发送一个 txt 文件,但名称已损坏。内容不错,只是名字不好。
谁能告诉我为什么?谢谢!
这是发送文件的代码:
fd = open(appoggio1, O_RDONLY);
if (fd < 0) {
fprintf(stderr, "unable to open '%s': %s\n", appoggio1, strerror(errno));
exit(1);
}
while ((nread = read(fd, buffer2, sizeof(buffer2))) > 0)
{
write(servers_fd, buffer2, nread);
read(servers_fd,buffer2,sizeof(char));
}
printf("Trasmissione completata con successo\n\n");
write(servers_fd,fine,strlen(fine));
read(servers_fd,fine,strlen(fine));
close(fd);
这是接收文件的代码:
fd = open(nomefile, O_CREAT | O_WRONLY, 0755);
if (fd < 0)
{
fprintf(stderr, "errore open(): %s\n", strerror(errno));
exit(errno);
}
while ((nread = read(conn_fd, buffer, sizeof(buffer))) > 0)
{
if(!strncmp(buffer,fine,7))
break;
write(fd, buffer, nread);
write(conn_fd,buffer,sizeof(char));
}
write(conn_fd,fine,strlen(fine));
}
【问题讨论】:
-
您是否先发送文件名..?什么是
nomefile..? -
对,就是文件名。
-
在发送方,发送文件名的代码在哪里..?
-
你用 valgrind 测试过吗?您是否进行了网络跟踪 (tcpdump) 以查看问题出在哪里,在服务器上还是在客户端上?
-
您的代码的另一个问题是发送方中的 sizeof(buffer2) 必须等于接收方中的 sizeof(buffer)。否则握手(发回一个字节)将失败。为避免这种情况,最好在文件名之后发送文件大小并且不要握手。在接收方,跟踪到目前为止接收到的字节并将其与预期字节数进行比较。您将知道何时收到所有数据。
标签: c file sockets client server