Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 服务器套接字中的多个写入到单读取客户端套接字程序?_C_Sockets_Tcp - Fatal编程技术网

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

C 服务器套接字中的多个写入到单读取客户端套接字程序?,c,sockets,tcp,C,Sockets,Tcp,我已经看到了很多关于我要做什么的问题,但我还没有找到任何解决方案 我尝试编写两个套接字程序(一个客户端和一个服务器),以便服务器能够向客户端发送任何类型的文件(按字节)。我不确定如何构建/协调以下内容: (在服务器中)从文件中获取数据的read语句(我使用的是fread()) (在服务器中)将数据发送到客户端的write语句(我正在使用write()) (在客户端中)从服务器接收数据的read语句(我使用的是read()) (在客户机中)将从服务器接收的数据写入文件的write语句(我使用的是f

我已经看到了很多关于我要做什么的问题,但我还没有找到任何解决方案

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

  • (在服务器中)从文件中获取数据的read语句(我使用的是fread())

  • (在服务器中)将数据发送到客户端的write语句(我正在使用write())

  • (在客户端中)从服务器接收数据的read语句(我使用的是read())

  • (在客户机中)将从服务器接收的数据写入文件的write语句(我使用的是fwrite())

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

    我不熟悉套接字编程。提前谢谢! 我的服务器和客户端的以下部分:

    客户端:

    /*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");
        }
    
    /*尝试从服务器获取文件*/
    字符接收缓冲区[256];
    文件*新的_文件;
    接收到的int字节=0;
    new_file=fopen(“newfile.txt”,“w”);
    字节接收=读取(连接,接收缓冲区,256);
    printf(“已接收%d字节\n”,已接收字节);
    同时(接收的字节数>0)
    {   
    字节接收=读取(连接,接收缓冲区,256);
    printf(“已接收%d字节\n”,已接收字节);
    fwrite(接收缓冲区,1,接收字节,新文件);
    printf(“写入字节!\n”);
    打破
    }
    如果(接收的字节数小于0)
    {
    printf(“/n读取数据字节时出错/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;
            }    
        }
    
    FILE*FILE_to_get=fopen(“sample.txt”、“rb”);
    if(file_to_get==NULL)
    {
    printf(“没有这样的文件!”);
    出口(0);
    }
    而(1)
    {
    无符号字符buff[256];
    int num_read=fread(buff,1256,文件要获取);
    printf(“读取%d字节”,num\u read);
    如果(num_read>0)
    {
    写入(连接、buff、num\u读取);
    printf(“写入%d字节”,num\u读取);
    }    
    if(num_read<256)
    {
    if(feof(文件到获取))
    printf(“文件结束\n”);
    如果(ferror(文件到获取))
    printf(“读取字节时出错\n”);
    打破
    }    
    }
    
    发送到网络时,您可以使用对
    write()
    的单个调用。如果内核中没有足够的缓冲区空间来处理整件事情,
    write()
    将阻塞,直到它能够处理所有内容。你也可以分块写,也可以。这并不重要


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

    发送到网络时,您可以使用单个调用
    write()
    。如果内核中没有足够的缓冲区空间来处理整件事情,
    write()
    将阻塞,直到它能够处理所有内容。你也可以分块写,也可以。这并不重要


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

    简单说明一下,确保检查每个系统调用是否失败(即
    fopen()
    等)(参考客户端)。作为一般规则,您应该检查任何返回字节数的系统调用的返回值,并正确处理它返回的任何返回值。这意味着您需要在它返回与您传入的字节数相同的字节数时处理它(即完全读取/写入缓冲区),并且当它返回的值小于您传入的值(即缓冲区的部分读/写)时,您还需要对其进行处理。最后,当它返回0(也称为文件结尾)和-1(也称为错误)时,您需要对其进行处理。请注意,请确保检查每个系统调用是否失败(即,
    fopen()
    ),等等。(指您的客户端)。一般来说,您应该检查返回字节数的任何系统调用的返回值,并正确处理它返回的任何返回值。这意味着您需要在它返回与您传入的字节数相同的字节数时处理它(即完全读取/写入缓冲区),并且当它返回的值小于您传入的值(即缓冲区的部分读/写)时,您还需要处理它。最后,当它返回0(又名文件结尾)和-1(又名错误)时,您需要处理它。谢谢,(在服务器中)我从文件中读取一次,然后向网络写入一次?和(在客户端中)我从网络中读取,然后在循环中写入文件?是的,这是一种很好的方法。谢谢,(在服务器中)我从文件中读取一次,然后在网络中写入一次?并且(在客户端)我从网络中读取,然后在循环中写入文件?是的,这是一种很好的方法。