Сокет передачи данных, "MZ" добавлен в буфер? C ++ / Java - PullRequest
1 голос
/ 22 апреля 2020

Я отправляю файл с сервера (Java) клиенту (C ++). В то время как везде данные получаются просто отлично. В этой области иногда к имени файла добавляется «MZ []».

Вот код получения (C ++):

else if(command == "freceive")
        {
            // Receive Filename
            int fsize, l = 0;
            WIN32_FIND_DATA FindFileData;
            HANDLE hFind;
            char filetoSave[BUFFER] = { 0 };
            std::ostringstream response;
            memset(filetoSave, '\0', BUFFER);
            int fl = recv(sockfd, filetoSave, BUFFER, 0);
            if (fl == SOCKET_ERROR && WSAGetLastError() == WSAECONNRESET)
            {
                connected = false;
            }
            //===================================================
            std::ofstream File(filetoSave, std::ios::app | std::ios::binary);
            memset(recvbuf, '\0', BUFFER);
            // Recevie File
            while ((fsize = recv(sockfd, recvbuf + l, sizeof(recvbuf) - l, 0)) > 0)
            {
                if(fsize > 0){
                    File.write(recvbuf, fsize);
                }   
            }
            File.close();


            if(fsize == SOCKET_ERROR && WSAGetLastError() == WSAECONNRESET)
            {
                connected = false;
            }

            File.close();
            if(IsFile((char*)filetoSave) == TRUE){
                hFind = FindFirstFile(filetoSave , &FindFileData);
                if (hFind == INVALID_HANDLE_VALUE) 
                {
                    response << "ERROR Receiving file (" << filetoSave << ") : " << GetLastError();
                } 
                else 
                {
                    ULONGLONG FileSize = FindFileData.nFileSizeHigh;
                    FileSize <<= sizeof( FindFileData.nFileSizeHigh ) * 8; 
                    FileSize |= FindFileData.nFileSizeLow;
                    response << "Saved : '" << filetoSave << "'\nSize : " << FileSize << " bytes.\nSaved as : " << filetoSave;
                    FindClose(hFind);
                }
            } else {
                response << "Error File not found (" << filetoSave << ") : " << GetLastError();
            }

            EncSend(response.str().c_str());
        }

, а вот часть сервера, которая отправляет имя файла (Java):

public static void SendRaw(Socket sock, String data)
    {
        try {
            OutputStream outputStream = sock.getOutputStream();
            DataOutputStream dataOutputStream = new DataOutputStream(outputStream);
            dataOutputStream.write(data.getBytes());
            dataOutputStream.flush();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (NullPointerException ne) {
            ne.printStackTrace();
        }
    }

Все идет хорошо, за исключением того, что к имени файла добавлено MZ[], что мне не нужно. Почему это происходит? Это дало мне головную боль! Откуда взялась эта MZ[]!?

Вот скриншот. Обратите внимание, что после MZ в абсолютном имени файла есть странный символ ascii, такой как [], но os игнорирует его. скриншот здесь

...