получение байтов разных размеров с сервера c ++ на клиент python - PullRequest
0 голосов
/ 20 февраля 2020

Я пытаюсь отправить несколько изображений, взятых из папки с сервера C ++, на клиент Python. Мне удалось отправить / получить размеры в виде целых чисел, но теперь я должен отправить / получить фактические изображения. Поскольку изображения имеют разные размеры, я бы хотел, чтобы клиент разделил байты в соответствии с размерами изображений.

Я немного потерян, поскольку сейчас я использую один параметр, например recv(1024), и получаю много больше байтов, чем я послал. Так что я не совсем уверен в том, что происходит.

Сервер

    ifstream stream(nm, std::ios::in | std::ios::binary);
if(stream.is_open())
    {


vector<char> imageDataVec((istreambuf_iterator<char>(stream)), istreambuf_iterator<char>());
cout << "Size=of=image=== " << imageDataVec.size() << " bytes";
long conv_num= htonl(imageDataVec.size());
//send(new_socket, &converted_number, sizeof(converted_number), 0);
//send(new_socket, &imageDataVec, imageDataVec.size() , 0);

//size_t sent{};
int nbytes=0;  

while (1) 
    {

    //send(new_socket, &conv_num, sizeof(conv_num), 0);
     nbytes = send(new_socket, &imageDataVec, imageDataVec.size(), 0);
//continue;
    if (nbytes <= 0) {
        std::clog << "error: while sending image\n";
        break;
}
    else
{
    //sent += nbytes;
    cout<<nbytes<<"=====1=1=1=1========"<<"bytes"<<endl;}
                       break;

    }
//fclose(fin);
}
else
{cout<<"can't open folder"<<endl;}

Клиент

 while(1):
    pic_bytes=s.recv(8)
    pic_bytes_amount=int.from_bytes(pic_bytes, byteorder='big', signed=False)
    print("received bytes======{}".format(pic_bytes_amount))
    f=open('pic.jpeg','wb')
    f.write(pic_bytes)
    f.close()

1 Ответ

0 голосов
/ 20 февраля 2020

1) кажется странным, что вы пишете адрес вектора в сокет.

я думаю, что send должен выглядеть следующим образом:

send(new_socket, imageDataVec.data()...);

2) как я понимаю, на клиенте сторона, которую вы пытаетесь прочитать 8-байтовое целое число. но я не вижу, куда сервер записывает эти данные.

3) используйте int64_t вместо длинного типа, так как вы не можете быть уверены в длинном размере.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...