解决即可。见下文 我正在运行这样的服务:
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;
。答案 0 :(得分:1)
我在这里假设了很多东西。
startService
我假设您正在设置cli_addr
至0
。在制作一对后填充向量方面,我没有看到你使用vector和std :: pair构造的根本错误。然而,诀窍可能是确保语义正确性。在接受返回后,您能否检查cli_addr
是否在事实上正确填充?
另外,在你的情况c
中,你不应该推送接受返回的fd,而不是推送服务器fd吗? IMO,一种更好的方法来完成你正在做的是使用关联数据结构,如地图或无序地图。此外,为了更好的设计,您应该评估select
等机制来处理i / o,因为accept
调用基本上会阻止。
另一个问题是没有检查find_if的返回值。您应该始终将迭代器与clients.end()进行比较,以确保它是有效的迭代器。
希望这有帮助。