使用读写来做服务器和客户端(FTP协议)

时间:2015-03-29 19:36:28

标签: c ftp

我的代码太长了,无法在此发布,所以我要总结一下是什么问题。

在服务器部分我正在发送套接字3件事:

  • 消息

  • 文件内容

  • 另一条消息

在客户端部分我收到这些东西但是:

  • 首先是在终端上打印

  • 第二个写入新文件

  • 最后在终端上打印

但我的客户仍然坚持阅读,我真的不知道为什么。我问了一个小时的问题,所以如果有人可以帮助我,那就太棒了!

编辑:基本上,我认为我的问题是我不知道服务器上的write要停止客户端上的read ..是\n,{ {1}} ..?

以下是代码的两部分:

\0

server

void send_content(t_server *s, FILE *fd, int rfd) { int len; char *buff; write(s->socket, "150 File status okay;" \ "about to open data connection.\n\0", strlen("150 File status okay;about to open data connection.\n\0")); fseek(fd, 0, SEEK_END); len = ftell(fd); buff = malloc(len * sizeof(char)); read(rfd, buff, len); write(s->socket, buff, len); write(s->socket, "\n\0", strlen("\n\0")); write(s->socket, "226 Closing data connection.\n\0", strlen("226 Closing data connection.\n\0")); free(buff); }

client

2 个答案:

答案 0 :(得分:0)

  char  buff[4096];

  z = 0;
  read(c->fd, buff, 4096);
  write(1, buff, strlen(buff));

您应该将调用的返回值保存到read(),以便找出刚收到的字节数。您可能需要多次拨打read()才能收到整条消息。使用strlen()来查找接收到的字节数是错误的,因为缓冲区内容未初始化,并且消息的第一个块可以在任何地方被切断,因此您不能指望它是以null终止的。

答案 1 :(得分:0)

如上所述,您需要一个像this这样的读取功能来确保您收到 指定的字节数(此函数将循环,直到它收到它被告知的字节数)。只需使用此receivall方法,而不是随处阅读。 对于文件,您通常首先发送文件长度,然后接收文件。 我之前做过类似的事情,希望它会对你有所帮助。这是客户端,它尝试从服务器接收第一个文件长度,然后是文件:

        /* create file */
        FILE * ptrMyFile = fopen(&filenames[i][0],"wb");
        if(NULL == ptrMyFile)
        {
            printf("Unable to open file \n");
            return 1;
        }

        int size = 0;
        int t = 4;

        /* first receive file size from server */
        /* NOTE: error checking is omitted from code, nevertheless users should stil do some error checking when using this code */
        readall(sockfd, (unsigned char*) &size, &t);

        /* how many 256 byte chunks are there? */
        int div = size / 256;

        /* loop to receive each chunk. */
        for(int k = 0; k < div; k++)
        {
            int chunk_size = 256;

            /* make sure we receive 256 bytes */
            readall(sockfd, buffer, &chunk_size);

            /* write to file */
            fwrite(buffer, chunk_size, 1, ptrMyFile);
        }

        /* read the final chunk. */
        int whatsleft = size - 256 * div;
        readall(sockfd, buffer, &whatsleft);

        /* write */
        fwrite(buffer, whatsleft, 1, ptrMyFile);

        /* close file */
        fclose(ptrMyFile);

我将服务器部分留给您。