requires LOCK(cs_vSend)
| 814 | |
| 815 | // requires LOCK(cs_vSend) |
| 816 | void SocketSendData(CNode* pnode) |
| 817 | { |
| 818 | std::deque<CSerializeData>::iterator it = pnode->vSendMsg.begin(); |
| 819 | |
| 820 | while (it != pnode->vSendMsg.end()) { |
| 821 | const CSerializeData& data = *it; |
| 822 | assert(data.size() > pnode->nSendOffset); |
| 823 | int nBytes = send(pnode->hSocket, &data[pnode->nSendOffset], data.size() - pnode->nSendOffset, MSG_NOSIGNAL | MSG_DONTWAIT); |
| 824 | if (nBytes > 0) { |
| 825 | pnode->nLastSend = GetTime(); |
| 826 | pnode->nSendBytes += nBytes; |
| 827 | pnode->nSendOffset += nBytes; |
| 828 | pnode->RecordBytesSent(nBytes); |
| 829 | if (pnode->nSendOffset == data.size()) { |
| 830 | pnode->nSendOffset = 0; |
| 831 | pnode->nSendSize -= data.size(); |
| 832 | it++; |
| 833 | } else { |
| 834 | // could not send full message; stop sending more |
| 835 | break; |
| 836 | } |
| 837 | } else { |
| 838 | if (nBytes < 0) { |
| 839 | // error |
| 840 | int nErr = WSAGetLastError(); |
| 841 | if (nErr != WSAEWOULDBLOCK && nErr != WSAEMSGSIZE && nErr != WSAEINTR && nErr != WSAEINPROGRESS) { |
| 842 | LogPrintf("socket send error %s\n", NetworkErrorString(nErr)); |
| 843 | pnode->CloseSocketDisconnect(); |
| 844 | } |
| 845 | } |
| 846 | // couldn't send anything at all |
| 847 | break; |
| 848 | } |
| 849 | } |
| 850 | |
| 851 | if (it == pnode->vSendMsg.end()) { |
| 852 | assert(pnode->nSendOffset == 0); |
| 853 | assert(pnode->nSendSize == 0); |
| 854 | } |
| 855 | pnode->vSendMsg.erase(pnode->vSendMsg.begin(), it); |
| 856 | } |
| 857 | |
| 858 | static list<CNode*> vNodesDisconnected; |
| 859 |
no test coverage detected