bool RemoteConnect( void ) { int baud_limit; /* maximum baud that BOTH sides can achieve */ byte dummy; /* hold values that we don't need here */ byte MaxBaud2; /* MaxBaud at the other machine */ SendBlkNo = ReceiveBlkNo = 0; LastResponse = SDATA_NAK; if( !SetSyncTime() ) return( FALSE ); /* establish baud limit */ #ifdef SERVER if( !WaitReceive( &dummy, 1, &MaxBaud2, SEC( 2 ) ) ) { return( FALSE ); } if( !BlockSend( 1, (byte *)&MaxBaud, SEC( 2 ) ) ) { return( FALSE ); } #else if( !BlockSend( 1, (byte *)&MaxBaud, SEC( 2 ) ) ) { return( FALSE ); } if( !WaitReceive( &dummy, 1, &MaxBaud2, SEC( 2 ) ) ) { return( FALSE ); } #endif /* MaxBaud2 now contains the other side's baud rate limit */ if( MaxBaud > MaxBaud2 ) { baud_limit = MaxBaud; } else { baud_limit = MaxBaud2; } BaudCounter = baud_limit; if( !Speed() ) return( FALSE ); #ifdef SERVER { char buff[128]; if( BaudCounter == MIN_BAUD ) { strcpy( buff, "pre-set" ); } else { strcpy( buff, BaudTable[BaudCounter].name ); } strcat( buff, " baud" ); ServMessage( buff ); } #endif return( TRUE ); }
void servercontroller::slot_filters_update() { emit ServMessage(QString(), ServCommand::updateFilters, QString()); }
const char *RemoteLink( const char *parms, bool server ) { unsigned short port; #ifndef __RDOS__ struct servent *sp; #endif #ifdef SERVER #if !defined( __RDOS__ ) trp_socklen length; char buff[128]; #endif _DBG_NET(("SERVER: Calling into RemoteLink\r\n")); #if defined(__NT__) || defined(__WINDOWS__) { WSADATA data; if( WSAStartup( 0x101, &data ) != 0 ) { return( TRP_ERR_unable_to_initialize_TCPIP ); } } #endif port = 0; #ifdef __RDOS__ while( isdigit( *parms ) ) { port = port * 10 + (*parms - '0'); ++parms; } if( port == 0 ) port = DEFAULT_PORT; wait_handle = RdosCreateWait( ); listen_handle = RdosCreateTcpListen( port, 1, SOCKET_BUFFER ); RdosAddWaitForTcpListen( wait_handle, listen_handle, (int)(&listen_handle) ); #else if( *parms == '\0' ) parms = "tcplink"; sp = getservbyname( parms, "tcp" ); if( sp != NULL ) { port = sp->s_port; } else { while( isdigit( *parms ) ) { port = port * 10 + (*parms - '0'); ++parms; } if( port == 0 ) port = DEFAULT_PORT; port = htons( port ); } control_socket = socket(AF_INET, SOCK_STREAM, 0); if( !IS_VALID_SOCKET( control_socket ) ) { return( TRP_ERR_unable_to_open_stream_socket ); } #ifdef GUISERVER if( *ServParms == '\0' ) { sprintf( ServParms, "%u", ntohs( port ) ); } #endif /* Name socket using wildcards */ socket_address.sin_family = AF_INET; socket_address.sin_addr.s_addr = INADDR_ANY; socket_address.sin_port = port; if( bind( control_socket, (LPSOCKADDR)&socket_address, sizeof( socket_address ) ) ) { return( TRP_ERR_unable_to_bind_stream_socket ); } /* Find out assigned port number and print it out */ length = sizeof( socket_address ); if( getsockname( control_socket, (LPSOCKADDR)&socket_address, &length ) ) { return( TRP_ERR_unable_to_get_socket_name ); } sprintf( buff, "%s%d", TRP_TCP_socket_number, ntohs( socket_address.sin_port ) ); ServMessage( buff ); _DBG_NET(("TCP: ")); _DBG_NET((buff)); _DBG_NET(("\r\n")); #ifdef LIST_INTERFACES // TODO: need rework to POSIX if_nameindex in <net/if.h> /* Find and print TCP/IP interface addresses, ignore aliases */ { struct ifi_info *ifi, *ifihead; struct sockaddr *sa; ifihead = get_ifi_info( AF_INET, false ); for( ifi = ifihead; ifi != NULL; ifi = ifi->ifi_next ) { /* Ignore loopback interfaces */ if( ifi->flags & IFI_LOOP ) continue; if( (sa = ifi->ifi_addr) != NULL ) { sprintf( buff, "%s%s", TRP_TCP_ip_address, inet_ntoa( ((struct sockaddr_in *)sa)->sin_addr ) ); ServMessage( buff ); } } free_ifi_info( ifihead ); } #endif #endif _DBG_NET(("Start accepting connections\r\n")); /* Start accepting connections */ #ifndef __RDOS__ listen( control_socket, 5 ); #endif #else #ifdef __RDOS__ // Todo: handle connect #else const char *sock; char buff[128]; char *p; #if defined(__NT__) || defined(__WINDOWS__) { WSADATA data; if( WSAStartup( 0x101, &data ) != 0 ) { return( TRP_ERR_unable_to_initialize_TCPIP ); } } #endif /* get port number out of name */ p = buff; for( sock = parms; *sock != '\0'; ++sock ) { if( *sock == ':' ) { ++sock; break; } *p++ = *sock; } *p = '\0'; if( sock[0] == '\0' ) { sp = getservbyname( "tcplink", "tcp" ); } else { sp = getservbyname( sock, "tcp" ); } if( sp != NULL ) { port = sp->s_port; } else { port = 0; while( isdigit( *sock ) ) { port = port * 10 + (*sock - '0'); ++sock; } if( *sock != '\0' ) { return( TRP_ERR_unable_to_parse_port_number ); } if( port == 0 ) port = DEFAULT_PORT; port = htons( port ); } parms = buff; /* Setup for socket connect using parms specified by command line. */ socket_address.sin_family = AF_INET; /* OS/2's TCP/IP gethostbyname doesn't handle numeric addresses */ socket_address.sin_addr.s_addr = inet_addr( parms ); if( socket_address.sin_addr.s_addr == (unsigned long)-1L ) { struct hostent *hp; hp = gethostbyname( parms ); if( hp != 0 ) { memcpy( &socket_address.sin_addr, hp->h_addr, hp->h_length ); } else { return( TRP_ERR_unknown_host ); } } socket_address.sin_port = port; #endif #endif server = server; return( NULL ); }