使用 UDP 传输对象黑白客户端/服务器

Transfer of objects b/w Client/Server using UDP

本文关键字:客户端 服务器 黑白 对象 UDP 传输 使用      更新时间:2023-10-16

我想将对象从服务器发送到客户端。通过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";

解决了,问题。我按照@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<<"nn";

客户:

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";

这正在解决问题,但我相信还有其他更好的方法可以做到这一点。