gpt4 book ai didi

c++ - 服务多个客户端 : accept() socket call in a loop to accept incoming connections

转载 作者:太空宇宙 更新时间:2023-11-04 11:05:46 29 4
gpt4 key购买 nike

这是我的代码:

void error(const char *msg)
{
perror(msg);
exit(1);
}

void sServer::acceptClientConnections(int listenerSocket)
{
struct sockaddr clientAddress;
socklen_t sizeOfClientAddress = sizeof(clientAddress);

while (true)
{
int newConnection = accept(listenerSocket, &clientAddress, &sizeOfClientAddress);
std::cout << "Someone connected ... " <<std::endl;
liveConnections.push_back(newConnection);
}
}

int sServer::getServerListenerSocket()
{
return serverListenerSocket;
}

sServer::sServer(int port)
{
int serverListenerSocket;
struct sockaddr_in serv_addr;

serverListenerSocket = socket(AF_INET, SOCK_STREAM, 0);
if (serverListenerSocket < 0)
error("ERROR opening a socket. Cannot start sever. Exiting ...");

memset((char *) &serv_addr, 0, sizeof(serv_addr));

serv_addr.sin_family = AF_INET;
serv_addr.sin_addr.s_addr = INADDR_ANY;
serv_addr.sin_port = htons(port);

std::cout << "Host ip: " << serv_addr.sin_addr.s_addr << "\n";

if ( bind(serverListenerSocket, (struct sockaddr *) &serv_addr, sizeof(serv_addr)) < 0 )
error("ERROR on binding server socket. Are you running another instance of this server ?");

listen(serverListenerSocket, 45);
}

这样调用:

int main()
{
sServer superServer(9889);
std::thread handleConnections( &sServer::acceptClientConnections, superServer, superServer.getServerListenerSocket() );
}

我原以为 accept 会等待传入的连接,并在有连接时激活。

但是相反,当我运行该程序时,即使没有建立任何连接,它也会不断打印“有人连接...”。

具有讽刺意味的是,如果我在构造函数的末尾启动线程,它运行良好。

您能否解释为什么会发生这种情况以及接受连接的正确方法是什么?

最佳答案

现在我们已经确定了错误,问题出在构造函数中的局部变量:

sServer::sServer(int port)
{
int serverListenerSocket;

只需删除它。它正在隐藏同名的类成员,所以后者永远不会被设置,所以 accept() 正在获取 EBADF, 返回 -1,从不显示已接受的连接, 抽 CPU 等

当您在构造函数中启动线程时它起作用的原因是局部变量仍在范围内。

关于c++ - 服务多个客户端 : accept() socket call in a loop to accept incoming connections,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25349197/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com