Files
ROSS/Src/Common/SocketBase.cpp
T
92thmsandClaude Sonnet 5 1f626c6b93 Fix DB warning and a client-connection-blocking accept() busy-loop
- runtime.sql: widen starttime to varchar(32). ctime() produces 25 chars;
  MariaDB's default strict mode rejects the 20-char column instead of
  silently truncating like the original MySQL 5.0 target did.

- SocketServer.cpp/SocketBase.cpp: the accept-loop's select() used `maxfd`
  set only from `sock`, never updated for the ISC sockets (sckISC/sckISCII).
  Any fd beyond nfds is left however FD_SET last set it, since select()
  never examines it -- so those bits stayed permanently "set", and the
  server treated them as always-ready.  For the login server specifically
  this was fatal: its sckISC is created but never listen()'d (the login
  server has no inbound ISC use), so accept() on it returned EINVAL on
  every single loop iteration, spinning the login server's CPU and
  spamming the log without ever getting to the real client-facing accept()
  in a timely way. Root-caused with a real client connecting for the first
  time (this path was never exercised end-to-end before). Fixed by
  including the ISC sockets in maxfd and skipping the ISC accept branch
  entirely for the login server. Also initialize sckISC/sckISCII to
  INVALID_SOCKET in the constructor -- they were previously left
  uninitialized for server types that never touch them.

- tools/rose_login_test.cpp: protocol-level login smoke test. Links
  directly against Src/Common/rosecrypt.cpp (the server's own encryption
  code) rather than reimplementing the crypto, so there's no risk of a
  second, subtly-wrong implementation. Documents the wire handshake
  (0x703 encryption request -> 0x7FF -> 0x708 login, password[32]+username[16]
  payload) for future reference.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-07-08 07:12:52 +00:00

69 lines
1.6 KiB
C++

/*
Rose Online Server Emulator
Copyright (C) 2006,2007 OSRose Team http://osroseon.to.md
This program is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License
as published by the Free Software Foundation; either version 2
of the License, or (at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
depeloped with Main erose/hrose source server + some change from the original eich source
*/
#include "sockets.h"
// Constructor
CBaseSocket::CBaseSocket( )
{
sock = INVALID_SOCKET;
sckISC = INVALID_SOCKET;
sckISCII = INVALID_SOCKET;
isActive = false;
}
// Destructor
CBaseSocket::~CBaseSocket( )
{
}
// Close all open sockets
void CBaseSocket::CloseSocket( void )
{
// Leave function, if socket isn't active
if ( !isActive ) return;
// Close socket
close( sock );
sock = INVALID_SOCKET;
isActive = false;
}
// Init winsocket, if we are using Windows
bool InitWinSocket ( void )
{
#ifdef _WIN32
WSADATA wsa;
return (WSAStartup(MAKEWORD(2,0),&wsa)==0);
#else
return true;
#endif
}
// Close winsocket, if we are using Windows
void CloseWinSocket( void )
{
#ifdef _WIN32
WSACleanup( );
#endif
}