size_t MSNP::writeDataToSocket (void* sock, char* data, size_t size) { // printf("MSNP::writeDataToSocket\n"); size_t written = 0; int idx; for (int i = 0; i < kSocketsCount; i++) { if (kPollSockets[i].fd == getSocketFileDescriptor(sock)) { idx = i; break; } } while (written < size) { int newWritten; if (kSocketsSsl[idx].isSSL) { if (!kSocketsSsl[idx].isConnected) return 0; newWritten = SSL_write(kSocketsSsl[idx].ssl, data, (int) (size - written)); int error = SSL_get_error(kSocketsSsl[idx].ssl,newWritten); switch (error) { case SSL_ERROR_NONE: written += newWritten; data+=newWritten; break; case SSL_ERROR_WANT_WRITE: case SSL_ERROR_WANT_READ: continue; case SSL_ERROR_ZERO_RETURN: break; case SSL_ERROR_SYSCALL: default: break; } } else { newWritten = ::send(getSocketFileDescriptor(sock), data, (int)(size - written), 0); if (newWritten <= 0) { if (errno == EAGAIN) { continue; } else { break; } } written += newWritten; data+=newWritten; } } if (written != size) { showError(NULL, "Error on socket"); unregisterSocket(sock); closeSocket(sock); return written; } return written; }
CModuleSocket::~CModuleSocket() { unregisterSocket(); }