- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
我正在尝试进行压力测试,以防攻击者尝试一次尝试大量 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/
我有一个用 C++ 编写的游戏服务器,我正在使用一个网络库在 Windows 中使用 winsock。我一直在对我的服务器进行压力测试,看看它一次可以接受多少个连接。当我使用我的游戏客户端连接时它工作
我正在尝试进行压力测试,以防攻击者尝试一次尝试大量 TCP 连接到我的 C++ 游戏服务器。 我做了一个简单的程序,通过 TCP 端口连接 1000 次到我的游戏服务器。这是我的服务器接受连接的地方:
我是一名优秀的程序员,十分优秀!