// -------------------------------------------------------------------------- // IEE_stop: ICMP Echo Engine stop procedure. Stops the IEE_process function. // This function should be called from an external thread. // // Parameters: // p_config: Opaque pointer to a ICMP_ECHO_ENGINE_PARMS structure. // // Return values: // IEE_SUCCESS on success. // IEE_INVALID_PARMS if invalid pp_config. // iee_ret_t IEE_stop( void* p_config ) { PICMP_ECHO_ENGINE_PARMS p_engine = (PICMP_ECHO_ENGINE_PARMS)p_config; // Verify input parameters. if( p_engine == NULL ) { // Error: invalid p_config, or already freed. return IEE_INVALID_PARMS; } // Notify the engine to stop. p_engine->eng_ongoing = 0; // Close the ICMP socket. // If the ICMP echo engine is currently in a read operation, the // IEE_process() function will not return until the call to select() // returns. This time lapse depends on the current processing. It can take // up to p_engine->send_interval milliseconds. To break the select() call, // we close the ICMP socket so it will return as an error. // pal_closesocket( p_engine->icmp_sfd ); // break a wait on 'select()'. return IEE_SUCCESS; }
// -------------------------------------------------------------------------- // IEE_destroy: ICMP Echo Engine destruction routine. // // Parameters: // pp_config: Opaque double pointer to a ICMP_ECHO_ENGINE_PARMS structure. // // Return values: // IEE_SUCCESS on success. // IEE_INVALID_PARMS if invalid pp_config. // iee_ret_t IEE_destroy( void** pp_config ) { PICMP_ECHO_ENGINE_PARMS p_engine = NULL; // Verify input parameters. if( pp_config == NULL || *pp_config == NULL ) { // Error: invalid p_config, or already freed. return IEE_INVALID_PARMS; } // Cast opaque double pointer to allow manipulation. p_engine = (PICMP_ECHO_ENGINE_PARMS)*pp_config; // Close the ICMP raw socket. pal_closesocket( p_engine->icmp_sfd ); // Free the engine echo event list. _free_echo_event_list( p_engine->event_list ); // Deallocate the memory used by the engine structure. pal_free( p_engine ); *pp_config = NULL; return IEE_SUCCESS; }
/* Destroy a socket */ sint32_t destroySocket(pal_socket_t sfd) { pal_shutdown( sfd, PAL_SOCK_SHTDN_BOTH ); pal_closesocket( sfd ); return 0; }
// -------------------------------------------------------------------------- // NetTCP6Connect: // // Return values: // 0: success // -1: Failed to resolve srvname. // -2: Socket error / Failed to connect (TCP only). // sint32_t NetTCP6Connect( pal_socket_t *p_sock, char *Host, uint16_t Port ) { pal_socket_t sockfd; struct sockaddr_in6 serv_addr; struct in6_addr addr; if( NULL == NetText2Addr6(Host, &addr) ) { return -1; } memset(&serv_addr, 0, sizeof(serv_addr)); serv_addr.sin6_family = AF_INET6; serv_addr.sin6_port = htons(Port); serv_addr.sin6_addr = addr; /* * Open a TCP socket (an Internet 6 stream socket). */ if( (sockfd = pal_socket(AF_INET6, SOCK_STREAM, 0)) < 0 ) { return -2; } /* * Connect to the server. */ if( pal_connect(sockfd, (struct sockaddr *) &serv_addr, sizeof(serv_addr)) < 0 ) { pal_closesocket( sockfd ); return -2; } *p_sock = sockfd; return 0; }
// -------------------------------------------------------------------------- // NetUDPConnect: // // Return values: // 0: success // -1: Failed to resolve srvname. // -2: Socket error / Failed to connect (TCP only). // sint32_t NetUDPConnect(pal_socket_t *p_sock, char *Host, uint16_t Port) { pal_socket_t sockfd; struct sockaddr_in serv_addr; struct in_addr addr; if( NetText2Addr(Host, &addr) == NULL ) { return -1; } memset(&serv_addr, 0, sizeof(serv_addr)); serv_addr.sin_family = AF_INET; serv_addr.sin_port = htons(Port); serv_addr.sin_addr.s_addr = addr.s_addr; /* * Open a UDP socket. */ if( (sockfd = pal_socket(AF_INET, SOCK_DGRAM, 0)) < 0 ) { return -2; } /* * Connect to the server. */ if( pal_connect(sockfd, (struct sockaddr *) &serv_addr, sizeof(serv_addr)) < 0 ) { pal_closesocket( sockfd ); return -2; } *p_sock = sockfd; return 0; }
sint32_t NetTCP6Close( pal_socket_t Socket ) { pal_shutdown( Socket, PAL_SOCK_SHTDN_BOTH ); return pal_closesocket( Socket ); }