Example #1
0
File: MSN.cpp Project: ModeenF/Caya
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;
}
Example #2
0
	CModuleSocket::~CModuleSocket()
	{
		unregisterSocket();
	}