############################################################################# ## Name: ext/socket/lib/Wx/Socket.pm ## Purpose: Wx::Socket ## Author: Graciliano M. P. ## Modified by: ## Created: 27/02/2003 ## RCS-ID: $Id: Socket.pm 2057 2007-06-18 23:03:00Z mbarbon $ ## Copyright: (c) 2003-2004 Graciliano M. P. ## Licence: This program is free software; you can redistribute it and/or ## modify it under the same terms as Perl itself ############################################################################# package Wx::Socket ; use Wx; use strict; use vars qw($VERSION); $VERSION = '0.01'; Wx::load_dll( 'net' ); Wx::wx_boot( 'Wx::Socket', $VERSION ); no strict ; package Wx::DatagramSocket ; @ISA = qw(Wx::SocketBase) ; package Wx::SocketClient ; @ISA = qw(Wx::SocketBase) ; package Wx::SocketServer ; @ISA = qw(Wx::SocketBase) ; package Wx::SocketEvent ; @ISA = qw(Wx::Event) ; package Wx::IPaddress ; @ISA = qw(Wx::SockAddress); package Wx::IPV4address ; @ISA = qw(Wx::IPaddress); package Wx::IPV6address ; @ISA = qw(Wx::IPaddress); package Wx::UNIXaddress ; @ISA = qw(Wx::SockAddress); use strict ; ##################### # WX::SOCKET::EVENT # ##################### package Wx::Socket::Event ; use Wx qw(wxSOCKET_INPUT_FLAG wxSOCKET_OUTPUT_FLAG wxSOCKET_CONNECTION_FLAG wxSOCKET_LOST_FLAG wxSOCKET_INPUT wxSOCKET_OUTPUT wxSOCKET_CONNECTION wxSOCKET_LOST) ; my $EVTID ; sub EVT_SOCKET($$$) { $_[0]->Connect($_[1] , -1, &Wx::wxEVT_SOCKET , $_[2] ); } sub EVT_SOCKET_ALL($$$) { &MAKE_EVT('all',@_) ;} sub EVT_SOCKET_INPUT($$$) { &MAKE_EVT(wxSOCKET_INPUT,@_) ;} sub EVT_SOCKET_OUTPUT($$$) { &MAKE_EVT(wxSOCKET_OUTPUT,@_) ;} sub EVT_SOCKET_CONNECTION($$$) { &MAKE_EVT(wxSOCKET_CONNECTION,@_) ;} sub EVT_SOCKET_LOST($$$) { &MAKE_EVT(wxSOCKET_LOST,@_) ;} sub MAKE_EVT { my $type = shift ; my( $handler, $sock, $callback ) = @_; &ENABLE_SKEVT($sock , $handler , $callback) ; $sock->{_WXEVT}{SUB}{$type} = $callback ; if (!$sock->{_WXEVT}{CONNECT}) { $handler->Connect( $sock->{_WXEVT}{ID} , -1 , &Wx::wxEVT_SOCKET , sub{ &CHECK_EVT_TYPE($sock,@_) } ); $sock->{_WXEVT}{CONNECT} = 1 ; } } sub ENABLE_SKEVT { my ( $sock , $parent ) = @_ ; if ( $sock->{_WXEVT}{ENABLE} ) { return ;} $sock->{_WXEVT}{ID} = ++$EVTID ; $sock->SetEventHandler($parent, $sock->{_WXEVT}{ID}) ; $sock->SetNotify(wxSOCKET_INPUT_FLAG|wxSOCKET_OUTPUT_FLAG| wxSOCKET_CONNECTION_FLAG|wxSOCKET_LOST_FLAG) ; $sock->Notify(1) ; $sock->{_WXEVT}{ENABLE} = 1 ; } sub CHECK_EVT_TYPE { my ( $sock , $this , $evt ) = @_ ; #print "$sock\n" ; my $evt_type = $evt->GetSocketEvent ; my $sub = $sock->{_WXEVT}{SUB}{$evt_type} || $sock->{_WXEVT}{SUB}{all} ; if ($sub) { return &$sub($sock , $this , $evt) ;} return( undef ) ; } ####### # END # ####### 1; __END__ =head1 NAME Wx::Socket - wxSocket* classes =head1 USAGE use Wx qw(:socket) ; use Wx::Event qw(EVT_SOCKET_INPUT EVT_SOCKET_LOST) ; use Wx::Event qw(EVT_SOCKET_CONNECTION) ; ########## # CLIENT # ########## my $sock = Wx::SocketClient->new(wxSOCKET_WAITALL); EVT_SOCKET_INPUT($parent , $sock , \&onInput ) ; EVT_SOCKET_LOST($parent , $sock , \&onClose ) ; $sock->Connect('localhost',5050) ; if (! $sock->IsConnected ) { print "ERROR\n" ;} sub onInput { my ( $sock , $this , $evt ) = @_ ; my $length = 123; my $buffer ; $sock->Read($buffer , 1024 , $length ) ; } ########## # SERVER # ########## my $sock = Wx::SocketServer->new('localhost',5050,wxSOCKET_WAITALL); EVT_SOCKET_CONNECTION($parent , $sock , \&onConnect ) ; if ( !$sock->Ok ) { print "ERROR\n" ;} sub onConnect { my ( $sock , $this , $evt ) = @_ ; my $client = $sock->Accept(0) ; my ($local_host,$local_port) = $client->GetLocal ; my ($peer_host,$peer_port) = $client->GetPeer ; $client->Write("This is a data test!\n") ; ... or ... $client->Write( $data , length($data) ) ; $client->Close ; } =head1 METHODS All the methods work as in wxWidgets (see the documentation). The functions for reading data (Read, ReadMsg, Peek) take 3 arguments, like the Perl read() function: ## To read the data into the variable $sock->Read($buffer , 1024) ; ... or ... ## To append data at the given offset: $sock->Read($buffer , 1024 , $offset ) ; The write functions (Write, WriteMsg, Unread) can be used with 1 or 2 arguments: $client->Write("This is a data test!\n") ; $client->Write($data , $length) ; =head1 EVENTS The events are: EVT_SOCKET EVT_SOCKET_ALL EVT_SOCKET_INPUT EVT_SOCKET_OUTPUT EVT_SOCKET_CONNECTION EVT_SOCKET_LOST The EVT_SOCKET works as in wxWidgets, the others are wxPerl extensions. Note that EVT_SOCKET events of wxSocketClient and wxSocketServer work differently than other event types. First you need to set the event handler: $sock->SetEventHandler($handler, $id) ; Then you set what types of event you want to receive: ## this select all. $sock->SetNotify(wxSOCKET_INPUT_FLAG|wxSOCKET_OUTPUT_FLAG| wxSOCKET_CONNECTION_FLAG|wxSOCKET_LOST_FLAG) ; Enable the event notification: $sock->Notify(1) ; And only after this use: ## note that $handler must be the same that was used in ## SetEventHandler EVT_SOCKET($handler, $id , sub{...} ) To make the events easier to use, all the proccess is automatic, and you just use: EVT_SOCKET_INPUT($handler , $socket , sub{...} ) EVT_SOCKET_OUTPUT($handler , $socket , sub{...} ) EVT_SOCKET_CONNECTION($handler , $socket , sub{...} ) EVT_SOCKET_LOST($handler , $socket , sub{...} ) ## This is for the events not used yet by the above: EVT_SOCKET_ALL($parent , $socket , sub{...} ) ** The new way is better to handle more than one socket in the same time too. Take a look in the demos. =head1 SEE ALSO L, The wxWxwindows documentation at L =head1 AUTHOR Graciliano M. P. =head1 COPYRIGHT This program is free software; you can redistribute it and/or modify it under the same terms as Perl itself. =cut