| 254 | |
| 255 | |
| 256 | SocketSentBytes CMuleUDPSocket::SendControlData(uint32 maxNumberOfBytesToSend, uint32 WXUNUSED(minFragSize)) |
| 257 | { |
| 258 | wxMutexLocker lock(m_mutex); |
| 259 | uint32 sentBytes = 0; |
| 260 | while (!m_queue.empty() && !m_busy && (sentBytes < maxNumberOfBytesToSend)) { |
| 261 | UDPPack item = m_queue.front(); |
| 262 | CPacket* packet = item.packet; |
| 263 | if (GetTickCount64() - item.time < UDPMAXQUEUETIME) { |
| 264 | uint32_t len = packet->GetPacketSize() + 2; |
| 265 | uint8_t *sendbuffer = new uint8_t [len]; |
| 266 | memcpy(sendbuffer, packet->GetUDPHeader(), 2); |
| 267 | memcpy(sendbuffer + 2, packet->GetDataBuffer(), packet->GetPacketSize()); |
| 268 | |
| 269 | if (item.bEncrypt && (theApp->GetPublicIP() > 0 || item.bKad)) { |
| 270 | len = CEncryptedDatagramSocket::EncryptSendClient(&sendbuffer, len, item.pachTargetClientHashORKadID, item.bKad, item.nReceiverVerifyKey, (item.bKad ? Kademlia::CPrefs::GetUDPVerifyKey(item.IP) : 0)); |
| 271 | } |
| 272 | |
| 273 | if (SendTo(sendbuffer, len, item.IP, item.port)) { |
| 274 | sentBytes += len; |
| 275 | m_queue.pop_front(); |
| 276 | delete packet; |
| 277 | delete [] sendbuffer; |
| 278 | } else { |
| 279 | // TODO: Needs better error handling, see SentTo |
| 280 | delete [] sendbuffer; |
| 281 | break; |
| 282 | } |
| 283 | } else { |
| 284 | m_queue.pop_front(); |
| 285 | delete packet; |
| 286 | } |
| 287 | } |
| 288 | if (!m_busy && !m_queue.empty()) { |
| 289 | theApp->uploadBandwidthThrottler->QueueForSendingControlPacket(this); |
| 290 | } |
| 291 | SocketSentBytes returnVal = { true, 0, sentBytes }; |
| 292 | |
| 293 | return returnVal; |
| 294 | } |
| 295 | |
| 296 | |
| 297 | bool CMuleUDPSocket::SendTo(uint8_t *buffer, uint32_t length, uint32_t ip, uint16_t port) |
no test coverage detected