gpt4 book ai didi

c++ - (WINSOCK) C++ 游戏服务器 : Too many TCP connections at once on TCPAccept

转载 作者:可可西里 更新时间:2023-11-01 02:54:19 25 4
gpt4 key购买 nike

我正在尝试进行压力测试,以防攻击者尝试一次尝试大量 TCP 连接到我的 C++ 游戏服务器。

我做了一个简单的程序,通过 TCP 端口连接 1000 次到我的游戏服务器。这是我的服务器接受连接的地方:

bool serverIsOn = true;
double listen = tcplisten(12345, 30000, 1);
setnagle(listen, true);

...

while(serverIsOn){
double playerSocket = tcpaccept(listen, 1);
if(playerSocket > -1){
cout << "Got a new connection, socket ID: " << playerSocket << endl;

std::string ip = tcpip(playerSocket);
if(ipIsBanned(ip))
closesocket(playerSocket);
}
}

这里是 tcplisten 和 tcpaccept 的定义:

double tcplisten(double port, double max, double mode)
{
CSocket* sock = new CSocket();
if(sock->tcplisten((int)port, (int)max,(int)mode))
return AddSocket(sock);
delete sock;
return -1;
}

double tcpaccept(double sockid, double mode)
{
CSocket*sock = (CSocket*)sockets.item((int)sockid);
if(sock == NULL)return -1;
CSocket*sock2 = sock->tcpaccept((int)mode);
if(sock2 != NULL)return AddSocket(sock2);
return -1;
}

问题: 在我的测试程序结束后服务器停止接受连接。例如,如果我在我的游戏上连接(它只请求一个连接而不是对于我的请求 1000 个连接的测试攻击程序),游戏甚至无法连接。我也不再通过服务器上的控制台输出看到任何连接。最后建立的连接来自攻击程序。就好像它不能再接受了,有些东西崩溃了,但我不知道是什么,没有异常或错误。

这对我的服务器来说是个大问题,因为任何人都可以轻松地让服务器崩溃并强制它必须重新启动才能再次开始接受新连接。

我能做些什么来解决这个问题?我的意思是我什至尝试将一次最大连接数设置为 30,000,但这没有用。即使它确实有效,有人也可以尝试连接超过 30,000 次而使其无用。

编辑:

上面tcplisten和tcpaccept函数更深入的定义:

bool CSocket::tcplisten(int port, int max, int mode)
{
if((sockid = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP)) == INVALID_SOCKET) return false;
SOCKADDR_IN addr;
addr.sin_family = AF_INET;
addr.sin_addr.s_addr = INADDR_ANY;
addr.sin_port = htons(port);
if(mode)setsync(1);
if(bind(sockid, (LPSOCKADDR)&addr, sizeof(SOCKADDR_IN)) == SOCKET_ERROR)
{
closesocket(sockid);
return false;
}
if(listen(sockid, max) == SOCKET_ERROR)
{
closesocket(sockid);
//TEMP ADD
sockid = INVALID_SOCKET;
return false;
}
return true;
}


CSocket* CSocket::tcpaccept(int mode)
{
//TEMP REMOVE: if(sockid<0)return NULL;
if(sockid == INVALID_SOCKET) return NULL;
SOCKET sock2;
if((sock2 = accept(sockid, (SOCKADDR *)&SenderAddr, &SenderAddrSize)) != INVALID_SOCKET)
{
CSocket*sockit = new CSocket(sock2);
if(mode >=1)sockit->setsync(1);
return sockit;
}

return NULL;
}

编辑 2:下面是 AddSocket 的定义:

int AddSocket(CSocket*b)
{
for(int i = 0; i < sockets.count; i ++)
{
if(sockets[i] == NULL)
{
sockets.set(i, b);
return i;
}
}
sockets.Add(b);
return sockets.count-1;
}

最佳答案

如果您使用的是 Linux,则可以使用 tcp_tw_reuse系统控制。

关于c++ - (WINSOCK) C++ 游戏服务器 : Too many TCP connections at once on TCPAccept,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30406151/

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