Передача объектов ч / б Клиент / Сервер с использованием UDP

0

Я хочу отправить объект с сервера на клиент. Через UDP. В c++. Я попытался просто отправить ссылку на клиента и сделать указатель на клиенте для обращения к этому адресу. Код за то, что я пробовал:

данные:

class data
{
private:
    int number;
public:
    data(int number) {
        this->number = number;
    }
    void print() {
        cout<<"number : "<<number;
    }
};

сервер:

data *obj;
if (recvfrom(conn_sock, obj, sizeof(data), 0, (struct sockaddr*)&client_addr, &slen) == -1)
    cout<<"ERROR: recvfrom()";
else cout<<"SUCCESS: recvfrom()";

cout<<"\nRECEIVED from Client : ";
obj->print();

клиент:

data *obj = new data(11);
if(sendto(conn_sock, &obj, sizeof(data), 0, (struct sockaddr*)&serv_addr, addr_len) == -1)
    cout<<"ERROR: Problem sending data";
else cout<<"SUCCESS: sending object";
  • 1
    Вы не можете просто отправить ссылку на объект по сети. Если клиент находится на другом компьютере, он не имеет доступа к памяти компьютера сервера и не сможет получить доступ к объекту. Я предлагаю вам разбить информацию внутри объекта на байты, отправить ее, проанализировать на клиенте и создать объект из проанализированной информации.
  • 0
    Да, ты прав. Я не учел эту вещь. Мой клиент и сервер были на одной машине, поэтому я так и делал. Теперь у меня есть проблема. Благодарю.
Теги:
udp
client-server

1 ответ

0

Решила, проблема. Я сделал так же, как предложил @snixtho. Рабочий код:

данные:

class data
{
private:
    int number;
    float gpa;
public:
    data(int number, float gpa) {
        this->number = number;
    }
    void print() {
        cout<<"number : "<<number<<"gpa : "<<gpa;
    }
    int getNumber() {
        return this->number;
    }
    int getGpa() {
        return this->number;
    }
};

сервер:

data *obj;
int number = 0;
float gpa = 0.0;

if (recvfrom(conn_sock, buf, buff_length, 0, (struct sockaddr*)&client_addr, &slen) == -1)
    cout<<"ERROR: recvfrom()";
number = atoi(buf);

if (recvfrom(conn_sock, buf, buff_length, 0, (struct sockaddr*)&client_addr, &slen) == -1)
    cout<<"ERROR: recvfrom()";
gpa = atoi(buf);

obj = new data(number, gpa);

cout<<"\nRECEIVED from Client : ";
obj->print();
cout<<"\n\n";

клиент:

data *obj = new data(11, 3.2);
int n=0;    // n is the number of bytes of 'buf' after converting the integer to 'buf'

n = sprintf(buf, "%d", obj->getNumber());  
if(sendto(conn_sock, buf, buff_length, 0, (struct sockaddr*)&serv_addr, addr_len) == -1)
    cout<<"ERROR: Problem sending data";

n = sprintf(buf, "%f", obj->getGpa());
if(sendto(conn_sock, buf, buff_length, 0, (struct sockaddr*)&serv_addr, addr_len) == -1)
    cout<<"ERROR: Problem sending data";

Это решение проблемы, но я уверен, что будет и другой лучший способ сделать это.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню