代码之家  ›  专栏  ›  技术社区  ›  joslinm

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

  •  2
  • joslinm  · 技术社区  · 14 年前

    虽然我能够完成服务器向客户端发送文件缓冲区;如果客户端打印成功,我似乎无法让服务器成功读取客户端发送的文件名。

    ///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放错地方了。

    3 回复  |  直到 14 年前
        1
  •  2
  •   Gilles 'SO- stop being evil'    14 年前

    在你发布的代码里, filename gcc gcc -O -Wall .

    strcpy . 在一个简单的程序中不需要这个步骤;如果在继续从客户机读取文件后需要记住文件名,那么制作一个副本就很有用了。这个 strdup

    您需要检查所有系统调用的返回值。的返回值 read 告诉您读取了多少字节。呼叫 read(fd,buf,n) n 如果操作系统喜欢的话。如果收到的字节数少于预期,请致电 阅读 在一个循环中。是的,几乎所有调用 阅读 在循环中调用它,这是一个基本的Unix/POSIX习惯用法。这个 fread 如果你能适应的话,函数会为你做的。

    msg.code msg.size msg.buffer ,必须限制

    是的,任务 msg.buffer[msg.size] = '\0' open '\0' 名称末尾的字符(这样它就知道名称的结尾)。


    我想也许strcpy是合适的

    画图表! 1+1 正在打印 3

        2
  •  1
  •   Nikolai Fetissov    14 年前

    的返回值 read(2)

    编辑:

    strcpy(3) 指向的空间 filename 指针变量,看起来未初始化。

        3
  •  0
  •   joslinm    14 年前

    fgets(msg.buffer, 256, stdin); 为了得到信息。当我用 printf("File |%s|", msg.buffer)

    我也改成了fopen和freads/writes。我补充道 ./ 但我怀疑这是必要的。。这只是我以前的一次尝试。现在看起来像这样:

                size_t rb = 0;
                FILE* file;
                char filename[256];
                while(rb < msg.size) { 
                    ssize_t r = read(sockfd, filename, msg.size - rb);
                    if(r < 0) { 
                        error(sockfd, r, msg.buffer);
                        goto end;
                    }
                    rb += r;
                }
                if(strlen(filename) > 253) { 
                    error(sockfd, rb, msg.buffer);
                    goto end;
                }
                strcpy(msg.buffer, "./");
                strcat(msg.buffer, filename);
                msg.buffer[rb + 1] = '\0';
    
                file = fopen(msg.buffer, "r");
                if(file == NULL) {
                    error(sockfd, rb, msg.buffer);
                    printf("Error opening file %s: %s\n", msg.buffer,strerror(errno));
                    fflush(stdout);
                    goto end;
                }