@@ -1220,9 +1220,10 @@ bool CConnman::AttemptToEvictConnection()
1220
1220
void CConnman::AcceptConnection (const ListenSocket& hListenSocket, CMasternodeSync& mn_sync) {
1221
1221
struct sockaddr_storage sockaddr;
1222
1222
socklen_t len = sizeof (sockaddr);
1223
- SOCKET hSocket = accept ( hListenSocket.socket , (struct sockaddr *)&sockaddr, &len);
1223
+ auto sock = hListenSocket.sock -> Accept ( (struct sockaddr *)&sockaddr, &len);
1224
1224
CAddress addr;
1225
- if (hSocket == INVALID_SOCKET) {
1225
+
1226
+ if (!sock) {
1226
1227
const int nErr = WSAGetLastError ();
1227
1228
if (nErr != WSAEWOULDBLOCK) {
1228
1229
LogPrintf (" socket error accept failed: %s\n " , NetworkErrorString (nErr));
@@ -1236,15 +1237,15 @@ void CConnman::AcceptConnection(const ListenSocket& hListenSocket, CMasternodeSy
1236
1237
addr = CAddress{MaybeFlipIPv6toCJDNS (addr), NODE_NONE};
1237
1238
}
1238
1239
1239
- const CAddress addr_bind{MaybeFlipIPv6toCJDNS (GetBindAddress (hSocket )), NODE_NONE};
1240
+ const CAddress addr_bind{MaybeFlipIPv6toCJDNS (GetBindAddress (sock-> Get () )), NODE_NONE};
1240
1241
1241
1242
NetPermissionFlags permissionFlags = NetPermissionFlags::None;
1242
1243
hListenSocket.AddSocketPermissionFlags (permissionFlags);
1243
1244
1244
- CreateNodeFromAcceptedSocket (hSocket , permissionFlags, addr_bind, addr, mn_sync);
1245
+ CreateNodeFromAcceptedSocket (std::move (sock) , permissionFlags, addr_bind, addr, mn_sync);
1245
1246
}
1246
1247
1247
- void CConnman::CreateNodeFromAcceptedSocket (SOCKET hSocket ,
1248
+ void CConnman::CreateNodeFromAcceptedSocket (std::unique_ptr<Sock>&& sock ,
1248
1249
NetPermissionFlags permissionFlags,
1249
1250
const CAddress& addr_bind,
1250
1251
const CAddress& addr,
@@ -1287,27 +1288,24 @@ void CConnman::CreateNodeFromAcceptedSocket(SOCKET hSocket,
1287
1288
1288
1289
if (!fNetworkActive ) {
1289
1290
LogPrint (BCLog::NET_NETCONN, " %s: not accepting new connections\n " , strDropped);
1290
- CloseSocket (hSocket);
1291
1291
return ;
1292
1292
}
1293
1293
1294
- if (!IsSelectableSocket (hSocket ))
1294
+ if (!IsSelectableSocket (sock-> Get () ))
1295
1295
{
1296
1296
LogPrintf (" %s: non-selectable socket\n " , strDropped);
1297
- CloseSocket (hSocket);
1298
1297
return ;
1299
1298
}
1300
1299
1301
1300
// According to the internet TCP_NODELAY is not carried into accepted sockets
1302
1301
// on all platforms. Set it again here just to be sure.
1303
- SetSocketNoDelay (hSocket );
1302
+ SetSocketNoDelay (sock-> Get () );
1304
1303
1305
1304
// Don't accept connections from banned peers.
1306
1305
bool banned = m_banman && m_banman->IsBanned (addr);
1307
1306
if (!NetPermissions::HasFlag (permissionFlags, NetPermissionFlags::NoBan) && banned)
1308
1307
{
1309
1308
LogPrint (BCLog::NET, " %s (banned)\n " , strDropped);
1310
- CloseSocket (hSocket);
1311
1309
return ;
1312
1310
}
1313
1311
@@ -1316,7 +1314,6 @@ void CConnman::CreateNodeFromAcceptedSocket(SOCKET hSocket,
1316
1314
if (!NetPermissions::HasFlag (permissionFlags, NetPermissionFlags::NoBan) && nInbound + 1 >= nMaxInbound && discouraged)
1317
1315
{
1318
1316
LogPrint (BCLog::NET, " connection from %s dropped (discouraged)\n " , addr.ToString ());
1319
- CloseSocket (hSocket);
1320
1317
return ;
1321
1318
}
1322
1319
@@ -1330,7 +1327,6 @@ void CConnman::CreateNodeFromAcceptedSocket(SOCKET hSocket,
1330
1327
if (!AttemptToEvictConnection ()) {
1331
1328
// No connection to evict, disconnect the new connection
1332
1329
LogPrint (BCLog::NET, " failed to find an eviction candidate - connection dropped (full)\n " );
1333
- CloseSocket (hSocket);
1334
1330
return ;
1335
1331
}
1336
1332
nInbound--;
@@ -1339,7 +1335,6 @@ void CConnman::CreateNodeFromAcceptedSocket(SOCKET hSocket,
1339
1335
// don't accept incoming connections until blockchain is synced
1340
1336
if (fMasternodeMode && !mn_sync.IsBlockchainSynced ()) {
1341
1337
LogPrint (BCLog::NET, " AcceptConnection -- blockchain is not synced yet, skipping inbound connection attempt\n " );
1342
- CloseSocket (hSocket);
1343
1338
return ;
1344
1339
}
1345
1340
@@ -1352,7 +1347,7 @@ void CConnman::CreateNodeFromAcceptedSocket(SOCKET hSocket,
1352
1347
}
1353
1348
1354
1349
const bool inbound_onion = std::find (m_onion_binds.begin (), m_onion_binds.end (), addr_bind) != m_onion_binds.end ();
1355
- CNode* pnode = new CNode (id, nodeServices, hSocket , addr, CalculateKeyedNetGroup (addr), nonce, addr_bind, " " , ConnectionType::INBOUND, inbound_onion);
1350
+ CNode* pnode = new CNode (id, nodeServices, sock-> Release () , addr, CalculateKeyedNetGroup (addr), nonce, addr_bind, " " , ConnectionType::INBOUND, inbound_onion);
1356
1351
pnode->AddRef ();
1357
1352
pnode->m_permissionFlags = permissionFlags;
1358
1353
// If this flag is present, the user probably expect that RPC and QT report it as whitelisted (backward compatibility)
@@ -1361,17 +1356,19 @@ void CConnman::CreateNodeFromAcceptedSocket(SOCKET hSocket,
1361
1356
m_msgproc->InitializeNode (pnode);
1362
1357
1363
1358
if (fLogIPs ) {
1364
- LogPrint (BCLog::NET_NETCONN, " connection from %s accepted, sock=%d, peer=%d\n " , addr.ToString (), hSocket , pnode->GetId ());
1359
+ LogPrint (BCLog::NET_NETCONN, " connection from %s accepted, sock=%d, peer=%d\n " , addr.ToString (), sock-> Get () , pnode->GetId ());
1365
1360
} else {
1366
- LogPrint (BCLog::NET_NETCONN, " connection accepted, sock=%d, peer=%d\n " , hSocket , pnode->GetId ());
1361
+ LogPrint (BCLog::NET_NETCONN, " connection accepted, sock=%d, peer=%d\n " , sock-> Get () , pnode->GetId ());
1367
1362
}
1368
1363
1369
1364
{
1370
1365
LOCK (m_nodes_mutex);
1371
1366
m_nodes.push_back (pnode);
1372
- WITH_LOCK (cs_mapSocketToNode, mapSocketToNode.emplace (hSocket, pnode));
1367
+ }
1368
+ {
1369
+ LOCK (pnode->cs_hSocket );
1370
+ WITH_LOCK (cs_mapSocketToNode, mapSocketToNode.emplace (pnode->hSocket , pnode));
1373
1371
if (m_edge_trig_events) {
1374
- LOCK (pnode->cs_hSocket );
1375
1372
if (!m_edge_trig_events->RegisterEvents (pnode->hSocket )) {
1376
1373
LogPrint (BCLog::NET, " EdgeTriggeredEvents::RegisterEvents() failed\n " );
1377
1374
}
@@ -1656,7 +1653,7 @@ bool CConnman::GenerateSelectSet(const std::vector<CNode*>& nodes,
1656
1653
std::set<SOCKET>& error_set)
1657
1654
{
1658
1655
for (const ListenSocket& hListenSocket : vhListenSocket) {
1659
- recv_set.insert (hListenSocket.socket );
1656
+ recv_set.insert (hListenSocket.sock -> Get () );
1660
1657
}
1661
1658
1662
1659
for (CNode* pnode : nodes)
@@ -2128,7 +2125,7 @@ void CConnman::SocketHandlerListening(const std::set<SOCKET>& recv_set, CMastern
2128
2125
if (interruptNet) {
2129
2126
return ;
2130
2127
}
2131
- if (recv_set.count (listen_socket.socket ) > 0 ) {
2128
+ if (recv_set.count (listen_socket.sock -> Get () ) > 0 ) {
2132
2129
AcceptConnection (listen_socket, mn_sync);
2133
2130
}
2134
2131
}
@@ -3168,7 +3165,7 @@ void CConnman::ThreadI2PAcceptIncoming(CMasternodeSync& mn_sync)
3168
3165
continue ;
3169
3166
}
3170
3167
3171
- CreateNodeFromAcceptedSocket (conn.sock -> Release ( ), NetPermissionFlags::None,
3168
+ CreateNodeFromAcceptedSocket (std::move ( conn.sock ), NetPermissionFlags::None,
3172
3169
CAddress{conn.me , NODE_NONE}, CAddress{conn.peer , NODE_NONE}, mn_sync);
3173
3170
}
3174
3171
}
@@ -3235,7 +3232,7 @@ bool CConnman::BindListenPort(const CService& addrBind, bilingual_str& strError,
3235
3232
return false ;
3236
3233
}
3237
3234
3238
- vhListenSocket.push_back ( ListenSocket (sock-> Release ( ), permissions) );
3235
+ vhListenSocket.emplace_back ( std::move (sock), permissions);
3239
3236
3240
3237
return true ;
3241
3238
}
@@ -3582,12 +3579,10 @@ void CConnman::StopNodes()
3582
3579
pnode->CloseSocketDisconnect (this );
3583
3580
}
3584
3581
for (ListenSocket& hListenSocket : vhListenSocket) {
3585
- if (hListenSocket.socket != INVALID_SOCKET) {
3586
- if (m_edge_trig_events && !m_edge_trig_events->RemoveSocket (hListenSocket.socket )) {
3582
+ if (hListenSocket.sock -> Get () != INVALID_SOCKET) {
3583
+ if (m_edge_trig_events && !m_edge_trig_events->RemoveSocket (hListenSocket.sock -> Get () )) {
3587
3584
LogPrintf (" EdgeTriggeredEvents::RemoveSocket() failed\n " );
3588
3585
}
3589
- if (!CloseSocket (hListenSocket.socket ))
3590
- LogPrintf (" CloseSocket(hListenSocket) failed with error %s\n " , NetworkErrorString (WSAGetLastError ()));
3591
3586
}
3592
3587
}
3593
3588
0 commit comments