tsk_size_t tnet_transport_send(const tnet_transport_handle_t *handle, tnet_fd_t from, const void* buf, tsk_size_t size)
{
    tnet_transport_t *transport = (tnet_transport_t*)handle;
    int numberOfBytesSent = 0;

    if(!transport) {
        TSK_DEBUG_ERROR("Invalid transport handle.");
        goto bail;
    }

    if(transport->tls.enabled) {
        const transport_socket_xt* socket = getSocket(transport->context, from);
        if(socket && socket->tlshandle) {
            if(!tnet_tls_socket_send(socket->tlshandle, buf, size)) {
                numberOfBytesSent = size;
            }
            else {
                numberOfBytesSent = 0;
            }
            goto bail;
        }
    }
    else if((numberOfBytesSent = tnet_sockfd_send(from, buf, size, 0)) <= 0) {
        TNET_PRINT_LAST_ERROR("send have failed.");

        //tnet_sockfd_close(&from);
        goto bail;
    }

bail:
    transport->bytes_out += numberOfBytesSent;
    return numberOfBytesSent;
}
/*
* Sends stream/dgram data to the remote peer (shall be previously connected using @tnet_transport_connectto).
*/
tsk_size_t tnet_transport_send(const tnet_transport_handle_t *handle, tnet_fd_t from, const void* buf, tsk_size_t size)
{
    tnet_transport_t *transport = (tnet_transport_t*)handle;
    int ret = -1;
    tsk_size_t sent = 0;

    if (!transport) {
        TSK_DEBUG_ERROR("Invalid transport handle.");
        goto bail;
    }

    while (sent < size) {
        int try_guard = 10;
        if (transport->tls.enabled) {
            transport_socket_xt* socket = getSocket(transport->context, from);
            if (socket && socket->tlshandle) {
                if (tnet_tls_socket_send(socket->tlshandle, buf, size) == 0) {
                    sent = size;
                }
                else {
                    TSK_DEBUG_ERROR("Tring to use a socket without TLS handle to send data");
                }
                goto bail; // TLS do not retry
            }
        }
        else {
            WSABUF wsaBuffer;
            DWORD numberOfBytesSent = 0;
            wsaBuffer.buf = ((CHAR*)buf) + sent;
            wsaBuffer.len = (ULONG)(size - sent);
try_again:
            if ((ret = WSASend(from, &wsaBuffer, 1, &numberOfBytesSent, 0, NULL, NULL)) == SOCKET_ERROR) {
                ret = WSAGetLastError();
                if (ret == WSA_IO_PENDING || ret == WSAEWOULDBLOCK) {
                    TSK_DEBUG_INFO("SendTCP() - WouldBlock. Retrying...");
                    if (try_guard--) {
                        tsk_thread_sleep(10);
                        goto try_again;
                    }
                }
                else {
                    TNET_PRINT_LAST_ERROR("WSASend have failed.");
                    goto bail;
                }
            }
            else {
                sent += numberOfBytesSent;
            }
        }
    }

bail:
    transport->bytes_out += sent;
    return sent;
}
Example #3
0
/**@ingroup tnet_socket_group
* Returns the number of bytes sent (or negative value on error)
*/
int tnet_socket_send_stream(tnet_socket_t* self, const void* data, tsk_size_t size)
{
	if (!self || self->fd == TNET_INVALID_FD || !data || !size || !TNET_SOCKET_TYPE_IS_STREAM(self->type)) {
		TSK_DEBUG_ERROR("Invalid parameter");
		return -1;
	}
	if (self->tlshandle && (TNET_SOCKET_TYPE_IS_TLS(self->type) || TNET_SOCKET_TYPE_IS_WSS(self->type))) {
		return tnet_tls_socket_send(self->tlshandle, data, size) == 0 ? (int)size : -1; // returns zero on success
	}

	return (int)tnet_sockfd_send(self->fd, data, size, 0);
}
/*
* Sends stream/dgram data to the remote peer (shall be previously connected using @tnet_transport_connectto).
*/
tsk_size_t tnet_transport_send(const tnet_transport_handle_t *handle, tnet_fd_t from, const void* buf, tsk_size_t size)
{
	tnet_transport_t *transport = (tnet_transport_t*)handle;
	int ret = -1;
	DWORD numberOfBytesSent = 0;

	if (!transport){
		TSK_DEBUG_ERROR("Invalid transport handle.");
		goto bail;
	}

	if (transport->tls.enabled){
		transport_socket_xt* socket = getSocket(transport->context, from);
		if (socket && socket->tlshandle){
			if (!tnet_tls_socket_send(socket->tlshandle, buf, size)){
				numberOfBytesSent = (DWORD)size;
			}
			else{
				TSK_DEBUG_ERROR("Tring to use a socket without TLS handle to send data");
				numberOfBytesSent = 0;
			}
			goto bail;
		}
	}
	else{
		WSABUF wsaBuffer;
		wsaBuffer.buf = (CHAR*)buf;
		wsaBuffer.len = (ULONG)size;

		if ((ret = WSASend(from, &wsaBuffer, 1, &numberOfBytesSent, 0, NULL, NULL)) == SOCKET_ERROR){
			if ((ret = WSAGetLastError()) == WSA_IO_PENDING){
				TSK_DEBUG_INFO("WSA_IO_PENDING error for WSASend SSESSION");
				ret = 0;
			}
			else{
				TNET_PRINT_LAST_ERROR("WSASend have failed.");

				//tnet_sockfd_close(&from);
				goto bail;
			}
		}
		else{
			ret = 0;
		}
	}

bail:
	return numberOfBytesSent;
}