c - 服务器无法正确读取/打开客户端用 C 发送的文件名

标签 c file sockets client-server

我正在用 C 语言与套接字进行客户端/服务器交互。我想做的是让客户端请求在服务器上读取文件,服务器返回文件内容的缓冲区,然后客户端打印出文件。

虽然我能够完成服务器将文件缓冲区发送到客户端并且客户端成功打印出来,但我似乎无法让服务器成功读取客户端发送的文件名。

这就是我的意思:

///This is the structure of the message that gets sent back and forth
struct message { 
int code; //Just indicates 1 or 2 for readfile or writefile
int size;
char buffer[256]; //This will hold the filename when client sends readfile request
 };

作品:

char *filename = "test.c";
infile = open(filename, O_RDONLY);
//Send the file and everything back to the client

不起作用:

while( read(sockfd, &msg, sizeof(int) * 2) > 0) {
        if(msg.code == 1) { //Perform a read operation
            int infile, filesize, rr;
            int length;
            char output[256];
            size_t rb = 0;

            while(rb < msg.size) { 
                ssize_t r = read(sockfd, msg.buffer, msg.size - rb);
                if(r < 0) { 
                    error(sockfd, r, msg.buffer);
                    break;
                }
                rb += r;
            }

            msg.buffer[rb] = '\0';  
         //This has been printing out the correct amount
            printf("\nBytes read: %i", rb); 
         //This has also been printing out properly
            printf("\nmsg.buffer: %s", msg.buffer); 

            infile = open(msg.buffer, O_RDONLY);

我已进行编辑以显示我的程序所处的当前状态,但仍然无法正常工作。之前,我有一个 strcpy 放置不当。

最佳答案

在您发布的代码中,filename 未初始化。你的编译器应该警告你这一点。如果没有,则说明您没有正确调用它;使用gcc,至少执行gcc -O -Wall

如果使用strcpy,还需要为文件名分配内存。在简单的程序中这一步不是必需的;如果您在继续从客户端读取文件后需要记住文件名,那么制作副本会很有用。 strdup 函数将内存分配和字符串复制结合在一起,在这里很合适。

您需要检查所有系统调用的返回值。 read 的返回值告诉您读取了多少字节。如果操作系统愿意,则允许调用 read(fd,buf,n) 返回少于 n 个字节。如果收到的字节数少于预期,请循环调用 read。是的,几乎所有调用 read 的程序都会循环调用它,这是一个基本的 Unix/POSIX 习惯用法。如果您能适应的话,fread 函数会为您完成此操作。

缺少检查 msg.codemsg.size 有效性的代码。由于您已在 msg.buffer 中分配了 256 个字节,因此必须将 msg.size 限制为 255。

是的,赋值msg.buffer[msg.size] = '\0'是必要的,因为open需要'\0' code> 字符位于名称末尾(这就是它知道名称在哪里结束的方式)。


I thought maybe strcpy was appropriate

每当你使用指针时(这在 C 语言中是大多数情况),你需要仔细考虑你在做什么以及这些指针指向哪里,以及是否有足够的空间来放置你想要放置的内容。 C是一种无情的语言;到处乱扔指针和乱扔箭一样危险。 画图表! C 程序员有两种:一种是在白板、纸上、沙子或其他介质上画图表;另一种是在白板上、纸上、沙子或其他介质上画图表。以及那些在头脑中画图的人(第三种仍在试图弄清楚为什么他们的打印 1+1 的程序正在打印 3)。

关于c - 服务器无法正确读取/打开客户端用 C 发送的文件名,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3356201/

相关文章:

c - 用 C 语言解决迷宫问题并打印正确路径

php - CRC 16 -DECT 与聚 x^16 + x^10 + x^8 + x^7 + x^3 + 1

objective-c - 根据 NSTimer 更新 UILabel

c - 如何从 C 中的 pthread 线程返回一个值?

windows - 测试套接字连接的好工具?

sockets - 设置 UDP 套接字的源 IP

c - 如何读取c中的数字列表

c: 在内核模块中重命名文件

c# - 获取用我的应用程序打开的文件的路径+文件名

c - C 中数据包的读/写处理示例