将文件从客户端发送到服务器

时间:2015-03-02 10:37:31

标签: c file sockets client server

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

}

1 个答案:

答案 0 :(得分:1)

问题在于您的协议。

您发送文件,然后发送名称。但客户端无法知道文件何时结束且名称开始。

您可以先修改名称的长度,然后再输入实际名称来修复它:

#include <arpa/inet.h>

// Write the file name with length marker
uint32_t nameLength = htonl(strlen(fine));
write(servers_fd, &nameLength, sizeof nameLength); 
write(servers_fd, fine, strlen(fine)); 

// Write the actual file.

在客户端:

#include <arpa/inet.h>

uint32_t nameLength;
read(conn_fd, &nameLength, sizeof nameLength);
nameLength = ntohl(nameLength);

read(conn_fd, fine, nameLength);
fine[nameLength] = '\0';  // Add nul-terminator to file name.

// Read the rest of the file

htonlntohl将数字转换为网络字节顺序,即使客户端和服务器使用不同的字节顺序(大/小字节顺序),也可以使代码正常工作。

注意:除非您对实际文件使用大小标记,否则客户端不知道它有多大,并且连接只适用于一个文件下载。

Note2 :我忽略了大小和文件名可能被分成多个网络数据包的可能性。