В настоящее время я пытаюсь добавить некоторые функциональные возможности в базовое серверное приложение, вводя DLL и отключая несколько функций, и у меня возникает проблема с повреждением сохраненного IP-адреса между двумя вызовами.
Сначала я обхожу «принять» и анализирую некоторые значения, затем вводю их в класс соединения и добавляю его в список.
Принять функцию объезда:
std::list<Connection*> ConnectionsList;
SOCKET WINAPI MyAccept(SOCKET s, sockaddr *addr, int *addrlen)
{
...
ConnectionsList.push_back(new Connection(ClientSocket, ipstr));
...
}
класс подключения:
SOCKET s;
char * ipAddress;
char * playerName;
Connection::Connection(SOCKET sock, char * address)
{
s = sock;
ipAddress = address;
}
Я также удалил ‘closesocket’, после чего я хотел бы удалить сокет из списка соединений. Если я остановлюсь на этой функции, то IP-адрес будет поврежден.
Кто-нибудь знает, почему это происходит?
ipAddress = address;
будет просто скопировать указатель. Если что-то изменит то, на что оно указывает, у вас будут проблемы.
Так как это C ++, может быть безопаснее использовать std::string
,
std::string ipAdreess;
...
ipAddress = address;
Иначе, stdcpy
в буфер достаточно большой.
Кстати, что удаляет все Connection*
из списка?
попытаться защитить свой ConnectionList
и т.д. статическая / глобальная переменная с блокировкой.