【问题标题】:wrong return value by function函数返回值错误
【发布时间】:2014-02-26 10:08:30
【问题描述】:

我用 C++ 开发了一个程序,我想在其中存储 clientadd、clientport、servaddr、servport 在stl地图中。 我能够将值传递给地图并从地图显示。 我显示的值正确显示为(clientadd、clientport、servport) 但 servaddr 错误。

map<int, Values> items;

Values connection (inet_ntoa(clientaddr.sin_addr),ntohs(clientaddr.sin_port),inet_ntoa(servaddr.sin_addr),ntohs(servaddr.sin_port));


items.insert(pair<int, Values> (0, connection));

cout << "Size of the items map : " << items.size() << endl;

map<int,Values>::const_iterator itemsIterator = items.begin();

while(itemsIterator != items.end() )
{
  Values item = itemsIterator->second;
  item.printValues();
  itemsIterator++; //make the iterator point to the next pair in the map
}

class Values
{
private:
char *C_addr;
int C_port;
char *S_addr;
int S_port;

public:
Values(char*,int,char*,int);
void printValues();
};

Values :: Values(char *faddr,int fport,char *gwaddr,int gport)
{
C_addr=faddr;
C_port=fport;
S_addr=gwaddr;
S_port=gport;
}

void Values::printValues()
{
cout << C_addr<<":" <<C_port<<   ":" << S_addr <<":" <<S_port << endl;
}

我期待的输出

127.0.0.1 : 任何端口号 : 0.0.0.0 : 任何端口号

(即客户端地址,客户端端口,服务地址,服务端口)

但我得到这样的输出

127.0.0.1 : 任意端口号 : 127.0.0.1 : 任意端口号

【问题讨论】:

  • 如何在构造函数调用中设置char *gwaddr?您能否将此代码添加到您的问题中。
  • atualy 我从客户端连接中获得了这些值,所以这些值取决于哪个客户端连接到服务器。我添加了所有必要的代码。

标签: c++ map stl network-programming client-server


【解决方案1】:

来自inet_ntoa的documentation:

字符串在静态分配的缓冲区中返回,后续调用将覆盖该缓冲区。

所以两个构造函数参数都指向同一个缓冲区,填充了最后写入的地址。如果其他代码再次调用inet_ntoa,那就更不对了。

使用std::string而不是指针来保存字符串的副本。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-12-28
    • 2011-03-15
    • 2020-11-22
    • 2019-05-02
    • 2019-11-07
    • 2019-04-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多