功能错误的返回值

时间:2014-02-26 10:08:31

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

我开发了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:任何端口号

1 个答案:

答案 0 :(得分:2)

来自inet_ntoa的{​​{3}}:

  

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

因此两个构造函数参数都指向同一个缓冲区,填充了最后写入的地址。如果其他一些代码再次调用inet_ntoa,那么它们甚至会成为wronger。

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