【发布时间】:2016-04-04 15:19:27
【问题描述】:
已解决。见下文 我正在运行这样的服务:
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 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 。似乎我正在访问我不应该访问的内存区域,幸运的是程序没有崩溃。
我做错了什么?在哪里?我认为这是我推入向量的方式或我获取数据的方式。
解决方案:当我 push_back 时,我用 sockfd 制作“make_pair”,但我不应该这样做。我必须按“c”。
【问题讨论】:
-
cli_addr 在哪里初始化?
-
在构造函数中。将编辑问题。
-
您编辑的帖子仍未初始化或声明 cli_addr。我假设您正在其他地方这样做。
-
你是说在课堂上?第二次编辑...