Невозможно передать последний пакет с помощью recv () Сервер / Клиент C файл Передается по TCP - PullRequest
0 голосов
/ 05 мая 2020

Я пытался передать файлы через TCP \ IP на клиенте windows на сервер Linux. Это было серьезной проблемой в течение последних нескольких дней из-за непонимания того, почему последний пакет не получен на стороне сервера, что тормозит запись файла.

Я хочу добиться загрузки изображения (JPG, PNG), программы (EXE) и т. д.

Вывод

Output from server side

Client

            lltoa(size.QuadPart,container,10);
            //Send file size
            send(sock, container, sizeof(container), 0);
            bzero(container,1024);
            //End of file size
            unsigned __int64 uiPos = 0;
            unsigned __int64 uiRemaining = ul.QuadPart;
            while (uiRemaining > 0)
            {
                ul.QuadPart = uiPos;
                ov.Offset = ul.LowPart;
                ov.OffsetHigh = ul.HighPart;
                DWORD dwNumToSend = (uiRemaining 

Server

            file_size = atoi(response);
            printf("File size: %lli \n",file_size);
            bzero(response,18384);
            //End of file size
            
            //First packet of file
            
            len = recv(client_socket,response,sizeof(response) 0)
            {
            //Start getting the file
                fwrite(response,1,len,new_file);
                bzero(response,18384);
                len = recv(client_socket,response,((file_size <= 1024) || (len < 1024))?file_size:sizeof(response),MSG_WAITALL);
                printf("Received: %i\t|",len);
                if(len <= 0)
                {
                    break;
                }
                //Check if this is the last packet
                
                file_size = file_size - len;
                printf("Response #%i\tbytes_received: %i\tbytes remain:%li \n",counter,len,file_size);
                counter += 1;
            }
            if(file_size > 0)
            {
                printf("\t\t\tError downloading file!  bytes left:%li \n",file_size);
                
            }
            else
            {
                printf("Successfully downloaded file! \n");
            }
            fclose(new_file);
            goto jump;

With error handeling for recv():

введите описание изображения здесь Если требуется больше кода на стороне сервера, прокомментируйте ... Я думаю, что это подойдет ...

Спасибо !!

1 Ответ

1 голос
/ 06 мая 2020

На основании кода, который вы показали, обнаружены некоторые проблемы. После редактирования, как показано ниже, он работает для меня. Вы можете попробовать. (Пожалуйста, покажите ul.QuadPart, ul.LowPart и ul.HighPart связанный код, если у вас все еще есть проблемы.)

На стороне клиента:

Измените DWORD dwNumToSend = (uiRemaining <= 3) ? 1 :1024; на DWORD dwNumToSend = (uiRemaining <= 1024) ? uiRemaining : 1024;

На стороне сервера:

Измените ((file_size <= 1024) || (len < 1024))?file_size:sizeof(response) на (file_size <= sizeof(response))?file_size:sizeof(response)

...