服务器套接字多次写入客户端套接字程序中的单个读取?

时间:2017-01-23 02:37:51

标签: c sockets tcp

我已经看到很多与我正在尝试做的事情相关的问题,但我还没有能够为我的任何解决方案工作。

我尝试编写两个套接字程序(一个客户端和一个服务器),以便服务器能够将任何类型的文件(按字节)发送到客户端。我不确定如何构建/协调以下内容:

  1. (在服务器中)从文件中获取数据的读取语句(我正在使用fread())

  2. (在服务器中)写入语句以将数据发送到客户端(我使用write())

  3. (在客户端)从服务器接收数据的读取语句(我正在使用read())

  4. (在客户端)用于将从服务器接收的数据写入文件的写入语句(我使用的是fwrite())

  5. 我想以块的字节传输数据。无论文件有多大,服务器中的一个fread()语句和一个write()语句是否足够? (或者这取决于我缓冲区的大小?) 在客户端,一个调用read()和一个调用fwrite()就足够了吗? (或者这取决于我缓冲区的大小?)

    我是Socket Programming的新手。提前致谢! 我的服务器和客户端部分如下:

    客户端:

    /*try to get file from server*/
    
      char receive_buffer[256];
        FILE * new_file;
    
        int bytes_received = 0;
    
        new_file = fopen("newfile.txt", "w");
    
        bytes_received = read(conn_s, receive_buffer, 256);
    
        printf("Received %d bytes\n", bytes_received);
    
        while( bytes_received > 0)
        {   
            bytes_received = read(conn_s, receive_buffer, 256);
            printf("Received %d bytes\n", bytes_received);
            fwrite(receive_buffer, 1, bytes_received, new_file);
            printf("writing bytes!\n");
            break;
        }
        if(bytes_received < 0)
        {
            printf("/nError reading bytes of data/n");
        }
    

    部分服务器代码:

    FILE * file_to_get = fopen("sample.txt", "rb");
        if(file_to_get == NULL)
        {
            printf("No such file!");
            exit(0);
        }
        while(1)
        {
            unsigned char buff[256];
            int num_read = fread(buff, 1, 256, file_to_get);
            printf("read %d bytes\n", num_read);
            if(num_read > 0)
            {
                write(conn_s, buff, num_read);
                printf("writing %d bytes\n", num_read);
            }    
    
            if(num_read < 256)
            {
                if(feof(file_to_get))
                    printf("End of file\n");
                if(ferror(file_to_get))
                    printf("Error reading bytes\n");
                break;
            }    
        }
    

1 个答案:

答案 0 :(得分:3)

发送到网络时,您可以使用write()一次通话。如果整个内核中的缓冲区空间不足,write()将会阻塞,直到它能够处理所有内容。你也可以把它写成块,这也很好。它并不重要。

从网络中读取时,您必须在循环中调用read()。调用read()时指定的缓冲区大小只是允许返回的最大缓冲区大小,它不会等待接收到那么多。所以它可以(并且经常会)返回少于此。只需继续调用read(),直到它返回0以指示EOF,将每个缓冲区写入文件。