118 lines
		
	
	
		
			4.0 KiB
		
	
	
	
		
			Prolog
		
	
	
	
	
	
			
		
		
	
	
			118 lines
		
	
	
		
			4.0 KiB
		
	
	
	
		
			Prolog
		
	
	
	
	
	
/*  $Id$
 | 
						|
 | 
						|
    Part of SWI-Prolog
 | 
						|
 | 
						|
    Author:        Jan Wielemaker
 | 
						|
    E-mail:        jan@swi.psy.uva.nl
 | 
						|
    WWW:           http://www.swi-prolog.org
 | 
						|
    Copyright (C): 1985-2002, University of Amsterdam
 | 
						|
 | 
						|
    This program is free software; you can redistribute it and/or
 | 
						|
    modify it under the terms of the GNU General Public License
 | 
						|
    as published by the Free Software Foundation; either version 2
 | 
						|
    of the License, or (at your option) any later version.
 | 
						|
 | 
						|
    This program is distributed in the hope that it will be useful,
 | 
						|
    but WITHOUT ANY WARRANTY; without even the implied warranty of
 | 
						|
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 | 
						|
    GNU General Public License for more details.
 | 
						|
 | 
						|
    You should have received a copy of the GNU Lesser General Public
 | 
						|
    License along with this library; if not, write to the Free Software
 | 
						|
    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 | 
						|
 | 
						|
    As a special exception, if you link this library with other files,
 | 
						|
    compiled with a Free Software compiler, to produce an executable, this
 | 
						|
    library does not by itself cause the resulting executable to be covered
 | 
						|
    by the GNU General Public License. This exception does not however
 | 
						|
    invalidate any other reasons why the executable file might be covered by
 | 
						|
    the GNU General Public License.
 | 
						|
*/
 | 
						|
 | 
						|
:- module(socket,
 | 
						|
	  [ tcp_socket/1,		% -Socket
 | 
						|
	    tcp_close_socket/1,		% +Socket
 | 
						|
	    tcp_open_socket/3,		% +Socket, -Read, -Write
 | 
						|
	    tcp_connect/2,		% +Socket, +Address
 | 
						|
	    tcp_connect/4,		% +Socket, +Address, -Read, -Write)
 | 
						|
	    tcp_bind/2,			% +Socket, +Address
 | 
						|
	    tcp_accept/3,		% +Master, -Slave, -PeerName
 | 
						|
	    tcp_listen/2,		% +Socket, +BackLog
 | 
						|
	    tcp_fcntl/3,		% +Socket, +Command, ?Arg
 | 
						|
	    tcp_setopt/2,		% +Socket, +Option
 | 
						|
	    tcp_host_to_address/2,	% ?HostName, ?Ip-nr
 | 
						|
	    tcp_select/3,		% +Inputs, -Ready, +Timeout
 | 
						|
	    gethostname/1,		% -HostName
 | 
						|
 | 
						|
	    udp_socket/1,		% -Socket
 | 
						|
	    udp_receive/4,		% +Socket, -Data, -Sender, +Options
 | 
						|
	    udp_send/4  		% +Socket, +Data, +Sender, +Options
 | 
						|
	  ]).
 | 
						|
:- use_module(library(shlib)).
 | 
						|
 | 
						|
/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
 | 
						|
These predicates are documented in the source-distribution of the package
 | 
						|
`clib'.  See also the SWI-Prolog home-page at http://www.swi-prolog.org
 | 
						|
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
 | 
						|
 | 
						|
:- use_foreign_library(foreign(socket), install_socket).
 | 
						|
 | 
						|
 | 
						|
		 /*******************************
 | 
						|
		 *	HOOKABLE CONNECT	*
 | 
						|
		 *******************************/
 | 
						|
 | 
						|
%%	tcp_connect(+Socket, +Address, -Read, -Write) is det.
 | 
						|
%
 | 
						|
%	Connect a (client) socket to Address and return a bi-directional
 | 
						|
%	connection through the  stream-handles  Read   and  Write.  This
 | 
						|
%	predicate may be hooked   by  defining socket:tcp_connect_hook/4
 | 
						|
%	with the same signature. Hooking can be  used to deal with proxy
 | 
						|
%	connections. E.g.,
 | 
						|
%
 | 
						|
%	    ==
 | 
						|
%	    :- multifile socket:tcp_connect_hook/4.
 | 
						|
%
 | 
						|
%	    socket:tcp_connect_hook(Socket, Address, Read, Write) :-
 | 
						|
%	        proxy(ProxyAdress),
 | 
						|
%	    	tcp_connect(Socket, ProxyAdress),
 | 
						|
%		tcp_open_socket(Socket, Read, Write),
 | 
						|
%		proxy_connect(Address, Read, Write).
 | 
						|
%	    ==
 | 
						|
 | 
						|
:- multifile
 | 
						|
	tcp_connect_hook/4.
 | 
						|
 | 
						|
tcp_connect(Socket, Address, Read, Write) :-
 | 
						|
	tcp_connect_hook(Socket, Address, Read, Write), !.
 | 
						|
tcp_connect(Socket, Address, Read, Write) :-
 | 
						|
	tcp_connect(Socket, Address),
 | 
						|
	tcp_open_socket(Socket, Read, Write).
 | 
						|
 | 
						|
 | 
						|
		 /*******************************
 | 
						|
		 *	   COMPATIBILITY	*
 | 
						|
		 *******************************/
 | 
						|
 | 
						|
tcp_fcntl(Socket, setfl, nonblock) :- !,
 | 
						|
	tcp_setopt(Socket, nonblock).
 | 
						|
 | 
						|
 | 
						|
		 /*******************************
 | 
						|
		 *	  HANDLE MESSAGES	*
 | 
						|
		 *******************************/
 | 
						|
 | 
						|
/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
 | 
						|
The C-layer generates exceptions of the  following format, where Message
 | 
						|
is extracted from the operating system.
 | 
						|
 | 
						|
	error(socket_error(Message), _)
 | 
						|
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
 | 
						|
 | 
						|
 | 
						|
:- multifile
 | 
						|
	prolog:message/3.
 | 
						|
 | 
						|
prolog:message(error(socket_error(Message), _)) -->
 | 
						|
	[ 'Socket error: ~w'-[Message] ].
 |