ssize_t us_rawnet_send( us_rawnet_context_t *self, const uint8_t dest_mac[6], const void *payload, ssize_t payload_len ) { bool r = false; pcap_t *m_pcap = (pcap_t *)self->m_pcap; if ( m_pcap ) { uint8_t buffer[2048]; uint8_t *data = buffer + 14; if ( dest_mac ) { memcpy( (void *)buffer, (void *)dest_mac, 6 ); } else { memcpy( (void *)buffer, (void *)self->m_default_dest_mac, 6 ); } memcpy( (void *)( buffer + 6 ), (void *)self->m_my_mac, 6 ); buffer[12] = US_GET_BYTE_1( self->m_ethertype ); buffer[13] = US_GET_BYTE_0( self->m_ethertype ); memcpy( data, payload, payload_len ); r = pcap_sendpacket( m_pcap, buffer, (int)payload_len + 14 ) == 0; } else { r = false; } return r ? payload_len : -1; }
static bool us_tool_send_osc_tcp( struct addrinfo *dest_addr, us_buffer_t *buf ) { bool r=false; int s = us_net_create_tcp_socket(dest_addr, false); if ( s>=0 ) { if ( connect(s, dest_addr->ai_addr, dest_addr->ai_addrlen)>=0 ) { uint8_t length[4]; int len=us_buffer_readable_count( buf ); r=true; length[0] = US_GET_BYTE_3( len ); length[1] = US_GET_BYTE_2( len ); length[2] = US_GET_BYTE_1( len ); length[3] = US_GET_BYTE_0( len ); r&=us_net_blocking_send(s, length, sizeof(length) ); if ( r ) { r&=us_net_blocking_send(s, buf->m_buffer, len ); } if ( !r ) { us_stderr->printf( us_stderr, "Error sending to TCP socket: %s\n", strerror(errno) ); } } else { r=false; us_stderr->printf( us_stderr, "Error connecting: %s\n", strerror(errno) ); } closesocket(s); } return r; }