在向量上找到第一对元素(int)并得到第二个(struct)

时间:2016-04-04 15:19:28

标签: c++ sockets vector struct

解决即可。见下文 我正在运行这样的服务:

int pgsService::startService(int sockfd){
    listen(sockfd,5);
    int c = accept(sockfd, (struct sockaddr *)&cli_addr,&clilen);
    clients.push_back(std::make_pair(sockfd,cli_addr));
    std::cout << "Accepted:" << c << "\tIP:" << inet_ntoa(cli_addr.sin_addr) << std::endl;
    return c;
}

构造

pgsService::pgsService(int *fd,int port) {
    bzero((char *) &serv_addr, sizeof(serv_addr));
    *fd = socket(AF_INET,SOCK_STREAM,0);
    assert(*fd>0);
    serv_addr.sin_family = AF_INET;
    serv_addr.sin_addr.s_addr = INADDR_ANY;
    serv_addr.sin_port=htons(port);
    bind(*fd, (struct sockaddr *) &serv_addr, sizeof(serv_addr));
    clilen = sizeof(cli_addr);
}

私人成员:

private:
        struct sockaddr_in serv_addr, cli_addr;
        int sfd;
        socklen_t clilen;
        std::vector<std::pair<int, struct sockaddr_in> > clients;
};

CompareFirst struct:

struct CompareFirst
{
  CompareFirst(int val) : val_(val) {}
  bool operator()(const std::pair<int,struct sockaddr_in>& elem) const {
    return val_ == elem.first;
  }
  private:
    int val_;
};

启动绑定本地端口的服务实例。 这个端口将用于.NET客户端应用程序中的类似聊天的服务,但服务器端将用C ++完成所有操作。

所以,在pgsService server = pgsService(&sockfd,port);之后,我致电int client = server.startService(sockfd); 如上所述。 构造函数仅在将结构等设置为套接字服务器时绑定。 有连接时: 仅测试代码

write(client,hello.c_str(),hello.length());
void *buf = malloc(512);
memset(buf,0,512);
read(client,buf,512);
std::cout << "From:" << inet_ntoa(server.getClientInfo(client).sin_addr) << ":"<< server.getClientInfo(client).sin_port << "\t - " << (char*)buf << std::endl;
free(buf);
shutdown(client,2);
exit(0);

输出如下:

$ ./pgs_service
Accepted:4      IP:127.0.0.1
GETING:0.0.0.0
GETING:0.0.0.0
From:0.0.0.0:0   - LOL

我试图将客户端数据信息保存在向量中:

clients.push_back(std::make_pair(sockfd,cli_addr));

getClientInfo方法是:

struct sockaddr_in pgsService:: getClientInfo(int client){
    std::vector< std::pair <int, struct sockaddr_in> >::iterator it = std::find_if(clients.begin(),clients.end(),CompareFirst(client));
    std::cout << "GETING:" << inet_ntoa(it->second.sin_addr) << std::endl;
    return (it->second);
}

所以我存储在客户端向量中,该向量接受另一个类型为std :: pair的对象。 我进入堆栈,当我需要获取结构时,我只需调用getClientInfo并找到使用find_if。 问题是我认为返回值不是实际的结构,因为它有时返回一些整数,如:83.0.0.0然后是0.0.0.0然后是30.0.0.0。似乎我访问的内存区域我不应该这样,幸运的是程序没有崩溃。

我做错了什么?哪里?我认为这是我推入向量的方式或我收回数据的方式。

解决方案:当我推送时,我会制作&#34; make_pair&#34;与sockfd,我不应该。我必须推动&#39;

1 个答案:

答案 0 :(得分:1)

我在这里假设了很多东西。

  1. 你已经在某处定义了CompareFirst。
  2. 在后续通话之间 至startService我假设您正在设置cli_addr0
  3. 在制作一对后填充向量方面,我没有看到你使用vector和std :: pair构造的根本错误。然而,诀窍可能是确保语义正确性。在接受返回后,您能否检查cli_addr是否在事实上正确填充?

    另外,在你的情况c中,你不应该推送接受返回的fd,而不是推送服务器fd吗? IMO,一种更好的方法来完成你正在做的是使用关联数据结构,如地图或无序地图。此外,为了更好的设计,您应该评估select等机制来处理i / o,因为accept调用基本上会阻止。

    另一个问题是没有检查find_if的返回值。您应该始终将迭代器与clients.end()进行比较,以确保它是有效的迭代器。

    希望这有帮助。