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; }
/**@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; }