- 31EB2CBDF4F83F10AE8A7CDD3A69312BA6EAFBECFAFBEDDF7546CE99847BD4F2A674037E2B89A0A7B91C37127D9770501C265A7977EDB0AE0B3A5964272692F9
+ F2413EBC07B49F7A4CB96E4AE82BCA531B78E4AFE6B2C93BE4E00A9C89813CFBB62B0F255DDE13EE6E59F883936AFC2640B139E49EA7A766868CDB9EDC2CD3DB
bitcoin/src/net.cpp
(111 . 33)(111 . 33)
1466 int nRet = select(hSocket + 1, NULL, &fdset, NULL, &timeout);
1467 if (nRet == 0)
1468 {
1469 printf("connection timeout\n");
1470 printf(SERR SNET "connection timeout\n");
1471 closesocket(hSocket);
1472 return false;
1473 }
1474 if (nRet == SOCKET_ERROR)
1475 {
1476 printf("select() for connection failed: %i\n",WSAGetLastError());
1477 printf(SERR SNET "select connection failed: %i\n", WSAGetLastError());
1478 closesocket(hSocket);
1479 return false;
1480 }
1481 socklen_t nRetSize = sizeof(nRet);
1482 if (getsockopt(hSocket, SOL_SOCKET, SO_ERROR, &nRet, &nRetSize) == SOCKET_ERROR)
1483 {
1484 printf("getsockopt() for connection failed: %i\n",WSAGetLastError());
1485 printf(SERR SNET "getsockopt for connection failed: %i\n", WSAGetLastError());
1486 closesocket(hSocket);
1487 return false;
1488 }
1489 if (nRet != 0)
1490 {
1491 printf("connect() failed after select(): %s\n",strerror(nRet));
1492 printf(SERR SNET "connect failed after select: %s\n", strerror(nRet));
1493 closesocket(hSocket);
1494 return false;
1495 }
1496 }
1497 else
1498 {
1499 printf("connect() failed: %i\n",WSAGetLastError());
1500 printf(SERR SNET "connect failed: %i\n", WSAGetLastError());
1501 closesocket(hSocket);
1502 return false;
1503 }
(157 . 7)(157 . 7)
1505
1506 if (fProxy)
1507 {
1508 printf("proxy connecting %s\n", addrConnect.ToString().c_str());
1509 printf(SWAR SNET "connecting through proxy to %s\n", addrConnect.ToString().c_str());
1510 char pszSocks4IP[] = "\4\1\0\0\0\0\0\0user";
1511 memcpy(pszSocks4IP + 2, &addrConnect.port, 2);
1512 memcpy(pszSocks4IP + 4, &addrConnect.ip, 4);
(168 . 22)(168 . 24)
1514 if (ret != nSize)
1515 {
1516 closesocket(hSocket);
1517 return error("Error sending to proxy");
1518 return error(SNET "couldn't send message over proxy address %s",
1519 addrConnect.ToString().c_str());
1520 }
1521 char pchRet[8];
1522 if (recv(hSocket, pchRet, 8, 0) != 8)
1523 {
1524 closesocket(hSocket);
1525 return error("Error reading proxy response");
1526 return error(SNET "couldn't read response over proxy address %s",
1527 addrConnect.ToString().c_str());
1528 }
1529 if (pchRet[1] != 0x5a)
1530 {
1531 closesocket(hSocket);
1532 if (pchRet[1] != 0x5b)
1533 printf("ERROR: Proxy returned error %d\n", pchRet[1]);
1534 printf(SERR SNET "proxy returned error %d\n", pchRet[1]);
1535 return false;
1536 }
1537 printf("proxy connected %s\n", addrConnect.ToString().c_str());
1538 printf(SWAR SNET "connected through proxy to %s\n", addrConnect.ToString().c_str());
1539 }
1540
1541 hSocketRet = hSocket;
(260 . 7)(262 . 7)
1543 if (it == mapAddresses.end())
1544 {
1545 // New address
1546 printf("AddAddress(%s)\n", addr.ToString().c_str());
1547 printf(SINF SADR "adding %s\n", addr.ToString().c_str());
1548 mapAddresses.insert(make_pair(addr.GetKey(), addr));
1549 fUpdated = true;
1550 fNew = true;
(469 . 7)(471 . 7)
1552 }
1553
1554 /// debug print
1555 printf("trying connection %s lastseen=%.1fhrs lasttry=%.1fhrs\n",
1556 printf(SINF SNET "trying to connect to %s\n",
1557 addrConnect.ToString().c_str(),
1558 (double)(addrConnect.nTime - GetAdjustedTime())/3600.0,
1559 (double)(addrConnect.nLastTry - GetAdjustedTime())/3600.0);
(482 . 11)(484 . 11)
1561 if (ConnectSocket(addrConnect, hSocket))
1562 {
1563 /// debug print
1564 printf("connected %s\n", addrConnect.ToString().c_str());
1565 printf(SINF SNET "connected to %s\n", addrConnect.ToString().c_str());
1566
1567 // Set to nonblocking
1568 if (fcntl(hSocket, F_SETFL, O_NONBLOCK) == SOCKET_ERROR)
1569 printf("ConnectSocket() : fcntl nonblocking setting failed, error %d\n", errno);
1570 printf(SERR SNET "socket fcntl nonblocking setting failed, error %d\n", errno);
1571
1572 // Add node
1573 CNode* pnode = new CNode(hSocket, addrConnect, false);
(511 . 9)(513 . 7)
1575 fDisconnect = true;
1576 if (hSocket != INVALID_SOCKET)
1577 {
1578 if (fDebug)
1579 printf("%s ", DateTimeStrFormat("%x %H:%M:%S", GetTime()).c_str());
1580 printf("disconnecting node %s\n", addr.ToString().c_str());
1581 printf(SWAR SNET "disconnecting from node %s\n", addr.ToString().c_str());
1582 closesocket(hSocket);
1583 hSocket = INVALID_SOCKET;
1584 }
(559 . 7)(559 . 7)
1586 {
1587 if (addr.IsLocal())
1588 {
1589 printf("Warning: local node %s misbehaving\n", addr.ToString().c_str());
1590 printf(SWAR SNET "local node %s is misbehaving\n", addr.ToString().c_str());
1591 return false;
1592 }
1593
(604 . 12)(604 . 12)
1595 vnThreadsRunning[0]--;
1596 throw; // support pthread_cancel()
1597 }
1598 printf("ThreadSocketHandler exiting\n");
1599 printf(SWAR SNET "socket handling thread exiting\n");
1600 }
1601
1602 void ThreadSocketHandler2(void* parg)
1603 {
1604 printf("ThreadSocketHandler started\n");
1605 printf(SINF SNET "socket handling thread started\n");
1606 list<CNode*> vNodesDisconnected;
1607 int nPrevNodeCount = 0;
1608
(713 . 7)(713 . 7)
1610 int nErr = WSAGetLastError();
1611 if (hSocketMax > -1)
1612 {
1613 printf("socket select error %d\n", nErr);
1614 printf(SERR SNET "socket select error %d\n", nErr);
1615 for (int i = 0; i <= hSocketMax; i++)
1616 FD_SET(i, &fdsetRecv);
1617 }
(745 . 7)(745 . 7)
1619 if (hSocket == INVALID_SOCKET)
1620 {
1621 if (WSAGetLastError() != WSAEWOULDBLOCK)
1622 printf("socket error accept failed: %d\n", WSAGetLastError());
1623 printf(SERR SNET "socket error accept failed: %d\n", WSAGetLastError());
1624 }
1625 else if (nInbound >= GetArg("-maxconnections", 125) - MAX_OUTBOUND_CONNECTIONS)
1626 {
(753 . 12)(753 . 12)
1628 }
1629 else if (CNode::IsBanned(addr.ip))
1630 {
1631 printf("connection from %s dropped (banned)\n", addr.ToString().c_str());
1632 printf(SWAR SNET "connection from %s dropped. (banned)\n", addr.ToString().c_str());
1633 closesocket(hSocket);
1634 }
1635 else
1636 {
1637 printf("accepted connection %s\n", addr.ToString().c_str());
1638 printf(SINF SNET "accepted connection to %s\n", addr.ToString().c_str());
1639 CNode* pnode = new CNode(hSocket, addr, true);
1640 pnode->AddRef();
1641 CRITICAL_BLOCK(cs_vNodes)
(796 . 7)(796 . 7)
1643
1644 if (nPos > ReceiveBufferSize()) {
1645 if (!pnode->fDisconnect)
1646 printf("socket recv flood control disconnect (%d bytes)\n", vRecv.size());
1647 printf(SWAR SNET "socket received flood, disconnecting. (%d bytes)\n", vRecv.size());
1648 pnode->CloseSocketDisconnect();
1649 }
1650 else {
(813 . 7)(813 . 7)
1652 {
1653 // socket closed gracefully
1654 if (!pnode->fDisconnect)
1655 printf("socket closed\n");
1656 printf(SWAR SNET "socket closed\n");
1657 pnode->CloseSocketDisconnect();
1658 }
1659 else if (nBytes < 0)
(823 . 7)(823 . 7)
1661 if (nErr != WSAEWOULDBLOCK && nErr != WSAEMSGSIZE && nErr != WSAEINTR && nErr != WSAEINPROGRESS)
1662 {
1663 if (!pnode->fDisconnect)
1664 printf("socket recv error %d\n", nErr);
1665 printf(SERR SNET "socket received error %d\n", nErr);
1666 pnode->CloseSocketDisconnect();
1667 }
1668 }
(855 . 13)(855 . 13)
1670 int nErr = WSAGetLastError();
1671 if (nErr != WSAEWOULDBLOCK && nErr != WSAEMSGSIZE && nErr != WSAEINTR && nErr != WSAEINPROGRESS)
1672 {
1673 printf("socket send error %d\n", nErr);
1674 printf(SERR SNET "socket send error %d\n", nErr);
1675 pnode->CloseSocketDisconnect();
1676 }
1677 }
1678 if (vSend.size() > SendBufferSize()) {
1679 if (!pnode->fDisconnect)
1680 printf("socket send flood control disconnect (%d bytes)\n", vSend.size());
1681 printf(SWAR SNET "socket send flood, disconnecting. (%d bytes)\n", vSend.size());
1682 pnode->CloseSocketDisconnect();
1683 }
1684 }
(877 . 17)(877 . 17)
1686 {
1687 if (pnode->nLastRecv == 0 || pnode->nLastSend == 0)
1688 {
1689 printf("socket no message in first 60 seconds, %d %d\n", pnode->nLastRecv != 0, pnode->nLastSend != 0);
1690 printf(SWAR SNET "socket received no message in first 60 seconds, disconnecting\n");
1691 pnode->fDisconnect = true;
1692 }
1693 else if (GetTime() - pnode->nLastSend > 90*60 && GetTime() - pnode->nLastSendEmpty > 90*60)
1694 {
1695 printf("socket not sending\n");
1696 printf(SWAR SNET "socket not sending, disconnecting\n");
1697 pnode->fDisconnect = true;
1698 }
1699 else if (GetTime() - pnode->nLastRecv > 90*60)
1700 {
1701 printf("socket inactivity timeout\n");
1702 printf(SWAR SNET "socket inactivity timeout, disconnecting\n");
1703 pnode->fDisconnect = true;
1704 }
1705 }
(919 . 12)(919 . 12)
1707 vnThreadsRunning[1]--;
1708 PrintException(NULL, "ThreadOpenConnections()");
1709 }
1710 printf("ThreadOpenConnections exiting\n");
1711 printf(SWAR SNET "connection opening thread exiting\n");
1712 }
1713
1714 void ThreadOpenConnections2(void* parg)
1715 {
1716 printf("ThreadOpenConnections started\n");
1717 printf(SINF SNET "connection opening thread started\n");
1718
1719 // Connect to specific addresses
1720 if (mapArgs.count("-connect"))
(1107 . 12)(1107 . 12)
1722 vnThreadsRunning[2]--;
1723 PrintException(NULL, "ThreadMessageHandler()");
1724 }
1725 printf("ThreadMessageHandler exiting\n");
1726 printf(SWAR SNET "message handling thread exiting\n");
1727 }
1728
1729 void ThreadMessageHandler2(void* parg)
1730 {
1731 printf("ThreadMessageHandler started\n");
1732 printf(SINF SNET "message handling thread starting\n");
1733 SetThreadPriority(THREAD_PRIORITY_BELOW_NORMAL);
1734 while (!fShutdown)
1735 {
(1177 . 8)(1177 . 7)
1737 hListenSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
1738 if (hListenSocket == INVALID_SOCKET)
1739 {
1740 strError = strprintf("Error: Couldn't open socket for incoming connections (socket returned error %d)", WSAGetLastError());
1741 printf("%s\n", strError.c_str());
1742 printf(SERR SNET "couldn't open socket for incoming connections, error %d\n", WSAGetLastError());
1743 return false;
1744 }
1745
(1193 . 8)(1192 . 7)
1747
1748 if (fcntl(hListenSocket, F_SETFL, O_NONBLOCK) == SOCKET_ERROR)
1749 {
1750 strError = strprintf("Error: Couldn't set properties on socket for incoming connections (error %d)", WSAGetLastError());
1751 printf("%s\n", strError.c_str());
1752 printf(SERR SNET "couldn't set properties on socket for incoming connections, error %d\n", WSAGetLastError());
1753 return false;
1754 }
1755
(1209 . 19)(1207 . 17)
1757 {
1758 int nErr = WSAGetLastError();
1759 if (nErr == WSAEADDRINUSE)
1760 strError = strprintf(_("Unable to bind to port %d on this computer. Bitcoin is probably already running."), ntohs(sockaddr.sin_port));
1761 printf(SERR SNET "unable to bind to port %d, bitcoind is probably already running\n", ntohs(sockaddr.sin_port));
1762 else
1763 strError = strprintf("Error: Unable to bind to port %d on this computer (bind returned error %d)", ntohs(sockaddr.sin_port), nErr);
1764 printf("%s\n", strError.c_str());
1765 printf(SERR SNET "unable to bind to port %d, error %d\n", ntohs(sockaddr.sin_port), nErr);
1766 return false;
1767 }
1768 printf("Bound to port %d\n", ntohs(sockaddr.sin_port));
1769 printf(SINF SNET "bound to port %d\n", ntohs(sockaddr.sin_port));
1770
1771 // Listen for incoming connections
1772 if (listen(hListenSocket, SOMAXCONN) == SOCKET_ERROR)
1773 {
1774 strError = strprintf("Error: Listening for incoming connections failed (listen returned error %d)", WSAGetLastError());
1775 printf("%s\n", strError.c_str());
1776 printf(SERR SNET "listening for incoming connections failed, error %d", WSAGetLastError());
1777 return false;
1778 }
1779
(1248 . 7)(1244 . 7)
1781 {
1782 struct sockaddr_in* s4 = (struct sockaddr_in*)(ifa->ifa_addr);
1783 if (inet_ntop(ifa->ifa_addr->sa_family, (void*)&(s4->sin_addr), pszIP, sizeof(pszIP)) != NULL)
1784 printf("ipv4 %s: %s\n", ifa->ifa_name, pszIP);
1785 printf(SINF SNET "ipv4 address %s: %s\n", ifa->ifa_name, pszIP);
1786
1787 // Take the first IP that isn't loopback 127.x.x.x
1788 CAddress addr(*(unsigned int*)&s4->sin_addr, GetListenPort(), nLocalServices);
(1262 . 13)(1258 . 13)
1790 {
1791 struct sockaddr_in6* s6 = (struct sockaddr_in6*)(ifa->ifa_addr);
1792 if (inet_ntop(ifa->ifa_addr->sa_family, (void*)&(s6->sin6_addr), pszIP, sizeof(pszIP)) != NULL)
1793 printf("ipv6 %s: %s\n", ifa->ifa_name, pszIP);
1794 printf(SINF SNET "ipv6 address %s: %s\n", ifa->ifa_name, pszIP);
1795 }
1796 }
1797 freeifaddrs(myaddrs);
1798 }
1799
1800 printf("addrLocalHost = %s\n", addrLocalHost.ToString().c_str());
1801 printf(SINF SNET "local host address is %s\n", addrLocalHost.ToString().c_str());
1802
1803 if (fUseProxy || mapArgs.count("-connect") || fNoListen)
1804 {
(1284 . 7)(1280 . 7)
1806 GetConfigFile().c_str()));
1807 }
1808
1809 printf("addrLocalHost = %s\n", addrLocalHost.ToString().c_str());
1810 printf(SINF SNET "local host address is %s\n", addrLocalHost.ToString().c_str());
1811
1812 //
1813 // Start threads
(1292 . 15)(1288 . 15)
1815
1816 // Send and receive from sockets, accept connections
1817 if (!CreateThread(ThreadSocketHandler, NULL))
1818 printf("Error: CreateThread(ThreadSocketHandler) failed\n");
1819 printf(SERR SNET "can't create socket handling thread\n");
1820
1821 // Initiate outbound connections
1822 if (!CreateThread(ThreadOpenConnections, NULL))
1823 printf("Error: CreateThread(ThreadOpenConnections) failed\n");
1824 printf(SERR SNET "can't create connection opening thread\n");
1825
1826 // Process messages
1827 if (!CreateThread(ThreadMessageHandler, NULL))
1828 printf("Error: CreateThread(ThreadMessageHandler) failed\n");
1829 printf(SERR SNET "can't create message handling thread\n");
1830
1831 // Generate coins in the background
1832 GenerateBitcoins(fGenerateBitcoins, pwalletMain);
(1308 . 7)(1304 . 7)
1834
1835 bool StopNode()
1836 {
1837 printf("StopNode()\n");
1838 printf(SWAR SNET "stopping node\n");
1839 fShutdown = true;
1840 nTransactionsUpdated++;
1841 int64 nStart = GetTime();
(1319 . 11)(1315 . 11)
1843 break;
1844 Sleep(20);
1845 }
1846 if (vnThreadsRunning[0] > 0) printf("ThreadSocketHandler still running\n");
1847 if (vnThreadsRunning[1] > 0) printf("ThreadOpenConnections still running\n");
1848 if (vnThreadsRunning[2] > 0) printf("ThreadMessageHandler still running\n");
1849 if (vnThreadsRunning[3] > 0) printf("ThreadBitcoinMiner still running\n");
1850 if (vnThreadsRunning[4] > 0) printf("ThreadRPCServer still running\n");
1851 if (vnThreadsRunning[0] > 0) printf(SWAR SNET "socket handling thread still running\n");
1852 if (vnThreadsRunning[1] > 0) printf(SWAR SNET "connection opening thread still running\n");
1853 if (vnThreadsRunning[2] > 0) printf(SWAR SNET "message handling thread still running\n");
1854 if (vnThreadsRunning[3] > 0) printf(SWAR SMIN "miner thread still running\n");
1855 if (vnThreadsRunning[4] > 0) printf(SWAR SNET "rpc server thread still running\n");
1856 while (vnThreadsRunning[2] > 0 || vnThreadsRunning[4] > 0)
1857 Sleep(20);
1858 Sleep(50);
(1345 . 7)(1341 . 7)
1860 closesocket(pnode->hSocket);
1861 if (hListenSocket != INVALID_SOCKET)
1862 if (closesocket(hListenSocket) == SOCKET_ERROR)
1863 printf("closesocket(hListenSocket) failed with error %d\n", WSAGetLastError());
1864 printf(SERR SNET "closing socket failed with error %d\n", WSAGetLastError());
1865
1866 }
1867 }