【问题标题】:Transfer of objects b/w Client/Server using UDP使用 UDP 传输对象 b/w 客户端/服务器
【发布时间】:2014-11-30 18:24:34
【问题描述】:

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

【问题讨论】:

  • 您不能只通过网络发送对对象的引用。如果客户端在另一台机器上,它就无法访问服务器机器的内存,也无法访问对象。我建议您将对象内部的信息分解为字节,发送,在客户端解析,然后根据解析的信息创建对象。
  • 是的,你是对的。我没有考虑那件事。我的客户端和服务器在同一台机器上,这就是我这样做的原因。现在我遇到了问题。谢谢。

标签: c++ udp client-server


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-22
    • 2012-01-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多