我已经看到了很多与我正在尝试做的事情有关的问题,但是我还没有找到任何解决方案来为我工作。
我尝试编写两个套接字程序(一个客户端和一个服务器),以便服务器能够向客户端发送任何类型的文件(按字节)。我不知道如何构建/协调以下内容:
(在服务器中)从文件中获取数据的read语句(我正在使用fread())
(在服务器中)将数据发送到客户机的WRITE语句(我使用的是WRITE())
(在客户端)从服务器接收数据的read语句(我正在使用read())
(在客户机中)将从服务器接收的数据写入文件的WRITE语句(我使用的是fwrite())
我想以字节为单位传输数据。无论文件有多大,服务器中的一个fread()语句和一个write()语句是否足够?(还是取决于缓冲区的大小?)
在客户端,一次调用read()和一次调用fwrite()就足够了吗?(还是取决于缓冲区的大小?)
我对socket编程很陌生。事先谢谢!
我的服务器和客户端的以下部分:
客户端:

/*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;
        }
    }

最佳答案

发送到网络时,您可以使用一个呼叫write()。如果内核中没有足够的缓冲空间来处理整个过程,write()将阻塞,直到它能够处理所有的缓冲空间为止。你也可以把它分块写,也可以。其实没关系。
从网络上阅读时,必须循环调用read()。调用read()时指定的缓冲区大小只是允许返回的最大值,它不会等待太多的时间。所以它可以(而且经常会)返回比这个小的值。只要继续调用read()直到它返回0以指示eof,将每个缓冲区写入文件。

关于c - 服务器套接字多次写入客户端套接字程序中的单个读取?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/41798508/

10-11 22:12
查看更多