簡體   English   中英

服務器套接字中的多次寫入到客戶端套接字程序中的單次讀取?

[英]Multiple writes in server socket to single read in client socket program?

我已經看到了許多與我想做的事情有關的問題,但到目前為止,我還沒有找到任何適合我的解決方案。

我嘗試編寫兩個套接字程序(一個客戶端和一台服務器),以便服務器能夠將任何類型的文件(按字節)發送到客戶端。 我不確定如何構造/協調以下內容:

  1. (在服務器中)讀取語句以從文件中獲取數據(我正在使用fread())

  2. (在服務器中)將數據發送到客戶端的寫語句(我正在使用write())

  3. (在客戶端中)讀取語句以從服務器接收數據(我正在使用read())

  4. (在客戶端中)寫語句,用於將從服務器接收的數據寫到文件中(我正在使用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");
    }

服務器代碼部分:

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,然后將每個緩沖區寫入文件即可。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM