Socket.st
author Stefan Vogel <sv@exept.de>
Wed, 16 Apr 2014 10:33:22 +0200
changeset 3224 bad706c50347
parent 3223 b126729a904b
child 3246 c75a006f9a7a
permissions -rw-r--r--
class: Socket added: #finalize #linger: Discard buffered data when finalizing a socket
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
0
1cf8d1747859 Initial revision
claus
parents:
diff changeset
     1
"
4
1f66800df351 *** empty log message ***
claus
parents: 3
diff changeset
     2
 COPYRIGHT (c) 1992 by Claus Gittinger
42
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
     3
	      All Rights Reserved
0
1cf8d1747859 Initial revision
claus
parents:
diff changeset
     4
1cf8d1747859 Initial revision
claus
parents:
diff changeset
     5
 This software is furnished under a license and may be used
1cf8d1747859 Initial revision
claus
parents:
diff changeset
     6
 only in accordance with the terms of that license and with the
1cf8d1747859 Initial revision
claus
parents:
diff changeset
     7
 inclusion of the above copyright notice.   This software may not
1cf8d1747859 Initial revision
claus
parents:
diff changeset
     8
 be provided or otherwise made available to, or used by, any
1cf8d1747859 Initial revision
claus
parents:
diff changeset
     9
 other person.  No title to or ownership of the software is
1cf8d1747859 Initial revision
claus
parents:
diff changeset
    10
 hereby transferred.
1cf8d1747859 Initial revision
claus
parents:
diff changeset
    11
"
888
a868b0e54a2b ipAddress stuff
Claus Gittinger <cg@exept.de>
parents: 887
diff changeset
    12
"{ Package: 'stx:libbasic2' }"
a868b0e54a2b ipAddress stuff
Claus Gittinger <cg@exept.de>
parents: 887
diff changeset
    13
63
7dd3d5b7877e *** empty log message ***
claus
parents: 58
diff changeset
    14
NonPositionableExternalStream subclass:#Socket
1505
Stefan Vogel <sv@exept.de>
parents: 1504
diff changeset
    15
	instanceVariableNames:'domain socketType protocol port serviceName peer peerName
Stefan Vogel <sv@exept.de>
parents: 1504
diff changeset
    16
		listening'
206
77166a6b3ee6 For ST80 style socket creation: register socket in Lobby.
Stefan Vogel <sv@exept.de>
parents: 203
diff changeset
    17
	classVariableNames:''
77166a6b3ee6 For ST80 style socket creation: register socket in Lobby.
Stefan Vogel <sv@exept.de>
parents: 203
diff changeset
    18
	poolDictionaries:''
77166a6b3ee6 For ST80 style socket creation: register socket in Lobby.
Stefan Vogel <sv@exept.de>
parents: 203
diff changeset
    19
	category:'Streams-External'
0
1cf8d1747859 Initial revision
claus
parents:
diff changeset
    20
!
1cf8d1747859 Initial revision
claus
parents:
diff changeset
    21
126
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
    22
!Socket primitiveDefinitions!
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
    23
%{
1009
e0839f923a3c double underlines;
Claus Gittinger <cg@exept.de>
parents: 1007
diff changeset
    24
/* #define DGRAM_DEBUG /* */
e0839f923a3c double underlines;
Claus Gittinger <cg@exept.de>
parents: 1007
diff changeset
    25
1343
cc3bed115c0a definitions cleanup with stxOSDefs.h
penk
parents: 1342
diff changeset
    26
#include "stxOSDefs.h"
126
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
    27
1503
4d97e4191d04 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1499
diff changeset
    28
#ifdef WIN32
3123
55ef9ca4f09f class: Socket
Stefan Vogel <sv@exept.de>
parents: 3077
diff changeset
    29
//#define DEBUG 1
2818
94d67df5c00d compilable with tcc
Claus Gittinger <cg@exept.de>
parents: 2773
diff changeset
    30
/* this is to catch uses of those - there should be none */
1503
4d97e4191d04 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1499
diff changeset
    31
# undef __BEGIN_INTERRUPTABLE__
4d97e4191d04 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1499
diff changeset
    32
# undef __END_INTERRUPTABLE__
2818
94d67df5c00d compilable with tcc
Claus Gittinger <cg@exept.de>
parents: 2773
diff changeset
    33
# ifdef __TCC__
94d67df5c00d compilable with tcc
Claus Gittinger <cg@exept.de>
parents: 2773
diff changeset
    34
#  define __BEGIN_INTERRUPTABLE__ xxxx
94d67df5c00d compilable with tcc
Claus Gittinger <cg@exept.de>
parents: 2773
diff changeset
    35
#  define __END_INTERRUPTABLE__ yyyy
94d67df5c00d compilable with tcc
Claus Gittinger <cg@exept.de>
parents: 2773
diff changeset
    36
# else
94d67df5c00d compilable with tcc
Claus Gittinger <cg@exept.de>
parents: 2773
diff changeset
    37
#  define __BEGIN_INTERRUPTABLE__ ..
94d67df5c00d compilable with tcc
Claus Gittinger <cg@exept.de>
parents: 2773
diff changeset
    38
#  define __END_INTERRUPTABLE__ ..
94d67df5c00d compilable with tcc
Claus Gittinger <cg@exept.de>
parents: 2773
diff changeset
    39
# endif
1503
4d97e4191d04 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1499
diff changeset
    40
1504
92005eec5c9d fixed moving-object-when-interrupted-with-scavenge bugs;
Claus Gittinger <cg@exept.de>
parents: 1503
diff changeset
    41
# define WRAP_STDIO
2823
10179ccfae5d Default for close - linger in background instead 30s in foreground
Stefan Vogel <sv@exept.de>
parents: 2818
diff changeset
    42
// The default is linger until all data is sent in background
10179ccfae5d Default for close - linger in background instead 30s in foreground
Stefan Vogel <sv@exept.de>
parents: 2818
diff changeset
    43
// so the close on the socket is non-blocking
10179ccfae5d Default for close - linger in background instead 30s in foreground
Stefan Vogel <sv@exept.de>
parents: 2818
diff changeset
    44
// linger.onoff=off linger.time= *irrelevant*
10179ccfae5d Default for close - linger in background instead 30s in foreground
Stefan Vogel <sv@exept.de>
parents: 2818
diff changeset
    45
//# define SET_LINGER_WHEN_CREATING_SOCKET
1529
911273d090c1 Re-unified Win32 and Unix code into single Socket.st.
Claus Gittinger <cg@exept.de>
parents: 1505
diff changeset
    46
2909
aacef77a1697 64bit fixes
Claus Gittinger <cg@exept.de>
parents: 2904
diff changeset
    47
# ifdef __MINGW__
aacef77a1697 64bit fixes
Claus Gittinger <cg@exept.de>
parents: 2904
diff changeset
    48
extern HANDLE _get_osfhandle();
1845
df4d79bfba9d closesocket is still tricky
Claus Gittinger <cg@exept.de>
parents: 1844
diff changeset
    49
# endif
df4d79bfba9d closesocket is still tricky
Claus Gittinger <cg@exept.de>
parents: 1844
diff changeset
    50
2915
896fffb0f02e mingw64
Claus Gittinger <cg@exept.de>
parents: 2909
diff changeset
    51
# if defined( __BORLANDC__ ) || defined( __MINGW__ )
896fffb0f02e mingw64
Claus Gittinger <cg@exept.de>
parents: 2909
diff changeset
    52
#  define SOCKET_FROM_FD(fd)               (SOCKET)(_get_osfhandle(fd))
2909
aacef77a1697 64bit fixes
Claus Gittinger <cg@exept.de>
parents: 2904
diff changeset
    53
# else
aacef77a1697 64bit fixes
Claus Gittinger <cg@exept.de>
parents: 2904
diff changeset
    54
#  define SOCKET_FROM_FD(fd)               (fd)
aacef77a1697 64bit fixes
Claus Gittinger <cg@exept.de>
parents: 2904
diff changeset
    55
# endif
1504
92005eec5c9d fixed moving-object-when-interrupted-with-scavenge bugs;
Claus Gittinger <cg@exept.de>
parents: 1503
diff changeset
    56
#else /* not WIN32 */
3215
342d793d938c class: Socket
Stefan Vogel <sv@exept.de>
parents: 3214
diff changeset
    57
# define SOCKET_FROM_FD(fd)   (fd)
342d793d938c class: Socket
Stefan Vogel <sv@exept.de>
parents: 3214
diff changeset
    58
# define closesocket(sock)    close(sock)
342d793d938c class: Socket
Stefan Vogel <sv@exept.de>
parents: 3214
diff changeset
    59
# define SOCKET               int
1504
92005eec5c9d fixed moving-object-when-interrupted-with-scavenge bugs;
Claus Gittinger <cg@exept.de>
parents: 1503
diff changeset
    60
#endif /* WIN32 */
1503
4d97e4191d04 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1499
diff changeset
    61
1843
8ee90d243b49 closeSocket after fclose: no longer (Q: is this the right thing)
Claus Gittinger <cg@exept.de>
parents: 1842
diff changeset
    62
#define SOCKET_FROM_FILE(f)             (SOCKET_FROM_FD(fileno(f)))
8ee90d243b49 closeSocket after fclose: no longer (Q: is this the right thing)
Claus Gittinger <cg@exept.de>
parents: 1842
diff changeset
    63
#define SOCKET_FROM_FILE_OBJECT(f)      (SOCKET_FROM_FILE(__FILEVal(f)))
1539
c0e89dcb58b3 non blocking stuff done right here;
Claus Gittinger <cg@exept.de>
parents: 1538
diff changeset
    64
126
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
    65
#include <stdio.h>
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
    66
#include <errno.h>
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
    67
1343
cc3bed115c0a definitions cleanup with stxOSDefs.h
penk
parents: 1342
diff changeset
    68
#ifdef WANT__TCP_DOT_H
cc3bed115c0a definitions cleanup with stxOSDefs.h
penk
parents: 1342
diff changeset
    69
# include <netinet/tcp.h>
cc3bed115c0a definitions cleanup with stxOSDefs.h
penk
parents: 1342
diff changeset
    70
#endif
cc3bed115c0a definitions cleanup with stxOSDefs.h
penk
parents: 1342
diff changeset
    71
1344
70d73917ac78 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1343
diff changeset
    72
#ifdef WANT__NETDB_DOT_H
70d73917ac78 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1343
diff changeset
    73
# include <netdb.h>
1343
cc3bed115c0a definitions cleanup with stxOSDefs.h
penk
parents: 1342
diff changeset
    74
#endif
cc3bed115c0a definitions cleanup with stxOSDefs.h
penk
parents: 1342
diff changeset
    75
739
eb3878300c3b removed WIN32 ifdef's - win32 uses Socket_win32.st anyway.
Claus Gittinger <cg@exept.de>
parents: 726
diff changeset
    76
#if defined(TRY_AGAIN) || defined(HOST_NOT_FOUND)
eb3878300c3b removed WIN32 ifdef's - win32 uses Socket_win32.st anyway.
Claus Gittinger <cg@exept.de>
parents: 726
diff changeset
    77
# define USE_H_ERRNO
eb3878300c3b removed WIN32 ifdef's - win32 uses Socket_win32.st anyway.
Claus Gittinger <cg@exept.de>
parents: 726
diff changeset
    78
#endif
eb3878300c3b removed WIN32 ifdef's - win32 uses Socket_win32.st anyway.
Claus Gittinger <cg@exept.de>
parents: 726
diff changeset
    79
126
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
    80
/*
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
    81
 * on some systems errno is a macro ... check for it here
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
    82
 */
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
    83
#ifndef errno
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
    84
 extern errno;
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
    85
#endif
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
    86
648
58e11a70ddaf gethostbyname behaves strange, if a name-server lookup is involved.
Claus Gittinger <cg@exept.de>
parents: 617
diff changeset
    87
#ifdef USE_H_ERRNO
58e11a70ddaf gethostbyname behaves strange, if a name-server lookup is involved.
Claus Gittinger <cg@exept.de>
parents: 617
diff changeset
    88
# ifndef h_errno
58e11a70ddaf gethostbyname behaves strange, if a name-server lookup is involved.
Claus Gittinger <cg@exept.de>
parents: 617
diff changeset
    89
 extern h_errno;
58e11a70ddaf gethostbyname behaves strange, if a name-server lookup is involved.
Claus Gittinger <cg@exept.de>
parents: 617
diff changeset
    90
# endif
58e11a70ddaf gethostbyname behaves strange, if a name-server lookup is involved.
Claus Gittinger <cg@exept.de>
parents: 617
diff changeset
    91
#endif
58e11a70ddaf gethostbyname behaves strange, if a name-server lookup is involved.
Claus Gittinger <cg@exept.de>
parents: 617
diff changeset
    92
126
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
    93
#ifdef DEBUG
1839
c10cd58ec334 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1781
diff changeset
    94
# define DBGPRINTF(x)    { if (__debugging__) console_printf x; }
c10cd58ec334 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1781
diff changeset
    95
# define DBGFPRINTF(x)   { if (__debugging__) console_fprintf x; }
126
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
    96
#else
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
    97
# define DBGPRINTF(x)    /* as nothing */
821
40b0b69bf4b5 more debugs; fixed at-addresses
Claus Gittinger <cg@exept.de>
parents: 820
diff changeset
    98
# define DBGFPRINTF(x)   /* as nothing */
126
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
    99
#endif
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
   100
1531
ec98158988ca compilable under unix
Claus Gittinger <cg@exept.de>
parents: 1529
diff changeset
   101
#ifndef TRUE
1535
f6aa0fc8c3cc getSocketAddress
Claus Gittinger <cg@exept.de>
parents: 1533
diff changeset
   102
# define TRUE   1
1531
ec98158988ca compilable under unix
Claus Gittinger <cg@exept.de>
parents: 1529
diff changeset
   103
#endif
ec98158988ca compilable under unix
Claus Gittinger <cg@exept.de>
parents: 1529
diff changeset
   104
#ifndef FALSE
1535
f6aa0fc8c3cc getSocketAddress
Claus Gittinger <cg@exept.de>
parents: 1533
diff changeset
   105
# define FALSE  0
1531
ec98158988ca compilable under unix
Claus Gittinger <cg@exept.de>
parents: 1529
diff changeset
   106
#endif
ec98158988ca compilable under unix
Claus Gittinger <cg@exept.de>
parents: 1529
diff changeset
   107
#ifndef WIN32
ec98158988ca compilable under unix
Claus Gittinger <cg@exept.de>
parents: 1529
diff changeset
   108
typedef int BOOL;
ec98158988ca compilable under unix
Claus Gittinger <cg@exept.de>
parents: 1529
diff changeset
   109
#endif
ec98158988ca compilable under unix
Claus Gittinger <cg@exept.de>
parents: 1529
diff changeset
   110
1843
8ee90d243b49 closeSocket after fclose: no longer (Q: is this the right thing)
Claus Gittinger <cg@exept.de>
parents: 1842
diff changeset
   111
#ifdef WIN32
8ee90d243b49 closeSocket after fclose: no longer (Q: is this the right thing)
Claus Gittinger <cg@exept.de>
parents: 1842
diff changeset
   112
# undef stdout
8ee90d243b49 closeSocket after fclose: no longer (Q: is this the right thing)
Claus Gittinger <cg@exept.de>
parents: 1842
diff changeset
   113
# undef stderr
8ee90d243b49 closeSocket after fclose: no longer (Q: is this the right thing)
Claus Gittinger <cg@exept.de>
parents: 1842
diff changeset
   114
# define stdout __win32_stdout()
8ee90d243b49 closeSocket after fclose: no longer (Q: is this the right thing)
Claus Gittinger <cg@exept.de>
parents: 1842
diff changeset
   115
# define stderr __win32_stderr()
8ee90d243b49 closeSocket after fclose: no longer (Q: is this the right thing)
Claus Gittinger <cg@exept.de>
parents: 1842
diff changeset
   116
#endif
126
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
   117
%}
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
   118
! !
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
   119
511
c071e228cb24 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 510
diff changeset
   120
!Socket primitiveVariables!
c071e228cb24 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 510
diff changeset
   121
%{
1844
decc9d62520d oops - debug
Claus Gittinger <cg@exept.de>
parents: 1843
diff changeset
   122
static int __debugging__ = 0;
511
c071e228cb24 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 510
diff changeset
   123
%}
c071e228cb24 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 510
diff changeset
   124
! !
c071e228cb24 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 510
diff changeset
   125
1504
92005eec5c9d fixed moving-object-when-interrupted-with-scavenge bugs;
Claus Gittinger <cg@exept.de>
parents: 1503
diff changeset
   126
!Socket primitiveFunctions!
92005eec5c9d fixed moving-object-when-interrupted-with-scavenge bugs;
Claus Gittinger <cg@exept.de>
parents: 1503
diff changeset
   127
%{
92005eec5c9d fixed moving-object-when-interrupted-with-scavenge bugs;
Claus Gittinger <cg@exept.de>
parents: 1503
diff changeset
   128
1529
911273d090c1 Re-unified Win32 and Unix code into single Socket.st.
Claus Gittinger <cg@exept.de>
parents: 1505
diff changeset
   129
static int
1504
92005eec5c9d fixed moving-object-when-interrupted-with-scavenge bugs;
Claus Gittinger <cg@exept.de>
parents: 1503
diff changeset
   130
setupBufferParameters(aDataBuffer, startIndex, p_extPtr, p_offs, p_objSize)
92005eec5c9d fixed moving-object-when-interrupted-with-scavenge bugs;
Claus Gittinger <cg@exept.de>
parents: 1503
diff changeset
   131
    OBJ aDataBuffer, startIndex;
92005eec5c9d fixed moving-object-when-interrupted-with-scavenge bugs;
Claus Gittinger <cg@exept.de>
parents: 1503
diff changeset
   132
    char **p_extPtr;
92005eec5c9d fixed moving-object-when-interrupted-with-scavenge bugs;
Claus Gittinger <cg@exept.de>
parents: 1503
diff changeset
   133
    int *p_offs;
92005eec5c9d fixed moving-object-when-interrupted-with-scavenge bugs;
Claus Gittinger <cg@exept.de>
parents: 1503
diff changeset
   134
    int *p_objSize;
92005eec5c9d fixed moving-object-when-interrupted-with-scavenge bugs;
Claus Gittinger <cg@exept.de>
parents: 1503
diff changeset
   135
{
92005eec5c9d fixed moving-object-when-interrupted-with-scavenge bugs;
Claus Gittinger <cg@exept.de>
parents: 1503
diff changeset
   136
	char *extPtr = 0;
92005eec5c9d fixed moving-object-when-interrupted-with-scavenge bugs;
Claus Gittinger <cg@exept.de>
parents: 1503
diff changeset
   137
	int sIdx = 0, objSize = 0, offs = 0;
92005eec5c9d fixed moving-object-when-interrupted-with-scavenge bugs;
Claus Gittinger <cg@exept.de>
parents: 1503
diff changeset
   138
92005eec5c9d fixed moving-object-when-interrupted-with-scavenge bugs;
Claus Gittinger <cg@exept.de>
parents: 1503
diff changeset
   139
	sIdx = 0;
92005eec5c9d fixed moving-object-when-interrupted-with-scavenge bugs;
Claus Gittinger <cg@exept.de>
parents: 1503
diff changeset
   140
	if (__isSmallInteger(startIndex)) {
92005eec5c9d fixed moving-object-when-interrupted-with-scavenge bugs;
Claus Gittinger <cg@exept.de>
parents: 1503
diff changeset
   141
	    sIdx = __intVal(startIndex) - 1;
92005eec5c9d fixed moving-object-when-interrupted-with-scavenge bugs;
Claus Gittinger <cg@exept.de>
parents: 1503
diff changeset
   142
	}
92005eec5c9d fixed moving-object-when-interrupted-with-scavenge bugs;
Claus Gittinger <cg@exept.de>
parents: 1503
diff changeset
   143
92005eec5c9d fixed moving-object-when-interrupted-with-scavenge bugs;
Claus Gittinger <cg@exept.de>
parents: 1503
diff changeset
   144
	if (__isExternalBytesLike(aDataBuffer)) {
92005eec5c9d fixed moving-object-when-interrupted-with-scavenge bugs;
Claus Gittinger <cg@exept.de>
parents: 1503
diff changeset
   145
	    OBJ sz;
92005eec5c9d fixed moving-object-when-interrupted-with-scavenge bugs;
Claus Gittinger <cg@exept.de>
parents: 1503
diff changeset
   146
92005eec5c9d fixed moving-object-when-interrupted-with-scavenge bugs;
Claus Gittinger <cg@exept.de>
parents: 1503
diff changeset
   147
	    extPtr = (char *)(__externalBytesAddress(aDataBuffer));
92005eec5c9d fixed moving-object-when-interrupted-with-scavenge bugs;
Claus Gittinger <cg@exept.de>
parents: 1503
diff changeset
   148
	    sz = __externalBytesSize(aDataBuffer);
92005eec5c9d fixed moving-object-when-interrupted-with-scavenge bugs;
Claus Gittinger <cg@exept.de>
parents: 1503
diff changeset
   149
	    if (__isSmallInteger(sz)) {
92005eec5c9d fixed moving-object-when-interrupted-with-scavenge bugs;
Claus Gittinger <cg@exept.de>
parents: 1503
diff changeset
   150
		objSize = __intVal(sz);
92005eec5c9d fixed moving-object-when-interrupted-with-scavenge bugs;
Claus Gittinger <cg@exept.de>
parents: 1503
diff changeset
   151
	    } else {
92005eec5c9d fixed moving-object-when-interrupted-with-scavenge bugs;
Claus Gittinger <cg@exept.de>
parents: 1503
diff changeset
   152
		objSize = 0; /* unknown */
92005eec5c9d fixed moving-object-when-interrupted-with-scavenge bugs;
Claus Gittinger <cg@exept.de>
parents: 1503
diff changeset
   153
	    }
92005eec5c9d fixed moving-object-when-interrupted-with-scavenge bugs;
Claus Gittinger <cg@exept.de>
parents: 1503
diff changeset
   154
	    offs = sIdx;
92005eec5c9d fixed moving-object-when-interrupted-with-scavenge bugs;
Claus Gittinger <cg@exept.de>
parents: 1503
diff changeset
   155
	} else {
92005eec5c9d fixed moving-object-when-interrupted-with-scavenge bugs;
Claus Gittinger <cg@exept.de>
parents: 1503
diff changeset
   156
	    OBJ oClass;
92005eec5c9d fixed moving-object-when-interrupted-with-scavenge bugs;
Claus Gittinger <cg@exept.de>
parents: 1503
diff changeset
   157
	    int nInstVars, nInstBytes;
92005eec5c9d fixed moving-object-when-interrupted-with-scavenge bugs;
Claus Gittinger <cg@exept.de>
parents: 1503
diff changeset
   158
1529
911273d090c1 Re-unified Win32 and Unix code into single Socket.st.
Claus Gittinger <cg@exept.de>
parents: 1505
diff changeset
   159
	    extPtr = (char *)0;
1504
92005eec5c9d fixed moving-object-when-interrupted-with-scavenge bugs;
Claus Gittinger <cg@exept.de>
parents: 1503
diff changeset
   160
	    oClass = __Class(aDataBuffer);
92005eec5c9d fixed moving-object-when-interrupted-with-scavenge bugs;
Claus Gittinger <cg@exept.de>
parents: 1503
diff changeset
   161
	    switch (__intVal(__ClassInstPtr(oClass)->c_flags) & ARRAYMASK) {
92005eec5c9d fixed moving-object-when-interrupted-with-scavenge bugs;
Claus Gittinger <cg@exept.de>
parents: 1503
diff changeset
   162
		case BYTEARRAY:
92005eec5c9d fixed moving-object-when-interrupted-with-scavenge bugs;
Claus Gittinger <cg@exept.de>
parents: 1503
diff changeset
   163
		    offs = sIdx;
92005eec5c9d fixed moving-object-when-interrupted-with-scavenge bugs;
Claus Gittinger <cg@exept.de>
parents: 1503
diff changeset
   164
		    break;
92005eec5c9d fixed moving-object-when-interrupted-with-scavenge bugs;
Claus Gittinger <cg@exept.de>
parents: 1503
diff changeset
   165
		case WORDARRAY:
92005eec5c9d fixed moving-object-when-interrupted-with-scavenge bugs;
Claus Gittinger <cg@exept.de>
parents: 1503
diff changeset
   166
		case SWORDARRAY:
92005eec5c9d fixed moving-object-when-interrupted-with-scavenge bugs;
Claus Gittinger <cg@exept.de>
parents: 1503
diff changeset
   167
		    offs = sIdx * 2;
92005eec5c9d fixed moving-object-when-interrupted-with-scavenge bugs;
Claus Gittinger <cg@exept.de>
parents: 1503
diff changeset
   168
		    break;
92005eec5c9d fixed moving-object-when-interrupted-with-scavenge bugs;
Claus Gittinger <cg@exept.de>
parents: 1503
diff changeset
   169
		case LONGARRAY:
92005eec5c9d fixed moving-object-when-interrupted-with-scavenge bugs;
Claus Gittinger <cg@exept.de>
parents: 1503
diff changeset
   170
		case SLONGARRAY:
92005eec5c9d fixed moving-object-when-interrupted-with-scavenge bugs;
Claus Gittinger <cg@exept.de>
parents: 1503
diff changeset
   171
		    offs = sIdx * 4;
92005eec5c9d fixed moving-object-when-interrupted-with-scavenge bugs;
Claus Gittinger <cg@exept.de>
parents: 1503
diff changeset
   172
		    break;
92005eec5c9d fixed moving-object-when-interrupted-with-scavenge bugs;
Claus Gittinger <cg@exept.de>
parents: 1503
diff changeset
   173
		case LONGLONGARRAY:
92005eec5c9d fixed moving-object-when-interrupted-with-scavenge bugs;
Claus Gittinger <cg@exept.de>
parents: 1503
diff changeset
   174
		case SLONGLONGARRAY:
92005eec5c9d fixed moving-object-when-interrupted-with-scavenge bugs;
Claus Gittinger <cg@exept.de>
parents: 1503
diff changeset
   175
		    offs = sIdx * 8;
92005eec5c9d fixed moving-object-when-interrupted-with-scavenge bugs;
Claus Gittinger <cg@exept.de>
parents: 1503
diff changeset
   176
# ifdef __NEED_LONGLONG_ALIGN
92005eec5c9d fixed moving-object-when-interrupted-with-scavenge bugs;
Claus Gittinger <cg@exept.de>
parents: 1503
diff changeset
   177
		    offs += 4;
92005eec5c9d fixed moving-object-when-interrupted-with-scavenge bugs;
Claus Gittinger <cg@exept.de>
parents: 1503
diff changeset
   178
# endif
92005eec5c9d fixed moving-object-when-interrupted-with-scavenge bugs;
Claus Gittinger <cg@exept.de>
parents: 1503
diff changeset
   179
		    break;
92005eec5c9d fixed moving-object-when-interrupted-with-scavenge bugs;
Claus Gittinger <cg@exept.de>
parents: 1503
diff changeset
   180
		case FLOATARRAY:
92005eec5c9d fixed moving-object-when-interrupted-with-scavenge bugs;
Claus Gittinger <cg@exept.de>
parents: 1503
diff changeset
   181
		    offs = sIdx * sizeof(float);
92005eec5c9d fixed moving-object-when-interrupted-with-scavenge bugs;
Claus Gittinger <cg@exept.de>
parents: 1503
diff changeset
   182
		    break;
92005eec5c9d fixed moving-object-when-interrupted-with-scavenge bugs;
Claus Gittinger <cg@exept.de>
parents: 1503
diff changeset
   183
		case DOUBLEARRAY:
92005eec5c9d fixed moving-object-when-interrupted-with-scavenge bugs;
Claus Gittinger <cg@exept.de>
parents: 1503
diff changeset
   184
		    offs = sIdx * sizeof(double);
92005eec5c9d fixed moving-object-when-interrupted-with-scavenge bugs;
Claus Gittinger <cg@exept.de>
parents: 1503
diff changeset
   185
# ifdef __NEED_DOUBLE_ALIGN
92005eec5c9d fixed moving-object-when-interrupted-with-scavenge bugs;
Claus Gittinger <cg@exept.de>
parents: 1503
diff changeset
   186
		    offs += 4;
92005eec5c9d fixed moving-object-when-interrupted-with-scavenge bugs;
Claus Gittinger <cg@exept.de>
parents: 1503
diff changeset
   187
# endif
92005eec5c9d fixed moving-object-when-interrupted-with-scavenge bugs;
Claus Gittinger <cg@exept.de>
parents: 1503
diff changeset
   188
		    break;
92005eec5c9d fixed moving-object-when-interrupted-with-scavenge bugs;
Claus Gittinger <cg@exept.de>
parents: 1503
diff changeset
   189
		default:
1529
911273d090c1 Re-unified Win32 and Unix code into single Socket.st.
Claus Gittinger <cg@exept.de>
parents: 1505
diff changeset
   190
		    *p_objSize = -1;
911273d090c1 Re-unified Win32 and Unix code into single Socket.st.
Claus Gittinger <cg@exept.de>
parents: 1505
diff changeset
   191
		    return 0;
1504
92005eec5c9d fixed moving-object-when-interrupted-with-scavenge bugs;
Claus Gittinger <cg@exept.de>
parents: 1503
diff changeset
   192
	    }
92005eec5c9d fixed moving-object-when-interrupted-with-scavenge bugs;
Claus Gittinger <cg@exept.de>
parents: 1503
diff changeset
   193
	    nInstVars = __intVal(__ClassInstPtr(oClass)->c_ninstvars);
92005eec5c9d fixed moving-object-when-interrupted-with-scavenge bugs;
Claus Gittinger <cg@exept.de>
parents: 1503
diff changeset
   194
	    nInstBytes = OHDR_SIZE + nInstVars * sizeof(OBJ);
92005eec5c9d fixed moving-object-when-interrupted-with-scavenge bugs;
Claus Gittinger <cg@exept.de>
parents: 1503
diff changeset
   195
	    offs = offs + nInstBytes;
2998
f3b0c290b01b stx macros begin with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 2953
diff changeset
   196
	    objSize = __Size(aDataBuffer) - offs;
1504
92005eec5c9d fixed moving-object-when-interrupted-with-scavenge bugs;
Claus Gittinger <cg@exept.de>
parents: 1503
diff changeset
   197
	}
92005eec5c9d fixed moving-object-when-interrupted-with-scavenge bugs;
Claus Gittinger <cg@exept.de>
parents: 1503
diff changeset
   198
	*p_extPtr = extPtr;
92005eec5c9d fixed moving-object-when-interrupted-with-scavenge bugs;
Claus Gittinger <cg@exept.de>
parents: 1503
diff changeset
   199
	*p_objSize = objSize;
92005eec5c9d fixed moving-object-when-interrupted-with-scavenge bugs;
Claus Gittinger <cg@exept.de>
parents: 1503
diff changeset
   200
	*p_offs = offs;
1529
911273d090c1 Re-unified Win32 and Unix code into single Socket.st.
Claus Gittinger <cg@exept.de>
parents: 1505
diff changeset
   201
	return 1;
1504
92005eec5c9d fixed moving-object-when-interrupted-with-scavenge bugs;
Claus Gittinger <cg@exept.de>
parents: 1503
diff changeset
   202
}
92005eec5c9d fixed moving-object-when-interrupted-with-scavenge bugs;
Claus Gittinger <cg@exept.de>
parents: 1503
diff changeset
   203
%}
92005eec5c9d fixed moving-object-when-interrupted-with-scavenge bugs;
Claus Gittinger <cg@exept.de>
parents: 1503
diff changeset
   204
! !
92005eec5c9d fixed moving-object-when-interrupted-with-scavenge bugs;
Claus Gittinger <cg@exept.de>
parents: 1503
diff changeset
   205
464
600b101a7035 alen in accept
Claus Gittinger <cg@exept.de>
parents: 463
diff changeset
   206
!Socket class methodsFor:'documentation'!
25
996051271ce9 *** empty log message ***
claus
parents: 21
diff changeset
   207
31
e223f3cf2995 *** empty log message ***
claus
parents: 28
diff changeset
   208
copyright
e223f3cf2995 *** empty log message ***
claus
parents: 28
diff changeset
   209
"
e223f3cf2995 *** empty log message ***
claus
parents: 28
diff changeset
   210
 COPYRIGHT (c) 1992 by Claus Gittinger
42
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   211
	      All Rights Reserved
31
e223f3cf2995 *** empty log message ***
claus
parents: 28
diff changeset
   212
e223f3cf2995 *** empty log message ***
claus
parents: 28
diff changeset
   213
 This software is furnished under a license and may be used
e223f3cf2995 *** empty log message ***
claus
parents: 28
diff changeset
   214
 only in accordance with the terms of that license and with the
e223f3cf2995 *** empty log message ***
claus
parents: 28
diff changeset
   215
 inclusion of the above copyright notice.   This software may not
e223f3cf2995 *** empty log message ***
claus
parents: 28
diff changeset
   216
 be provided or otherwise made available to, or used by, any
e223f3cf2995 *** empty log message ***
claus
parents: 28
diff changeset
   217
 other person.  No title to or ownership of the software is
e223f3cf2995 *** empty log message ***
claus
parents: 28
diff changeset
   218
 hereby transferred.
e223f3cf2995 *** empty log message ***
claus
parents: 28
diff changeset
   219
"
e223f3cf2995 *** empty log message ***
claus
parents: 28
diff changeset
   220
!
e223f3cf2995 *** empty log message ***
claus
parents: 28
diff changeset
   221
25
996051271ce9 *** empty log message ***
claus
parents: 21
diff changeset
   222
documentation
996051271ce9 *** empty log message ***
claus
parents: 21
diff changeset
   223
"
524
8287da54eccf more empty code for other domains;
Claus Gittinger <cg@exept.de>
parents: 513
diff changeset
   224
    This class provides access to sockets for interprocess communication.
25
996051271ce9 *** empty log message ***
claus
parents: 21
diff changeset
   225
    The message protocol is preliminary, until someone tells me how
31
e223f3cf2995 *** empty log message ***
claus
parents: 28
diff changeset
   226
    other smalltalk's socket interfaces look like.
25
996051271ce9 *** empty log message ***
claus
parents: 21
diff changeset
   227
1529
911273d090c1 Re-unified Win32 and Unix code into single Socket.st.
Claus Gittinger <cg@exept.de>
parents: 1505
diff changeset
   228
    Currently, only IP and UNIX domain sockets are really fully
911273d090c1 Re-unified Win32 and Unix code into single Socket.st.
Claus Gittinger <cg@exept.de>
parents: 1505
diff changeset
   229
    tested and supported.
525
5891518d17a3 appletalk support - untested
Claus Gittinger <cg@exept.de>
parents: 524
diff changeset
   230
    Code for appletalk is included, but was never tested ...
5891518d17a3 appletalk support - untested
Claus Gittinger <cg@exept.de>
parents: 524
diff changeset
   231
    More may be added in the future.
5891518d17a3 appletalk support - untested
Claus Gittinger <cg@exept.de>
parents: 524
diff changeset
   232
    (the code is prepared for things like SNA or decNet;
5891518d17a3 appletalk support - untested
Claus Gittinger <cg@exept.de>
parents: 524
diff changeset
   233
     however, right now, this code is empty and needs a little work.
5891518d17a3 appletalk support - untested
Claus Gittinger <cg@exept.de>
parents: 524
diff changeset
   234
     Implementing those is pretty straight forward, once the address
5891518d17a3 appletalk support - untested
Claus Gittinger <cg@exept.de>
parents: 524
diff changeset
   235
     data structures are known.)
524
8287da54eccf more empty code for other domains;
Claus Gittinger <cg@exept.de>
parents: 513
diff changeset
   236
28
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   237
    Due to historic reasons (I started this class, before I got hold of some
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   238
    code using ST-80 Sockets i.e. RemoteInvocation), there is some old interface
1485
d8578cf3504b gcc3.3.1 insn-scheduler bug workaround
Claus Gittinger <cg@exept.de>
parents: 1474
diff changeset
   239
    still provided.
524
8287da54eccf more empty code for other domains;
Claus Gittinger <cg@exept.de>
parents: 513
diff changeset
   240
    This will vanish; use the #family:type: or #newTCPxxx and #newUDPxxx interfaces,
71
claus
parents: 63
diff changeset
   241
    together with the bind/listen and accept calls,
claus
parents: 63
diff changeset
   242
    which are meant to be compatible to ST-80's UnixSocketAccessor interface.
claus
parents: 63
diff changeset
   243
claus
parents: 63
diff changeset
   244
    TODO: cleanup historic leftovers, implement other than inet domain stuff.
2825
e5b7d2005351 fixed for compilability
Claus Gittinger <cg@exept.de>
parents: 2824
diff changeset
   245
	  (mhmh - how can I test those ?)
e5b7d2005351 fixed for compilability
Claus Gittinger <cg@exept.de>
parents: 2824
diff changeset
   246
	  change to raise more signals on errors.
259
6d36f3ac42a2 documentation
Claus Gittinger <cg@exept.de>
parents: 220
diff changeset
   247
6d36f3ac42a2 documentation
Claus Gittinger <cg@exept.de>
parents: 220
diff changeset
   248
    [author:]
2825
e5b7d2005351 fixed for compilability
Claus Gittinger <cg@exept.de>
parents: 2824
diff changeset
   249
	Claus Gittinger
48
18b9353c9d07 *** empty log message ***
claus
parents: 44
diff changeset
   250
"
18b9353c9d07 *** empty log message ***
claus
parents: 44
diff changeset
   251
!
28
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   252
48
18b9353c9d07 *** empty log message ***
claus
parents: 44
diff changeset
   253
examples
18b9353c9d07 *** empty log message ***
claus
parents: 44
diff changeset
   254
"
28
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   255
    example (get help info from an nntp server):
2825
e5b7d2005351 fixed for compilability
Claus Gittinger <cg@exept.de>
parents: 2824
diff changeset
   256
									[exBegin]
e5b7d2005351 fixed for compilability
Claus Gittinger <cg@exept.de>
parents: 2824
diff changeset
   257
	|sock host|
e5b7d2005351 fixed for compilability
Claus Gittinger <cg@exept.de>
parents: 2824
diff changeset
   258
e5b7d2005351 fixed for compilability
Claus Gittinger <cg@exept.de>
parents: 2824
diff changeset
   259
	host := OperatingSystem getEnvironment:'NNTPSERVER'.
e5b7d2005351 fixed for compilability
Claus Gittinger <cg@exept.de>
parents: 2824
diff changeset
   260
e5b7d2005351 fixed for compilability
Claus Gittinger <cg@exept.de>
parents: 2824
diff changeset
   261
	sock := Socket newTCPclientToHost:host port:'nntp'.
e5b7d2005351 fixed for compilability
Claus Gittinger <cg@exept.de>
parents: 2824
diff changeset
   262
	sock isNil ifTrue:[
e5b7d2005351 fixed for compilability
Claus Gittinger <cg@exept.de>
parents: 2824
diff changeset
   263
	    self warn:'no nntp daemon is running'.
e5b7d2005351 fixed for compilability
Claus Gittinger <cg@exept.de>
parents: 2824
diff changeset
   264
	    ^ self
e5b7d2005351 fixed for compilability
Claus Gittinger <cg@exept.de>
parents: 2824
diff changeset
   265
	].
e5b7d2005351 fixed for compilability
Claus Gittinger <cg@exept.de>
parents: 2824
diff changeset
   266
	Transcript showCR:sock nextLine.
e5b7d2005351 fixed for compilability
Claus Gittinger <cg@exept.de>
parents: 2824
diff changeset
   267
	sock buffered:false.
e5b7d2005351 fixed for compilability
Claus Gittinger <cg@exept.de>
parents: 2824
diff changeset
   268
e5b7d2005351 fixed for compilability
Claus Gittinger <cg@exept.de>
parents: 2824
diff changeset
   269
	sock nextPutAll:'HELP'; cr.
e5b7d2005351 fixed for compilability
Claus Gittinger <cg@exept.de>
parents: 2824
diff changeset
   270
	[:exit |
e5b7d2005351 fixed for compilability
Claus Gittinger <cg@exept.de>
parents: 2824
diff changeset
   271
	    |line|
e5b7d2005351 fixed for compilability
Claus Gittinger <cg@exept.de>
parents: 2824
diff changeset
   272
e5b7d2005351 fixed for compilability
Claus Gittinger <cg@exept.de>
parents: 2824
diff changeset
   273
	    line := sock nextLine.
e5b7d2005351 fixed for compilability
Claus Gittinger <cg@exept.de>
parents: 2824
diff changeset
   274
	    line = '.' ifTrue:[exit value:nil].
e5b7d2005351 fixed for compilability
Claus Gittinger <cg@exept.de>
parents: 2824
diff changeset
   275
	    Transcript showCR:line.
e5b7d2005351 fixed for compilability
Claus Gittinger <cg@exept.de>
parents: 2824
diff changeset
   276
	] loopWithExit.
e5b7d2005351 fixed for compilability
Claus Gittinger <cg@exept.de>
parents: 2824
diff changeset
   277
	sock close
e5b7d2005351 fixed for compilability
Claus Gittinger <cg@exept.de>
parents: 2824
diff changeset
   278
									[exEnd]
209
2152fceba563 finger example
Claus Gittinger <cg@exept.de>
parents: 208
diff changeset
   279
28
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   280
209
2152fceba563 finger example
Claus Gittinger <cg@exept.de>
parents: 208
diff changeset
   281
    example (connect to finger daemon, get users entry):
2825
e5b7d2005351 fixed for compilability
Claus Gittinger <cg@exept.de>
parents: 2824
diff changeset
   282
									[exBegin]
e5b7d2005351 fixed for compilability
Claus Gittinger <cg@exept.de>
parents: 2824
diff changeset
   283
	|sock entry|
e5b7d2005351 fixed for compilability
Claus Gittinger <cg@exept.de>
parents: 2824
diff changeset
   284
e5b7d2005351 fixed for compilability
Claus Gittinger <cg@exept.de>
parents: 2824
diff changeset
   285
	sock := Socket newTCPclientToHost:'localhost' port:'finger'.
e5b7d2005351 fixed for compilability
Claus Gittinger <cg@exept.de>
parents: 2824
diff changeset
   286
	sock isNil ifTrue:[
e5b7d2005351 fixed for compilability
Claus Gittinger <cg@exept.de>
parents: 2824
diff changeset
   287
	    self warn:'no finger daemon is running'.
e5b7d2005351 fixed for compilability
Claus Gittinger <cg@exept.de>
parents: 2824
diff changeset
   288
	    ^ self
e5b7d2005351 fixed for compilability
Claus Gittinger <cg@exept.de>
parents: 2824
diff changeset
   289
	].
e5b7d2005351 fixed for compilability
Claus Gittinger <cg@exept.de>
parents: 2824
diff changeset
   290
	sock useCRLF:true.
e5b7d2005351 fixed for compilability
Claus Gittinger <cg@exept.de>
parents: 2824
diff changeset
   291
	sock buffered:false.
e5b7d2005351 fixed for compilability
Claus Gittinger <cg@exept.de>
parents: 2824
diff changeset
   292
	sock isNil ifTrue:[
e5b7d2005351 fixed for compilability
Claus Gittinger <cg@exept.de>
parents: 2824
diff changeset
   293
	    Transcript showCR:'cannot connect to local finger daemon'
e5b7d2005351 fixed for compilability
Claus Gittinger <cg@exept.de>
parents: 2824
diff changeset
   294
	] ifFalse:[
e5b7d2005351 fixed for compilability
Claus Gittinger <cg@exept.de>
parents: 2824
diff changeset
   295
	    sock nextPutAll:(OperatingSystem getLoginName).
e5b7d2005351 fixed for compilability
Claus Gittinger <cg@exept.de>
parents: 2824
diff changeset
   296
	    sock cr.
e5b7d2005351 fixed for compilability
Claus Gittinger <cg@exept.de>
parents: 2824
diff changeset
   297
e5b7d2005351 fixed for compilability
Claus Gittinger <cg@exept.de>
parents: 2824
diff changeset
   298
	    entry := sock nextLine.
e5b7d2005351 fixed for compilability
Claus Gittinger <cg@exept.de>
parents: 2824
diff changeset
   299
	    Transcript showCR:entry.
e5b7d2005351 fixed for compilability
Claus Gittinger <cg@exept.de>
parents: 2824
diff changeset
   300
e5b7d2005351 fixed for compilability
Claus Gittinger <cg@exept.de>
parents: 2824
diff changeset
   301
	    sock close
e5b7d2005351 fixed for compilability
Claus Gittinger <cg@exept.de>
parents: 2824
diff changeset
   302
	]
e5b7d2005351 fixed for compilability
Claus Gittinger <cg@exept.de>
parents: 2824
diff changeset
   303
									[exEnd]
99
7d016cc30052 fixed & moved pingWalk from SNMPSession to here;
Claus Gittinger <cg@exept.de>
parents: 98
diff changeset
   304
28
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   305
    example (connect to an ftp server):
2825
e5b7d2005351 fixed for compilability
Claus Gittinger <cg@exept.de>
parents: 2824
diff changeset
   306
									[exBegin]
e5b7d2005351 fixed for compilability
Claus Gittinger <cg@exept.de>
parents: 2824
diff changeset
   307
	|sock|
e5b7d2005351 fixed for compilability
Claus Gittinger <cg@exept.de>
parents: 2824
diff changeset
   308
e5b7d2005351 fixed for compilability
Claus Gittinger <cg@exept.de>
parents: 2824
diff changeset
   309
	sock := Socket newTCPclientToHost:'www.exept.de' port:'ftp'.
e5b7d2005351 fixed for compilability
Claus Gittinger <cg@exept.de>
parents: 2824
diff changeset
   310
e5b7d2005351 fixed for compilability
Claus Gittinger <cg@exept.de>
parents: 2824
diff changeset
   311
	sock buffered:false.
e5b7d2005351 fixed for compilability
Claus Gittinger <cg@exept.de>
parents: 2824
diff changeset
   312
	Transcript showCR:sock nextLine.
e5b7d2005351 fixed for compilability
Claus Gittinger <cg@exept.de>
parents: 2824
diff changeset
   313
	sock nextPutAll:('USER ' , 'anonymous'); cr.
e5b7d2005351 fixed for compilability
Claus Gittinger <cg@exept.de>
parents: 2824
diff changeset
   314
	Transcript showCR:sock nextLine.
e5b7d2005351 fixed for compilability
Claus Gittinger <cg@exept.de>
parents: 2824
diff changeset
   315
	sock nextPutAll:('PASS ' , 'fooBar'); cr.
e5b7d2005351 fixed for compilability
Claus Gittinger <cg@exept.de>
parents: 2824
diff changeset
   316
	Transcript showCR:sock nextLine.
e5b7d2005351 fixed for compilability
Claus Gittinger <cg@exept.de>
parents: 2824
diff changeset
   317
	sock nextPutAll:'HELP'; cr.
e5b7d2005351 fixed for compilability
Claus Gittinger <cg@exept.de>
parents: 2824
diff changeset
   318
	[
e5b7d2005351 fixed for compilability
Claus Gittinger <cg@exept.de>
parents: 2824
diff changeset
   319
	    |line|
e5b7d2005351 fixed for compilability
Claus Gittinger <cg@exept.de>
parents: 2824
diff changeset
   320
	    line := sock nextLine.
e5b7d2005351 fixed for compilability
Claus Gittinger <cg@exept.de>
parents: 2824
diff changeset
   321
	    Transcript showCR:line.
e5b7d2005351 fixed for compilability
Claus Gittinger <cg@exept.de>
parents: 2824
diff changeset
   322
	    (line at:4) = $-
e5b7d2005351 fixed for compilability
Claus Gittinger <cg@exept.de>
parents: 2824
diff changeset
   323
	] whileTrue.
e5b7d2005351 fixed for compilability
Claus Gittinger <cg@exept.de>
parents: 2824
diff changeset
   324
	sock close.
e5b7d2005351 fixed for compilability
Claus Gittinger <cg@exept.de>
parents: 2824
diff changeset
   325
e5b7d2005351 fixed for compilability
Claus Gittinger <cg@exept.de>
parents: 2824
diff changeset
   326
	'dont know enough of the ftp protocol to continue here ...'
e5b7d2005351 fixed for compilability
Claus Gittinger <cg@exept.de>
parents: 2824
diff changeset
   327
									[exEnd]
28
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   328
99
7d016cc30052 fixed & moved pingWalk from SNMPSession to here;
Claus Gittinger <cg@exept.de>
parents: 98
diff changeset
   329
93
Claus Gittinger <cg@exept.de>
parents: 92
diff changeset
   330
    example (connect to an snmp server [UDP]):
2824
b00dc482dd03 comment/format in: #examples
Stefan Vogel <sv@exept.de>
parents: 2823
diff changeset
   331
    Note: this is not a real connection, only the destination adress is
2825
e5b7d2005351 fixed for compilability
Claus Gittinger <cg@exept.de>
parents: 2824
diff changeset
   332
	  being fixed.
e5b7d2005351 fixed for compilability
Claus Gittinger <cg@exept.de>
parents: 2824
diff changeset
   333
									[exBegin]
e5b7d2005351 fixed for compilability
Claus Gittinger <cg@exept.de>
parents: 2824
diff changeset
   334
	|sock port|
e5b7d2005351 fixed for compilability
Claus Gittinger <cg@exept.de>
parents: 2824
diff changeset
   335
e5b7d2005351 fixed for compilability
Claus Gittinger <cg@exept.de>
parents: 2824
diff changeset
   336
	sock := Socket newUDP.
e5b7d2005351 fixed for compilability
Claus Gittinger <cg@exept.de>
parents: 2824
diff changeset
   337
	port := Socket portOfService:'snmp'.
e5b7d2005351 fixed for compilability
Claus Gittinger <cg@exept.de>
parents: 2824
diff changeset
   338
	sock connectTo:'localhost' port:port.
e5b7d2005351 fixed for compilability
Claus Gittinger <cg@exept.de>
parents: 2824
diff changeset
   339
	sock buffered:false.
e5b7d2005351 fixed for compilability
Claus Gittinger <cg@exept.de>
parents: 2824
diff changeset
   340
	Transcript showCR:'got it'.
e5b7d2005351 fixed for compilability
Claus Gittinger <cg@exept.de>
parents: 2824
diff changeset
   341
	sock close.
e5b7d2005351 fixed for compilability
Claus Gittinger <cg@exept.de>
parents: 2824
diff changeset
   342
									[exEnd]
42
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   343
99
7d016cc30052 fixed & moved pingWalk from SNMPSession to here;
Claus Gittinger <cg@exept.de>
parents: 98
diff changeset
   344
42
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   345
    example (await connection from a client and read some data):
2825
e5b7d2005351 fixed for compilability
Claus Gittinger <cg@exept.de>
parents: 2824
diff changeset
   346
									[exBegin]
e5b7d2005351 fixed for compilability
Claus Gittinger <cg@exept.de>
parents: 2824
diff changeset
   347
	|connectSock sock|
e5b7d2005351 fixed for compilability
Claus Gittinger <cg@exept.de>
parents: 2824
diff changeset
   348
e5b7d2005351 fixed for compilability
Claus Gittinger <cg@exept.de>
parents: 2824
diff changeset
   349
	connectSock := Socket newTCPserverAtPort:9998.
e5b7d2005351 fixed for compilability
Claus Gittinger <cg@exept.de>
parents: 2824
diff changeset
   350
	connectSock isNil ifTrue:[
e5b7d2005351 fixed for compilability
Claus Gittinger <cg@exept.de>
parents: 2824
diff changeset
   351
	    Transcript showCR:'socket setup failed.'.
e5b7d2005351 fixed for compilability
Claus Gittinger <cg@exept.de>
parents: 2824
diff changeset
   352
	] ifFalse:[
e5b7d2005351 fixed for compilability
Claus Gittinger <cg@exept.de>
parents: 2824
diff changeset
   353
	    Transcript showCR:'listen ..'.
e5b7d2005351 fixed for compilability
Claus Gittinger <cg@exept.de>
parents: 2824
diff changeset
   354
	    (connectSock listenFor:5) ifFalse:[
e5b7d2005351 fixed for compilability
Claus Gittinger <cg@exept.de>
parents: 2824
diff changeset
   355
		Transcript showCR:'listen failed.'.
e5b7d2005351 fixed for compilability
Claus Gittinger <cg@exept.de>
parents: 2824
diff changeset
   356
	    ] ifTrue:[
e5b7d2005351 fixed for compilability
Claus Gittinger <cg@exept.de>
parents: 2824
diff changeset
   357
		Transcript showCR:'wait'.
e5b7d2005351 fixed for compilability
Claus Gittinger <cg@exept.de>
parents: 2824
diff changeset
   358
		connectSock readWait.
e5b7d2005351 fixed for compilability
Claus Gittinger <cg@exept.de>
parents: 2824
diff changeset
   359
		Transcript showCR:'accept'.
e5b7d2005351 fixed for compilability
Claus Gittinger <cg@exept.de>
parents: 2824
diff changeset
   360
		sock := connectSock accept.
e5b7d2005351 fixed for compilability
Claus Gittinger <cg@exept.de>
parents: 2824
diff changeset
   361
		sock isNil ifTrue:[
e5b7d2005351 fixed for compilability
Claus Gittinger <cg@exept.de>
parents: 2824
diff changeset
   362
		    Transcript showCR:'accept failed.'.
e5b7d2005351 fixed for compilability
Claus Gittinger <cg@exept.de>
parents: 2824
diff changeset
   363
		] ifFalse:[
e5b7d2005351 fixed for compilability
Claus Gittinger <cg@exept.de>
parents: 2824
diff changeset
   364
		    sock buffered:false.
e5b7d2005351 fixed for compilability
Claus Gittinger <cg@exept.de>
parents: 2824
diff changeset
   365
		    Transcript showCR:'server: got it'.
e5b7d2005351 fixed for compilability
Claus Gittinger <cg@exept.de>
parents: 2824
diff changeset
   366
		    'can now do transfer via sock'.
e5b7d2005351 fixed for compilability
Claus Gittinger <cg@exept.de>
parents: 2824
diff changeset
   367
		    Transcript showCR:'read'.
e5b7d2005351 fixed for compilability
Claus Gittinger <cg@exept.de>
parents: 2824
diff changeset
   368
		    Transcript showCR:('got: ' , sock nextLine).
e5b7d2005351 fixed for compilability
Claus Gittinger <cg@exept.de>
parents: 2824
diff changeset
   369
e5b7d2005351 fixed for compilability
Claus Gittinger <cg@exept.de>
parents: 2824
diff changeset
   370
		    Transcript showCR:'close'.
e5b7d2005351 fixed for compilability
Claus Gittinger <cg@exept.de>
parents: 2824
diff changeset
   371
		    sock close
e5b7d2005351 fixed for compilability
Claus Gittinger <cg@exept.de>
parents: 2824
diff changeset
   372
		].
e5b7d2005351 fixed for compilability
Claus Gittinger <cg@exept.de>
parents: 2824
diff changeset
   373
		connectSock close.
e5b7d2005351 fixed for compilability
Claus Gittinger <cg@exept.de>
parents: 2824
diff changeset
   374
	    ]
e5b7d2005351 fixed for compilability
Claus Gittinger <cg@exept.de>
parents: 2824
diff changeset
   375
	]
e5b7d2005351 fixed for compilability
Claus Gittinger <cg@exept.de>
parents: 2824
diff changeset
   376
									[exEnd]
42
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   377
99
7d016cc30052 fixed & moved pingWalk from SNMPSession to here;
Claus Gittinger <cg@exept.de>
parents: 98
diff changeset
   378
42
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   379
    example (connect to above server and send some data):
2825
e5b7d2005351 fixed for compilability
Claus Gittinger <cg@exept.de>
parents: 2824
diff changeset
   380
									[exBegin]
e5b7d2005351 fixed for compilability
Claus Gittinger <cg@exept.de>
parents: 2824
diff changeset
   381
	|sock|
e5b7d2005351 fixed for compilability
Claus Gittinger <cg@exept.de>
parents: 2824
diff changeset
   382
e5b7d2005351 fixed for compilability
Claus Gittinger <cg@exept.de>
parents: 2824
diff changeset
   383
	sock := Socket newTCPclientToHost:'localhost' port:9998.
e5b7d2005351 fixed for compilability
Claus Gittinger <cg@exept.de>
parents: 2824
diff changeset
   384
	sock isNil ifTrue:[
e5b7d2005351 fixed for compilability
Claus Gittinger <cg@exept.de>
parents: 2824
diff changeset
   385
	    Transcript showCR:'nope'
e5b7d2005351 fixed for compilability
Claus Gittinger <cg@exept.de>
parents: 2824
diff changeset
   386
	] ifFalse:[
e5b7d2005351 fixed for compilability
Claus Gittinger <cg@exept.de>
parents: 2824
diff changeset
   387
	    sock buffered:false.
e5b7d2005351 fixed for compilability
Claus Gittinger <cg@exept.de>
parents: 2824
diff changeset
   388
	    Transcript showCR:'client: got it'.
e5b7d2005351 fixed for compilability
Claus Gittinger <cg@exept.de>
parents: 2824
diff changeset
   389
	    'can now do transfer via sock'.
e5b7d2005351 fixed for compilability
Claus Gittinger <cg@exept.de>
parents: 2824
diff changeset
   390
	    Transcript showCR:'sending <hello>'.
e5b7d2005351 fixed for compilability
Claus Gittinger <cg@exept.de>
parents: 2824
diff changeset
   391
	    sock nextPutLine:'hello'.
e5b7d2005351 fixed for compilability
Claus Gittinger <cg@exept.de>
parents: 2824
diff changeset
   392
	    sock close
e5b7d2005351 fixed for compilability
Claus Gittinger <cg@exept.de>
parents: 2824
diff changeset
   393
	]
e5b7d2005351 fixed for compilability
Claus Gittinger <cg@exept.de>
parents: 2824
diff changeset
   394
									[exEnd]
117
03cefad7e40b UD socket example & interruptable bind
Claus Gittinger <cg@exept.de>
parents: 116
diff changeset
   395
03cefad7e40b UD socket example & interruptable bind
Claus Gittinger <cg@exept.de>
parents: 116
diff changeset
   396
    example: UNIX domain socket (await connection from a client and read some data):
1009
e0839f923a3c double underlines;
Claus Gittinger <cg@exept.de>
parents: 1007
diff changeset
   397
2825
e5b7d2005351 fixed for compilability
Claus Gittinger <cg@exept.de>
parents: 2824
diff changeset
   398
	|connectSock sock|
e5b7d2005351 fixed for compilability
Claus Gittinger <cg@exept.de>
parents: 2824
diff changeset
   399
e5b7d2005351 fixed for compilability
Claus Gittinger <cg@exept.de>
parents: 2824
diff changeset
   400
	'/tmp/ud_socket' asFilename remove.
e5b7d2005351 fixed for compilability
Claus Gittinger <cg@exept.de>
parents: 2824
diff changeset
   401
	connectSock := Socket newUNIXserverAt:'/tmp/ud_socket'.
e5b7d2005351 fixed for compilability
Claus Gittinger <cg@exept.de>
parents: 2824
diff changeset
   402
	connectSock isNil ifTrue:[
e5b7d2005351 fixed for compilability
Claus Gittinger <cg@exept.de>
parents: 2824
diff changeset
   403
	    Transcript showCR:'socket setup failed.'.
e5b7d2005351 fixed for compilability
Claus Gittinger <cg@exept.de>
parents: 2824
diff changeset
   404
	] ifFalse:[
e5b7d2005351 fixed for compilability
Claus Gittinger <cg@exept.de>
parents: 2824
diff changeset
   405
	    Transcript showCR:'listen ..'.
e5b7d2005351 fixed for compilability
Claus Gittinger <cg@exept.de>
parents: 2824
diff changeset
   406
	    (connectSock listenFor:5) ifFalse:[
e5b7d2005351 fixed for compilability
Claus Gittinger <cg@exept.de>
parents: 2824
diff changeset
   407
		Transcript showCR:'listen failed.'.
e5b7d2005351 fixed for compilability
Claus Gittinger <cg@exept.de>
parents: 2824
diff changeset
   408
	    ] ifTrue:[
e5b7d2005351 fixed for compilability
Claus Gittinger <cg@exept.de>
parents: 2824
diff changeset
   409
		Transcript showCR:'wait'.
e5b7d2005351 fixed for compilability
Claus Gittinger <cg@exept.de>
parents: 2824
diff changeset
   410
		connectSock buffered:false.
e5b7d2005351 fixed for compilability
Claus Gittinger <cg@exept.de>
parents: 2824
diff changeset
   411
		connectSock readWait.
e5b7d2005351 fixed for compilability
Claus Gittinger <cg@exept.de>
parents: 2824
diff changeset
   412
		Transcript showCR:'accept'.
e5b7d2005351 fixed for compilability
Claus Gittinger <cg@exept.de>
parents: 2824
diff changeset
   413
		sock := connectSock accept.
e5b7d2005351 fixed for compilability
Claus Gittinger <cg@exept.de>
parents: 2824
diff changeset
   414
		sock isNil ifTrue:[
e5b7d2005351 fixed for compilability
Claus Gittinger <cg@exept.de>
parents: 2824
diff changeset
   415
		    Transcript showCR:'accept failed.'.
e5b7d2005351 fixed for compilability
Claus Gittinger <cg@exept.de>
parents: 2824
diff changeset
   416
		] ifFalse:[
e5b7d2005351 fixed for compilability
Claus Gittinger <cg@exept.de>
parents: 2824
diff changeset
   417
		    sock buffered:false.
e5b7d2005351 fixed for compilability
Claus Gittinger <cg@exept.de>
parents: 2824
diff changeset
   418
		    Transcript showCR:'server: got it'.
e5b7d2005351 fixed for compilability
Claus Gittinger <cg@exept.de>
parents: 2824
diff changeset
   419
		    'can now do transfer via sock'.
e5b7d2005351 fixed for compilability
Claus Gittinger <cg@exept.de>
parents: 2824
diff changeset
   420
		    Transcript showCR:'read'.
e5b7d2005351 fixed for compilability
Claus Gittinger <cg@exept.de>
parents: 2824
diff changeset
   421
		    Transcript showCR:('got: ' , sock nextLine).
e5b7d2005351 fixed for compilability
Claus Gittinger <cg@exept.de>
parents: 2824
diff changeset
   422
e5b7d2005351 fixed for compilability
Claus Gittinger <cg@exept.de>
parents: 2824
diff changeset
   423
		    Transcript showCR:'close'.
e5b7d2005351 fixed for compilability
Claus Gittinger <cg@exept.de>
parents: 2824
diff changeset
   424
		    sock close
e5b7d2005351 fixed for compilability
Claus Gittinger <cg@exept.de>
parents: 2824
diff changeset
   425
		].
e5b7d2005351 fixed for compilability
Claus Gittinger <cg@exept.de>
parents: 2824
diff changeset
   426
		connectSock close.
e5b7d2005351 fixed for compilability
Claus Gittinger <cg@exept.de>
parents: 2824
diff changeset
   427
	    ]
e5b7d2005351 fixed for compilability
Claus Gittinger <cg@exept.de>
parents: 2824
diff changeset
   428
	]
117
03cefad7e40b UD socket example & interruptable bind
Claus Gittinger <cg@exept.de>
parents: 116
diff changeset
   429
03cefad7e40b UD socket example & interruptable bind
Claus Gittinger <cg@exept.de>
parents: 116
diff changeset
   430
118
142d5c273454 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 117
diff changeset
   431
    example (connect to above server and send some data;
2825
e5b7d2005351 fixed for compilability
Claus Gittinger <cg@exept.de>
parents: 2824
diff changeset
   432
	     Notice, this fails, if above server code is executed in the same ST/X image
e5b7d2005351 fixed for compilability
Claus Gittinger <cg@exept.de>
parents: 2824
diff changeset
   433
		     (at least on LINUX), since the OS does not correctly handle
e5b7d2005351 fixed for compilability
Claus Gittinger <cg@exept.de>
parents: 2824
diff changeset
   434
		     a connect from within an interrupted accept system call
e5b7d2005351 fixed for compilability
Claus Gittinger <cg@exept.de>
parents: 2824
diff changeset
   435
		     On SGI's SVR4, this works ok
e5b7d2005351 fixed for compilability
Claus Gittinger <cg@exept.de>
parents: 2824
diff changeset
   436
									[exBegin]
e5b7d2005351 fixed for compilability
Claus Gittinger <cg@exept.de>
parents: 2824
diff changeset
   437
	|sock|
e5b7d2005351 fixed for compilability
Claus Gittinger <cg@exept.de>
parents: 2824
diff changeset
   438
e5b7d2005351 fixed for compilability
Claus Gittinger <cg@exept.de>
parents: 2824
diff changeset
   439
	sock := Socket newUNIXclientTo:'/tmp/ud_socket'.
e5b7d2005351 fixed for compilability
Claus Gittinger <cg@exept.de>
parents: 2824
diff changeset
   440
	sock isNil ifTrue:[
e5b7d2005351 fixed for compilability
Claus Gittinger <cg@exept.de>
parents: 2824
diff changeset
   441
	    Transcript showCR:'nope'
e5b7d2005351 fixed for compilability
Claus Gittinger <cg@exept.de>
parents: 2824
diff changeset
   442
	] ifFalse:[
e5b7d2005351 fixed for compilability
Claus Gittinger <cg@exept.de>
parents: 2824
diff changeset
   443
	    sock buffered:false.
e5b7d2005351 fixed for compilability
Claus Gittinger <cg@exept.de>
parents: 2824
diff changeset
   444
	    Transcript showCR:'client: got it'.
e5b7d2005351 fixed for compilability
Claus Gittinger <cg@exept.de>
parents: 2824
diff changeset
   445
	    'can now do transfer via sock'.
e5b7d2005351 fixed for compilability
Claus Gittinger <cg@exept.de>
parents: 2824
diff changeset
   446
	    Transcript showCR:'sending <hello>'.
e5b7d2005351 fixed for compilability
Claus Gittinger <cg@exept.de>
parents: 2824
diff changeset
   447
	    sock nextPutLine:'hello'.
e5b7d2005351 fixed for compilability
Claus Gittinger <cg@exept.de>
parents: 2824
diff changeset
   448
	    sock close
e5b7d2005351 fixed for compilability
Claus Gittinger <cg@exept.de>
parents: 2824
diff changeset
   449
	]
e5b7d2005351 fixed for compilability
Claus Gittinger <cg@exept.de>
parents: 2824
diff changeset
   450
									[exEnd]
1007
5267b5738779 UDP examples
Claus Gittinger <cg@exept.de>
parents: 1004
diff changeset
   451
5267b5738779 UDP examples
Claus Gittinger <cg@exept.de>
parents: 1004
diff changeset
   452
5267b5738779 UDP examples
Claus Gittinger <cg@exept.de>
parents: 1004
diff changeset
   453
    example (UDP await packet from a client and read some data):
2825
e5b7d2005351 fixed for compilability
Claus Gittinger <cg@exept.de>
parents: 2824
diff changeset
   454
									[exBegin]
e5b7d2005351 fixed for compilability
Claus Gittinger <cg@exept.de>
parents: 2824
diff changeset
   455
	|udpSock sock addr n dataBuffer|
e5b7d2005351 fixed for compilability
Claus Gittinger <cg@exept.de>
parents: 2824
diff changeset
   456
e5b7d2005351 fixed for compilability
Claus Gittinger <cg@exept.de>
parents: 2824
diff changeset
   457
	udpSock := Socket newUDPserverAtPort:9999.
e5b7d2005351 fixed for compilability
Claus Gittinger <cg@exept.de>
parents: 2824
diff changeset
   458
	udpSock isNil ifTrue:[
e5b7d2005351 fixed for compilability
Claus Gittinger <cg@exept.de>
parents: 2824
diff changeset
   459
	    Transcript showCR:'socket setup failed.'.
e5b7d2005351 fixed for compilability
Claus Gittinger <cg@exept.de>
parents: 2824
diff changeset
   460
	] ifFalse:[
e5b7d2005351 fixed for compilability
Claus Gittinger <cg@exept.de>
parents: 2824
diff changeset
   461
	    Transcript showCR:'wait'.
e5b7d2005351 fixed for compilability
Claus Gittinger <cg@exept.de>
parents: 2824
diff changeset
   462
	    udpSock readWait.
e5b7d2005351 fixed for compilability
Claus Gittinger <cg@exept.de>
parents: 2824
diff changeset
   463
e5b7d2005351 fixed for compilability
Claus Gittinger <cg@exept.de>
parents: 2824
diff changeset
   464
	    addr := IPSocketAddress new.
e5b7d2005351 fixed for compilability
Claus Gittinger <cg@exept.de>
parents: 2824
diff changeset
   465
	    dataBuffer := ByteArray new:1000.
e5b7d2005351 fixed for compilability
Claus Gittinger <cg@exept.de>
parents: 2824
diff changeset
   466
	    n := udpSock receiveFrom:addr buffer:dataBuffer start:1 for:dataBuffer size.
e5b7d2005351 fixed for compilability
Claus Gittinger <cg@exept.de>
parents: 2824
diff changeset
   467
	    n > 0 ifTrue:[
e5b7d2005351 fixed for compilability
Claus Gittinger <cg@exept.de>
parents: 2824
diff changeset
   468
		Transcript showCR:('got: ' , n printString , 'bytes  from ' , addr printString).
e5b7d2005351 fixed for compilability
Claus Gittinger <cg@exept.de>
parents: 2824
diff changeset
   469
		Transcript showCR:('data: ' , (dataBuffer copyTo:n) printString).
e5b7d2005351 fixed for compilability
Claus Gittinger <cg@exept.de>
parents: 2824
diff changeset
   470
	    ] ifFalse:[
e5b7d2005351 fixed for compilability
Claus Gittinger <cg@exept.de>
parents: 2824
diff changeset
   471
		Transcript showCR:'read failed'.
e5b7d2005351 fixed for compilability
Claus Gittinger <cg@exept.de>
parents: 2824
diff changeset
   472
	    ].
e5b7d2005351 fixed for compilability
Claus Gittinger <cg@exept.de>
parents: 2824
diff changeset
   473
e5b7d2005351 fixed for compilability
Claus Gittinger <cg@exept.de>
parents: 2824
diff changeset
   474
	    Transcript showCR:'close'.
e5b7d2005351 fixed for compilability
Claus Gittinger <cg@exept.de>
parents: 2824
diff changeset
   475
	    udpSock close
e5b7d2005351 fixed for compilability
Claus Gittinger <cg@exept.de>
parents: 2824
diff changeset
   476
	]
e5b7d2005351 fixed for compilability
Claus Gittinger <cg@exept.de>
parents: 2824
diff changeset
   477
									[exEnd]
1007
5267b5738779 UDP examples
Claus Gittinger <cg@exept.de>
parents: 1004
diff changeset
   478
    example (connect to above UDP server and send some data;
2825
e5b7d2005351 fixed for compilability
Claus Gittinger <cg@exept.de>
parents: 2824
diff changeset
   479
									[exBegin]
e5b7d2005351 fixed for compilability
Claus Gittinger <cg@exept.de>
parents: 2824
diff changeset
   480
	|sock|
e5b7d2005351 fixed for compilability
Claus Gittinger <cg@exept.de>
parents: 2824
diff changeset
   481
e5b7d2005351 fixed for compilability
Claus Gittinger <cg@exept.de>
parents: 2824
diff changeset
   482
	sock := Socket newUDP.
e5b7d2005351 fixed for compilability
Claus Gittinger <cg@exept.de>
parents: 2824
diff changeset
   483
	sock isNil ifTrue:[
e5b7d2005351 fixed for compilability
Claus Gittinger <cg@exept.de>
parents: 2824
diff changeset
   484
	    Transcript showCR:'nope'
e5b7d2005351 fixed for compilability
Claus Gittinger <cg@exept.de>
parents: 2824
diff changeset
   485
	] ifFalse:[
e5b7d2005351 fixed for compilability
Claus Gittinger <cg@exept.de>
parents: 2824
diff changeset
   486
	    sock sendTo:(IPSocketAddress new hostName:'localhost' port:9999) buffer:'hello world'.
e5b7d2005351 fixed for compilability
Claus Gittinger <cg@exept.de>
parents: 2824
diff changeset
   487
	    sock close
e5b7d2005351 fixed for compilability
Claus Gittinger <cg@exept.de>
parents: 2824
diff changeset
   488
	]
e5b7d2005351 fixed for compilability
Claus Gittinger <cg@exept.de>
parents: 2824
diff changeset
   489
									[exEnd]
99
7d016cc30052 fixed & moved pingWalk from SNMPSession to here;
Claus Gittinger <cg@exept.de>
parents: 98
diff changeset
   490
7d016cc30052 fixed & moved pingWalk from SNMPSession to here;
Claus Gittinger <cg@exept.de>
parents: 98
diff changeset
   491
    example: pingWalk (try to ping hosts on the local network)
2824
b00dc482dd03 comment/format in: #examples
Stefan Vogel <sv@exept.de>
parents: 2823
diff changeset
   492
    Note: it dosen't use ICMP ping, but tries to reache the echo service,
2825
e5b7d2005351 fixed for compilability
Claus Gittinger <cg@exept.de>
parents: 2824
diff changeset
   493
	  which is disabled on most OS.
e5b7d2005351 fixed for compilability
Claus Gittinger <cg@exept.de>
parents: 2824
diff changeset
   494
									[exBegin]
e5b7d2005351 fixed for compilability
Claus Gittinger <cg@exept.de>
parents: 2824
diff changeset
   495
	|myAddress list top hosts walkProcess port|
e5b7d2005351 fixed for compilability
Claus Gittinger <cg@exept.de>
parents: 2824
diff changeset
   496
e5b7d2005351 fixed for compilability
Claus Gittinger <cg@exept.de>
parents: 2824
diff changeset
   497
	myAddress := OperatingSystem getNetworkAddresses
e5b7d2005351 fixed for compilability
Claus Gittinger <cg@exept.de>
parents: 2824
diff changeset
   498
			keysAndValuesSelect:[:eachIFName :eachAddress|
e5b7d2005351 fixed for compilability
Claus Gittinger <cg@exept.de>
parents: 2824
diff changeset
   499
			    eachAddress isLocal not
e5b7d2005351 fixed for compilability
Claus Gittinger <cg@exept.de>
parents: 2824
diff changeset
   500
			    and:[eachIFName = 'wlan0']
e5b7d2005351 fixed for compilability
Claus Gittinger <cg@exept.de>
parents: 2824
diff changeset
   501
			].
e5b7d2005351 fixed for compilability
Claus Gittinger <cg@exept.de>
parents: 2824
diff changeset
   502
	myAddress := myAddress first hostAddress.
e5b7d2005351 fixed for compilability
Claus Gittinger <cg@exept.de>
parents: 2824
diff changeset
   503
e5b7d2005351 fixed for compilability
Claus Gittinger <cg@exept.de>
parents: 2824
diff changeset
   504
	port := Socket portOfService:'echo'.
e5b7d2005351 fixed for compilability
Claus Gittinger <cg@exept.de>
parents: 2824
diff changeset
   505
	port isNil ifTrue:[
e5b7d2005351 fixed for compilability
Claus Gittinger <cg@exept.de>
parents: 2824
diff changeset
   506
	    self error:'dont know echo port'.
e5b7d2005351 fixed for compilability
Claus Gittinger <cg@exept.de>
parents: 2824
diff changeset
   507
	    ^ self
e5b7d2005351 fixed for compilability
Claus Gittinger <cg@exept.de>
parents: 2824
diff changeset
   508
	].
e5b7d2005351 fixed for compilability
Claus Gittinger <cg@exept.de>
parents: 2824
diff changeset
   509
e5b7d2005351 fixed for compilability
Claus Gittinger <cg@exept.de>
parents: 2824
diff changeset
   510
	top := StandardSystemView new.
e5b7d2005351 fixed for compilability
Claus Gittinger <cg@exept.de>
parents: 2824
diff changeset
   511
	top label:'PING net walk'.
e5b7d2005351 fixed for compilability
Claus Gittinger <cg@exept.de>
parents: 2824
diff changeset
   512
e5b7d2005351 fixed for compilability
Claus Gittinger <cg@exept.de>
parents: 2824
diff changeset
   513
	list := ScrollableView for:ListView in:top.
e5b7d2005351 fixed for compilability
Claus Gittinger <cg@exept.de>
parents: 2824
diff changeset
   514
	list origin:0.0@0.0 corner:1.0@1.0.
e5b7d2005351 fixed for compilability
Claus Gittinger <cg@exept.de>
parents: 2824
diff changeset
   515
e5b7d2005351 fixed for compilability
Claus Gittinger <cg@exept.de>
parents: 2824
diff changeset
   516
	top openAndWait.
e5b7d2005351 fixed for compilability
Claus Gittinger <cg@exept.de>
parents: 2824
diff changeset
   517
e5b7d2005351 fixed for compilability
Claus Gittinger <cg@exept.de>
parents: 2824
diff changeset
   518
	walkProcess := [
e5b7d2005351 fixed for compilability
Claus Gittinger <cg@exept.de>
parents: 2824
diff changeset
   519
	    |l low hi direction tryHostID dottedName hostName conn addr|
e5b7d2005351 fixed for compilability
Claus Gittinger <cg@exept.de>
parents: 2824
diff changeset
   520
e5b7d2005351 fixed for compilability
Claus Gittinger <cg@exept.de>
parents: 2824
diff changeset
   521
	    l := SortedCollection new.
e5b7d2005351 fixed for compilability
Claus Gittinger <cg@exept.de>
parents: 2824
diff changeset
   522
e5b7d2005351 fixed for compilability
Claus Gittinger <cg@exept.de>
parents: 2824
diff changeset
   523
	    ' only works with type C-net
e5b7d2005351 fixed for compilability
Claus Gittinger <cg@exept.de>
parents: 2824
diff changeset
   524
	      the code below could simply do 1 to:254 do:[:hostID }
e5b7d2005351 fixed for compilability
Claus Gittinger <cg@exept.de>
parents: 2824
diff changeset
   525
	      but, to probe likely hosts earlier, the probing is done
e5b7d2005351 fixed for compilability
Claus Gittinger <cg@exept.de>
parents: 2824
diff changeset
   526
	      ping-pong like around my ip-address (assuming, that other machines
e5b7d2005351 fixed for compilability
Claus Gittinger <cg@exept.de>
parents: 2824
diff changeset
   527
	      have numbers around my own)'.
e5b7d2005351 fixed for compilability
Claus Gittinger <cg@exept.de>
parents: 2824
diff changeset
   528
e5b7d2005351 fixed for compilability
Claus Gittinger <cg@exept.de>
parents: 2824
diff changeset
   529
	    low := hi := (myAddress at:4).
e5b7d2005351 fixed for compilability
Claus Gittinger <cg@exept.de>
parents: 2824
diff changeset
   530
	    direction := 1.
e5b7d2005351 fixed for compilability
Claus Gittinger <cg@exept.de>
parents: 2824
diff changeset
   531
e5b7d2005351 fixed for compilability
Claus Gittinger <cg@exept.de>
parents: 2824
diff changeset
   532
	    [low > 0 or:[hi < 255]] whileTrue:[
e5b7d2005351 fixed for compilability
Claus Gittinger <cg@exept.de>
parents: 2824
diff changeset
   533
		direction > 0 ifTrue:[
e5b7d2005351 fixed for compilability
Claus Gittinger <cg@exept.de>
parents: 2824
diff changeset
   534
		    hi := hi + 1.
e5b7d2005351 fixed for compilability
Claus Gittinger <cg@exept.de>
parents: 2824
diff changeset
   535
		    tryHostID := hi.
e5b7d2005351 fixed for compilability
Claus Gittinger <cg@exept.de>
parents: 2824
diff changeset
   536
		    direction := -1.
e5b7d2005351 fixed for compilability
Claus Gittinger <cg@exept.de>
parents: 2824
diff changeset
   537
		] ifFalse:[
e5b7d2005351 fixed for compilability
Claus Gittinger <cg@exept.de>
parents: 2824
diff changeset
   538
		    low := low - 1.
e5b7d2005351 fixed for compilability
Claus Gittinger <cg@exept.de>
parents: 2824
diff changeset
   539
		    tryHostID := low.
e5b7d2005351 fixed for compilability
Claus Gittinger <cg@exept.de>
parents: 2824
diff changeset
   540
		    direction := 1.
e5b7d2005351 fixed for compilability
Claus Gittinger <cg@exept.de>
parents: 2824
diff changeset
   541
		].
e5b7d2005351 fixed for compilability
Claus Gittinger <cg@exept.de>
parents: 2824
diff changeset
   542
		(tryHostID between:1 and:254) ifTrue:[
e5b7d2005351 fixed for compilability
Claus Gittinger <cg@exept.de>
parents: 2824
diff changeset
   543
		    dottedName := (myAddress at:1) printString
e5b7d2005351 fixed for compilability
Claus Gittinger <cg@exept.de>
parents: 2824
diff changeset
   544
				  , '.' , (myAddress at:2) printString
e5b7d2005351 fixed for compilability
Claus Gittinger <cg@exept.de>
parents: 2824
diff changeset
   545
				  , '.' , (myAddress at:3) printString
e5b7d2005351 fixed for compilability
Claus Gittinger <cg@exept.de>
parents: 2824
diff changeset
   546
				  , '.' , tryHostID printString.
e5b7d2005351 fixed for compilability
Claus Gittinger <cg@exept.de>
parents: 2824
diff changeset
   547
e5b7d2005351 fixed for compilability
Claus Gittinger <cg@exept.de>
parents: 2824
diff changeset
   548
		    top label:'PING net walk - trying ' , dottedName.
e5b7d2005351 fixed for compilability
Claus Gittinger <cg@exept.de>
parents: 2824
diff changeset
   549
e5b7d2005351 fixed for compilability
Claus Gittinger <cg@exept.de>
parents: 2824
diff changeset
   550
		    top windowGroup withCursor:Cursor wait do:[
e5b7d2005351 fixed for compilability
Claus Gittinger <cg@exept.de>
parents: 2824
diff changeset
   551
			conn := Socket newTCPclientToHost:dottedName port:port withTimeout:1000.
e5b7d2005351 fixed for compilability
Claus Gittinger <cg@exept.de>
parents: 2824
diff changeset
   552
			conn notNil ifTrue:[
e5b7d2005351 fixed for compilability
Claus Gittinger <cg@exept.de>
parents: 2824
diff changeset
   553
			    addr := Socket ipAddressOfHost:dottedName.
e5b7d2005351 fixed for compilability
Claus Gittinger <cg@exept.de>
parents: 2824
diff changeset
   554
			    hostName := Socket hostWithIpAddress:addr.
e5b7d2005351 fixed for compilability
Claus Gittinger <cg@exept.de>
parents: 2824
diff changeset
   555
			    hostName isNil ifTrue:[
e5b7d2005351 fixed for compilability
Claus Gittinger <cg@exept.de>
parents: 2824
diff changeset
   556
				hostName :='?'
e5b7d2005351 fixed for compilability
Claus Gittinger <cg@exept.de>
parents: 2824
diff changeset
   557
			    ].
e5b7d2005351 fixed for compilability
Claus Gittinger <cg@exept.de>
parents: 2824
diff changeset
   558
			    l add:(dottedName paddedTo:15 with:Character space)
e5b7d2005351 fixed for compilability
Claus Gittinger <cg@exept.de>
parents: 2824
diff changeset
   559
				   , ' '
e5b7d2005351 fixed for compilability
Claus Gittinger <cg@exept.de>
parents: 2824
diff changeset
   560
				   , (hostName paddedTo:15 with:Character space)
e5b7d2005351 fixed for compilability
Claus Gittinger <cg@exept.de>
parents: 2824
diff changeset
   561
				   , ' up & reachable'.
e5b7d2005351 fixed for compilability
Claus Gittinger <cg@exept.de>
parents: 2824
diff changeset
   562
			    list list:l.
e5b7d2005351 fixed for compilability
Claus Gittinger <cg@exept.de>
parents: 2824
diff changeset
   563
			    conn close.
e5b7d2005351 fixed for compilability
Claus Gittinger <cg@exept.de>
parents: 2824
diff changeset
   564
			]
e5b7d2005351 fixed for compilability
Claus Gittinger <cg@exept.de>
parents: 2824
diff changeset
   565
		    ].
e5b7d2005351 fixed for compilability
Claus Gittinger <cg@exept.de>
parents: 2824
diff changeset
   566
		].
e5b7d2005351 fixed for compilability
Claus Gittinger <cg@exept.de>
parents: 2824
diff changeset
   567
	    ].
e5b7d2005351 fixed for compilability
Claus Gittinger <cg@exept.de>
parents: 2824
diff changeset
   568
	    top label:'PING reachable hosts'.
e5b7d2005351 fixed for compilability
Claus Gittinger <cg@exept.de>
parents: 2824
diff changeset
   569
	] forkAt:(Processor userBackgroundPriority).
e5b7d2005351 fixed for compilability
Claus Gittinger <cg@exept.de>
parents: 2824
diff changeset
   570
	walkProcess name:'ping net walker'.
e5b7d2005351 fixed for compilability
Claus Gittinger <cg@exept.de>
parents: 2824
diff changeset
   571
									[exEnd]
e5b7d2005351 fixed for compilability
Claus Gittinger <cg@exept.de>
parents: 2824
diff changeset
   572
e5b7d2005351 fixed for compilability
Claus Gittinger <cg@exept.de>
parents: 2824
diff changeset
   573
e5b7d2005351 fixed for compilability
Claus Gittinger <cg@exept.de>
parents: 2824
diff changeset
   574
	This example creates a simple UDP server that accepts
e5b7d2005351 fixed for compilability
Claus Gittinger <cg@exept.de>
parents: 2824
diff changeset
   575
	single packets from anybody and broadcasts them to all
e5b7d2005351 fixed for compilability
Claus Gittinger <cg@exept.de>
parents: 2824
diff changeset
   576
	clients that have connected so far.
e5b7d2005351 fixed for compilability
Claus Gittinger <cg@exept.de>
parents: 2824
diff changeset
   577
e5b7d2005351 fixed for compilability
Claus Gittinger <cg@exept.de>
parents: 2824
diff changeset
   578
									[exBegin]
e5b7d2005351 fixed for compilability
Claus Gittinger <cg@exept.de>
parents: 2824
diff changeset
   579
	| socket address buffer msgSize clients |
e5b7d2005351 fixed for compilability
Claus Gittinger <cg@exept.de>
parents: 2824
diff changeset
   580
	clients := Set new.
e5b7d2005351 fixed for compilability
Claus Gittinger <cg@exept.de>
parents: 2824
diff changeset
   581
	address := IPSocketAddress new.
e5b7d2005351 fixed for compilability
Claus Gittinger <cg@exept.de>
parents: 2824
diff changeset
   582
	buffer := String new: 1024.
e5b7d2005351 fixed for compilability
Claus Gittinger <cg@exept.de>
parents: 2824
diff changeset
   583
e5b7d2005351 fixed for compilability
Claus Gittinger <cg@exept.de>
parents: 2824
diff changeset
   584
	socket := self newUDPserverAtPort: 6666.
e5b7d2005351 fixed for compilability
Claus Gittinger <cg@exept.de>
parents: 2824
diff changeset
   585
e5b7d2005351 fixed for compilability
Claus Gittinger <cg@exept.de>
parents: 2824
diff changeset
   586
	Transcript showCR: 'server starting'.
e5b7d2005351 fixed for compilability
Claus Gittinger <cg@exept.de>
parents: 2824
diff changeset
   587
e5b7d2005351 fixed for compilability
Claus Gittinger <cg@exept.de>
parents: 2824
diff changeset
   588
	[
e5b7d2005351 fixed for compilability
Claus Gittinger <cg@exept.de>
parents: 2824
diff changeset
   589
	    [true] whileTrue: [
e5b7d2005351 fixed for compilability
Claus Gittinger <cg@exept.de>
parents: 2824
diff changeset
   590
		(socket readWaitWithTimeoutMs: 200) ifFalse: [
e5b7d2005351 fixed for compilability
Claus Gittinger <cg@exept.de>
parents: 2824
diff changeset
   591
		    msgSize := socket
e5b7d2005351 fixed for compilability
Claus Gittinger <cg@exept.de>
parents: 2824
diff changeset
   592
			    receiveFrom: address
e5b7d2005351 fixed for compilability
Claus Gittinger <cg@exept.de>
parents: 2824
diff changeset
   593
			    buffer: buffer
e5b7d2005351 fixed for compilability
Claus Gittinger <cg@exept.de>
parents: 2824
diff changeset
   594
			    start: 1
e5b7d2005351 fixed for compilability
Claus Gittinger <cg@exept.de>
parents: 2824
diff changeset
   595
			    for: buffer size.
e5b7d2005351 fixed for compilability
Claus Gittinger <cg@exept.de>
parents: 2824
diff changeset
   596
e5b7d2005351 fixed for compilability
Claus Gittinger <cg@exept.de>
parents: 2824
diff changeset
   597
		    clients add: address copy.
e5b7d2005351 fixed for compilability
Claus Gittinger <cg@exept.de>
parents: 2824
diff changeset
   598
		    clients do: [ :clientAddress |
e5b7d2005351 fixed for compilability
Claus Gittinger <cg@exept.de>
parents: 2824
diff changeset
   599
			    socket
e5b7d2005351 fixed for compilability
Claus Gittinger <cg@exept.de>
parents: 2824
diff changeset
   600
				    sendTo: clientAddress
e5b7d2005351 fixed for compilability
Claus Gittinger <cg@exept.de>
parents: 2824
diff changeset
   601
				    buffer: buffer
e5b7d2005351 fixed for compilability
Claus Gittinger <cg@exept.de>
parents: 2824
diff changeset
   602
				    start: 1
e5b7d2005351 fixed for compilability
Claus Gittinger <cg@exept.de>
parents: 2824
diff changeset
   603
				    for: msgSize]]
e5b7d2005351 fixed for compilability
Claus Gittinger <cg@exept.de>
parents: 2824
diff changeset
   604
	    ]
e5b7d2005351 fixed for compilability
Claus Gittinger <cg@exept.de>
parents: 2824
diff changeset
   605
	] ensure:[
e5b7d2005351 fixed for compilability
Claus Gittinger <cg@exept.de>
parents: 2824
diff changeset
   606
	    Transcript showCR: 'server shutting down'.
e5b7d2005351 fixed for compilability
Claus Gittinger <cg@exept.de>
parents: 2824
diff changeset
   607
	    socket close
e5b7d2005351 fixed for compilability
Claus Gittinger <cg@exept.de>
parents: 2824
diff changeset
   608
	]
e5b7d2005351 fixed for compilability
Claus Gittinger <cg@exept.de>
parents: 2824
diff changeset
   609
									[exEnd]
817
eda0065cbd47 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 814
diff changeset
   610
eda0065cbd47 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 814
diff changeset
   611
   send a datagram to above server:
2825
e5b7d2005351 fixed for compilability
Claus Gittinger <cg@exept.de>
parents: 2824
diff changeset
   612
									[exBegin]
e5b7d2005351 fixed for compilability
Claus Gittinger <cg@exept.de>
parents: 2824
diff changeset
   613
e5b7d2005351 fixed for compilability
Claus Gittinger <cg@exept.de>
parents: 2824
diff changeset
   614
	| socket address buffer host msg |
e5b7d2005351 fixed for compilability
Claus Gittinger <cg@exept.de>
parents: 2824
diff changeset
   615
e5b7d2005351 fixed for compilability
Claus Gittinger <cg@exept.de>
parents: 2824
diff changeset
   616
	host := Dialog
e5b7d2005351 fixed for compilability
Claus Gittinger <cg@exept.de>
parents: 2824
diff changeset
   617
		request: 'What is the name of the server''s host?'
e5b7d2005351 fixed for compilability
Claus Gittinger <cg@exept.de>
parents: 2824
diff changeset
   618
		initialAnswer: 'localhost'.
e5b7d2005351 fixed for compilability
Claus Gittinger <cg@exept.de>
parents: 2824
diff changeset
   619
e5b7d2005351 fixed for compilability
Claus Gittinger <cg@exept.de>
parents: 2824
diff changeset
   620
	socket := self newUDP.
e5b7d2005351 fixed for compilability
Claus Gittinger <cg@exept.de>
parents: 2824
diff changeset
   621
e5b7d2005351 fixed for compilability
Claus Gittinger <cg@exept.de>
parents: 2824
diff changeset
   622
	address := IPSocketAddress hostName: host port: 6666.
e5b7d2005351 fixed for compilability
Claus Gittinger <cg@exept.de>
parents: 2824
diff changeset
   623
e5b7d2005351 fixed for compilability
Claus Gittinger <cg@exept.de>
parents: 2824
diff changeset
   624
	buffer := ByteArray new: 1000.
e5b7d2005351 fixed for compilability
Claus Gittinger <cg@exept.de>
parents: 2824
diff changeset
   625
	[
e5b7d2005351 fixed for compilability
Claus Gittinger <cg@exept.de>
parents: 2824
diff changeset
   626
	    [(msg := Dialog request: 'Say something') isEmpty] whileFalse:[
e5b7d2005351 fixed for compilability
Claus Gittinger <cg@exept.de>
parents: 2824
diff changeset
   627
		| replySize stream |
e5b7d2005351 fixed for compilability
Claus Gittinger <cg@exept.de>
parents: 2824
diff changeset
   628
e5b7d2005351 fixed for compilability
Claus Gittinger <cg@exept.de>
parents: 2824
diff changeset
   629
		socket writeWait.
e5b7d2005351 fixed for compilability
Claus Gittinger <cg@exept.de>
parents: 2824
diff changeset
   630
		stream := buffer writeStream.
e5b7d2005351 fixed for compilability
Claus Gittinger <cg@exept.de>
parents: 2824
diff changeset
   631
		stream nextPutAll: msg.
e5b7d2005351 fixed for compilability
Claus Gittinger <cg@exept.de>
parents: 2824
diff changeset
   632
		socket sendTo:address buffer:buffer start:1 for:stream position.
e5b7d2005351 fixed for compilability
Claus Gittinger <cg@exept.de>
parents: 2824
diff changeset
   633
		socket readWait.
e5b7d2005351 fixed for compilability
Claus Gittinger <cg@exept.de>
parents: 2824
diff changeset
   634
e5b7d2005351 fixed for compilability
Claus Gittinger <cg@exept.de>
parents: 2824
diff changeset
   635
		replySize := socket receiveFrom:address buffer:buffer.
e5b7d2005351 fixed for compilability
Claus Gittinger <cg@exept.de>
parents: 2824
diff changeset
   636
		replySize > 0 ifTrue: [
e5b7d2005351 fixed for compilability
Claus Gittinger <cg@exept.de>
parents: 2824
diff changeset
   637
		    Transcript cr; nextPutAll: 'Server acknowledged: '.
e5b7d2005351 fixed for compilability
Claus Gittinger <cg@exept.de>
parents: 2824
diff changeset
   638
		    Transcript show: ((buffer copyFrom: 1 to: replySize) asString)
e5b7d2005351 fixed for compilability
Claus Gittinger <cg@exept.de>
parents: 2824
diff changeset
   639
		]
e5b7d2005351 fixed for compilability
Claus Gittinger <cg@exept.de>
parents: 2824
diff changeset
   640
	    ]
e5b7d2005351 fixed for compilability
Claus Gittinger <cg@exept.de>
parents: 2824
diff changeset
   641
	] ensure: [socket close].
e5b7d2005351 fixed for compilability
Claus Gittinger <cg@exept.de>
parents: 2824
diff changeset
   642
	Transcript cr
e5b7d2005351 fixed for compilability
Claus Gittinger <cg@exept.de>
parents: 2824
diff changeset
   643
									[exEnd]
1316
ffe05bfee9b5 example
Claus Gittinger <cg@exept.de>
parents: 1313
diff changeset
   644
ffe05bfee9b5 example
Claus Gittinger <cg@exept.de>
parents: 1313
diff changeset
   645
ffe05bfee9b5 example
Claus Gittinger <cg@exept.de>
parents: 1313
diff changeset
   646
   loopBack:
2825
e5b7d2005351 fixed for compilability
Claus Gittinger <cg@exept.de>
parents: 2824
diff changeset
   647
									[exBegin]
e5b7d2005351 fixed for compilability
Claus Gittinger <cg@exept.de>
parents: 2824
diff changeset
   648
e5b7d2005351 fixed for compilability
Claus Gittinger <cg@exept.de>
parents: 2824
diff changeset
   649
	|readerTask readingSocket writingSocket|
e5b7d2005351 fixed for compilability
Claus Gittinger <cg@exept.de>
parents: 2824
diff changeset
   650
e5b7d2005351 fixed for compilability
Claus Gittinger <cg@exept.de>
parents: 2824
diff changeset
   651
	readingSocket := self newTCPserverAtPort:9999.
e5b7d2005351 fixed for compilability
Claus Gittinger <cg@exept.de>
parents: 2824
diff changeset
   652
	readerTask :=
e5b7d2005351 fixed for compilability
Claus Gittinger <cg@exept.de>
parents: 2824
diff changeset
   653
	    [
e5b7d2005351 fixed for compilability
Claus Gittinger <cg@exept.de>
parents: 2824
diff changeset
   654
		|connection|
e5b7d2005351 fixed for compilability
Claus Gittinger <cg@exept.de>
parents: 2824
diff changeset
   655
e5b7d2005351 fixed for compilability
Claus Gittinger <cg@exept.de>
parents: 2824
diff changeset
   656
		readingSocket listenFor:1.
e5b7d2005351 fixed for compilability
Claus Gittinger <cg@exept.de>
parents: 2824
diff changeset
   657
		connection := readingSocket accept.
e5b7d2005351 fixed for compilability
Claus Gittinger <cg@exept.de>
parents: 2824
diff changeset
   658
		readingSocket close.
e5b7d2005351 fixed for compilability
Claus Gittinger <cg@exept.de>
parents: 2824
diff changeset
   659
		[connection atEnd] whileFalse:[
e5b7d2005351 fixed for compilability
Claus Gittinger <cg@exept.de>
parents: 2824
diff changeset
   660
		    Transcript showCR:(connection nextLine).
e5b7d2005351 fixed for compilability
Claus Gittinger <cg@exept.de>
parents: 2824
diff changeset
   661
		].
e5b7d2005351 fixed for compilability
Claus Gittinger <cg@exept.de>
parents: 2824
diff changeset
   662
		connection close.
e5b7d2005351 fixed for compilability
Claus Gittinger <cg@exept.de>
parents: 2824
diff changeset
   663
	    ] fork.
e5b7d2005351 fixed for compilability
Claus Gittinger <cg@exept.de>
parents: 2824
diff changeset
   664
e5b7d2005351 fixed for compilability
Claus Gittinger <cg@exept.de>
parents: 2824
diff changeset
   665
	Delay waitForSeconds:1.
e5b7d2005351 fixed for compilability
Claus Gittinger <cg@exept.de>
parents: 2824
diff changeset
   666
	writingSocket := self newTCPclientToHost:'localhost' port:9999.
e5b7d2005351 fixed for compilability
Claus Gittinger <cg@exept.de>
parents: 2824
diff changeset
   667
	writingSocket nextPutLine:'Hello'.
e5b7d2005351 fixed for compilability
Claus Gittinger <cg@exept.de>
parents: 2824
diff changeset
   668
	writingSocket nextPutLine:'World'.
e5b7d2005351 fixed for compilability
Claus Gittinger <cg@exept.de>
parents: 2824
diff changeset
   669
	writingSocket close.
e5b7d2005351 fixed for compilability
Claus Gittinger <cg@exept.de>
parents: 2824
diff changeset
   670
									[exEnd]
25
996051271ce9 *** empty log message ***
claus
parents: 21
diff changeset
   671
"
996051271ce9 *** empty log message ***
claus
parents: 21
diff changeset
   672
! !
996051271ce9 *** empty log message ***
claus
parents: 21
diff changeset
   673
1462
5602fce52b42 squeak stuff
Claus Gittinger <cg@exept.de>
parents: 1413
diff changeset
   674
!Socket class methodsFor:'instance creation'!
126
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
   675
3059
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
   676
bindTo:aSocketAddress type:aTypeSymbol
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
   677
    "create a socket for a specific type
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
   678
     and bind it to aSocketAddress.
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
   679
     Type must be:
3217
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
   680
	#stream, #datagram or #raw
3059
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
   681
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
   682
     Neither connect nor connect-wait is done."
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
   683
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
   684
    |newSock|
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
   685
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
   686
    newSock := self domain:aSocketAddress domain type:aTypeSymbol.
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
   687
    [
3217
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
   688
	newSock bindTo:aSocketAddress reuseAddress:true.
3059
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
   689
    ] ifCurtailed:[
3217
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
   690
	newSock close.
3059
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
   691
    ].
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
   692
    ^ newSock
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
   693
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
   694
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
   695
    "
3217
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
   696
	Socket bindTo:(IPSocketAddress anyHost port:8081) type:#stream.
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
   697
	Socket bindTo:(IPv6SocketAddress anyHost port:8081) type:#datagram.
3059
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
   698
    "
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
   699
!
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
   700
126
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
   701
domain:domainSymbol type:type
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
   702
    "create a socket for domain and type -
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
   703
     neither any connect nor binding is done.
1485
d8578cf3504b gcc3.3.1 insn-scheduler bug workaround
Claus Gittinger <cg@exept.de>
parents: 1474
diff changeset
   704
     Domain must be one of the symbols:
3217
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
   705
	#inet, #unix, #appletalk, #decnet, #xns, ...;
819
4cc15700d123 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 817
diff changeset
   706
     Type must be:
3217
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
   707
	#stream, #datagram or #raw
3059
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
   708
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
   709
     XXX: currently only the #AF_INET and #AF_INET6 and #AF_UNIX domains are supported"
126
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
   710
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
   711
    ^ self new domain:domainSymbol type:type
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
   712
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
   713
    "
3059
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
   714
     Socket domain:#AF_INET type:#stream
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
   715
     Socket domain:#AF_INET type:#datagram
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
   716
     Socket domain:#AF_INET6 type:#stream
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
   717
     Socket domain:#AF_INET6 type:#datagram
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
   718
     Socket domain:#AF_UNIX type:#stream
126
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
   719
    "
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
   720
!
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
   721
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
   722
newTCP
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
   723
    "create a TCP socket - no binding or other setup is done,
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
   724
     neither connect nor connect-wait is done."
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
   725
3059
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
   726
    ^ self new domain:#'AF_INET' type:#stream
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
   727
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
   728
    "
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
   729
      Socket newTCP
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
   730
    "
126
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
   731
!
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
   732
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
   733
newTCP:aServiceOrNil
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
   734
    "create a TCP socket for a service -
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
   735
     neither connect nor connect-wait is done."
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
   736
3059
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
   737
    |newSock socketAddress socketAddressClass|
126
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
   738
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
   739
    newSock := self newTCP.
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
   740
    (newSock notNil and:[aServiceOrNil notNil]) ifTrue:[
3217
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
   741
	[
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
   742
	    socketAddressClass := newSock socketAddressClass.
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
   743
	    socketAddress := socketAddressClass hostName:nil serviceName:aServiceOrNil type:#stream.
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
   744
	    socketAddress hostAddress:socketAddressClass anyAddress.
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
   745
	    newSock bindTo:socketAddress reuseAddress:true.
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
   746
	] ifCurtailed:[
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
   747
	    newSock close.
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
   748
	]
126
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
   749
    ].
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
   750
    ^ newSock
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
   751
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
   752
1911
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
   753
    "
3217
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
   754
	Socket newTCP:'http-alt'.
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
   755
	Socket newTCP:9996.
1911
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
   756
    "
126
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
   757
!
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
   758
576
13acab81fad0 more ST80 compatibility
ca
parents: 572
diff changeset
   759
newTCPclientToAddress:aHostAddress port:aService
13acab81fad0 more ST80 compatibility
ca
parents: 572
diff changeset
   760
    "create a new TCP client socket connecting to a service.
13acab81fad0 more ST80 compatibility
ca
parents: 572
diff changeset
   761
     Return a socket instance if ok, nil on failure.
13acab81fad0 more ST80 compatibility
ca
parents: 572
diff changeset
   762
     Block until a connection is established (but only the current thread;
1485
d8578cf3504b gcc3.3.1 insn-scheduler bug workaround
Claus Gittinger <cg@exept.de>
parents: 1474
diff changeset
   763
     not the whole smalltalk).
576
13acab81fad0 more ST80 compatibility
ca
parents: 572
diff changeset
   764
     See also: #newTCPclientToAddress:port:withTimeout:"
13acab81fad0 more ST80 compatibility
ca
parents: 572
diff changeset
   765
13acab81fad0 more ST80 compatibility
ca
parents: 572
diff changeset
   766
    ^ self newTCPclientToAddress:aHostAddress port:aService withTimeout:nil
13acab81fad0 more ST80 compatibility
ca
parents: 572
diff changeset
   767
!
13acab81fad0 more ST80 compatibility
ca
parents: 572
diff changeset
   768
3059
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
   769
newTCPclientToAddress:aSocketAddressOrByteArray port:aService withTimeout:millis
576
13acab81fad0 more ST80 compatibility
ca
parents: 572
diff changeset
   770
    "create a new TCP client socket connecting to a service.
13acab81fad0 more ST80 compatibility
ca
parents: 572
diff changeset
   771
     Return a socket instance if ok, nil on failure.
13acab81fad0 more ST80 compatibility
ca
parents: 572
diff changeset
   772
     If the millis arg is nonNil, stop trying to connect after that many milliseconds
811
72d9ac1a7f95 comments
Claus Gittinger <cg@exept.de>
parents: 809
diff changeset
   773
     and return nil."
576
13acab81fad0 more ST80 compatibility
ca
parents: 572
diff changeset
   774
3059
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
   775
    |port socketAddress|
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
   776
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
   777
    aService isString ifTrue:[
3217
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
   778
	port := self portOfService:aService protocol:#tcp.
3059
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
   779
    ] ifFalse:[
3217
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
   780
	port := aService.
3059
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
   781
    ].
3217
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
   782
    socketAddress := aSocketAddressOrByteArray isSocketAddress
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
   783
			ifTrue:[aSocketAddressOrByteArray]
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
   784
			ifFalse:[
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
   785
			    "Passing ByteArrays is obsolete and only supported for IPv4"
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
   786
			    IPSocketAddress hostAddress:aSocketAddressOrByteArray
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
   787
			].
3059
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
   788
    port notNil ifTrue:[
3217
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
   789
	socketAddress port:port.
3059
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
   790
    ].
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
   791
    ^ self newTCPclientToAddress:socketAddress withTimeout:millis
576
13acab81fad0 more ST80 compatibility
ca
parents: 572
diff changeset
   792
!
13acab81fad0 more ST80 compatibility
ca
parents: 572
diff changeset
   793
3059
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
   794
newTCPclientToAddress:aSocketAddress withTimeout:millis
126
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
   795
    "create a new TCP client socket connecting to a service.
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
   796
     Return a socket instance if ok, nil on failure.
3059
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
   797
     If the millis arg is nonNil, stop trying to connect after that many milliseconds
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
   798
     and return nil."
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
   799
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
   800
    |socket|
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
   801
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
   802
    socket := self domain:aSocketAddress domain type:#stream.
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
   803
    (socket connectTo:aSocketAddress withTimeout:millis) ifFalse:[
3217
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
   804
	socket close.
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
   805
	^ nil
3059
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
   806
    ].
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
   807
    ^ socket.
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
   808
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
   809
    "
3217
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
   810
	self newTCPclientToAddress:(IPv6SocketAddress hostName:'www.exept.de' port:80) withTimeout:nil
3059
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
   811
    "
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
   812
!
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
   813
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
   814
newTCPclientToHost:hostNameOrAddress port:aPortOrServiceName
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
   815
    "create a new TCP client socket connecting to a service.
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
   816
     If hostNameOrAddress is a string, try all the resolved adresses regardless
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
   817
     whether fpr IPv4 or IPv6.
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
   818
     Return a socket instance if ok, nil on failure.
126
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
   819
     Block until a connection is established (but only the current thread;
1485
d8578cf3504b gcc3.3.1 insn-scheduler bug workaround
Claus Gittinger <cg@exept.de>
parents: 1474
diff changeset
   820
     not the whole smalltalk).
126
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
   821
     See also: #newTCPclientToHost:port:withTimeout:"
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
   822
3059
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
   823
    ^ self newTCPclientToHost:hostNameOrAddress port:aPortOrServiceName domain:nil withTimeout:nil
126
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
   824
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
   825
    "
3059
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
   826
      Socket newTCPclientToHost:'www.exept.de' port:'http'
126
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
   827
    "
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
   828
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
   829
    "Created: 31.10.1995 / 18:54:11 / cg"
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
   830
!
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
   831
3059
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
   832
newTCPclientToHost:hostNameOrAddress port:aPortOrServiceName domain:aDomainSymbolOrNil withTimeout:millis
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
   833
    "create a new TCP client socket connecting to a service on hostNameOrAddress.
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
   834
     If hostNameOrAddress is a string, try all the resolved adresses.
126
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
   835
     Return a socket instance if ok, nil on failure.
3059
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
   836
     Set aDomainSymbolOrNil to #AF_INET of #AF_INET6 to connect via a defined protocol.
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
   837
     Set aDomainSymbolOrNil to nil, to try all protocols.
126
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
   838
     If the millis arg is nonNil, stop trying to connect after that many milliseconds
3059
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
   839
     and return nil."
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
   840
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
   841
    |socket addressInfoList|
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
   842
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
   843
    hostNameOrAddress isString ifFalse:[
3217
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
   844
	^ self newTCPclientToAddress:hostNameOrAddress port:aPortOrServiceName withTimeout:millis.
126
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
   845
    ].
3059
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
   846
3217
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
   847
    addressInfoList := SocketAddress
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
   848
			    getAddressInfo:hostNameOrAddress
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
   849
			    serviceName:aPortOrServiceName
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
   850
			    domain:aDomainSymbolOrNil
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
   851
			    type:#stream
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
   852
			    protocol:nil
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
   853
			    flags:0.
3059
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
   854
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
   855
    addressInfoList do:[:eachAddressInfo|
3217
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
   856
	|domainSymbol lastDomainSymbol|
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
   857
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
   858
	domainSymbol := eachAddressInfo domain.
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
   859
	domainSymbol ~~ lastDomainSymbol ifTrue:[
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
   860
	    socket notNil ifTrue:[
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
   861
		socket close.
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
   862
	    ].
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
   863
	    socket := self new domain:domainSymbol type:#stream.
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
   864
	    lastDomainSymbol := domainSymbol.
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
   865
	].
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
   866
	(socket connectTo:eachAddressInfo socketAddress withTimeout:millis) ifTrue:[
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
   867
	    ^ socket.
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
   868
	].
3059
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
   869
    ].
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
   870
    socket notNil ifTrue:[
3217
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
   871
	socket close.
3059
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
   872
    ].
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
   873
    ^ nil.
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
   874
126
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
   875
    "
3059
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
   876
      Socket newTCPclientToHost:'www.exept.de' port:80 domain:#'AF_INET' withTimeout:1000.
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
   877
      Socket newTCPclientToHost:'www.exept.de' port:80 domain:#'AF_INET6' withTimeout:1000.
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
   878
      Socket newTCPclientToHost:'www.exept.de' port:80 domain:nil withTimeout:1000.
126
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
   879
      Socket newTCPclientToHost:'localhost' port:'nntp' withTimeout:1000
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
   880
    "
604
b302a21afece Remove redundant code.
Stefan Vogel <sv@exept.de>
parents: 589
diff changeset
   881
b302a21afece Remove redundant code.
Stefan Vogel <sv@exept.de>
parents: 589
diff changeset
   882
    "Modified: / 16.1.1998 / 09:47:06 / stefan"
126
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
   883
!
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
   884
3217
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
   885
newTCPclientToHost:hostNameOrAddress port:aPortOrServiceName withTimeout:millis
3059
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
   886
    "create a new TCP client socket connecting to a service on hostNameOrAddress.
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
   887
     If hostNameOrAddress is a string, try all the resolved adresses regardless
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
   888
     whether fpr IPv4 or IPv6.
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
   889
     Return a socket instance if ok, nil on failure.
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
   890
     If the millis arg is nonNil, stop trying to connect after that many milliseconds
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
   891
     and return nil."
3217
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
   892
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
   893
    ^ self
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
   894
	newTCPclientToHost:hostNameOrAddress
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
   895
	port:aPortOrServiceName
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
   896
	domain:self defaultIpDomainForConnect
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
   897
	withTimeout:millis
3059
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
   898
!
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
   899
506
11ef93d12870 support anonymous (OS_specified) ports. (for FTP-protocol)
Claus Gittinger <cg@exept.de>
parents: 486
diff changeset
   900
newTCPserverAtAnonymousPort
11ef93d12870 support anonymous (OS_specified) ports. (for FTP-protocol)
Claus Gittinger <cg@exept.de>
parents: 486
diff changeset
   901
    "create a new TCP server socket providing service on
11ef93d12870 support anonymous (OS_specified) ports. (for FTP-protocol)
Claus Gittinger <cg@exept.de>
parents: 486
diff changeset
   902
     a new anonymous port. The portNr is assigned by the OS."
11ef93d12870 support anonymous (OS_specified) ports. (for FTP-protocol)
Claus Gittinger <cg@exept.de>
parents: 486
diff changeset
   903
811
72d9ac1a7f95 comments
Claus Gittinger <cg@exept.de>
parents: 809
diff changeset
   904
    ^ self newTCPserverAtPort:0
506
11ef93d12870 support anonymous (OS_specified) ports. (for FTP-protocol)
Claus Gittinger <cg@exept.de>
parents: 486
diff changeset
   905
11ef93d12870 support anonymous (OS_specified) ports. (for FTP-protocol)
Claus Gittinger <cg@exept.de>
parents: 486
diff changeset
   906
!
11ef93d12870 support anonymous (OS_specified) ports. (for FTP-protocol)
Claus Gittinger <cg@exept.de>
parents: 486
diff changeset
   907
126
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
   908
newTCPserverAtPort:aService
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
   909
    "create a new TCP server socket providing service."
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
   910
1911
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
   911
    ^ self newTCP:aService
126
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
   912
!
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
   913
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
   914
newUDP
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
   915
    "create a UDP socket - no binding or other setup is done,
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
   916
     neither connect nor connect-wait is done."
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
   917
3059
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
   918
    ^ self new domain:#'AF_INET' type:#datagram
126
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
   919
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
   920
    "Socket newUDP"
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
   921
!
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
   922
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
   923
newUDP:aServiceOrNil
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
   924
    "create a UDP socket for a service -
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
   925
     neither connect nor connect-wait is done."
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
   926
3059
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
   927
    |newSock socketAddressClass socketAddress|
126
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
   928
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
   929
    newSock := self newUDP.
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
   930
    (newSock notNil and:[aServiceOrNil notNil]) ifTrue:[
3217
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
   931
	[
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
   932
	    socketAddressClass := newSock socketAddressClass.
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
   933
	    socketAddress := socketAddressClass hostName:nil serviceName:aServiceOrNil type:#stream.
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
   934
	    socketAddress hostAddress:socketAddressClass anyAddress.
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
   935
	    newSock bindTo:socketAddress reuseAddress:true.
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
   936
	] ifCurtailed:[
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
   937
	    newSock close.
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
   938
	]
126
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
   939
    ].
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
   940
    ^ newSock
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
   941
1911
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
   942
    "
3217
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
   943
	Socket newUDP:4444.
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
   944
	Socket newUDP:'activesync'.
1911
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
   945
    "
126
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
   946
!
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
   947
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
   948
newUDPserverAtPort:aService
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
   949
    "create a new UDP server socket providing service."
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
   950
1911
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
   951
    ^ self newUDP:aService
126
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
   952
!
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
   953
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
   954
newUNIX
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
   955
    "create a UNIX domain socket - no binding or other setup is done,
811
72d9ac1a7f95 comments
Claus Gittinger <cg@exept.de>
parents: 809
diff changeset
   956
     neither connect nor connect-wait is done.
72d9ac1a7f95 comments
Claus Gittinger <cg@exept.de>
parents: 809
diff changeset
   957
     If the system does not support unix domain sockets (i.e. VMS or MSDOS),
72d9ac1a7f95 comments
Claus Gittinger <cg@exept.de>
parents: 809
diff changeset
   958
     return nil."
126
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
   959
3059
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
   960
    ^ self new domain:#'AF_UNIX' type:#stream
126
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
   961
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
   962
    "
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
   963
     Socket newUNIX
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
   964
    "
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
   965
!
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
   966
1485
d8578cf3504b gcc3.3.1 insn-scheduler bug workaround
Claus Gittinger <cg@exept.de>
parents: 1474
diff changeset
   967
newUNIXclientTo:pathName
126
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
   968
    "create a new UNIX client socket connecting to a pathname.
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
   969
     Return a socket instance if ok, nil on failure.
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
   970
     Block until a connection is established (but only the current thread;
1485
d8578cf3504b gcc3.3.1 insn-scheduler bug workaround
Claus Gittinger <cg@exept.de>
parents: 1474
diff changeset
   971
     not the whole smalltalk).
811
72d9ac1a7f95 comments
Claus Gittinger <cg@exept.de>
parents: 809
diff changeset
   972
     If the system does not support unix domain sockets (i.e. VMS or MSDOS),
72d9ac1a7f95 comments
Claus Gittinger <cg@exept.de>
parents: 809
diff changeset
   973
     return nil.
126
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
   974
     See also: #newUNIXclientTo:withTimeout:"
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
   975
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
   976
    ^ self newUNIXclientTo:pathName withTimeout:nil
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
   977
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
   978
!
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
   979
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
   980
newUNIXclientTo:pathName withTimeout:millis
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
   981
    "create a new UNIX client socket connecting to a pathname.
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
   982
     Return a socket instance if ok, nil on failure.
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
   983
     If the millis arg is nonNil, stop trying to connect after that many milliseconds
811
72d9ac1a7f95 comments
Claus Gittinger <cg@exept.de>
parents: 809
diff changeset
   984
     and return nil.
72d9ac1a7f95 comments
Claus Gittinger <cg@exept.de>
parents: 809
diff changeset
   985
     If the system does not support unix domain sockets (i.e. VMS or MSDOS),
72d9ac1a7f95 comments
Claus Gittinger <cg@exept.de>
parents: 809
diff changeset
   986
     return nil."
126
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
   987
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
   988
    |newSock|
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
   989
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
   990
    newSock := self newUNIX.
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
   991
    newSock notNil ifTrue:[
3217
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
   992
	(newSock connectTo:(UDSocketAddress name:pathName) withTimeout:millis) ifFalse:[
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
   993
	    newSock close.
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
   994
	    ^ nil
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
   995
	]
126
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
   996
    ].
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
   997
    ^ newSock
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
   998
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
   999
    "
3217
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  1000
	Socket newUNIXclientTo:'/tmp/foo'
126
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
  1001
    "
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
  1002
!
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
  1003
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
  1004
newUNIXserverAt:pathName
811
72d9ac1a7f95 comments
Claus Gittinger <cg@exept.de>
parents: 809
diff changeset
  1005
    "create a new UNIX server socket providing service at a pathname.
72d9ac1a7f95 comments
Claus Gittinger <cg@exept.de>
parents: 809
diff changeset
  1006
     If the system does not support unix domain sockets (i.e. VMS or MSDOS),
72d9ac1a7f95 comments
Claus Gittinger <cg@exept.de>
parents: 809
diff changeset
  1007
     return nil."
126
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
  1008
3059
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  1009
    ^ self bindTo:(UDSocketAddress name:pathName) type:#stream.
126
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
  1010
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
  1011
    "
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
  1012
     |s s2|
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
  1013
3059
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  1014
    '/tmp/foo' asFilename remove.
126
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
  1015
     s := Socket newUNIXserverAt:'/tmp/foo'.
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
  1016
     s listenFor:5.
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
  1017
     s2 := s accept.
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
  1018
    "
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
  1019
! !
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
  1020
1462
5602fce52b42 squeak stuff
Claus Gittinger <cg@exept.de>
parents: 1413
diff changeset
  1021
!Socket class methodsFor:'Compatibility-ST80'!
5602fce52b42 squeak stuff
Claus Gittinger <cg@exept.de>
parents: 1413
diff changeset
  1022
5602fce52b42 squeak stuff
Claus Gittinger <cg@exept.de>
parents: 1413
diff changeset
  1023
family:domainSymbol type:typeSymbol
5602fce52b42 squeak stuff
Claus Gittinger <cg@exept.de>
parents: 1413
diff changeset
  1024
    "create a socket for domain and type - ST80 simply uses a different name.
1504
92005eec5c9d fixed moving-object-when-interrupted-with-scavenge bugs;
Claus Gittinger <cg@exept.de>
parents: 1503
diff changeset
  1025
     Domain must be one of the symbols: #inet, #unix, #appletalk or #ns;
92005eec5c9d fixed moving-object-when-interrupted-with-scavenge bugs;
Claus Gittinger <cg@exept.de>
parents: 1503
diff changeset
  1026
     Type must be #stream, #datagram or #raw."
1462
5602fce52b42 squeak stuff
Claus Gittinger <cg@exept.de>
parents: 1413
diff changeset
  1027
5602fce52b42 squeak stuff
Claus Gittinger <cg@exept.de>
parents: 1413
diff changeset
  1028
    ^ self domain:domainSymbol type:typeSymbol
5602fce52b42 squeak stuff
Claus Gittinger <cg@exept.de>
parents: 1413
diff changeset
  1029
5602fce52b42 squeak stuff
Claus Gittinger <cg@exept.de>
parents: 1413
diff changeset
  1030
    "
3059
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  1031
     Socket family:#AF_INET type:#stream
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  1032
     Socket family:#AF_INET type:#datagram
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  1033
     Socket family:#AF_UNIX type:#stream
1462
5602fce52b42 squeak stuff
Claus Gittinger <cg@exept.de>
parents: 1413
diff changeset
  1034
    "
5602fce52b42 squeak stuff
Claus Gittinger <cg@exept.de>
parents: 1413
diff changeset
  1035
!
5602fce52b42 squeak stuff
Claus Gittinger <cg@exept.de>
parents: 1413
diff changeset
  1036
5602fce52b42 squeak stuff
Claus Gittinger <cg@exept.de>
parents: 1413
diff changeset
  1037
getHostname
5602fce52b42 squeak stuff
Claus Gittinger <cg@exept.de>
parents: 1413
diff changeset
  1038
    "return the computers hostname string"
5602fce52b42 squeak stuff
Claus Gittinger <cg@exept.de>
parents: 1413
diff changeset
  1039
5602fce52b42 squeak stuff
Claus Gittinger <cg@exept.de>
parents: 1413
diff changeset
  1040
    ^ OperatingSystem getHostName
5602fce52b42 squeak stuff
Claus Gittinger <cg@exept.de>
parents: 1413
diff changeset
  1041
5602fce52b42 squeak stuff
Claus Gittinger <cg@exept.de>
parents: 1413
diff changeset
  1042
    "Created: / 27.2.1998 / 02:32:17 / cg"
5602fce52b42 squeak stuff
Claus Gittinger <cg@exept.de>
parents: 1413
diff changeset
  1043
!
5602fce52b42 squeak stuff
Claus Gittinger <cg@exept.de>
parents: 1413
diff changeset
  1044
5602fce52b42 squeak stuff
Claus Gittinger <cg@exept.de>
parents: 1413
diff changeset
  1045
sockStream
5602fce52b42 squeak stuff
Claus Gittinger <cg@exept.de>
parents: 1413
diff changeset
  1046
    "return the type code for stream sockets"
5602fce52b42 squeak stuff
Claus Gittinger <cg@exept.de>
parents: 1413
diff changeset
  1047
5602fce52b42 squeak stuff
Claus Gittinger <cg@exept.de>
parents: 1413
diff changeset
  1048
    ^ #stream
5602fce52b42 squeak stuff
Claus Gittinger <cg@exept.de>
parents: 1413
diff changeset
  1049
! !
5602fce52b42 squeak stuff
Claus Gittinger <cg@exept.de>
parents: 1413
diff changeset
  1050
1600
f3acd5382fa1 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1584
diff changeset
  1051
!Socket class methodsFor:'Compatibility-Squeak'!
f3acd5382fa1 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1584
diff changeset
  1052
2900
0e8b305e9a98 class: Socket
Claus Gittinger <cg@exept.de>
parents: 2899
diff changeset
  1053
deadlineSecs:seconds
0e8b305e9a98 class: Socket
Claus Gittinger <cg@exept.de>
parents: 2899
diff changeset
  1054
    ^ Timestamp now addSeconds:seconds
0e8b305e9a98 class: Socket
Claus Gittinger <cg@exept.de>
parents: 2899
diff changeset
  1055
!
0e8b305e9a98 class: Socket
Claus Gittinger <cg@exept.de>
parents: 2899
diff changeset
  1056
1600
f3acd5382fa1 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1584
diff changeset
  1057
initializeNetwork
f3acd5382fa1 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1584
diff changeset
  1058
    "/ intentionally left blank here
f3acd5382fa1 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1584
diff changeset
  1059
!
f3acd5382fa1 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1584
diff changeset
  1060
2292
c4b0b901278e added: #standardTimeout
Claus Gittinger <cg@exept.de>
parents: 1940
diff changeset
  1061
standardTimeout
c4b0b901278e added: #standardTimeout
Claus Gittinger <cg@exept.de>
parents: 1940
diff changeset
  1062
    ^ 30
c4b0b901278e added: #standardTimeout
Claus Gittinger <cg@exept.de>
parents: 1940
diff changeset
  1063
!
c4b0b901278e added: #standardTimeout
Claus Gittinger <cg@exept.de>
parents: 1940
diff changeset
  1064
1600
f3acd5382fa1 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1584
diff changeset
  1065
wildcardPort
f3acd5382fa1 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1584
diff changeset
  1066
    ^ nil
f3acd5382fa1 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1584
diff changeset
  1067
! !
f3acd5382fa1 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1584
diff changeset
  1068
1462
5602fce52b42 squeak stuff
Claus Gittinger <cg@exept.de>
parents: 1413
diff changeset
  1069
!Socket class methodsFor:'Compatibility-VW'!
5602fce52b42 squeak stuff
Claus Gittinger <cg@exept.de>
parents: 1413
diff changeset
  1070
1485
d8578cf3504b gcc3.3.1 insn-scheduler bug workaround
Claus Gittinger <cg@exept.de>
parents: 1474
diff changeset
  1071
AF_INET
1462
5602fce52b42 squeak stuff
Claus Gittinger <cg@exept.de>
parents: 1413
diff changeset
  1072
    ^ #AF_INET
5602fce52b42 squeak stuff
Claus Gittinger <cg@exept.de>
parents: 1413
diff changeset
  1073
!
5602fce52b42 squeak stuff
Claus Gittinger <cg@exept.de>
parents: 1413
diff changeset
  1074
5602fce52b42 squeak stuff
Claus Gittinger <cg@exept.de>
parents: 1413
diff changeset
  1075
SOCK_STREAM
5602fce52b42 squeak stuff
Claus Gittinger <cg@exept.de>
parents: 1413
diff changeset
  1076
    ^ #SOCK_STREAM
5602fce52b42 squeak stuff
Claus Gittinger <cg@exept.de>
parents: 1413
diff changeset
  1077
! !
5602fce52b42 squeak stuff
Claus Gittinger <cg@exept.de>
parents: 1413
diff changeset
  1078
5602fce52b42 squeak stuff
Claus Gittinger <cg@exept.de>
parents: 1413
diff changeset
  1079
!Socket class methodsFor:'Signal constants'!
5602fce52b42 squeak stuff
Claus Gittinger <cg@exept.de>
parents: 1413
diff changeset
  1080
5602fce52b42 squeak stuff
Claus Gittinger <cg@exept.de>
parents: 1413
diff changeset
  1081
brokenConnectionSignal
5602fce52b42 squeak stuff
Claus Gittinger <cg@exept.de>
parents: 1413
diff changeset
  1082
    "return the signal used to tell broken connections.
5602fce52b42 squeak stuff
Claus Gittinger <cg@exept.de>
parents: 1413
diff changeset
  1083
     Since in unix, this is the same as the broken pipe signal,
5602fce52b42 squeak stuff
Claus Gittinger <cg@exept.de>
parents: 1413
diff changeset
  1084
     return that one.
5602fce52b42 squeak stuff
Claus Gittinger <cg@exept.de>
parents: 1413
diff changeset
  1085
     (for other Operatingsystems, this may change ..)"
5602fce52b42 squeak stuff
Claus Gittinger <cg@exept.de>
parents: 1413
diff changeset
  1086
5602fce52b42 squeak stuff
Claus Gittinger <cg@exept.de>
parents: 1413
diff changeset
  1087
    ^ PipeStream brokenPipeSignal
5602fce52b42 squeak stuff
Claus Gittinger <cg@exept.de>
parents: 1413
diff changeset
  1088
!
5602fce52b42 squeak stuff
Claus Gittinger <cg@exept.de>
parents: 1413
diff changeset
  1089
5602fce52b42 squeak stuff
Claus Gittinger <cg@exept.de>
parents: 1413
diff changeset
  1090
invalidArgumentsSignal
5602fce52b42 squeak stuff
Claus Gittinger <cg@exept.de>
parents: 1413
diff changeset
  1091
    "dummy for compatibility"
5602fce52b42 squeak stuff
Claus Gittinger <cg@exept.de>
parents: 1413
diff changeset
  1092
5602fce52b42 squeak stuff
Claus Gittinger <cg@exept.de>
parents: 1413
diff changeset
  1093
    ^ self errorSignal
5602fce52b42 squeak stuff
Claus Gittinger <cg@exept.de>
parents: 1413
diff changeset
  1094
! !
5602fce52b42 squeak stuff
Claus Gittinger <cg@exept.de>
parents: 1413
diff changeset
  1095
5602fce52b42 squeak stuff
Claus Gittinger <cg@exept.de>
parents: 1413
diff changeset
  1096
!Socket class methodsFor:'debugging'!
5602fce52b42 squeak stuff
Claus Gittinger <cg@exept.de>
parents: 1413
diff changeset
  1097
5602fce52b42 squeak stuff
Claus Gittinger <cg@exept.de>
parents: 1413
diff changeset
  1098
debug:aBoolean
5602fce52b42 squeak stuff
Claus Gittinger <cg@exept.de>
parents: 1413
diff changeset
  1099
    "turn on/off internal debugprints.
5602fce52b42 squeak stuff
Claus Gittinger <cg@exept.de>
parents: 1413
diff changeset
  1100
     This method is for ST/X debugging only and
5602fce52b42 squeak stuff
Claus Gittinger <cg@exept.de>
parents: 1413
diff changeset
  1101
     may  be removed in later versions"
5602fce52b42 squeak stuff
Claus Gittinger <cg@exept.de>
parents: 1413
diff changeset
  1102
5602fce52b42 squeak stuff
Claus Gittinger <cg@exept.de>
parents: 1413
diff changeset
  1103
%{  /* NOCONTEXT */
5602fce52b42 squeak stuff
Claus Gittinger <cg@exept.de>
parents: 1413
diff changeset
  1104
5602fce52b42 squeak stuff
Claus Gittinger <cg@exept.de>
parents: 1413
diff changeset
  1105
    __debugging__ = (aBoolean == true);
5602fce52b42 squeak stuff
Claus Gittinger <cg@exept.de>
parents: 1413
diff changeset
  1106
%}
5602fce52b42 squeak stuff
Claus Gittinger <cg@exept.de>
parents: 1413
diff changeset
  1107
    "
5602fce52b42 squeak stuff
Claus Gittinger <cg@exept.de>
parents: 1413
diff changeset
  1108
     Socket debug:true
5602fce52b42 squeak stuff
Claus Gittinger <cg@exept.de>
parents: 1413
diff changeset
  1109
     Socket debug:false
5602fce52b42 squeak stuff
Claus Gittinger <cg@exept.de>
parents: 1413
diff changeset
  1110
    "
5602fce52b42 squeak stuff
Claus Gittinger <cg@exept.de>
parents: 1413
diff changeset
  1111
! !
5602fce52b42 squeak stuff
Claus Gittinger <cg@exept.de>
parents: 1413
diff changeset
  1112
3059
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  1113
!Socket class methodsFor:'defaults'!
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  1114
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  1115
defaultIpDomainForConnect
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  1116
    "answer the domain used to look up host names for connect:
3217
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  1117
	#AF_INET    use only IPv4
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  1118
	#AF_INET6   use only IPv6
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  1119
	nil         use both IPv4 and IPv6"
3059
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  1120
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  1121
    ^ #AF_INET
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  1122
! !
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  1123
1911
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
  1124
!Socket class methodsFor:'obsolete'!
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
  1125
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
  1126
connectTo:service on:host
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
  1127
    <resource: #obsolete>
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
  1128
    "standard & easy client setup:
2321
6f4cc7b644db filePointer -> handle migration
Claus Gittinger <cg@exept.de>
parents: 2308
diff changeset
  1129
	create new client tcp socket, bind and connect;
6f4cc7b644db filePointer -> handle migration
Claus Gittinger <cg@exept.de>
parents: 2308
diff changeset
  1130
	return the socket.
1911
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
  1131
     The thread blocks (interruptable), until the connection is established."
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
  1132
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
  1133
    ^ self newTCPclientToHost:host port:(self portOfService:service).
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
  1134
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
  1135
    "
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
  1136
     Socket connectTo:9995 on:'clam'
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
  1137
     Socket connectTo:4711 on:'exept'
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
  1138
     Socket connectTo:'finger' on:'clam'
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
  1139
     Socket connectTo:'ftp' on:'exept'
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
  1140
     Socket connectTo:'nntp' on:(OperatingSystem getEnvironment:'NNTPSERVER')
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
  1141
    "
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
  1142
!
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
  1143
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
  1144
networkLongOrderIsMSB
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
  1145
    "return the well known fact, that network byte order is most significant byte first"
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
  1146
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
  1147
    <resource: #obsolete>
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
  1148
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
  1149
    ^ true
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
  1150
!
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
  1151
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
  1152
networkShortOrderIsMSB
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
  1153
    "return the well known fact, that network byte order is most significant byte first"
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
  1154
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
  1155
    <resource: #obsolete>
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
  1156
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
  1157
    ^ true
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
  1158
!
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
  1159
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
  1160
provide:aService
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
  1161
    "standard & easy server setup:
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
  1162
     create a new TCP server socket providing a service."
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
  1163
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
  1164
    <resource:#obsolete>
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
  1165
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
  1166
    |newSock|
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
  1167
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
  1168
    self obsoleteMethodWarning:'use #newTCPserverAtPort: / #listen'.
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
  1169
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
  1170
    newSock := self newTCPserverAtPort:(self portOfService:aService).
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
  1171
    newSock notNil ifTrue:[
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
  1172
	newSock listenFor:5.
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
  1173
    ].
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
  1174
    ^ newSock
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
  1175
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
  1176
    "
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
  1177
     Socket provide:9995
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
  1178
     (Socket provide:9996) accept
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
  1179
     Socket provide:'nntp'
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
  1180
    "
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
  1181
! !
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
  1182
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
  1183
!Socket class methodsFor:'obsolete host queries'!
525
5891518d17a3 appletalk support - untested
Claus Gittinger <cg@exept.de>
parents: 524
diff changeset
  1184
5891518d17a3 appletalk support - untested
Claus Gittinger <cg@exept.de>
parents: 524
diff changeset
  1185
appletalkAddressOfHost:aHostName
1911
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
  1186
    <resource: #obsolete>
525
5891518d17a3 appletalk support - untested
Claus Gittinger <cg@exept.de>
parents: 524
diff changeset
  1187
    "return the APPLETALK address for a hostname as a byteArray,
819
4cc15700d123 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 817
diff changeset
  1188
     where the network bytes come first (no matter what the local byteorder is)
4cc15700d123 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 817
diff changeset
  1189
     followed by the node byte.
525
5891518d17a3 appletalk support - untested
Claus Gittinger <cg@exept.de>
parents: 524
diff changeset
  1190
     If the host is unknown, return nil.
812
c8101ea70e6c *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 811
diff changeset
  1191
     This is the reverse operation to #hostWithAppletalkAddress:.
c8101ea70e6c *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 811
diff changeset
  1192
     WARNING: untested code - I have no appletalk to test this."
525
5891518d17a3 appletalk support - untested
Claus Gittinger <cg@exept.de>
parents: 524
diff changeset
  1193
1485
d8578cf3504b gcc3.3.1 insn-scheduler bug workaround
Claus Gittinger <cg@exept.de>
parents: 1474
diff changeset
  1194
    NameLookupError
d8578cf3504b gcc3.3.1 insn-scheduler bug workaround
Claus Gittinger <cg@exept.de>
parents: 1474
diff changeset
  1195
	handle:[:ex |
1343
cc3bed115c0a definitions cleanup with stxOSDefs.h
penk
parents: 1342
diff changeset
  1196
	    ^ nil
cc3bed115c0a definitions cleanup with stxOSDefs.h
penk
parents: 1342
diff changeset
  1197
	]
cc3bed115c0a definitions cleanup with stxOSDefs.h
penk
parents: 1342
diff changeset
  1198
	do:[
cc3bed115c0a definitions cleanup with stxOSDefs.h
penk
parents: 1342
diff changeset
  1199
	    ^ (AppletalkSocketAddress hostName:aHostName) address
cc3bed115c0a definitions cleanup with stxOSDefs.h
penk
parents: 1342
diff changeset
  1200
	]
525
5891518d17a3 appletalk support - untested
Claus Gittinger <cg@exept.de>
parents: 524
diff changeset
  1201
!
5891518d17a3 appletalk support - untested
Claus Gittinger <cg@exept.de>
parents: 524
diff changeset
  1202
1278
7251c65b8d38 use nameLookup from SocketAddress for all addr-families
Claus Gittinger <cg@exept.de>
parents: 1274
diff changeset
  1203
hostWithAppletalkAddress:addrByteArray
1911
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
  1204
    <resource: #obsolete>
525
5891518d17a3 appletalk support - untested
Claus Gittinger <cg@exept.de>
parents: 524
diff changeset
  1205
    "return the hostname for an APPLETALK address.
5891518d17a3 appletalk support - untested
Claus Gittinger <cg@exept.de>
parents: 524
diff changeset
  1206
     The address is supposed to be a byteArray consisting of 3 bytes,
5891518d17a3 appletalk support - untested
Claus Gittinger <cg@exept.de>
parents: 524
diff changeset
  1207
     the network bytes come first (no matter what the local byteorder is).
5891518d17a3 appletalk support - untested
Claus Gittinger <cg@exept.de>
parents: 524
diff changeset
  1208
     The last byte is the node number.
5891518d17a3 appletalk support - untested
Claus Gittinger <cg@exept.de>
parents: 524
diff changeset
  1209
     Nil is returned for an unknown host or if its not an appletalk host.
812
c8101ea70e6c *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 811
diff changeset
  1210
     This is is the reverse operation to #appletalkAddressOfHost:.
c8101ea70e6c *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 811
diff changeset
  1211
     WARNING: untested code - I have no appletalk to test this."
525
5891518d17a3 appletalk support - untested
Claus Gittinger <cg@exept.de>
parents: 524
diff changeset
  1212
1485
d8578cf3504b gcc3.3.1 insn-scheduler bug workaround
Claus Gittinger <cg@exept.de>
parents: 1474
diff changeset
  1213
    NameLookupError
d8578cf3504b gcc3.3.1 insn-scheduler bug workaround
Claus Gittinger <cg@exept.de>
parents: 1474
diff changeset
  1214
	handle:[:ex |
1343
cc3bed115c0a definitions cleanup with stxOSDefs.h
penk
parents: 1342
diff changeset
  1215
	    ^ nil
cc3bed115c0a definitions cleanup with stxOSDefs.h
penk
parents: 1342
diff changeset
  1216
	]
cc3bed115c0a definitions cleanup with stxOSDefs.h
penk
parents: 1342
diff changeset
  1217
	do:[
cc3bed115c0a definitions cleanup with stxOSDefs.h
penk
parents: 1342
diff changeset
  1218
	    ^ (AppletalkSocketAddress hostAddress:addrByteArray) hostName
cc3bed115c0a definitions cleanup with stxOSDefs.h
penk
parents: 1342
diff changeset
  1219
	]
1278
7251c65b8d38 use nameLookup from SocketAddress for all addr-families
Claus Gittinger <cg@exept.de>
parents: 1274
diff changeset
  1220
525
5891518d17a3 appletalk support - untested
Claus Gittinger <cg@exept.de>
parents: 524
diff changeset
  1221
    "
1278
7251c65b8d38 use nameLookup from SocketAddress for all addr-families
Claus Gittinger <cg@exept.de>
parents: 1274
diff changeset
  1222
     Socket appletalkAddressOfHost:'yourAppleHere'
1485
d8578cf3504b gcc3.3.1 insn-scheduler bug workaround
Claus Gittinger <cg@exept.de>
parents: 1474
diff changeset
  1223
     Socket hostWithAppletalkAddress:#[1 2 3]
525
5891518d17a3 appletalk support - untested
Claus Gittinger <cg@exept.de>
parents: 524
diff changeset
  1224
     "
126
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
  1225
!
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
  1226
1278
7251c65b8d38 use nameLookup from SocketAddress for all addr-families
Claus Gittinger <cg@exept.de>
parents: 1274
diff changeset
  1227
hostWithIpAddress:addrByteArray
1911
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
  1228
    <resource: #obsolete>
126
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
  1229
    "return the hostname for an IP (internet-) address.
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
  1230
     The address is supposed to be a byteArray consisting of 4 bytes,
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
  1231
     the network bytes come first (no matter what the local byteorder is).
525
5891518d17a3 appletalk support - untested
Claus Gittinger <cg@exept.de>
parents: 524
diff changeset
  1232
     Nil is returned for an unknown host or if its not an internet host.
126
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
  1233
     This is the reverse operation to #ipAddressOfHost:."
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
  1234
1485
d8578cf3504b gcc3.3.1 insn-scheduler bug workaround
Claus Gittinger <cg@exept.de>
parents: 1474
diff changeset
  1235
    NameLookupError
d8578cf3504b gcc3.3.1 insn-scheduler bug workaround
Claus Gittinger <cg@exept.de>
parents: 1474
diff changeset
  1236
	handle:[:ex |
1343
cc3bed115c0a definitions cleanup with stxOSDefs.h
penk
parents: 1342
diff changeset
  1237
	    ^ nil
cc3bed115c0a definitions cleanup with stxOSDefs.h
penk
parents: 1342
diff changeset
  1238
	]
cc3bed115c0a definitions cleanup with stxOSDefs.h
penk
parents: 1342
diff changeset
  1239
	do:[
cc3bed115c0a definitions cleanup with stxOSDefs.h
penk
parents: 1342
diff changeset
  1240
	    ^ (IPSocketAddress hostAddress:addrByteArray) hostName
cc3bed115c0a definitions cleanup with stxOSDefs.h
penk
parents: 1342
diff changeset
  1241
	]
126
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
  1242
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
  1243
    "
1485
d8578cf3504b gcc3.3.1 insn-scheduler bug workaround
Claus Gittinger <cg@exept.de>
parents: 1474
diff changeset
  1244
     Socket ipAddressOfHost:'clam'
d8578cf3504b gcc3.3.1 insn-scheduler bug workaround
Claus Gittinger <cg@exept.de>
parents: 1474
diff changeset
  1245
     Socket hostWithIpAddress:(Socket ipAddressOfHost:'clam')
d8578cf3504b gcc3.3.1 insn-scheduler bug workaround
Claus Gittinger <cg@exept.de>
parents: 1474
diff changeset
  1246
     Socket ipAddressOfHost:'porty'
1278
7251c65b8d38 use nameLookup from SocketAddress for all addr-families
Claus Gittinger <cg@exept.de>
parents: 1274
diff changeset
  1247
     Socket hostWithIpAddress:(Socket ipAddressOfHost:'porty')
1485
d8578cf3504b gcc3.3.1 insn-scheduler bug workaround
Claus Gittinger <cg@exept.de>
parents: 1474
diff changeset
  1248
     Socket hostWithIpAddress:#[1 2 3 4]
d8578cf3504b gcc3.3.1 insn-scheduler bug workaround
Claus Gittinger <cg@exept.de>
parents: 1474
diff changeset
  1249
     Socket hostWithIpAddress:#[127 0 0 1]
1278
7251c65b8d38 use nameLookup from SocketAddress for all addr-families
Claus Gittinger <cg@exept.de>
parents: 1274
diff changeset
  1250
     Socket hostWithIpAddress:(Socket ipAddressOfHost:'1.2.3.4')
1485
d8578cf3504b gcc3.3.1 insn-scheduler bug workaround
Claus Gittinger <cg@exept.de>
parents: 1474
diff changeset
  1251
     Socket hostWithIpAddress:(Socket ipAddressOfHost:'www.altavista.com')
126
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
  1252
     "
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
  1253
!
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
  1254
1278
7251c65b8d38 use nameLookup from SocketAddress for all addr-families
Claus Gittinger <cg@exept.de>
parents: 1274
diff changeset
  1255
hostWithIpV6Address:addrByteArray
1911
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
  1256
    <resource: #obsolete>
820
b6860c3660c8 Fix address sizes when calling gethostbyaddr
Stefan Vogel <sv@exept.de>
parents: 819
diff changeset
  1257
    "return the hostname for an IPv6 (internet-) address.
b6860c3660c8 Fix address sizes when calling gethostbyaddr
Stefan Vogel <sv@exept.de>
parents: 819
diff changeset
  1258
     The address is supposed to be a byteArray consisting ??? bytes,
b6860c3660c8 Fix address sizes when calling gethostbyaddr
Stefan Vogel <sv@exept.de>
parents: 819
diff changeset
  1259
     the network bytes come first (no matter what the local byteorder is).
b6860c3660c8 Fix address sizes when calling gethostbyaddr
Stefan Vogel <sv@exept.de>
parents: 819
diff changeset
  1260
     Nil is returned for an unknown host or if its not an internet host.
b6860c3660c8 Fix address sizes when calling gethostbyaddr
Stefan Vogel <sv@exept.de>
parents: 819
diff changeset
  1261
     This is the reverse operation to #ipV6AddressOfHost:."
b6860c3660c8 Fix address sizes when calling gethostbyaddr
Stefan Vogel <sv@exept.de>
parents: 819
diff changeset
  1262
1485
d8578cf3504b gcc3.3.1 insn-scheduler bug workaround
Claus Gittinger <cg@exept.de>
parents: 1474
diff changeset
  1263
    NameLookupError
d8578cf3504b gcc3.3.1 insn-scheduler bug workaround
Claus Gittinger <cg@exept.de>
parents: 1474
diff changeset
  1264
	handle:[:ex |
1343
cc3bed115c0a definitions cleanup with stxOSDefs.h
penk
parents: 1342
diff changeset
  1265
	    ^ nil
cc3bed115c0a definitions cleanup with stxOSDefs.h
penk
parents: 1342
diff changeset
  1266
	]
cc3bed115c0a definitions cleanup with stxOSDefs.h
penk
parents: 1342
diff changeset
  1267
	do:[
cc3bed115c0a definitions cleanup with stxOSDefs.h
penk
parents: 1342
diff changeset
  1268
	    ^ (IPv6SocketAddress hostAddress:addrByteArray) hostName
cc3bed115c0a definitions cleanup with stxOSDefs.h
penk
parents: 1342
diff changeset
  1269
	]
820
b6860c3660c8 Fix address sizes when calling gethostbyaddr
Stefan Vogel <sv@exept.de>
parents: 819
diff changeset
  1270
b6860c3660c8 Fix address sizes when calling gethostbyaddr
Stefan Vogel <sv@exept.de>
parents: 819
diff changeset
  1271
    "
1485
d8578cf3504b gcc3.3.1 insn-scheduler bug workaround
Claus Gittinger <cg@exept.de>
parents: 1474
diff changeset
  1272
     Socket ipV6AddressOfHost:'clam'
d8578cf3504b gcc3.3.1 insn-scheduler bug workaround
Claus Gittinger <cg@exept.de>
parents: 1474
diff changeset
  1273
     Socket hostWithIpV6Address:(Socket ipAddressOfHost:'clam')
d8578cf3504b gcc3.3.1 insn-scheduler bug workaround
Claus Gittinger <cg@exept.de>
parents: 1474
diff changeset
  1274
     Socket ipV6AddressOfHost:'porty'
d8578cf3504b gcc3.3.1 insn-scheduler bug workaround
Claus Gittinger <cg@exept.de>
parents: 1474
diff changeset
  1275
     Socket hostWithIpV6Address:(Socket ipAddressOfHost:'porty')
d8578cf3504b gcc3.3.1 insn-scheduler bug workaround
Claus Gittinger <cg@exept.de>
parents: 1474
diff changeset
  1276
     Socket hostWithIpV6Address:#[1 2 3 4 5 6 7 8 9 10 11 12 13 14]
d8578cf3504b gcc3.3.1 insn-scheduler bug workaround
Claus Gittinger <cg@exept.de>
parents: 1474
diff changeset
  1277
     Socket ipV6AddressOfHost:'www.exept.de'
820
b6860c3660c8 Fix address sizes when calling gethostbyaddr
Stefan Vogel <sv@exept.de>
parents: 819
diff changeset
  1278
     "
b6860c3660c8 Fix address sizes when calling gethostbyaddr
Stefan Vogel <sv@exept.de>
parents: 819
diff changeset
  1279
!
b6860c3660c8 Fix address sizes when calling gethostbyaddr
Stefan Vogel <sv@exept.de>
parents: 819
diff changeset
  1280
6
claus
parents: 4
diff changeset
  1281
ipAddressOfHost:aHostName
1911
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
  1282
    <resource: #obsolete>
98
5e787ba2cb31 use common byteOrder when representing IP numbers as byteArrays (always network-first)
Claus Gittinger <cg@exept.de>
parents: 96
diff changeset
  1283
    "return the IP (internet-) number for a hostname as a byteArray,
5e787ba2cb31 use common byteOrder when representing IP numbers as byteArrays (always network-first)
Claus Gittinger <cg@exept.de>
parents: 96
diff changeset
  1284
     where the network bytes come first (no matter what the cpus byteOrder is).
5e787ba2cb31 use common byteOrder when representing IP numbers as byteArrays (always network-first)
Claus Gittinger <cg@exept.de>
parents: 96
diff changeset
  1285
     If the host is unknown, return nil.
5e787ba2cb31 use common byteOrder when representing IP numbers as byteArrays (always network-first)
Claus Gittinger <cg@exept.de>
parents: 96
diff changeset
  1286
     This is the reverse operation to #hostWithIpAddress:."
6
claus
parents: 4
diff changeset
  1287
1485
d8578cf3504b gcc3.3.1 insn-scheduler bug workaround
Claus Gittinger <cg@exept.de>
parents: 1474
diff changeset
  1288
    NameLookupError
d8578cf3504b gcc3.3.1 insn-scheduler bug workaround
Claus Gittinger <cg@exept.de>
parents: 1474
diff changeset
  1289
	handle:[:ex |
1343
cc3bed115c0a definitions cleanup with stxOSDefs.h
penk
parents: 1342
diff changeset
  1290
	    ^ nil
cc3bed115c0a definitions cleanup with stxOSDefs.h
penk
parents: 1342
diff changeset
  1291
	]
cc3bed115c0a definitions cleanup with stxOSDefs.h
penk
parents: 1342
diff changeset
  1292
	do:[
cc3bed115c0a definitions cleanup with stxOSDefs.h
penk
parents: 1342
diff changeset
  1293
	    ^ (IPSocketAddress hostName:aHostName) address
cc3bed115c0a definitions cleanup with stxOSDefs.h
penk
parents: 1342
diff changeset
  1294
	]
21
33eb5ffad09d *** empty log message ***
claus
parents: 8
diff changeset
  1295
71
claus
parents: 63
diff changeset
  1296
    "
1485
d8578cf3504b gcc3.3.1 insn-scheduler bug workaround
Claus Gittinger <cg@exept.de>
parents: 1474
diff changeset
  1297
     Socket ipAddressOfHost:'localhost'
d8578cf3504b gcc3.3.1 insn-scheduler bug workaround
Claus Gittinger <cg@exept.de>
parents: 1474
diff changeset
  1298
     Socket ipAddressOfHost:'exept'
d8578cf3504b gcc3.3.1 insn-scheduler bug workaround
Claus Gittinger <cg@exept.de>
parents: 1474
diff changeset
  1299
     Socket ipAddressOfHost:'1.2.3.4'
1274
f257a1b16b4d use naemLookup from SocketAddress for ipv6
Claus Gittinger <cg@exept.de>
parents: 1263
diff changeset
  1300
     Socket ipAddressOfHost:'193.15.16.17'
1485
d8578cf3504b gcc3.3.1 insn-scheduler bug workaround
Claus Gittinger <cg@exept.de>
parents: 1474
diff changeset
  1301
     Socket ipAddressOfHost:'josef'
d8578cf3504b gcc3.3.1 insn-scheduler bug workaround
Claus Gittinger <cg@exept.de>
parents: 1474
diff changeset
  1302
     Socket ipAddressOfHost:'styx.com'
d8578cf3504b gcc3.3.1 insn-scheduler bug workaround
Claus Gittinger <cg@exept.de>
parents: 1474
diff changeset
  1303
     Socket hostWithIpAddress:(Socket ipAddressOfHost:'localhost')
d8578cf3504b gcc3.3.1 insn-scheduler bug workaround
Claus Gittinger <cg@exept.de>
parents: 1474
diff changeset
  1304
     Socket ipAddressOfHost:(Socket hostWithIpAddress:'127.0.0.1')
71
claus
parents: 63
diff changeset
  1305
    "
819
4cc15700d123 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 817
diff changeset
  1306
!
4cc15700d123 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 817
diff changeset
  1307
4cc15700d123 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 817
diff changeset
  1308
ipV6AddressOfHost:aHostName
1911
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
  1309
    <resource: #obsolete>
819
4cc15700d123 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 817
diff changeset
  1310
    "return the IPv6 (internet-) number for a hostname as a byteArray,
4cc15700d123 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 817
diff changeset
  1311
     where the network bytes come first (no matter what the cpus byteOrder is).
4cc15700d123 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 817
diff changeset
  1312
     If the host is unknown, return nil.
4cc15700d123 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 817
diff changeset
  1313
     This is the reverse operation to #hostWithIpV6Address:."
4cc15700d123 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 817
diff changeset
  1314
1485
d8578cf3504b gcc3.3.1 insn-scheduler bug workaround
Claus Gittinger <cg@exept.de>
parents: 1474
diff changeset
  1315
    NameLookupError
d8578cf3504b gcc3.3.1 insn-scheduler bug workaround
Claus Gittinger <cg@exept.de>
parents: 1474
diff changeset
  1316
	handle:[:ex |
1343
cc3bed115c0a definitions cleanup with stxOSDefs.h
penk
parents: 1342
diff changeset
  1317
	    ^ nil
cc3bed115c0a definitions cleanup with stxOSDefs.h
penk
parents: 1342
diff changeset
  1318
	]
cc3bed115c0a definitions cleanup with stxOSDefs.h
penk
parents: 1342
diff changeset
  1319
	do:[
cc3bed115c0a definitions cleanup with stxOSDefs.h
penk
parents: 1342
diff changeset
  1320
	    ^ (IPv6SocketAddress hostName:aHostName) address
cc3bed115c0a definitions cleanup with stxOSDefs.h
penk
parents: 1342
diff changeset
  1321
	]
819
4cc15700d123 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 817
diff changeset
  1322
4cc15700d123 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 817
diff changeset
  1323
    "
1485
d8578cf3504b gcc3.3.1 insn-scheduler bug workaround
Claus Gittinger <cg@exept.de>
parents: 1474
diff changeset
  1324
     Socket ipV6AddressOfHost:'localhost'
d8578cf3504b gcc3.3.1 insn-scheduler bug workaround
Claus Gittinger <cg@exept.de>
parents: 1474
diff changeset
  1325
     Socket ipV6AddressOfHost:'exept'
d8578cf3504b gcc3.3.1 insn-scheduler bug workaround
Claus Gittinger <cg@exept.de>
parents: 1474
diff changeset
  1326
     Socket ipV6AddressOfHost:'exept.exept.de'
d8578cf3504b gcc3.3.1 insn-scheduler bug workaround
Claus Gittinger <cg@exept.de>
parents: 1474
diff changeset
  1327
     Socket ipV6AddressOfHost:'www.google.de'
d8578cf3504b gcc3.3.1 insn-scheduler bug workaround
Claus Gittinger <cg@exept.de>
parents: 1474
diff changeset
  1328
     Socket ipV6AddressOfHost:'1.2.3.4.5.6.7.8.9.10.11.12.13.14.15.16'
d8578cf3504b gcc3.3.1 insn-scheduler bug workaround
Claus Gittinger <cg@exept.de>
parents: 1474
diff changeset
  1329
     Socket ipV6AddressOfHost:'josef'
d8578cf3504b gcc3.3.1 insn-scheduler bug workaround
Claus Gittinger <cg@exept.de>
parents: 1474
diff changeset
  1330
     Socket ipV6AddressOfHost:'styx.com'
d8578cf3504b gcc3.3.1 insn-scheduler bug workaround
Claus Gittinger <cg@exept.de>
parents: 1474
diff changeset
  1331
     Socket hostWithIpV6Address:(Socket ipV6AddressOfHost:'localhost')
d8578cf3504b gcc3.3.1 insn-scheduler bug workaround
Claus Gittinger <cg@exept.de>
parents: 1474
diff changeset
  1332
     Socket ipV6AddressOfHost:(Socket hostV6WithIpAddress:'127.0.0.1')
819
4cc15700d123 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 817
diff changeset
  1333
    "
531
ca4c73813531 category changes
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
  1334
! !
ca4c73813531 category changes
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
  1335
ca4c73813531 category changes
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
  1336
!Socket class methodsFor:'queries'!
ca4c73813531 category changes
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
  1337
1260
9a8fb2391174 instance creation of peer refactored
Claus Gittinger <cg@exept.de>
parents: 1235
diff changeset
  1338
peerFromDomain:domain name:peerName port:port
9a8fb2391174 instance creation of peer refactored
Claus Gittinger <cg@exept.de>
parents: 1235
diff changeset
  1339
    |addrClass|
9a8fb2391174 instance creation of peer refactored
Claus Gittinger <cg@exept.de>
parents: 1235
diff changeset
  1340
9a8fb2391174 instance creation of peer refactored
Claus Gittinger <cg@exept.de>
parents: 1235
diff changeset
  1341
    addrClass := self socketAddressClassForDomain:domain.
1263
23161346a162 no longer callBack into sockets getHostName/getAddress code.
Claus Gittinger <cg@exept.de>
parents: 1260
diff changeset
  1342
    ^ addrClass hostName:peerName serviceName:port type:nil
1187
7e5f2f6b177d getHostByAddr - call is now done lazy, when the socket is asked for the peer
Claus Gittinger <cg@exept.de>
parents: 1186
diff changeset
  1343
!
7e5f2f6b177d getHostByAddr - call is now done lazy, when the socket is asked for the peer
Claus Gittinger <cg@exept.de>
parents: 1186
diff changeset
  1344
7e5f2f6b177d getHostByAddr - call is now done lazy, when the socket is asked for the peer
Claus Gittinger <cg@exept.de>
parents: 1186
diff changeset
  1345
peerNameFromDomain:domain peer:peer
1260
9a8fb2391174 instance creation of peer refactored
Claus Gittinger <cg@exept.de>
parents: 1235
diff changeset
  1346
    |addrClass|
9a8fb2391174 instance creation of peer refactored
Claus Gittinger <cg@exept.de>
parents: 1235
diff changeset
  1347
9a8fb2391174 instance creation of peer refactored
Claus Gittinger <cg@exept.de>
parents: 1235
diff changeset
  1348
    addrClass := self socketAddressClassForDomain:domain.
9a8fb2391174 instance creation of peer refactored
Claus Gittinger <cg@exept.de>
parents: 1235
diff changeset
  1349
    ^ addrClass peerNameFromPeer:peer
1187
7e5f2f6b177d getHostByAddr - call is now done lazy, when the socket is asked for the peer
Claus Gittinger <cg@exept.de>
parents: 1186
diff changeset
  1350
!
7e5f2f6b177d getHostByAddr - call is now done lazy, when the socket is asked for the peer
Claus Gittinger <cg@exept.de>
parents: 1186
diff changeset
  1351
0
1cf8d1747859 Initial revision
claus
parents:
diff changeset
  1352
portOfService:aNameOrNumber
819
4cc15700d123 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 817
diff changeset
  1353
    "returns the port-number for a given IP-service
0
1cf8d1747859 Initial revision
claus
parents:
diff changeset
  1354
     or nil if no such service exists;
1cf8d1747859 Initial revision
claus
parents:
diff changeset
  1355
     - used to convert service names to portNumbers"
1cf8d1747859 Initial revision
claus
parents:
diff changeset
  1356
91
Claus Gittinger <cg@exept.de>
parents: 85
diff changeset
  1357
    ^ self portOfService:aNameOrNumber protocol:nil
Claus Gittinger <cg@exept.de>
parents: 85
diff changeset
  1358
28
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1359
    "
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1360
     Socket portOfService:'finger'
1485
d8578cf3504b gcc3.3.1 insn-scheduler bug workaround
Claus Gittinger <cg@exept.de>
parents: 1474
diff changeset
  1361
     Socket portOfService:'nntp'
d8578cf3504b gcc3.3.1 insn-scheduler bug workaround
Claus Gittinger <cg@exept.de>
parents: 1474
diff changeset
  1362
     Socket portOfService:'echo'
d8578cf3504b gcc3.3.1 insn-scheduler bug workaround
Claus Gittinger <cg@exept.de>
parents: 1474
diff changeset
  1363
     Socket portOfService:'snmp'
28
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1364
    "
0
1cf8d1747859 Initial revision
claus
parents:
diff changeset
  1365
!
1cf8d1747859 Initial revision
claus
parents:
diff changeset
  1366
91
Claus Gittinger <cg@exept.de>
parents: 85
diff changeset
  1367
portOfService:aNameOrNumber protocol:aProtocol
819
4cc15700d123 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 817
diff changeset
  1368
    "returns the port-number for a given IP-service
91
Claus Gittinger <cg@exept.de>
parents: 85
diff changeset
  1369
     or nil if no such service exists;
Claus Gittinger <cg@exept.de>
parents: 85
diff changeset
  1370
     - used to convert service names to portNumbers"
Claus Gittinger <cg@exept.de>
parents: 85
diff changeset
  1371
2909
aacef77a1697 64bit fixes
Claus Gittinger <cg@exept.de>
parents: 2904
diff changeset
  1372
%{ /* UNLIMITEDSTACK(noWIN32) */
418
317e55c6c281 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 403
diff changeset
  1373
#ifndef NO_SOCKET
91
Claus Gittinger <cg@exept.de>
parents: 85
diff changeset
  1374
    struct servent *servent = NULL;
Claus Gittinger <cg@exept.de>
parents: 85
diff changeset
  1375
    char *protocol;
Claus Gittinger <cg@exept.de>
parents: 85
diff changeset
  1376
    int tryBoth = 0;
524
8287da54eccf more empty code for other domains;
Claus Gittinger <cg@exept.de>
parents: 513
diff changeset
  1377
    short portNo;
91
Claus Gittinger <cg@exept.de>
parents: 85
diff changeset
  1378
604
b302a21afece Remove redundant code.
Stefan Vogel <sv@exept.de>
parents: 589
diff changeset
  1379
    if (__isSmallInteger(aNameOrNumber)) {
2340
2dc6e31f0142 handleType
Claus Gittinger <cg@exept.de>
parents: 2331
diff changeset
  1380
	RETURN ( aNameOrNumber );
92
Claus Gittinger <cg@exept.de>
parents: 91
diff changeset
  1381
    }
Claus Gittinger <cg@exept.de>
parents: 91
diff changeset
  1382
2331
b5280e1b3b9f changed:
Stefan Vogel <sv@exept.de>
parents: 2327
diff changeset
  1383
    if (__isStringLike(aProtocol)) {
2340
2dc6e31f0142 handleType
Claus Gittinger <cg@exept.de>
parents: 2331
diff changeset
  1384
	protocol = (char *)__stringVal(aProtocol);
604
b302a21afece Remove redundant code.
Stefan Vogel <sv@exept.de>
parents: 589
diff changeset
  1385
    } else {
2340
2dc6e31f0142 handleType
Claus Gittinger <cg@exept.de>
parents: 2331
diff changeset
  1386
	protocol = "tcp";
2dc6e31f0142 handleType
Claus Gittinger <cg@exept.de>
parents: 2331
diff changeset
  1387
	tryBoth = 1;
91
Claus Gittinger <cg@exept.de>
parents: 85
diff changeset
  1388
    }
524
8287da54eccf more empty code for other domains;
Claus Gittinger <cg@exept.de>
parents: 513
diff changeset
  1389
2331
b5280e1b3b9f changed:
Stefan Vogel <sv@exept.de>
parents: 2327
diff changeset
  1390
    if (__isStringLike(aNameOrNumber)) {
2340
2dc6e31f0142 handleType
Claus Gittinger <cg@exept.de>
parents: 2331
diff changeset
  1391
	servent = getservbyname((char *) __stringVal(aNameOrNumber), protocol);
2dc6e31f0142 handleType
Claus Gittinger <cg@exept.de>
parents: 2331
diff changeset
  1392
	if (servent != NULL) {
2dc6e31f0142 handleType
Claus Gittinger <cg@exept.de>
parents: 2331
diff changeset
  1393
	    RETURN ( __MKSMALLINT(ntohs(servent->s_port)) );
2dc6e31f0142 handleType
Claus Gittinger <cg@exept.de>
parents: 2331
diff changeset
  1394
	}
2dc6e31f0142 handleType
Claus Gittinger <cg@exept.de>
parents: 2331
diff changeset
  1395
	if (tryBoth) {
2dc6e31f0142 handleType
Claus Gittinger <cg@exept.de>
parents: 2331
diff changeset
  1396
	    servent = getservbyname((char *) __stringVal(aNameOrNumber), "udp");
2dc6e31f0142 handleType
Claus Gittinger <cg@exept.de>
parents: 2331
diff changeset
  1397
	    if (servent != NULL) {
2dc6e31f0142 handleType
Claus Gittinger <cg@exept.de>
parents: 2331
diff changeset
  1398
		RETURN ( __MKSMALLINT(ntohs(servent->s_port)) );
2dc6e31f0142 handleType
Claus Gittinger <cg@exept.de>
parents: 2331
diff changeset
  1399
	    }
2dc6e31f0142 handleType
Claus Gittinger <cg@exept.de>
parents: 2331
diff changeset
  1400
	}
2dc6e31f0142 handleType
Claus Gittinger <cg@exept.de>
parents: 2331
diff changeset
  1401
	RETURN ( nil );
91
Claus Gittinger <cg@exept.de>
parents: 85
diff changeset
  1402
    }
418
317e55c6c281 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 403
diff changeset
  1403
#endif
91
Claus Gittinger <cg@exept.de>
parents: 85
diff changeset
  1404
    RETURN ( nil );
Claus Gittinger <cg@exept.de>
parents: 85
diff changeset
  1405
%}
Claus Gittinger <cg@exept.de>
parents: 85
diff changeset
  1406
    "
Claus Gittinger <cg@exept.de>
parents: 85
diff changeset
  1407
     Socket portOfService:'echo' protocol:'udp'
Claus Gittinger <cg@exept.de>
parents: 85
diff changeset
  1408
     Socket portOfService:'echo' protocol:'tcp'
Claus Gittinger <cg@exept.de>
parents: 85
diff changeset
  1409
    "
Claus Gittinger <cg@exept.de>
parents: 85
diff changeset
  1410
!
Claus Gittinger <cg@exept.de>
parents: 85
diff changeset
  1411
0
1cf8d1747859 Initial revision
claus
parents:
diff changeset
  1412
protocolOfService:aNameOrNumber
819
4cc15700d123 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 817
diff changeset
  1413
    "returns the protocol (as string) for a given IP-service
28
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1414
     or nil if no such service exists."
1504
92005eec5c9d fixed moving-object-when-interrupted-with-scavenge bugs;
Claus Gittinger <cg@exept.de>
parents: 1503
diff changeset
  1415
92005eec5c9d fixed moving-object-when-interrupted-with-scavenge bugs;
Claus Gittinger <cg@exept.de>
parents: 1503
diff changeset
  1416
%{  /* UNLIMITEDSTACK(noWIN32) */
418
317e55c6c281 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 403
diff changeset
  1417
#ifndef NO_SOCKET
0
1cf8d1747859 Initial revision
claus
parents:
diff changeset
  1418
    struct servent *servent = NULL;
524
8287da54eccf more empty code for other domains;
Claus Gittinger <cg@exept.de>
parents: 513
diff changeset
  1419
    short portNo;
0
1cf8d1747859 Initial revision
claus
parents:
diff changeset
  1420
58
bd6753bf0401 *** empty log message ***
claus
parents: 51
diff changeset
  1421
    if (__isSmallInteger(aNameOrNumber)) {
2340
2dc6e31f0142 handleType
Claus Gittinger <cg@exept.de>
parents: 2331
diff changeset
  1422
	portNo = __intVal(aNameOrNumber);
2dc6e31f0142 handleType
Claus Gittinger <cg@exept.de>
parents: 2331
diff changeset
  1423
	servent = getservbyport(htons(portNo), "tcp") ;
2dc6e31f0142 handleType
Claus Gittinger <cg@exept.de>
parents: 2331
diff changeset
  1424
	if (servent == NULL) {
2dc6e31f0142 handleType
Claus Gittinger <cg@exept.de>
parents: 2331
diff changeset
  1425
	    servent = getservbyport(htons(portNo), "udp") ;
2dc6e31f0142 handleType
Claus Gittinger <cg@exept.de>
parents: 2331
diff changeset
  1426
	    if (servent == NULL) {
2dc6e31f0142 handleType
Claus Gittinger <cg@exept.de>
parents: 2331
diff changeset
  1427
		RETURN ( nil );
2dc6e31f0142 handleType
Claus Gittinger <cg@exept.de>
parents: 2331
diff changeset
  1428
	    }
2dc6e31f0142 handleType
Claus Gittinger <cg@exept.de>
parents: 2331
diff changeset
  1429
	}
0
1cf8d1747859 Initial revision
claus
parents:
diff changeset
  1430
    } else {
2340
2dc6e31f0142 handleType
Claus Gittinger <cg@exept.de>
parents: 2331
diff changeset
  1431
	if (__isStringLike(aNameOrNumber)) {
2dc6e31f0142 handleType
Claus Gittinger <cg@exept.de>
parents: 2331
diff changeset
  1432
	    servent = getservbyname((char *) __stringVal(aNameOrNumber), "tcp");
2dc6e31f0142 handleType
Claus Gittinger <cg@exept.de>
parents: 2331
diff changeset
  1433
	    if (servent == NULL) {
2dc6e31f0142 handleType
Claus Gittinger <cg@exept.de>
parents: 2331
diff changeset
  1434
		servent = getservbyname((char *) __stringVal(aNameOrNumber), "udp");
2dc6e31f0142 handleType
Claus Gittinger <cg@exept.de>
parents: 2331
diff changeset
  1435
		if (servent == NULL) {
2dc6e31f0142 handleType
Claus Gittinger <cg@exept.de>
parents: 2331
diff changeset
  1436
		    RETURN ( nil );
2dc6e31f0142 handleType
Claus Gittinger <cg@exept.de>
parents: 2331
diff changeset
  1437
		}
2dc6e31f0142 handleType
Claus Gittinger <cg@exept.de>
parents: 2331
diff changeset
  1438
	    }
2dc6e31f0142 handleType
Claus Gittinger <cg@exept.de>
parents: 2331
diff changeset
  1439
	}
0
1cf8d1747859 Initial revision
claus
parents:
diff changeset
  1440
    }
1cf8d1747859 Initial revision
claus
parents:
diff changeset
  1441
    if (servent) {
2340
2dc6e31f0142 handleType
Claus Gittinger <cg@exept.de>
parents: 2331
diff changeset
  1442
	RETURN ( __MKSTRING(servent->s_proto) );
0
1cf8d1747859 Initial revision
claus
parents:
diff changeset
  1443
    }
1504
92005eec5c9d fixed moving-object-when-interrupted-with-scavenge bugs;
Claus Gittinger <cg@exept.de>
parents: 1503
diff changeset
  1444
#endif /* !NO_SOCKET */
0
1cf8d1747859 Initial revision
claus
parents:
diff changeset
  1445
    RETURN ( nil );
1cf8d1747859 Initial revision
claus
parents:
diff changeset
  1446
%}
28
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1447
    "
1485
d8578cf3504b gcc3.3.1 insn-scheduler bug workaround
Claus Gittinger <cg@exept.de>
parents: 1474
diff changeset
  1448
     Socket protocolOfService:'finger'
d8578cf3504b gcc3.3.1 insn-scheduler bug workaround
Claus Gittinger <cg@exept.de>
parents: 1474
diff changeset
  1449
     Socket protocolOfService:'nntp'
28
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1450
     Socket protocolOfService:'xxx'
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1451
     Socket protocolOfService:79
1485
d8578cf3504b gcc3.3.1 insn-scheduler bug workaround
Claus Gittinger <cg@exept.de>
parents: 1474
diff changeset
  1452
     Socket protocolOfService:'snmp'
28
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1453
    "
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1454
!
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1455
1187
7e5f2f6b177d getHostByAddr - call is now done lazy, when the socket is asked for the peer
Claus Gittinger <cg@exept.de>
parents: 1186
diff changeset
  1456
socketAddressClassForDomain:domain
1230
2cfb8c270cb5 more functionality moved to SocketAccessor
Claus Gittinger <cg@exept.de>
parents: 1224
diff changeset
  1457
    ^ SocketAddress knownClassFromCode:domain
2cfb8c270cb5 more functionality moved to SocketAccessor
Claus Gittinger <cg@exept.de>
parents: 1224
diff changeset
  1458
2cfb8c270cb5 more functionality moved to SocketAccessor
Claus Gittinger <cg@exept.de>
parents: 1224
diff changeset
  1459
    "
3059
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  1460
     self socketAddressClassForDomain:#AF_INET
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  1461
     self socketAddressClassForDomain:#AF_UNIX
1230
2cfb8c270cb5 more functionality moved to SocketAccessor
Claus Gittinger <cg@exept.de>
parents: 1224
diff changeset
  1462
    "
1187
7e5f2f6b177d getHostByAddr - call is now done lazy, when the socket is asked for the peer
Claus Gittinger <cg@exept.de>
parents: 1186
diff changeset
  1463
!
7e5f2f6b177d getHostByAddr - call is now done lazy, when the socket is asked for the peer
Claus Gittinger <cg@exept.de>
parents: 1186
diff changeset
  1464
532
f997c3873602 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 531
diff changeset
  1465
supportedProtocolFamilies
f997c3873602 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 531
diff changeset
  1466
    "return a collection of supported protocol families.
f997c3873602 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 531
diff changeset
  1467
     This list specifies what the Socket class supports -
f997c3873602 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 531
diff changeset
  1468
     socket creation may still fail, if your system was built
f997c3873602 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 531
diff changeset
  1469
     without it."
f997c3873602 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 531
diff changeset
  1470
1280
b973855bfe74 moved all socket constant queries from SocketHandle
Claus Gittinger <cg@exept.de>
parents: 1278
diff changeset
  1471
    ^ OperatingSystem supportedProtocolFamilies
532
f997c3873602 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 531
diff changeset
  1472
f997c3873602 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 531
diff changeset
  1473
    "
f997c3873602 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 531
diff changeset
  1474
     Socket supportedProtocolFamilies
f997c3873602 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 531
diff changeset
  1475
    "
559
61012867ebed cleanup if #connect is interrupted
Claus Gittinger <cg@exept.de>
parents: 551
diff changeset
  1476
!
61012867ebed cleanup if #connect is interrupted
Claus Gittinger <cg@exept.de>
parents: 551
diff changeset
  1477
61012867ebed cleanup if #connect is interrupted
Claus Gittinger <cg@exept.de>
parents: 551
diff changeset
  1478
typeOfProtocol:aProtocol
61012867ebed cleanup if #connect is interrupted
Claus Gittinger <cg@exept.de>
parents: 551
diff changeset
  1479
    "given a protocols name (i.e. tcp, udp etc) return the connection type.
61012867ebed cleanup if #connect is interrupted
Claus Gittinger <cg@exept.de>
parents: 551
diff changeset
  1480
     This method needs more ... - or is there a way to get this from the system ?"
61012867ebed cleanup if #connect is interrupted
Claus Gittinger <cg@exept.de>
parents: 551
diff changeset
  1481
61012867ebed cleanup if #connect is interrupted
Claus Gittinger <cg@exept.de>
parents: 551
diff changeset
  1482
    (aProtocol = 'tcp') ifTrue:[^ #stream].
61012867ebed cleanup if #connect is interrupted
Claus Gittinger <cg@exept.de>
parents: 551
diff changeset
  1483
    (aProtocol = 'udp') ifTrue:[^ #datagram].
61012867ebed cleanup if #connect is interrupted
Claus Gittinger <cg@exept.de>
parents: 551
diff changeset
  1484
    (aProtocol = 'ip')  ifTrue:[^ #raw].
61012867ebed cleanup if #connect is interrupted
Claus Gittinger <cg@exept.de>
parents: 551
diff changeset
  1485
    "
61012867ebed cleanup if #connect is interrupted
Claus Gittinger <cg@exept.de>
parents: 551
diff changeset
  1486
     unix domain
61012867ebed cleanup if #connect is interrupted
Claus Gittinger <cg@exept.de>
parents: 551
diff changeset
  1487
    "
61012867ebed cleanup if #connect is interrupted
Claus Gittinger <cg@exept.de>
parents: 551
diff changeset
  1488
    (aProtocol = 'ud')  ifTrue:[^ #stream].
61012867ebed cleanup if #connect is interrupted
Claus Gittinger <cg@exept.de>
parents: 551
diff changeset
  1489
    "
61012867ebed cleanup if #connect is interrupted
Claus Gittinger <cg@exept.de>
parents: 551
diff changeset
  1490
     add x25 stuff (if any) here ...
61012867ebed cleanup if #connect is interrupted
Claus Gittinger <cg@exept.de>
parents: 551
diff changeset
  1491
    "
61012867ebed cleanup if #connect is interrupted
Claus Gittinger <cg@exept.de>
parents: 551
diff changeset
  1492
    "
61012867ebed cleanup if #connect is interrupted
Claus Gittinger <cg@exept.de>
parents: 551
diff changeset
  1493
     add appletalk stuff (if any) here ...
61012867ebed cleanup if #connect is interrupted
Claus Gittinger <cg@exept.de>
parents: 551
diff changeset
  1494
    "
61012867ebed cleanup if #connect is interrupted
Claus Gittinger <cg@exept.de>
parents: 551
diff changeset
  1495
    "
61012867ebed cleanup if #connect is interrupted
Claus Gittinger <cg@exept.de>
parents: 551
diff changeset
  1496
     add other stuff (if any) here ...
61012867ebed cleanup if #connect is interrupted
Claus Gittinger <cg@exept.de>
parents: 551
diff changeset
  1497
    "
61012867ebed cleanup if #connect is interrupted
Claus Gittinger <cg@exept.de>
parents: 551
diff changeset
  1498
    ^ nil
61012867ebed cleanup if #connect is interrupted
Claus Gittinger <cg@exept.de>
parents: 551
diff changeset
  1499
61012867ebed cleanup if #connect is interrupted
Claus Gittinger <cg@exept.de>
parents: 551
diff changeset
  1500
    "
61012867ebed cleanup if #connect is interrupted
Claus Gittinger <cg@exept.de>
parents: 551
diff changeset
  1501
     Socket typeOfProtocol:'tcp'
61012867ebed cleanup if #connect is interrupted
Claus Gittinger <cg@exept.de>
parents: 551
diff changeset
  1502
     Socket typeOfProtocol:'ucp'
61012867ebed cleanup if #connect is interrupted
Claus Gittinger <cg@exept.de>
parents: 551
diff changeset
  1503
     Socket typeOfProtocol:(Socket protocolOfService:'nntp')
61012867ebed cleanup if #connect is interrupted
Claus Gittinger <cg@exept.de>
parents: 551
diff changeset
  1504
     Socket typeOfProtocol:(Socket protocolOfService:'echo')
61012867ebed cleanup if #connect is interrupted
Claus Gittinger <cg@exept.de>
parents: 551
diff changeset
  1505
    "
28
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1506
! !
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1507
1202
c52279df60d8 method category rename
Claus Gittinger <cg@exept.de>
parents: 1187
diff changeset
  1508
!Socket methodsFor:'Compatibility-Dolphin'!
1110
0876a3d30fd2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1035
diff changeset
  1509
0876a3d30fd2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1035
diff changeset
  1510
setReceiveTimeout: milliseconds
0876a3d30fd2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1035
diff changeset
  1511
    self receiveTimeout:(milliseconds / 1000)
0876a3d30fd2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1035
diff changeset
  1512
!
0876a3d30fd2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1035
diff changeset
  1513
0876a3d30fd2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1035
diff changeset
  1514
setSendTimeout: milliseconds
0876a3d30fd2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1035
diff changeset
  1515
    self sendTimeout:(milliseconds / 1000)
0876a3d30fd2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1035
diff changeset
  1516
! !
0876a3d30fd2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1035
diff changeset
  1517
1202
c52279df60d8 method category rename
Claus Gittinger <cg@exept.de>
parents: 1187
diff changeset
  1518
!Socket methodsFor:'Compatibility-ST80'!
28
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1519
887
2b2dc6b59b5a more VW compatibility
Claus Gittinger <cg@exept.de>
parents: 876
diff changeset
  1520
acceptNonBlock
2b2dc6b59b5a more VW compatibility
Claus Gittinger <cg@exept.de>
parents: 876
diff changeset
  1521
    ^ self accept
2b2dc6b59b5a more VW compatibility
Claus Gittinger <cg@exept.de>
parents: 876
diff changeset
  1522
!
2b2dc6b59b5a more VW compatibility
Claus Gittinger <cg@exept.de>
parents: 876
diff changeset
  1523
126
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
  1524
errorReporter
781
4d61e7588ff3 added #waitForNewConnectionOrDataOnAny:timeout:
Claus Gittinger <cg@exept.de>
parents: 776
diff changeset
  1525
    "ST-80 mimicry."
4d61e7588ff3 added #waitForNewConnectionOrDataOnAny:timeout:
Claus Gittinger <cg@exept.de>
parents: 776
diff changeset
  1526
1535
f6aa0fc8c3cc getSocketAddress
Claus Gittinger <cg@exept.de>
parents: 1533
diff changeset
  1527
    ^ self class
28
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1528
!
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1529
1485
d8578cf3504b gcc3.3.1 insn-scheduler bug workaround
Claus Gittinger <cg@exept.de>
parents: 1474
diff changeset
  1530
ioConnection
887
2b2dc6b59b5a more VW compatibility
Claus Gittinger <cg@exept.de>
parents: 876
diff changeset
  1531
    ^ self
2b2dc6b59b5a more VW compatibility
Claus Gittinger <cg@exept.de>
parents: 876
diff changeset
  1532
!
2b2dc6b59b5a more VW compatibility
Claus Gittinger <cg@exept.de>
parents: 876
diff changeset
  1533
126
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
  1534
notReadySignal
781
4d61e7588ff3 added #waitForNewConnectionOrDataOnAny:timeout:
Claus Gittinger <cg@exept.de>
parents: 776
diff changeset
  1535
    "ST-80 mimicry.
4d61e7588ff3 added #waitForNewConnectionOrDataOnAny:timeout:
Claus Gittinger <cg@exept.de>
parents: 776
diff changeset
  1536
     for now - this is not yet raised"
71
claus
parents: 63
diff changeset
  1537
126
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
  1538
    ^ Signal new
486
ed4e215e83ef ST-80 mimicry
Claus Gittinger <cg@exept.de>
parents: 470
diff changeset
  1539
!
ed4e215e83ef ST-80 mimicry
Claus Gittinger <cg@exept.de>
parents: 470
diff changeset
  1540
576
13acab81fad0 more ST80 compatibility
ca
parents: 572
diff changeset
  1541
readAppendStream
781
4d61e7588ff3 added #waitForNewConnectionOrDataOnAny:timeout:
Claus Gittinger <cg@exept.de>
parents: 776
diff changeset
  1542
    "ST-80 mimicry.
4d61e7588ff3 added #waitForNewConnectionOrDataOnAny:timeout:
Claus Gittinger <cg@exept.de>
parents: 776
diff changeset
  1543
     In ST-80, socket is not a stream, but referes to one.
4d61e7588ff3 added #waitForNewConnectionOrDataOnAny:timeout:
Claus Gittinger <cg@exept.de>
parents: 776
diff changeset
  1544
     ST-80 code therefore uses 'Socket readWriteStream' to access
1485
d8578cf3504b gcc3.3.1 insn-scheduler bug workaround
Claus Gittinger <cg@exept.de>
parents: 1474
diff changeset
  1545
     the actual stream.
781
4d61e7588ff3 added #waitForNewConnectionOrDataOnAny:timeout:
Claus Gittinger <cg@exept.de>
parents: 776
diff changeset
  1546
     In ST/X, sockets inherit from stream, so
4d61e7588ff3 added #waitForNewConnectionOrDataOnAny:timeout:
Claus Gittinger <cg@exept.de>
parents: 776
diff changeset
  1547
     this method returns the receiver, for transparency"
4d61e7588ff3 added #waitForNewConnectionOrDataOnAny:timeout:
Claus Gittinger <cg@exept.de>
parents: 776
diff changeset
  1548
576
13acab81fad0 more ST80 compatibility
ca
parents: 572
diff changeset
  1549
    ^ self
13acab81fad0 more ST80 compatibility
ca
parents: 572
diff changeset
  1550
!
13acab81fad0 more ST80 compatibility
ca
parents: 572
diff changeset
  1551
486
ed4e215e83ef ST-80 mimicry
Claus Gittinger <cg@exept.de>
parents: 470
diff changeset
  1552
readStream
ed4e215e83ef ST-80 mimicry
Claus Gittinger <cg@exept.de>
parents: 470
diff changeset
  1553
    "ST-80 mimicry.
ed4e215e83ef ST-80 mimicry
Claus Gittinger <cg@exept.de>
parents: 470
diff changeset
  1554
     In ST-80, socket is not a stream, but referes to one.
ed4e215e83ef ST-80 mimicry
Claus Gittinger <cg@exept.de>
parents: 470
diff changeset
  1555
     ST-80 code therefore uses 'Socket readStream' to access
1485
d8578cf3504b gcc3.3.1 insn-scheduler bug workaround
Claus Gittinger <cg@exept.de>
parents: 1474
diff changeset
  1556
     the actual stream.
781
4d61e7588ff3 added #waitForNewConnectionOrDataOnAny:timeout:
Claus Gittinger <cg@exept.de>
parents: 776
diff changeset
  1557
     In ST/X, sockets inherit from stream, so
4d61e7588ff3 added #waitForNewConnectionOrDataOnAny:timeout:
Claus Gittinger <cg@exept.de>
parents: 776
diff changeset
  1558
     this method returns the receiver, for transparency"
486
ed4e215e83ef ST-80 mimicry
Claus Gittinger <cg@exept.de>
parents: 470
diff changeset
  1559
ed4e215e83ef ST-80 mimicry
Claus Gittinger <cg@exept.de>
parents: 470
diff changeset
  1560
    ^ self
ed4e215e83ef ST-80 mimicry
Claus Gittinger <cg@exept.de>
parents: 470
diff changeset
  1561
ed4e215e83ef ST-80 mimicry
Claus Gittinger <cg@exept.de>
parents: 470
diff changeset
  1562
    "Created: 24.1.1997 / 23:52:57 / cg"
ed4e215e83ef ST-80 mimicry
Claus Gittinger <cg@exept.de>
parents: 470
diff changeset
  1563
!
ed4e215e83ef ST-80 mimicry
Claus Gittinger <cg@exept.de>
parents: 470
diff changeset
  1564
ed4e215e83ef ST-80 mimicry
Claus Gittinger <cg@exept.de>
parents: 470
diff changeset
  1565
writeStream
ed4e215e83ef ST-80 mimicry
Claus Gittinger <cg@exept.de>
parents: 470
diff changeset
  1566
    "ST-80 mimicry.
ed4e215e83ef ST-80 mimicry
Claus Gittinger <cg@exept.de>
parents: 470
diff changeset
  1567
     In ST-80, socket is not a stream, but referes to one.
ed4e215e83ef ST-80 mimicry
Claus Gittinger <cg@exept.de>
parents: 470
diff changeset
  1568
     ST-80 code therefore uses 'Socket writeStream' to access
1485
d8578cf3504b gcc3.3.1 insn-scheduler bug workaround
Claus Gittinger <cg@exept.de>
parents: 1474
diff changeset
  1569
     the actual stream.
781
4d61e7588ff3 added #waitForNewConnectionOrDataOnAny:timeout:
Claus Gittinger <cg@exept.de>
parents: 776
diff changeset
  1570
     In ST/X, sockets inherit from stream, so
4d61e7588ff3 added #waitForNewConnectionOrDataOnAny:timeout:
Claus Gittinger <cg@exept.de>
parents: 776
diff changeset
  1571
     this method returns the receiver, for transparency"
486
ed4e215e83ef ST-80 mimicry
Claus Gittinger <cg@exept.de>
parents: 470
diff changeset
  1572
ed4e215e83ef ST-80 mimicry
Claus Gittinger <cg@exept.de>
parents: 470
diff changeset
  1573
    ^ self
ed4e215e83ef ST-80 mimicry
Claus Gittinger <cg@exept.de>
parents: 470
diff changeset
  1574
ed4e215e83ef ST-80 mimicry
Claus Gittinger <cg@exept.de>
parents: 470
diff changeset
  1575
    "Created: 24.1.1997 / 10:34:35 / cg"
ed4e215e83ef ST-80 mimicry
Claus Gittinger <cg@exept.de>
parents: 470
diff changeset
  1576
    "Modified: 24.1.1997 / 23:52:52 / cg"
71
claus
parents: 63
diff changeset
  1577
! !
claus
parents: 63
diff changeset
  1578
1202
c52279df60d8 method category rename
Claus Gittinger <cg@exept.de>
parents: 1187
diff changeset
  1579
!Socket methodsFor:'Compatibility-Squeak'!
771
74abb04ef57c checkin from browser
Claus Gittinger <cg@exept.de>
parents: 752
diff changeset
  1580
1462
5602fce52b42 squeak stuff
Claus Gittinger <cg@exept.de>
parents: 1413
diff changeset
  1581
address
5602fce52b42 squeak stuff
Claus Gittinger <cg@exept.de>
parents: 1413
diff changeset
  1582
    ^ self getSocketAddress
5602fce52b42 squeak stuff
Claus Gittinger <cg@exept.de>
parents: 1413
diff changeset
  1583
!
5602fce52b42 squeak stuff
Claus Gittinger <cg@exept.de>
parents: 1413
diff changeset
  1584
2308
d8b410a4f38b added: #connectToHostNamed:port:
Claus Gittinger <cg@exept.de>
parents: 2292
diff changeset
  1585
connectToHostNamed:hostName port:portNr
d8b410a4f38b added: #connectToHostNamed:port:
Claus Gittinger <cg@exept.de>
parents: 2292
diff changeset
  1586
    self connectTo:hostName port:portNr
d8b410a4f38b added: #connectToHostNamed:port:
Claus Gittinger <cg@exept.de>
parents: 2292
diff changeset
  1587
!
d8b410a4f38b added: #connectToHostNamed:port:
Claus Gittinger <cg@exept.de>
parents: 2292
diff changeset
  1588
1462
5602fce52b42 squeak stuff
Claus Gittinger <cg@exept.de>
parents: 1413
diff changeset
  1589
dataAvailable
5602fce52b42 squeak stuff
Claus Gittinger <cg@exept.de>
parents: 1413
diff changeset
  1590
    ^ self canReadWithoutBlocking
5602fce52b42 squeak stuff
Claus Gittinger <cg@exept.de>
parents: 1413
diff changeset
  1591
!
5602fce52b42 squeak stuff
Claus Gittinger <cg@exept.de>
parents: 1413
diff changeset
  1592
1886
e0d23764c809 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1885
diff changeset
  1593
destroy
e0d23764c809 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1885
diff changeset
  1594
    self close
e0d23764c809 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1885
diff changeset
  1595
e0d23764c809 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1885
diff changeset
  1596
    "Created: / 04-06-2007 / 21:29:03 / cg"
e0d23764c809 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1885
diff changeset
  1597
!
e0d23764c809 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1885
diff changeset
  1598
1462
5602fce52b42 squeak stuff
Claus Gittinger <cg@exept.de>
parents: 1413
diff changeset
  1599
listenOn:aPortNr
1882
6f818f33c85a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1863
diff changeset
  1600
    self listenOn:aPortNr backlogSize:5
6f818f33c85a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1863
diff changeset
  1601
6f818f33c85a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1863
diff changeset
  1602
    "Modified: / 31-05-2007 / 17:59:53 / cg"
6f818f33c85a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1863
diff changeset
  1603
!
6f818f33c85a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1863
diff changeset
  1604
6f818f33c85a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1863
diff changeset
  1605
listenOn:aPortNr backlogSize:aNumber
1462
5602fce52b42 squeak stuff
Claus Gittinger <cg@exept.de>
parents: 1413
diff changeset
  1606
    self bindTo:aPortNr address:nil.
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  1607
    self listenFor:aNumber
1882
6f818f33c85a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1863
diff changeset
  1608
6f818f33c85a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1863
diff changeset
  1609
    "Created: / 31-05-2007 / 17:59:47 / cg"
1462
5602fce52b42 squeak stuff
Claus Gittinger <cg@exept.de>
parents: 1413
diff changeset
  1610
!
5602fce52b42 squeak stuff
Claus Gittinger <cg@exept.de>
parents: 1413
diff changeset
  1611
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  1612
peerName
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  1613
    "return my peer (i.e. ipAddr + port);
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  1614
     May return nil if not yet setup completely."
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  1615
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  1616
    ^ self getPeer
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  1617
!
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  1618
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  1619
primSocketLocalPort:aSocket
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  1620
    ^ self port
1600
f3acd5382fa1 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1584
diff changeset
  1621
!
f3acd5382fa1 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1584
diff changeset
  1622
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  1623
sendData: aStringOrByteArray
3155
d1884a37375c Initialize in instance initialize method insted in #new
Stefan Vogel <sv@exept.de>
parents: 3152
diff changeset
  1624
    "Send all of the data in the given array, even if it requires multiple calls to send it all.
d1884a37375c Initialize in instance initialize method insted in #new
Stefan Vogel <sv@exept.de>
parents: 3152
diff changeset
  1625
     Return the number of bytes sent."
d1884a37375c Initialize in instance initialize method insted in #new
Stefan Vogel <sv@exept.de>
parents: 3152
diff changeset
  1626
d1884a37375c Initialize in instance initialize method insted in #new
Stefan Vogel <sv@exept.de>
parents: 3152
diff changeset
  1627
    ^ self nextPutBytes:aStringOrByteArray size from:aStringOrByteArray startingAt:1.
1600
f3acd5382fa1 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1584
diff changeset
  1628
!
f3acd5382fa1 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1584
diff changeset
  1629
1462
5602fce52b42 squeak stuff
Claus Gittinger <cg@exept.de>
parents: 1413
diff changeset
  1630
setOption: optionName value: optionValue
2899
a1f9a142d49b class: Socket
Claus Gittinger <cg@exept.de>
parents: 2891
diff changeset
  1631
    ^ self setSocketOption:(optionName asSymbol) argument:optionValue argument:nil
1887
f26d9b04244d changed #setOption:value:
Claus Gittinger <cg@exept.de>
parents: 1886
diff changeset
  1632
f26d9b04244d changed #setOption:value:
Claus Gittinger <cg@exept.de>
parents: 1886
diff changeset
  1633
    "Modified: / 04-06-2007 / 21:23:19 / cg"
1600
f3acd5382fa1 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1584
diff changeset
  1634
!
f3acd5382fa1 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1584
diff changeset
  1635
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  1636
socketHandle
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  1637
    ^ self
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  1638
!
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  1639
2904
d2e1eead2bfb class: Socket
Claus Gittinger <cg@exept.de>
parents: 2900
diff changeset
  1640
waitForConnectionUntil:aTimestamp
d2e1eead2bfb class: Socket
Claus Gittinger <cg@exept.de>
parents: 2900
diff changeset
  1641
    "return true if connected"
d2e1eead2bfb class: Socket
Claus Gittinger <cg@exept.de>
parents: 2900
diff changeset
  1642
d2e1eead2bfb class: Socket
Claus Gittinger <cg@exept.de>
parents: 2900
diff changeset
  1643
    self readWaitWithTimeoutMs: (aTimestamp millisecondDeltaFrom:Timestamp now).
d2e1eead2bfb class: Socket
Claus Gittinger <cg@exept.de>
parents: 2900
diff changeset
  1644
    ^ self isConnected
1886
e0d23764c809 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1885
diff changeset
  1645
!
e0d23764c809 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1885
diff changeset
  1646
e0d23764c809 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1885
diff changeset
  1647
waitForData
e0d23764c809 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1885
diff changeset
  1648
    self readWait
e0d23764c809 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1885
diff changeset
  1649
e0d23764c809 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1885
diff changeset
  1650
    "Created: / 04-06-2007 / 21:28:40 / cg"
771
74abb04ef57c checkin from browser
Claus Gittinger <cg@exept.de>
parents: 752
diff changeset
  1651
! !
74abb04ef57c checkin from browser
Claus Gittinger <cg@exept.de>
parents: 752
diff changeset
  1652
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  1653
!Socket methodsFor:'accepting connections'!
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  1654
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  1655
accept
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  1656
    "create a new TCP socket from accepting on the receiver.
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  1657
     This method will suspend the current process if no connection is waiting.
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  1658
     For ST-80 compatibility"
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  1659
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  1660
    |newSock|
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  1661
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  1662
    self readWait.
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  1663
    newSock := self class new.
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  1664
    (newSock primAcceptOn:self blocking:false) ifFalse:[
2321
6f4cc7b644db filePointer -> handle migration
Claus Gittinger <cg@exept.de>
parents: 2308
diff changeset
  1665
	"should raise an error here"
6f4cc7b644db filePointer -> handle migration
Claus Gittinger <cg@exept.de>
parents: 2308
diff changeset
  1666
	^ nil
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  1667
    ].
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  1668
    ^ newSock
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  1669
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  1670
    "
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  1671
     |sock newSock|
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  1672
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  1673
     sock := Socket provide:8004.
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  1674
     sock listenFor:5.
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  1675
     newSock := sock accept.
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  1676
    "
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  1677
!
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  1678
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  1679
blockingAccept
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  1680
    "create a new TCP socket from accepting on the receiver.
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  1681
     This method will suspend the smalltalk image with all smalltalk processes if no connection is waiting.
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  1682
     For ST-80 compatibility"
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  1683
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  1684
    |newSock|
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  1685
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  1686
    newSock := self class new.
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  1687
    (newSock primAcceptOn:self blocking:true) ifFalse:[
2321
6f4cc7b644db filePointer -> handle migration
Claus Gittinger <cg@exept.de>
parents: 2308
diff changeset
  1688
	"should raise an error here"
6f4cc7b644db filePointer -> handle migration
Claus Gittinger <cg@exept.de>
parents: 2308
diff changeset
  1689
	^ nil
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  1690
    ].
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  1691
    ^ newSock
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  1692
! !
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  1693
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  1694
!Socket methodsFor:'binding'!
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  1695
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  1696
bindAnonymously
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  1697
    "bind to any address. A free port will be allocated.
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  1698
     Our own socket address will be determined after conection set up.
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  1699
     This is the default after the socket has been created"
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  1700
3059
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  1701
    ^ self bindTo:nil reuseAddress:false
2321
6f4cc7b644db filePointer -> handle migration
Claus Gittinger <cg@exept.de>
parents: 2308
diff changeset
  1702
6f4cc7b644db filePointer -> handle migration
Claus Gittinger <cg@exept.de>
parents: 2308
diff changeset
  1703
    "
1938
831af28cc848 comments
Stefan Vogel <sv@exept.de>
parents: 1935
diff changeset
  1704
      self newTCP bindAnonymously; listenFor:1; yourself
831af28cc848 comments
Stefan Vogel <sv@exept.de>
parents: 1935
diff changeset
  1705
    "
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  1706
!
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  1707
3059
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  1708
bindAnonymouslyToAddress:aSocketAddress
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  1709
    "bind to address addressString.
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  1710
     A free port will be allocated"
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  1711
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  1712
    ^ self
3217
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  1713
	bindTo:0
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  1714
	address:aSocketAddress
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  1715
	reuseAddress:false
2321
6f4cc7b644db filePointer -> handle migration
Claus Gittinger <cg@exept.de>
parents: 2308
diff changeset
  1716
6f4cc7b644db filePointer -> handle migration
Claus Gittinger <cg@exept.de>
parents: 2308
diff changeset
  1717
    "
3059
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  1718
      self newTCP bindAnonymouslyToAddress:IPSocketAddress localHost; listenFor:1; yourself
1938
831af28cc848 comments
Stefan Vogel <sv@exept.de>
parents: 1935
diff changeset
  1719
    "
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  1720
!
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  1721
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  1722
bindTo:aSocketAddress
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  1723
    "ST80 compatible bind, expecting a socketAddress argument.
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  1724
     The socketAddress object (an instance of SocketAddress)
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  1725
     is supposed to respond to #portOrName and #address requests."
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  1726
3059
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  1727
    ^ self bindTo:aSocketAddress reuseAddress:true
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  1728
!
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  1729
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  1730
bindTo:portNrOrNameString address:addressString
3059
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  1731
    "Old interface: bind the socket to an address
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  1732
     - returns true if ok, false otherwise.
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  1733
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  1734
     The interpretation of hostOrPathNameOrSocketAddrOrNil portNrOrName depends on the domain:
3217
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  1735
	Best use a SocketAddress
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  1736
	For backward compatibility:
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  1737
	    AF_INET domain can also use (4byte) byteArray like internet numbers,
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  1738
	    AF_UNIX domain cab use pathname strings."
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  1739
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  1740
    ^ self
3217
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  1741
	bindTo:portNrOrNameString
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  1742
	address:addressString
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  1743
	reuseAddress:true
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  1744
!
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  1745
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  1746
bindTo:portNrOrNameOrNil address:hostOrPathNameOrSocketAddrOrNil reuseAddress:reuse
3059
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  1747
    "Old interface: bind the socket to an address
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  1748
     - returns true if ok, false otherwise.
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  1749
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  1750
     The interpretation of hostOrPathNameOrSocketAddrOrNil portNrOrName depends on the domain:
3217
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  1751
	Best use a SocketAddress
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  1752
	For backward compatibility:
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  1753
	    AF_INET domain can also use (4byte) byteArray like internet numbers,
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  1754
	    AF_UNIX domain can use pathname strings.
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  1755
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  1756
     The reuse boolean argument controls if the SO_REUSEADDR socket option
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  1757
     is to be set (to avoid the 'bind: address in use' error).
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  1758
    "
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  1759
3059
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  1760
    |socketAddress|
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  1761
2321
6f4cc7b644db filePointer -> handle migration
Claus Gittinger <cg@exept.de>
parents: 2308
diff changeset
  1762
    handle isNil ifTrue:[
3217
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  1763
	^ self errorNotOpen
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  1764
    ].
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  1765
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  1766
    hostOrPathNameOrSocketAddrOrNil isNil ifTrue:[
3217
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  1767
	socketAddress := self socketAddressClass anyHost.
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  1768
    ] ifFalse:[
3217
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  1769
	(hostOrPathNameOrSocketAddrOrNil isSocketAddress) ifTrue:[
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  1770
	    socketAddress := hostOrPathNameOrSocketAddrOrNil.
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  1771
	] ifFalse:[
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  1772
	    "backward compatibility: support for byteArray and string arg"
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  1773
	    hostOrPathNameOrSocketAddrOrNil isString ifTrue:[
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  1774
		socketAddress := self socketAddressClass hostName:hostOrPathNameOrSocketAddrOrNil.
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  1775
	    ] ifFalse:[
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  1776
		hostOrPathNameOrSocketAddrOrNil isByteCollection ifFalse:[
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  1777
		    ^ self error:'bindTo: bad host (socketAddress) argument'
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  1778
		].
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  1779
		socketAddress := self socketAddressClass hostAddress:hostOrPathNameOrSocketAddrOrNil.
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  1780
	    ].
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  1781
	].
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  1782
    ].
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  1783
    portNrOrNameOrNil notNil ifTrue:[
3217
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  1784
	socketAddress port:portNrOrNameOrNil.
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  1785
    ].
3059
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  1786
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  1787
    ^ self bindTo:socketAddress reuseAddress:reuse.
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  1788
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  1789
    "
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  1790
     (Socket domain:#'AF_INET' type:#stream)
3217
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  1791
	 bindTo:2144 address:nil; yourself
3059
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  1792
    "
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  1793
!
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  1794
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  1795
bindTo:aSocketAddress reuseAddress:reuse
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  1796
    "Bind the socket to aSocketAddress - returns true if ok, false otherwise.
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  1797
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  1798
     The reuse boolean argument controls if the SO_REUSEADDR socket option
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  1799
     is to be set (to avoid the 'bind: address in use' error).
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  1800
3137
df3e9cebf52c class: Socket
Stefan Vogel <sv@exept.de>
parents: 3127
diff changeset
  1801
     You can bind to nil to bind to anyHost and assign a random port."
3059
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  1802
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  1803
    |ok error socketAddress|
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  1804
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  1805
    handle isNil ifTrue:[
3217
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  1806
	^ self errorNotOpen
3059
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  1807
    ].
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  1808
    socketAddress := aSocketAddress.
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  1809
    socketAddress isNil ifTrue:[
3217
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  1810
	"ok, get a all zero socket address, so it is for anyHost
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  1811
	 and the port will be assigned"
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  1812
	socketAddress := self socketAddressClass new.
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  1813
    ].
2321
6f4cc7b644db filePointer -> handle migration
Claus Gittinger <cg@exept.de>
parents: 2308
diff changeset
  1814
    ok := false.
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  1815
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  1816
%{  /* STACK: 100000 */
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  1817
#ifndef NO_SOCKET
2321
6f4cc7b644db filePointer -> handle migration
Claus Gittinger <cg@exept.de>
parents: 2308
diff changeset
  1818
    OBJ fp = __INST(handle);
6f4cc7b644db filePointer -> handle migration
Claus Gittinger <cg@exept.de>
parents: 2308
diff changeset
  1819
    SOCKET sock;
6f4cc7b644db filePointer -> handle migration
Claus Gittinger <cg@exept.de>
parents: 2308
diff changeset
  1820
    union sockaddr_u sa;
6f4cc7b644db filePointer -> handle migration
Claus Gittinger <cg@exept.de>
parents: 2308
diff changeset
  1821
    int sockaddr_size;
2909
aacef77a1697 64bit fixes
Claus Gittinger <cg@exept.de>
parents: 2904
diff changeset
  1822
    INT ret;
2321
6f4cc7b644db filePointer -> handle migration
Claus Gittinger <cg@exept.de>
parents: 2308
diff changeset
  1823
    int sockAddrOffs;
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  1824
3059
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  1825
    if (fp == nil) {
3217
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  1826
	goto getOutOfHere;
2321
6f4cc7b644db filePointer -> handle migration
Claus Gittinger <cg@exept.de>
parents: 2308
diff changeset
  1827
    }
3059
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  1828
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  1829
    if (! __isBytes(socketAddress)) {
3217
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  1830
	error = __mkSmallInteger(-1);
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  1831
	goto getOutOfHere;
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  1832
    }
2321
6f4cc7b644db filePointer -> handle migration
Claus Gittinger <cg@exept.de>
parents: 2308
diff changeset
  1833
    /* get the socket-address */
3059
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  1834
    if (__isNonNilObject(socketAddress)){
3217
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  1835
	int nIndex;
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  1836
	OBJ cls = __qClass(socketAddress);
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  1837
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  1838
	sockAddrOffs = __OBJS2BYTES__(__intVal(__ClassInstPtr(cls)->c_ninstvars));
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  1839
	nIndex = __qSize(socketAddress) - OHDR_SIZE;
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  1840
	sockaddr_size = nIndex - sockAddrOffs;
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  1841
	if (sockaddr_size > sizeof(sa)) {
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  1842
	    error=__mkSmallInteger(-2);
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  1843
	    goto getOutOfHere;
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  1844
	}
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  1845
	memcpy(&sa, __byteArrayVal(socketAddress) + sockAddrOffs, sockaddr_size);
2321
6f4cc7b644db filePointer -> handle migration
Claus Gittinger <cg@exept.de>
parents: 2308
diff changeset
  1846
    }
6f4cc7b644db filePointer -> handle migration
Claus Gittinger <cg@exept.de>
parents: 2308
diff changeset
  1847
6f4cc7b644db filePointer -> handle migration
Claus Gittinger <cg@exept.de>
parents: 2308
diff changeset
  1848
    sock = SOCKET_FROM_FILE_OBJECT(fp);
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  1849
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  1850
# ifdef SO_REUSEADDR
2321
6f4cc7b644db filePointer -> handle migration
Claus Gittinger <cg@exept.de>
parents: 2308
diff changeset
  1851
    if (reuse == true) {
3217
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  1852
	int on = 1;
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  1853
	if (setsockopt(sock, SOL_SOCKET, SO_REUSEADDR, (char *) &on, sizeof (on)) < 0) {
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  1854
	    DBGPRINTF(("SOCKET: setsockopt - SO_REUSEADDR failed\n"));
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  1855
	}
2321
6f4cc7b644db filePointer -> handle migration
Claus Gittinger <cg@exept.de>
parents: 2308
diff changeset
  1856
    }
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  1857
# endif /* SO_REUSEADDR */
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  1858
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  1859
# ifdef BIND_BLOCKS
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  1860
#  ifdef DO_WRAP_CALLS
2321
6f4cc7b644db filePointer -> handle migration
Claus Gittinger <cg@exept.de>
parents: 2308
diff changeset
  1861
    do {
3217
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  1862
	__threadErrno = 0;
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  1863
	ret = STX_WSA_NOINT_CALL3("bind", bind, sock, &sa, sockaddr_size);
2321
6f4cc7b644db filePointer -> handle migration
Claus Gittinger <cg@exept.de>
parents: 2308
diff changeset
  1864
    } while ((ret < 0) && (__threadErrno == EINTR));
3126
d95cc55a4fb5 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3123
diff changeset
  1865
    if (ret < 0) {
3217
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  1866
	errno = __threadErrno;
3126
d95cc55a4fb5 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3123
diff changeset
  1867
    }
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  1868
#  else
2321
6f4cc7b644db filePointer -> handle migration
Claus Gittinger <cg@exept.de>
parents: 2308
diff changeset
  1869
    __BEGIN_INTERRUPTABLE__
6f4cc7b644db filePointer -> handle migration
Claus Gittinger <cg@exept.de>
parents: 2308
diff changeset
  1870
    do {
3217
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  1871
	ret = bind(sock, (struct sockaddr *)&sa, sockaddr_size);
2321
6f4cc7b644db filePointer -> handle migration
Claus Gittinger <cg@exept.de>
parents: 2308
diff changeset
  1872
    } while ((ret < 0) && (errno == EINTR));
6f4cc7b644db filePointer -> handle migration
Claus Gittinger <cg@exept.de>
parents: 2308
diff changeset
  1873
    __END_INTERRUPTABLE__
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  1874
#  endif
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  1875
# else
3126
d95cc55a4fb5 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3123
diff changeset
  1876
    errno = 0;
2321
6f4cc7b644db filePointer -> handle migration
Claus Gittinger <cg@exept.de>
parents: 2308
diff changeset
  1877
    ret = bind(sock, (struct sockaddr *)&sa, sockaddr_size);
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  1878
# endif
2321
6f4cc7b644db filePointer -> handle migration
Claus Gittinger <cg@exept.de>
parents: 2308
diff changeset
  1879
    if (ret < 0) {
3126
d95cc55a4fb5 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3123
diff changeset
  1880
# ifdef WIN32
3217
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  1881
	if (errno == 0) {
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  1882
	    errno = WSAGetLastError();
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  1883
	}
3126
d95cc55a4fb5 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3123
diff changeset
  1884
# endif
3217
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  1885
	DBGPRINTF(("SOCKET: bind failed errno=%d\n", errno));
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  1886
	error = __INST(lastErrorNumber) = __MKSMALLINT(errno);
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  1887
	goto getOutOfHere;
2321
6f4cc7b644db filePointer -> handle migration
Claus Gittinger <cg@exept.de>
parents: 2308
diff changeset
  1888
    } else {
3217
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  1889
	ok = true;
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  1890
    }
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  1891
#endif /* NO_SOCKET */
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  1892
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  1893
getOutOfHere: ;
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  1894
%}.
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  1895
    ok ~~ true ifTrue:[
3217
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  1896
	|errorHolder errorString|
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  1897
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  1898
	error isInteger ifTrue:[
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  1899
	    errorHolder := OperatingSystem errorHolderForNumber:error.
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  1900
	    errorString := errorHolder errorString.
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  1901
	] ifFalse:[
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  1902
	    errorString := error.
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  1903
	].
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  1904
	OpenError newException
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  1905
	    errorString:('cannot bind socket to address: %1 (%2)'
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  1906
			    bindWith:socketAddress
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  1907
			    with:errorString);
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  1908
	    errorCode:error;
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  1909
	    osErrorHolder:errorHolder;
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  1910
	    parameter:self;
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  1911
	    raiseRequest.
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  1912
	"maybe someone catches the error and binds to some other port..."
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  1913
	^ true.
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  1914
    ].
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  1915
3059
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  1916
    port := socketAddress port.
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  1917
    port == 0 ifTrue:[
3217
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  1918
	"this is a bind to a random port, now we can get the real port"
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  1919
	port := self getFullSocketAddress port.
3059
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  1920
    ].
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  1921
    ^ true
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  1922
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  1923
    "
3059
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  1924
     (Socket domain:#'AF_INET' type:#stream)
3217
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  1925
	bindTo:(IPSocketAddress anyHost port:445) reuseAddress:false;
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  1926
	yourself.
3059
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  1927
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  1928
     (Socket domain:#'AF_INET' type:#stream)
3217
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  1929
	bindTo:139 reuseAddress:false;
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  1930
	yourself.
3059
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  1931
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  1932
     (Socket domain:#'AF_INET6' type:#stream)
3217
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  1933
	bindTo:nil reuseAddress:false;
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  1934
	yourself.
3059
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  1935
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  1936
     (Socket domain:#'AF_INET' type:#stream)
3217
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  1937
	bindTo:(IPSocketAddress localHost port:2122) reuseAddress:false;
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  1938
	yourself.
3059
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  1939
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  1940
     (Socket domain:#'AF_UNIX' type:#stream)
3217
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  1941
	bindTo:nil reuseAddress:false;
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  1942
	yourself.
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  1943
    "
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  1944
!
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  1945
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  1946
listenFor:aNumber
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  1947
    "start listening; return true if ok, false on error
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  1948
     aNumber is the number of connect requests, that may be queued on the socket"
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  1949
2321
6f4cc7b644db filePointer -> handle migration
Claus Gittinger <cg@exept.de>
parents: 2308
diff changeset
  1950
    handle isNil ifTrue:[
3217
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  1951
	^ self errorNotOpen
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  1952
    ].
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  1953
%{
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  1954
#ifndef NO_SOCKET
2321
6f4cc7b644db filePointer -> handle migration
Claus Gittinger <cg@exept.de>
parents: 2308
diff changeset
  1955
    OBJ fp = __INST(handle);
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  1956
    SOCKET sock;
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  1957
    int ret;
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  1958
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  1959
    if (! __isSmallInteger(aNumber)) {
3217
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  1960
	DBGPRINTF(("SOCKET: invalid arg\n"));
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  1961
	RETURN (false);
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  1962
    }
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  1963
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  1964
    sock = SOCKET_FROM_FILE_OBJECT(fp);
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  1965
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  1966
#ifdef LISTEN_BLOCKS
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  1967
# ifdef DO_WRAP_CALLS
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  1968
    do {
3217
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  1969
	__threadErrno = 0;
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  1970
	ret = STX_WSA_NOINT_CALL2("listen", listen, sock, __intVal(aNumber));
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  1971
    } while ((ret < 0) && (__threadErrno == EINTR));
3126
d95cc55a4fb5 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3123
diff changeset
  1972
    if (ret < 0) {
3217
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  1973
	errno = __threadErrno;
3126
d95cc55a4fb5 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3123
diff changeset
  1974
    }
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  1975
# else
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  1976
    __BEGIN_INTERRUPTABLE__
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  1977
    do {
3217
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  1978
	ret = listen(sock, __intVal(aNumber));
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  1979
    } while ((ret < 0) && (errno == EINTR));
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  1980
    __END_INTERRUPTABLE__
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  1981
# endif
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  1982
#else
3126
d95cc55a4fb5 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3123
diff changeset
  1983
    errno = 0;
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  1984
    ret = listen(sock, __intVal(aNumber));
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  1985
#endif
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  1986
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  1987
    if (ret < 0) {
3126
d95cc55a4fb5 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3123
diff changeset
  1988
# ifdef WIN32
3217
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  1989
	if (errno == 0) {
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  1990
	    errno = WSAGetLastError();
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  1991
	}
3126
d95cc55a4fb5 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3123
diff changeset
  1992
# endif
3217
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  1993
	DBGPRINTF(("SOCKET: listen call failed errno=%d\n", errno));
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  1994
	__INST(lastErrorNumber) = __MKSMALLINT(errno);
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  1995
	RETURN (false);
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  1996
    }
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  1997
#else
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  1998
    RETURN (false);
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  1999
#endif
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2000
%}.
3157
44f5f9f79256 initialize methods
Stefan Vogel <sv@exept.de>
parents: 3155
diff changeset
  2001
    listening := aNumber.
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2002
    ^ true
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2003
! !
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2004
1576
a2ffb22c5f5e New: #shutDownInput #shutDownOutput
Stefan Vogel <sv@exept.de>
parents: 1568
diff changeset
  2005
!Socket methodsFor:'closing'!
a2ffb22c5f5e New: #shutDownInput #shutDownOutput
Stefan Vogel <sv@exept.de>
parents: 1568
diff changeset
  2006
3224
bad706c50347 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3223
diff changeset
  2007
finalize
bad706c50347 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3223
diff changeset
  2008
    self linger:0.      "/ discard buffered data
bad706c50347 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3223
diff changeset
  2009
    super finalize.
bad706c50347 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3223
diff changeset
  2010
!
bad706c50347 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3223
diff changeset
  2011
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2012
shutDown
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2013
    "shutDown and close the socket"
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2014
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2015
    self shutdown:2.
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2016
    self close
1576
a2ffb22c5f5e New: #shutDownInput #shutDownOutput
Stefan Vogel <sv@exept.de>
parents: 1568
diff changeset
  2017
!
a2ffb22c5f5e New: #shutDownInput #shutDownOutput
Stefan Vogel <sv@exept.de>
parents: 1568
diff changeset
  2018
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2019
shutDownInput
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2020
    "shutDown the input side of the socket.
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2021
     Any read on the socket will signal end-of-file from now on.
1839
c10cd58ec334 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1781
diff changeset
  2022
     The other side MAY be informed, that no more data will be accepted
1576
a2ffb22c5f5e New: #shutDownInput #shutDownOutput
Stefan Vogel <sv@exept.de>
parents: 1568
diff changeset
  2023
     (e.g. setting the TCP-Windowsize to 0)"
a2ffb22c5f5e New: #shutDownInput #shutDownOutput
Stefan Vogel <sv@exept.de>
parents: 1568
diff changeset
  2024
a2ffb22c5f5e New: #shutDownInput #shutDownOutput
Stefan Vogel <sv@exept.de>
parents: 1568
diff changeset
  2025
    self shutdown:0.
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2026
!
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2027
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2028
shutDownOutput
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2029
    "shutDown the output side of the socket.
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2030
     Any write to the socket will signal end-of-file from now on.
2825
e5b7d2005351 fixed for compilability
Claus Gittinger <cg@exept.de>
parents: 2824
diff changeset
  2031
     An orderly realease (TCP FIN) will be initiated after the last buffered data
2823
10179ccfae5d Default for close - linger in background instead 30s in foreground
Stefan Vogel <sv@exept.de>
parents: 2818
diff changeset
  2032
     has been sent, so the other side will get a end-of-file condition eventually."
1343
cc3bed115c0a definitions cleanup with stxOSDefs.h
penk
parents: 1342
diff changeset
  2033
1884
ee0d640a25a7 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1882
diff changeset
  2034
    self shutdown:1.
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2035
! !
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2036
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2037
!Socket methodsFor:'connecting'!
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2038
3059
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  2039
connectTo:aSocketAddress
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  2040
    ^ self connectTo:aSocketAddress withTimeout:nil
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  2041
!
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  2042
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2043
connectTo:hostOrPathName port:portNrOrName
3059
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  2044
    "Backward compatibility connect; connect to port, portNrOrNameOrNil on host, hostOrPathNameOrSocketAddr.
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  2045
     For backward compatibility, hostOrPathNameOrSocketAddr may be also a string or a byteArray,
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  2046
     but it is recommended to pass SocketAddress instances.
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2047
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2048
     Return true if ok, false otherwise.
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2049
     The current process will block (but not the whole Smalltalk) until the connection is established.
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2050
     See also: #connectTo:port:withTimeout: for a somewhat nicer interface."
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2051
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2052
    ^ self connectTo:hostOrPathName port:portNrOrName withTimeout:nil
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2053
!
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2054
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2055
connectTo:hostOrPathNameOrSocketAddr port:portNrOrNameOrNil withTimeout:timeout
3059
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  2056
    "Backward compatibility connect; connect to port, portNrOrNameOrNil on host, hostOrPathNameOrSocketAddr.
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  2057
     For backward compatibility, hostOrPathNameOrSocketAddr may be also a string or a byteArray,
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  2058
     but it is recommended to pass SocketAddress instances.
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2059
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2060
     Return true if ok, false otherwise.
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2061
     The current process will block (but not the whole Smalltalk) until the connection is established,
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2062
     or timeout millliseconds have passed."
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2063
3059
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  2064
    |domainClass socketAddress|
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  2065
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  2066
    (hostOrPathNameOrSocketAddr isSocketAddress) ifTrue:[
3217
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  2067
	socketAddress := hostOrPathNameOrSocketAddr.
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  2068
	portNrOrNameOrNil notNil ifTrue:[
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  2069
	    socketAddress port:portNrOrNameOrNil.
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  2070
	].
3059
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  2071
    ] ifFalse:[
3217
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  2072
	"backward compatibility: support for byteArray and string arg"
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  2073
	domainClass := self class socketAddressClassForDomain:domain.
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  2074
	domainClass isNil ifTrue:[
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  2075
	    ^ self error:'invalid (unsupported) domain'.
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  2076
	].
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  2077
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  2078
	hostOrPathNameOrSocketAddr isString ifTrue:[
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  2079
	    socketAddress := domainClass hostName:hostOrPathNameOrSocketAddr serviceName:portNrOrNameOrNil type:#SOCK_STREAM.
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  2080
	    peerName := hostOrPathNameOrSocketAddr.
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  2081
	] ifFalse:[
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  2082
	    hostOrPathNameOrSocketAddr isByteCollection ifFalse:[
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  2083
		^ self error:'connectTo: bad host (socketAddress) argument'
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  2084
	    ].
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  2085
	    socketAddress := domainClass hostAddress:hostOrPathNameOrSocketAddr port:portNrOrNameOrNil.
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  2086
	].
3059
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  2087
    ].
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  2088
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  2089
    ^ self connectTo:socketAddress withTimeout:timeout.
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  2090
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  2091
    "
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  2092
       |sock|
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  2093
       sock := Socket newTCP.
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  2094
       sock connectTo:'localhost' port:21 withTimeout:1000.
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  2095
       sock
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  2096
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  2097
       |sock|
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  2098
       sock := Socket newTCP.
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  2099
       sock connectTo:'localhost' port:9876 withTimeout:2000.
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  2100
       sock
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  2101
    "
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  2102
!
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  2103
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  2104
connectTo:aSocketAddress withTimeout:timeout
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  2105
    "Connect to a SocketAddress.
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  2106
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  2107
     Return true if ok, false otherwise.
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  2108
     The current process will block (but not the whole Smalltalk) until the connection is established,
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  2109
     or timeout millliseconds have passed."
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  2110
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  2111
    |isAsync err|
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2112
2321
6f4cc7b644db filePointer -> handle migration
Claus Gittinger <cg@exept.de>
parents: 2308
diff changeset
  2113
    handle isNil ifTrue:[
3217
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  2114
	^ self errorNotOpen
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2115
    ].
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2116
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2117
%{  /* STACK: 100000 */
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2118
#ifndef NO_SOCKET
3123
55ef9ca4f09f class: Socket
Stefan Vogel <sv@exept.de>
parents: 3077
diff changeset
  2119
//#define DUMP_ADDRESS 1
2321
6f4cc7b644db filePointer -> handle migration
Claus Gittinger <cg@exept.de>
parents: 2308
diff changeset
  2120
    OBJ fp = __INST(handle);
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2121
    union sockaddr_u sa;
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2122
    SOCKET sock;
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2123
    int a;
2909
aacef77a1697 64bit fixes
Claus Gittinger <cg@exept.de>
parents: 2904
diff changeset
  2124
    INT ret;
aacef77a1697 64bit fixes
Claus Gittinger <cg@exept.de>
parents: 2904
diff changeset
  2125
    int oldFlags;
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2126
    int on = 1;
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2127
    int sockaddr_size;
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2128
3059
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  2129
    if (!__isNonNilObject(aSocketAddress) || !__isBytes(aSocketAddress)) {
3217
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  2130
	DBGPRINTF(("SOCKET: invalid socketAddress\n"));
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  2131
	err = @symbol(argumentError);
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  2132
	goto out;
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2133
    }
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2134
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2135
    {
3217
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  2136
	int sockAddrOffs = 0;
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  2137
	int nIndex =__byteArraySize(aSocketAddress);
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  2138
	OBJ cls = __qClass(aSocketAddress);
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  2139
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  2140
	//if (cls != @global(ByteArray))
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  2141
	//    sockAddrOffs = __OBJS2BYTES__(__intVal(__ClassInstPtr(cls)->c_ninstvars));
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  2142
	sockaddr_size = nIndex - sockAddrOffs;
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  2143
	if (sockaddr_size > sizeof(sa)) {
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  2144
	    DBGPRINTF(("SOCKET: invalid (short) socketAddress\n"));
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  2145
	    err = @symbol(argumentError);
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  2146
	    goto out;
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  2147
	}
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  2148
	memcpy(&sa, __byteArrayVal(aSocketAddress) + sockAddrOffs, sockaddr_size);
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2149
    }
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2150
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2151
    sock = SOCKET_FROM_FILE_OBJECT(fp);
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2152
3077
032905ddd57a class: Socket
Claus Gittinger <cg@exept.de>
parents: 3072
diff changeset
  2153
# if defined(O_NONBLOCK) && !defined(WIN32)
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2154
    /*
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2155
     * set to non-blocking and wait later
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2156
     */
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2157
    oldFlags = fcntl(sock, F_GETFL, 0);
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2158
    /* on SUNOS4.x, would use fcntl(osfd, F_SETFL, flags | FNDELAY); */
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2159
    fcntl(sock, F_SETFL, oldFlags | O_NONBLOCK);
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2160
# endif
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2161
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2162
    /*
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2163
     * connect
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2164
     */
3123
55ef9ca4f09f class: Socket
Stefan Vogel <sv@exept.de>
parents: 3077
diff changeset
  2165
3077
032905ddd57a class: Socket
Claus Gittinger <cg@exept.de>
parents: 3072
diff changeset
  2166
# if defined(DO_WRAP_CALLS)
3217
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  2167
    // __setWrapCallDebugging(1,1);
2414
886ecf4b36cd changed:
ab
parents: 2340
diff changeset
  2168
3123
55ef9ca4f09f class: Socket
Stefan Vogel <sv@exept.de>
parents: 3077
diff changeset
  2169
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2170
    do {
3217
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  2171
	DBGFPRINTF((stderr, "SOCKET: (sock=%d) connect...\n", sock));
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  2172
	ret = STX_WSA_NOINT_CALL3("connect", connect, sock, &sa, (INT)sockaddr_size);
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  2173
	DBGFPRINTF((stderr, "SOCKET: connect(%d) -> %"_ld_" (%d)\n", sock, (INT)ret, __threadErrno));
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2174
    } while ((ret < 0) && (__threadErrno == EINTR));
3123
55ef9ca4f09f class: Socket
Stefan Vogel <sv@exept.de>
parents: 3077
diff changeset
  2175
3077
032905ddd57a class: Socket
Claus Gittinger <cg@exept.de>
parents: 3072
diff changeset
  2176
    if (ret < 0) {
3217
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  2177
	int optLen = sizeof(errno);
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  2178
	errno = __threadErrno;
3123
55ef9ca4f09f class: Socket
Stefan Vogel <sv@exept.de>
parents: 3077
diff changeset
  2179
#if 0
3217
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  2180
	if (getsockopt(sock, SOL_SOCKET, SO_ERROR, &errno, &optLen) == SOCKET_ERROR) {
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  2181
	    DBGFPRINTF((stderr, "SOCKET: getsockopt(SO_ERROR) failed: %d\n", WSAGetLastError()));
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  2182
	}
3123
55ef9ca4f09f class: Socket
Stefan Vogel <sv@exept.de>
parents: 3077
diff changeset
  2183
#endif
3077
032905ddd57a class: Socket
Claus Gittinger <cg@exept.de>
parents: 3072
diff changeset
  2184
    }
032905ddd57a class: Socket
Claus Gittinger <cg@exept.de>
parents: 3072
diff changeset
  2185
032905ddd57a class: Socket
Claus Gittinger <cg@exept.de>
parents: 3072
diff changeset
  2186
    // __setWrapCallDebugging(1,0);
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2187
# else
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2188
    __BEGIN_INTERRUPTABLE__
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2189
    do {
3217
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  2190
	ret = connect(sock, (struct sockaddr *)&sa, sockaddr_size);
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2191
    } while ((ret < 0)
3217
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  2192
	     && ((errno == EINTR)
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2193
# ifdef EAGAIN
3217
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  2194
		 || (errno == EAGAIN)
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2195
# endif
3217
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  2196
		));
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2197
    __END_INTERRUPTABLE__
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2198
#endif
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2199
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2200
    if (ret < 0) {
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2201
# if defined(EINPROGRESS) || defined(EALREADY)
3217
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  2202
	if (0
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2203
#  ifdef EINPROGRESS
3217
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  2204
	    || (errno == EINPROGRESS)
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2205
#  endif
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2206
#  ifdef EALREADY
3217
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  2207
	    || (errno == EALREADY)
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2208
#  endif
3217
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  2209
	) {
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  2210
	    /*
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  2211
	     * This was a nonblocking operation that will take some time.
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  2212
	     * Do a select on read to get informed when the operation is ready.
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  2213
	     */
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  2214
	    DBGFPRINTF((stderr, "SOCKET: isAsync is true\n"));
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  2215
	    isAsync = true;
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  2216
	} else
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2217
# endif /* EINPROGRESS or EALREADY */
3217
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  2218
	{
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  2219
	    DBGFPRINTF((stderr, "SOCKET: connect failed ret=%"_ld_" errno=%d __threadErrno=%d\n",
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  2220
			(INT)ret, errno, __threadErrno ));
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2221
# ifdef DUMP_ADDRESS
3217
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  2222
	    {
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  2223
		unsigned char *cp = (unsigned char *)(&sa);
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  2224
		int i;
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  2225
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  2226
		console_printf("address data:\n");
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  2227
		for (i=0; i<sockaddr_size; i++) {
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  2228
		    console_printf(" %02x\n", *cp++);
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  2229
		}
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  2230
	    }
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2231
# endif
3217
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  2232
	    err = __MKSMALLINT(errno);
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  2233
	}
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2234
    }
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2235
3077
032905ddd57a class: Socket
Claus Gittinger <cg@exept.de>
parents: 3072
diff changeset
  2236
# if defined(O_NONBLOCK) && !defined(WIN32)
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2237
    fcntl(sock, F_SETFL, oldFlags);
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2238
# endif
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2239
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2240
# else /* NO_SOCKET */
3077
032905ddd57a class: Socket
Claus Gittinger <cg@exept.de>
parents: 3072
diff changeset
  2241
    err = @symbol(notSupported);
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2242
# endif /* NO_SOCKET */
3077
032905ddd57a class: Socket
Claus Gittinger <cg@exept.de>
parents: 3072
diff changeset
  2243
out:;
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2244
%}.
3217
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  2245
3077
032905ddd57a class: Socket
Claus Gittinger <cg@exept.de>
parents: 3072
diff changeset
  2246
    err notNil ifTrue:[
3217
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  2247
	err isSymbol ifTrue:[
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  2248
	    self primitiveFailed:err.
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  2249
	].
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  2250
	lastErrorNumber := err.
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  2251
	^ false.
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  2252
	"/ Once we will raise an exception instead of returning false (and have to change some code above):
3077
032905ddd57a class: Socket
Claus Gittinger <cg@exept.de>
parents: 3072
diff changeset
  2253
"/        (OperatingSystem errorHolderForNumber:err) reportError.
032905ddd57a class: Socket
Claus Gittinger <cg@exept.de>
parents: 3072
diff changeset
  2254
    ].
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2255
    isAsync == true ifTrue:[
3217
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  2256
	(self writeWaitWithTimeoutMs:timeout) ifTrue:[
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  2257
	    "/ a timeout occured
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  2258
	    "/ should I cancel the connect?
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  2259
	    ^ false.
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  2260
	].
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  2261
	err := self getSocketError.
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  2262
	err ~~ 0 ifTrue:[
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  2263
	    lastErrorNumber := err.
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  2264
	    ^ false.
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  2265
	].
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2266
    ].
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2267
1940
2ea7d2c1a2e6 changed #connectTo:port:withTimeout: - add commented code tah may be used in the future
Stefan Vogel <sv@exept.de>
parents: 1939
diff changeset
  2268
3059
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  2269
    peer := aSocketAddress.
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2270
    port isNil ifTrue:[
3217
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  2271
	"socket has not been explicitly bound,
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  2272
	 after connect it has been bound implicitly - fetch the port"
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  2273
	port := self getFullSocketAddress port.
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2274
    ].
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2275
    ^ true
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2276
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2277
    "
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2278
       |sock|
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2279
       sock := Socket newTCP.
3059
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  2280
       sock connectTo:(IPSocketAddress localHost port:21) withTimeout:1000.
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2281
       sock
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2282
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2283
       |sock|
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2284
       sock := Socket newTCP.
3059
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  2285
       sock connectTo:(IPSocketAddress localHost port:9876) withTimeout:2000.
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2286
       sock
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2287
    "
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2288
! !
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2289
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2290
!Socket methodsFor:'datagram transmission'!
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2291
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2292
receiveBuffer:aDataBuffer start:startIndex for:nBytes
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2293
    "receive data
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2294
     Return the number of bytes received, or a negative number on error.
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2295
     On error, the unix error code is left in the lastErrorNumber
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2296
     instance variable.
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2297
     The thread blocks until data arrives - you may want to wait before
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2298
     receiving, using #readWait or #readWaitWithTimeout:."
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2299
3126
d95cc55a4fb5 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3123
diff changeset
  2300
    |nReceived error|
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2301
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2302
%{
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2303
#ifndef NO_SOCKET
2321
6f4cc7b644db filePointer -> handle migration
Claus Gittinger <cg@exept.de>
parents: 2308
diff changeset
  2304
    OBJ fp = __INST(handle);
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2305
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2306
    if (fp != nil) {
3217
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  2307
	SOCKET sock;
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  2308
	INT objSize, offs;
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  2309
	INT n;
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  2310
	char *extPtr;
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  2311
	unsigned char *buffer;
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  2312
	unsigned char *allocatedBuffer = NULL;
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  2313
	INT flags = 0;
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  2314
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  2315
	sock = SOCKET_FROM_FILE_OBJECT(fp);
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  2316
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  2317
	if (! setupBufferParameters(aDataBuffer, startIndex, &extPtr, &offs, &objSize)) goto bad;
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  2318
	if (__isSmallInteger(nBytes)) {
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  2319
	    if (__intVal(nBytes) < objSize) {
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  2320
		objSize = __intVal(nBytes);
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  2321
	    }
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  2322
	}
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2323
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2324
# ifdef DO_WRAP_CALLS
3217
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  2325
	if (extPtr) {
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  2326
	    buffer = extPtr + offs;
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  2327
	} else {
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  2328
	    allocatedBuffer = buffer = (char *)malloc(objSize);
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  2329
	}
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  2330
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  2331
	do {
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  2332
	    __threadErrno = 0;
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  2333
	    n = (INT)STX_WSA_NOINT_CALL4("recv", recv, sock, buffer, objSize, flags);
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  2334
	} while ((n < 0) && (__threadErrno == EINTR));
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  2335
	if (n < 0) {
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  2336
	    errno = __threadErrno;
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  2337
	}
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  2338
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  2339
	if (allocatedBuffer) {
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  2340
	    if (n > 0) {
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  2341
		bcopy(allocatedBuffer, (char *)__InstPtr(aDataBuffer) + offs, n);
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  2342
	    }
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  2343
	    free(allocatedBuffer);
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  2344
	}
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2345
# else
3217
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  2346
	__BEGIN_INTERRUPTABLE__
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  2347
	do {
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  2348
	    if (extPtr) {
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  2349
		n = recv(sock, extPtr + offs, objSize, flags);
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  2350
	    } else {
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  2351
		n = recv(sock, (char *)__InstPtr(aDataBuffer) + offs, objSize, flags);
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  2352
	    }
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  2353
	} while ((n < 0) && (errno == EINTR));
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  2354
	__END_INTERRUPTABLE__
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2355
# endif
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2356
3217
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  2357
	if (n < 0) {
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  2358
	    error = __INST(lastErrorNumber) = __MKSMALLINT(errno);
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  2359
	} else {
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  2360
	    RETURN(__MKSMALLINT(n));
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  2361
	}
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2362
    }
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2363
#endif
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2364
bad: ;
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2365
%}.
3126
d95cc55a4fb5 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3123
diff changeset
  2366
    error notNil ifTrue:[
3217
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  2367
	^ ReadError
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  2368
	    raiseRequestWith:self
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  2369
	    errorString:(' : ' , OperatingSystem errorTextForNumber:error)
915
3dc0e3cd838a added interface to send() and recv()
Claus Gittinger <cg@exept.de>
parents: 898
diff changeset
  2370
    ].
3dc0e3cd838a added interface to send() and recv()
Claus Gittinger <cg@exept.de>
parents: 898
diff changeset
  2371
    "
1282
7e4ffdfd19f6 remove historic leftover
Claus Gittinger <cg@exept.de>
parents: 1280
diff changeset
  2372
     arrive here if you try to receive into an invalid buffer (i.e. not ByteArray-like)
915
3dc0e3cd838a added interface to send() and recv()
Claus Gittinger <cg@exept.de>
parents: 898
diff changeset
  2373
    "
3dc0e3cd838a added interface to send() and recv()
Claus Gittinger <cg@exept.de>
parents: 898
diff changeset
  2374
    self primitiveFailed
3dc0e3cd838a added interface to send() and recv()
Claus Gittinger <cg@exept.de>
parents: 898
diff changeset
  2375
!
3dc0e3cd838a added interface to send() and recv()
Claus Gittinger <cg@exept.de>
parents: 898
diff changeset
  2376
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2377
receiveFrom:anAddressBuffer buffer:aDataBuffer
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2378
    "receive datagramm data - put address of originating host into
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2379
     anAddressBuffer, data into aBuffer.
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2380
     Both must be ByteArray-like. The addressBuffer must
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2381
     provide space for a valid address for my domain (i.e. for inet, a 4-byte byteArray).
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2382
     Return the number of bytes received, or a negative number on error.
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2383
     On error, the unix error code is left in the lastErrorNumber
126
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
  2384
     instance variable."
28
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  2385
126
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
  2386
    ^ self receiveFrom:anAddressBuffer buffer:aDataBuffer start:1 for:(aDataBuffer size)
99
7d016cc30052 fixed & moved pingWalk from SNMPSession to here;
Claus Gittinger <cg@exept.de>
parents: 98
diff changeset
  2387
!
7d016cc30052 fixed & moved pingWalk from SNMPSession to here;
Claus Gittinger <cg@exept.de>
parents: 98
diff changeset
  2388
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2389
receiveFrom:anAddressBuffer buffer:aDataBuffer start:startIndex for:nBytes
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2390
    "receive datagramm data
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2391
     - put address of originating host into anAddressBuffer, data into aBuffer.
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2392
     For backward compatibility, the addressBuffer may be a non-SocketAddress;
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2393
     then, it must be a byteArray with appropriate size for the addressBytes.
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2394
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2395
     Return the number of bytes received, or a negative number on error.
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2396
     On error, the unix error code is left in the lastErrorNumber
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2397
     instance variable.
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2398
     The thread blocks until data arrives - you may want to wait before
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2399
     receiving, using #readWait or #readWaitWithTimeout:."
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2400
3126
d95cc55a4fb5 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3123
diff changeset
  2401
    |domainClass addr addrLen nReceived error|
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2402
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2403
    domainClass := self class socketAddressClassForDomain:domain.
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2404
    domainClass isNil ifTrue:[
3217
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  2405
	^ self error:'invalid (unsupported) domain'.
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2406
    ].
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2407
    (anAddressBuffer isKindOf:SocketAddress) ifTrue:[
3217
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  2408
	anAddressBuffer class == domainClass ifFalse:[
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  2409
	    ^ self error:'addressBuffer class mismatch (domain)'.
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  2410
	].
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  2411
	addr := anAddressBuffer.
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2412
    ] ifFalse:[
3217
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  2413
	anAddressBuffer notNil ifTrue:[
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  2414
	    addr := domainClass new.
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  2415
	].
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2416
    ].
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2417
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2418
%{
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2419
#ifndef NO_SOCKET
2321
6f4cc7b644db filePointer -> handle migration
Claus Gittinger <cg@exept.de>
parents: 2308
diff changeset
  2420
    OBJ fp = __INST(handle);
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2421
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2422
    if (fp != nil) {
3217
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  2423
	SOCKET sock;
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  2424
	INT objSize;
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  2425
	union sockaddr_u sa;
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  2426
	unsigned INT alen = 0;
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  2427
	INT n, offs;
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  2428
	INT flags = 0;
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  2429
	char *extPtr;
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  2430
	unsigned char *allocatedBuffer = NULL;
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  2431
	unsigned char *buffer = NULL;
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  2432
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  2433
	sock = SOCKET_FROM_FILE_OBJECT(fp);
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  2434
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  2435
	if (! setupBufferParameters(aDataBuffer, startIndex, &extPtr, &offs, &objSize)) goto bad;
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  2436
	if (__isSmallInteger(nBytes)) {
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  2437
	    if (__intVal(nBytes) < objSize) {
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  2438
		objSize = __intVal(nBytes);
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  2439
	    }
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  2440
	}
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2441
# ifdef DO_WRAP_CALLS
3217
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  2442
	if (extPtr) {
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  2443
	    buffer = extPtr + offs;
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  2444
	} else {
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  2445
	    allocatedBuffer = buffer = (char *)malloc(objSize);
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  2446
	}
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  2447
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  2448
	do {
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  2449
	    __threadErrno = 0;
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  2450
	    alen = sizeof(sa);
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  2451
	    n = (INT)STX_WSA_NOINT_CALL6("recvfrom", recvfrom, sock, buffer, objSize, flags, (struct sockaddr *)&sa, &alen);
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  2452
	} while ((n < 0) && (__threadErrno == EINTR));
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  2453
	if (n < 0) {
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  2454
	    errno = __threadErrno;
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  2455
	}
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  2456
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  2457
	if (allocatedBuffer) {
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  2458
	    if (n > 0) {
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  2459
		memcpy((char *)__InstPtr(aDataBuffer) + offs, allocatedBuffer, n);
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  2460
	    }
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  2461
	    free(allocatedBuffer);
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  2462
	}
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2463
# else
3217
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  2464
	__BEGIN_INTERRUPTABLE__
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  2465
	do {
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  2466
	    alen = sizeof(sa);
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  2467
	    if (extPtr) {
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  2468
		n = recvfrom(sock, extPtr + offs, objSize, flags, (struct sockaddr *) &sa, &alen);
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  2469
	    } else {
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  2470
		n = recvfrom(sock, (char *)__InstPtr(aDataBuffer) + offs, objSize, flags, (struct sockaddr *) &sa, &alen);
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  2471
	    }
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  2472
	} while ((n < 0) && (errno == EINTR));
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  2473
	__END_INTERRUPTABLE__
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2474
# endif
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2475
3217
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  2476
	if (n >= 0) {
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  2477
	    if (__isNonNilObject(addr)) {
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  2478
		char *addrPtr;
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  2479
		OBJ oClass;
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  2480
		int nInstVars, nInstBytes, objSize;
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  2481
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  2482
		oClass = __qClass(addr);
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  2483
		if (! __isBytes(addr) )
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  2484
		    goto bad;
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  2485
		nInstVars = __intVal(__ClassInstPtr(oClass)->c_ninstvars);
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  2486
		nInstBytes = OHDR_SIZE + (nInstVars * sizeof(OBJ));
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  2487
		objSize = __qSize(addr) - nInstBytes;
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  2488
		addrPtr = (char *)__InstPtr(addr) + nInstBytes;
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  2489
		if (objSize < alen)
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  2490
		    goto bad;
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  2491
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  2492
		/*
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  2493
		 * extract the datagrams address
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  2494
		 */
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  2495
		memcpy(addrPtr, (char *)&sa, alen);
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  2496
		addrLen = __MKSMALLINT(alen);
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  2497
	    }
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  2498
	}
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  2499
	if (n < 0) {
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  2500
	    error = __INST(lastErrorNumber) = __MKSMALLINT(errno);
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  2501
	}
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  2502
	nReceived = __MKSMALLINT(n);
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2503
    }
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2504
#endif
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2505
bad: ;
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2506
%}.
3126
d95cc55a4fb5 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3123
diff changeset
  2507
    error notNil ifTrue:[
3217
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  2508
	^ ReadError
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  2509
	    raiseRequestWith:self
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  2510
	    errorString:(' : ' , OperatingSystem errorTextForNumber:error)
3126
d95cc55a4fb5 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3123
diff changeset
  2511
    ].
d95cc55a4fb5 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3123
diff changeset
  2512
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2513
    nReceived notNil ifTrue:[
3217
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  2514
	addrLen notNil ifTrue:[
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  2515
	    (addr == anAddressBuffer) ifFalse:[
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  2516
		self obsoleteFeatureWarning:'please use a socketAddress argument'.
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  2517
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  2518
		"can be a ByteArray for backward compatibility"
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  2519
		anAddressBuffer replaceFrom:1 to:addrLen with:(addr hostAddress).
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  2520
	    ].
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  2521
	].
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  2522
	^ nReceived
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2523
    ].
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2524
    "
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2525
     arrive here if you try to receive into an invalid buffer
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2526
     (i.e. not ByteArray-like),
1485
d8578cf3504b gcc3.3.1 insn-scheduler bug workaround
Claus Gittinger <cg@exept.de>
parents: 1474
diff changeset
  2527
     or if the addressBuffer is nonNil AND not a SocketAddress/ByteArray
126
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
  2528
     or if the addressBuffer is nonNil AND too small.
116
7789fb1c9fa2 more UD socket fixes (at least client side seems to work now)
Claus Gittinger <cg@exept.de>
parents: 115
diff changeset
  2529
    "
126
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
  2530
    self primitiveFailed
116
7789fb1c9fa2 more UD socket fixes (at least client side seems to work now)
Claus Gittinger <cg@exept.de>
parents: 115
diff changeset
  2531
!
7789fb1c9fa2 more UD socket fixes (at least client side seems to work now)
Claus Gittinger <cg@exept.de>
parents: 115
diff changeset
  2532
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2533
sendBuffer:aDataBuffer start:startIndex for:nBytes flags:flags
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2534
    "send data.
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2535
     Both must be ByteArray-like. The bytes in the addressBuffer must
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2536
     be a valid address for my domain (i.e. for inet, a 4-byte byteArray).
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2537
     Return the number of bytes transmitted, or a negative number on error.
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2538
     On error, the unix error code is left in the lastErrorNumber
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2539
     instance variable."
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2540
3126
d95cc55a4fb5 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3123
diff changeset
  2541
    |error|
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2542
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2543
%{
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2544
#ifndef NO_SOCKET
2321
6f4cc7b644db filePointer -> handle migration
Claus Gittinger <cg@exept.de>
parents: 2308
diff changeset
  2545
    OBJ fp = __INST(handle);
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2546
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2547
    if ((fp != nil)
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2548
     && __isSmallInteger(startIndex)
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2549
     && __isSmallInteger(nBytes)) {
3217
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  2550
	SOCKET sock;
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  2551
	INT objSize;
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  2552
	INT n;
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  2553
	char *extPtr;
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  2554
	INT _flags = 0;
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  2555
	INT offs;
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  2556
	unsigned long norder;
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  2557
	unsigned char *buffer;
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  2558
	unsigned char *allocatedBuffer = NULL;
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  2559
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  2560
	_flags = __longIntVal(flags);
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  2561
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  2562
	sock = SOCKET_FROM_FILE_OBJECT(fp);
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  2563
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  2564
	if (! setupBufferParameters(aDataBuffer, startIndex, &extPtr, &offs, &objSize)) goto bad;
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  2565
	if (__isSmallInteger(nBytes)) {
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  2566
	    if (__intVal(nBytes) < objSize) {
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  2567
		objSize = __intVal(nBytes);
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  2568
	    }
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  2569
	}
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2570
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2571
# ifdef DGRAM_DEBUG
3217
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  2572
	console_printf("sending %d bytes ...\n", nBytes);
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2573
# endif
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2574
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2575
#ifdef DO_WRAP_CALLS
3217
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  2576
	if (extPtr) {
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  2577
	    buffer = extPtr + offs;
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  2578
	} else {
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  2579
	    allocatedBuffer = buffer = (char *)malloc(objSize);
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  2580
	    bcopy((char *)__InstPtr(aDataBuffer) + offs, allocatedBuffer, objSize);
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  2581
	}
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  2582
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  2583
	do {
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  2584
	    __threadErrno = 0;
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  2585
	    n = (INT)STX_WSA_NOINT_CALL4("send", send, sock, buffer, objSize, _flags);
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  2586
	} while ((n < 0) && (__threadErrno == EINTR));
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  2587
	if (n < 0) {
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  2588
	    errno = __threadErrno;
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  2589
	}
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  2590
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  2591
	if (allocatedBuffer) {
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  2592
	    free(allocatedBuffer);
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  2593
	}
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2594
#else
3217
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  2595
	__BEGIN_INTERRUPTABLE__
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  2596
	do {
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  2597
	    if (extPtr) {
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  2598
		n = send(sock, extPtr + offs, objSize, _flags);
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  2599
	    } else {
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  2600
		n = send(sock, (char *)__InstPtr(aDataBuffer) + offs, objSize, _flags);
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  2601
	    }
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  2602
	} while ((n < 0) && (errno == EINTR));
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  2603
	__END_INTERRUPTABLE__
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2604
#endif
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2605
3217
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  2606
	if (n < 0) {
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  2607
	    error = __INST(lastErrorNumber) = __MKSMALLINT(errno);
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  2608
	} else {
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  2609
	    RETURN (__MKSMALLINT(n));
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  2610
	}
915
3dc0e3cd838a added interface to send() and recv()
Claus Gittinger <cg@exept.de>
parents: 898
diff changeset
  2611
    }
3dc0e3cd838a added interface to send() and recv()
Claus Gittinger <cg@exept.de>
parents: 898
diff changeset
  2612
#endif
3dc0e3cd838a added interface to send() and recv()
Claus Gittinger <cg@exept.de>
parents: 898
diff changeset
  2613
bad: ;
3dc0e3cd838a added interface to send() and recv()
Claus Gittinger <cg@exept.de>
parents: 898
diff changeset
  2614
%}.
3126
d95cc55a4fb5 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3123
diff changeset
  2615
    error notNil ifTrue:[
3217
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  2616
	self writeError:error.
3126
d95cc55a4fb5 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3123
diff changeset
  2617
    ].
d95cc55a4fb5 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3123
diff changeset
  2618
915
3dc0e3cd838a added interface to send() and recv()
Claus Gittinger <cg@exept.de>
parents: 898
diff changeset
  2619
    "
1485
d8578cf3504b gcc3.3.1 insn-scheduler bug workaround
Claus Gittinger <cg@exept.de>
parents: 1474
diff changeset
  2620
     arrive here if you try to send from an invalid buffer (i.e. not ByteArray-like),
915
3dc0e3cd838a added interface to send() and recv()
Claus Gittinger <cg@exept.de>
parents: 898
diff changeset
  2621
    "
3dc0e3cd838a added interface to send() and recv()
Claus Gittinger <cg@exept.de>
parents: 898
diff changeset
  2622
    self primitiveFailed
3dc0e3cd838a added interface to send() and recv()
Claus Gittinger <cg@exept.de>
parents: 898
diff changeset
  2623
!
3dc0e3cd838a added interface to send() and recv()
Claus Gittinger <cg@exept.de>
parents: 898
diff changeset
  2624
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2625
sendTo:anAddressBuffer buffer:buffer
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2626
    "send datagramm data - fetch address of destination host from
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2627
     anAddressBuffer, data from aDataBuffer.
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2628
     Both must be ByteArray-like. The bytes in the addressBuffer must
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2629
     be a valid address for my domain (i.e. for inet, a 4-byte byteArray).
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2630
     Return the number of bytes transmitted, or a negative number on error.
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2631
     On error, the unix error code is left in the lastErrorNumber
126
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
  2632
     instance variable.
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
  2633
     Flags is currently ignored; it is there for ST-80 compatibility."
116
7789fb1c9fa2 more UD socket fixes (at least client side seems to work now)
Claus Gittinger <cg@exept.de>
parents: 115
diff changeset
  2634
1485
d8578cf3504b gcc3.3.1 insn-scheduler bug workaround
Claus Gittinger <cg@exept.de>
parents: 1474
diff changeset
  2635
    ^ self sendTo:anAddressBuffer buffer:buffer start:1 for:buffer size flags:0
116
7789fb1c9fa2 more UD socket fixes (at least client side seems to work now)
Claus Gittinger <cg@exept.de>
parents: 115
diff changeset
  2636
!
7789fb1c9fa2 more UD socket fixes (at least client side seems to work now)
Claus Gittinger <cg@exept.de>
parents: 115
diff changeset
  2637
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2638
sendTo:anAddressBuffer buffer:buffer start:startIndex for:count
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2639
    "send datagramm data - fetch address of destination host from
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2640
     anAddressBuffer, data from aDataBuffer.
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2641
     Both must be ByteArray-like. The bytes in the addressBuffer must
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2642
     be a valid address for my domain (i.e. for inet, a 4-byte byteArray).
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2643
     Return the number of bytes transmitted, or a negative number on error.
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2644
     On error, the unix error code is left in the lastErrorNumber
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2645
     instance variable.
817
eda0065cbd47 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 814
diff changeset
  2646
     Flags is currently ignored; it is there for ST-80 compatibility."
eda0065cbd47 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 814
diff changeset
  2647
1485
d8578cf3504b gcc3.3.1 insn-scheduler bug workaround
Claus Gittinger <cg@exept.de>
parents: 1474
diff changeset
  2648
    ^ self sendTo:anAddressBuffer buffer:buffer start:startIndex for:count flags:0
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2649
!
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2650
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2651
sendTo:anAddressBuffer buffer:aDataBuffer start:startIndex for:nBytes flags:flags
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2652
    "send datagramm data - fetch address of destination host from
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2653
     anAddressBuffer, data from aDataBuffer starting at startIndex,
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2654
     sending count bytes.
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2655
     Both must be ByteArray-like. The bytes in the addressBuffer must
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2656
     be a valid address for my domain (i.e. for inet, a 4-byte byteArray).
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2657
     Return the number of bytes transmitted, or a negative number on error.
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2658
     On error, the unix error code is left in the lastErrorNumber
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2659
     instance variable."
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2660
3126
d95cc55a4fb5 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3123
diff changeset
  2661
    |domainClass addr error|
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2662
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2663
    (anAddressBuffer isKindOf:SocketAddress) ifTrue:[
3217
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  2664
	addr := anAddressBuffer.
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2665
    ] ifFalse:[
3217
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  2666
	anAddressBuffer isByteArray ifFalse:[
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  2667
	    ^ self error:'bad socketAddress argument'
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  2668
	].
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  2669
	domainClass := self class socketAddressClassForDomain:domain.
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  2670
	domainClass isNil ifTrue:[
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  2671
	    ^ self error:'invalid (unsupported) domain'.
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  2672
	].
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  2673
	addr := domainClass hostAddress:anAddressBuffer.
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2674
    ].
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2675
%{
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2676
#ifndef NO_SOCKET
2321
6f4cc7b644db filePointer -> handle migration
Claus Gittinger <cg@exept.de>
parents: 2308
diff changeset
  2677
    OBJ fp = __INST(handle);
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2678
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2679
    if ((fp != nil)
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2680
     && __isSmallInteger(startIndex)
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2681
     && __isSmallInteger(nBytes)) {
3217
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  2682
	SOCKET sock;
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  2683
	INT objSize;
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  2684
	struct sockaddr *sockaddr_ptr;
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  2685
	union sockaddr_u sa;
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  2686
	INT alen = 0;
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  2687
	INT sockAddrOffs, sockaddr_size;
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  2688
	INT n;
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  2689
	char *extPtr;
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  2690
	INT _flags = 0;
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  2691
	INT offs;
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  2692
	unsigned long norder;
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  2693
	unsigned char *buffer;
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  2694
	unsigned char *allocatedBuffer = NULL;
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  2695
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  2696
	_flags = __longIntVal(flags);
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  2697
	sock = SOCKET_FROM_FILE_OBJECT(fp);
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  2698
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  2699
	if (! __isBytes(addr)) {
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  2700
	    sockaddr_size = 0;
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  2701
	    sockaddr_ptr = (struct sockaddr *)0;
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  2702
	} else {
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  2703
	    int nIndex;
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  2704
	    OBJ cls;
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  2705
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  2706
	    sockAddrOffs = 0;
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  2707
	    if ((cls = __qClass(addr)) != @global(ByteArray))
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  2708
		sockAddrOffs += __OBJS2BYTES__(__intVal(__ClassInstPtr(cls)->c_ninstvars));
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  2709
	    nIndex = __qSize(addr) - OHDR_SIZE;
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  2710
	    sockaddr_size = nIndex - sockAddrOffs;
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  2711
	    if (sockaddr_size > sizeof(sa)) {
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  2712
		console_fprintf(stderr, "Socket [warning]: bad socketAddr\n");
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  2713
		goto bad;
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  2714
	    }
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  2715
	    memcpy(&sa, (__byteArrayVal(addr) + sockAddrOffs), sockaddr_size);
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  2716
	    sockaddr_ptr = (struct sockaddr *)(&sa);
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  2717
	}
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  2718
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  2719
	if (! setupBufferParameters(aDataBuffer, startIndex, &extPtr, &offs, &objSize)) goto bad;
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  2720
	if (__isSmallInteger(nBytes)) {
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  2721
	    if (__intVal(nBytes) < objSize) {
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  2722
		objSize = __intVal(nBytes);
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  2723
	    }
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  2724
	}
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2725
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2726
#ifdef DO_WRAP_CALLS
3217
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  2727
	if (extPtr) {
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  2728
	    buffer = extPtr + offs;
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  2729
	} else {
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  2730
	    allocatedBuffer = buffer = (char *)malloc(objSize);
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  2731
	    bcopy((char *)__InstPtr(aDataBuffer) + offs, allocatedBuffer, objSize);
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  2732
	}
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  2733
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  2734
	do {
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  2735
	    __threadErrno = 0;
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  2736
	    n = (INT)STX_WSA_NOINT_CALL6("sendto", sendto, sock, buffer, objSize, _flags, sockaddr_ptr, sockaddr_size);
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  2737
	} while ((n < 0) && (__threadErrno == EINTR));
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  2738
	if (n < 0) {
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  2739
	    errno = __threadErrno;
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  2740
	}
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  2741
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  2742
	if (allocatedBuffer) {
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  2743
	    free(allocatedBuffer);
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  2744
	}
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2745
#else
3217
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  2746
	__BEGIN_INTERRUPTABLE__
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  2747
	do {
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  2748
	    if (extPtr) {
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  2749
		n = sendto(sock, extPtr + offs, objSize, _flags, sockaddr_ptr, sockaddr_size);
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  2750
	    } else {
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  2751
		n = sendto(sock, (char *)__InstPtr(aDataBuffer) + offs, objSize, _flags, sockaddr_ptr, sockaddr_size);
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  2752
	    }
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  2753
	} while ((n < 0) && (errno == EINTR));
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  2754
	__END_INTERRUPTABLE__
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2755
#endif
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2756
3217
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  2757
	if (n < 0) {
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  2758
	    error = __INST(lastErrorNumber) = __MKSMALLINT(errno);
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  2759
	} else {
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  2760
	    RETURN (__MKSMALLINT(n));
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  2761
	}
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2762
    }
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2763
#endif
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2764
bad: ;
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2765
%}.
3126
d95cc55a4fb5 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3123
diff changeset
  2766
    error notNil ifTrue:[
3217
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  2767
	self writeError:error.
3126
d95cc55a4fb5 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3123
diff changeset
  2768
    ].
d95cc55a4fb5 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3123
diff changeset
  2769
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2770
    "
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2771
     arrive here if you try to send from an invalid buffer
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2772
     (i.e. not ByteArray-like),
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2773
     or if the addressBuffer is nonNil AND not a ByteArray/String
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2774
     or if the addressBuffer is nonNil AND too small.
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2775
    "
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2776
    self primitiveFailed
0
1cf8d1747859 Initial revision
claus
parents:
diff changeset
  2777
! !
1cf8d1747859 Initial revision
claus
parents:
diff changeset
  2778
3123
55ef9ca4f09f class: Socket
Stefan Vogel <sv@exept.de>
parents: 3077
diff changeset
  2779
!Socket methodsFor:'low level'!
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2780
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2781
getSocketAdress
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2782
    "BAD SPELLING, of #getSocketAddress, kept for compatibility with swazoo"
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2783
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2784
    <resource: #obsolete>
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2785
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2786
    ^ self getSocketAddress
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2787
!
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2788
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2789
getSocketError
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2790
    "get the SO_ERROR form the socket, which indicates the
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2791
     result of an asynchronous operation"
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2792
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2793
%{
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2794
#ifndef NO_SOCKET
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2795
    OBJ fp;
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2796
    int err;
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2797
2321
6f4cc7b644db filePointer -> handle migration
Claus Gittinger <cg@exept.de>
parents: 2308
diff changeset
  2798
    fp = __INST(handle);
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2799
    if (fp == nil) {
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2800
	err = EBADF;
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2801
    } else {
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2802
	unsigned int sz;
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2803
	SOCKET sock;
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2804
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2805
	sock = SOCKET_FROM_FILE_OBJECT(fp);
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2806
	sz = sizeof(err);
2909
aacef77a1697 64bit fixes
Claus Gittinger <cg@exept.de>
parents: 2904
diff changeset
  2807
	if (getsockopt(sock, SOL_SOCKET, SO_ERROR, (char *)(&err), &sz) < 0) {
1558
a563aac90660 No need to ask Socket>>#networkXXXOrderIsMSB, because the return value is
Stefan Vogel <sv@exept.de>
parents: 1542
diff changeset
  2808
# ifdef WIN32
1568
3bca500e0c7a send and receiveTimeout fixed
Claus Gittinger <cg@exept.de>
parents: 1561
diff changeset
  2809
	    errno = WSAGetLastError();
1558
a563aac90660 No need to ask Socket>>#networkXXXOrderIsMSB, because the return value is
Stefan Vogel <sv@exept.de>
parents: 1542
diff changeset
  2810
# endif
1568
3bca500e0c7a send and receiveTimeout fixed
Claus Gittinger <cg@exept.de>
parents: 1561
diff changeset
  2811
	    err = errno;
3bca500e0c7a send and receiveTimeout fixed
Claus Gittinger <cg@exept.de>
parents: 1561
diff changeset
  2812
	}
1558
a563aac90660 No need to ask Socket>>#networkXXXOrderIsMSB, because the return value is
Stefan Vogel <sv@exept.de>
parents: 1542
diff changeset
  2813
    }
a563aac90660 No need to ask Socket>>#networkXXXOrderIsMSB, because the return value is
Stefan Vogel <sv@exept.de>
parents: 1542
diff changeset
  2814
a563aac90660 No need to ask Socket>>#networkXXXOrderIsMSB, because the return value is
Stefan Vogel <sv@exept.de>
parents: 1542
diff changeset
  2815
    RETURN(__MKSMALLINT(err));
a563aac90660 No need to ask Socket>>#networkXXXOrderIsMSB, because the return value is
Stefan Vogel <sv@exept.de>
parents: 1542
diff changeset
  2816
#endif
a563aac90660 No need to ask Socket>>#networkXXXOrderIsMSB, because the return value is
Stefan Vogel <sv@exept.de>
parents: 1542
diff changeset
  2817
%}
a563aac90660 No need to ask Socket>>#networkXXXOrderIsMSB, because the return value is
Stefan Vogel <sv@exept.de>
parents: 1542
diff changeset
  2818
!
a563aac90660 No need to ask Socket>>#networkXXXOrderIsMSB, because the return value is
Stefan Vogel <sv@exept.de>
parents: 1542
diff changeset
  2819
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2820
listenWithBacklog:aNumber
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2821
    <resource: #obsolete>
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2822
    "same as listenFor: - backward compatibility with old ST/X"
3059
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  2823
    self obsoleteMethodWarning.
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2824
    ^ self listenFor:aNumber
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2825
!
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2826
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2827
primAcceptOn:aSocket blocking:blocking
3059
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  2828
    "accept a connection on a server port (created with:'Socket>>newTCP:')
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  2829
     usage is: (Socket basicNew acceptOn:(Socket newTCP:9999)).
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2830
     Return the true if ok; false if not.
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2831
     If blocking is true, the accept() syscall (and the whole smalltalk image)
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2832
     will block, until a connection is accepted.
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2833
     If blocking is false, this call will return immediately, if there is no connection pending."
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2834
3059
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  2835
    |serverSocketFd addr domainClass|
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2836
2321
6f4cc7b644db filePointer -> handle migration
Claus Gittinger <cg@exept.de>
parents: 2308
diff changeset
  2837
    handle notNil ifTrue:[
3223
b126729a904b class: Socket
Stefan Vogel <sv@exept.de>
parents: 3218
diff changeset
  2838
        ^ self errorAlreadyOpen
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2839
    ].
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2840
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2841
    domain := aSocket domain.
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2842
    socketType := aSocket type.
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2843
    serverSocketFd := aSocket fileDescriptor.
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2844
    serverSocketFd isNil ifTrue:[
3223
b126729a904b class: Socket
Stefan Vogel <sv@exept.de>
parents: 3218
diff changeset
  2845
        ^ self error:'invalid server socket'
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2846
    ].
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2847
    (serverSocketFd isMemberOf:SmallInteger) ifFalse:[
3223
b126729a904b class: Socket
Stefan Vogel <sv@exept.de>
parents: 3218
diff changeset
  2848
        ^ self error:'invalid server socket'
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2849
    ].
3059
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  2850
    "unix domain sockets do not return a valid peer name on accept"
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2851
    domainClass := self class socketAddressClassForDomain:domain.
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2852
    domainClass isNil ifTrue:[
3223
b126729a904b class: Socket
Stefan Vogel <sv@exept.de>
parents: 3218
diff changeset
  2853
        ^ self error:'invalid (unsupported) domain'.
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2854
    ].
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2855
    addr := domainClass new.
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2856
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2857
%{  /* STACK: 100000 */
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2858
#ifndef NO_SOCKET
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2859
    FILE *fp;
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2860
    int flags;
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2861
    SOCKET sock, newSock;
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2862
    union sockaddr_u sa;
3059
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  2863
    unsigned int alen;
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  2864
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2865
    sock = SOCKET_FROM_FD(__intVal(serverSocketFd));
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2866
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2867
    if (blocking == false) {
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2868
# if defined(O_NONBLOCK) && defined(SET_NDELAY)
3223
b126729a904b class: Socket
Stefan Vogel <sv@exept.de>
parents: 3218
diff changeset
  2869
        flags = fcntl(sock, F_GETFL);
b126729a904b class: Socket
Stefan Vogel <sv@exept.de>
parents: 3218
diff changeset
  2870
        fcntl(sock, F_SETFL, flags | O_NONBLOCK);
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2871
# endif
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2872
    }
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2873
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2874
# ifdef DO_WRAP_CALLS
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2875
    do {
3223
b126729a904b class: Socket
Stefan Vogel <sv@exept.de>
parents: 3218
diff changeset
  2876
        __threadErrno = 0;
b126729a904b class: Socket
Stefan Vogel <sv@exept.de>
parents: 3218
diff changeset
  2877
        alen = sizeof(sa);
b126729a904b class: Socket
Stefan Vogel <sv@exept.de>
parents: 3218
diff changeset
  2878
        newSock = (SOCKET)STX_WSA_CALL3("accept", accept, sock, &sa, &alen);
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2879
    } while ((newSock < 0) && (__threadErrno == EINTR));
3127
333e87ba225a class: Socket
Stefan Vogel <sv@exept.de>
parents: 3126
diff changeset
  2880
    if (newSock < 0) {
3223
b126729a904b class: Socket
Stefan Vogel <sv@exept.de>
parents: 3218
diff changeset
  2881
        errno = __threadErrno;
3126
d95cc55a4fb5 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3123
diff changeset
  2882
    }
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2883
# else
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2884
    __BEGIN_INTERRUPTABLE__
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2885
    do {
3223
b126729a904b class: Socket
Stefan Vogel <sv@exept.de>
parents: 3218
diff changeset
  2886
        alen = sizeof(sa);
b126729a904b class: Socket
Stefan Vogel <sv@exept.de>
parents: 3218
diff changeset
  2887
        newSock = accept(sock, (struct sockaddr *) &sa, &alen);
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2888
    } while ((newSock < 0) && (errno == EINTR));
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2889
    __END_INTERRUPTABLE__
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2890
# endif
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2891
    DBGFPRINTF((stderr, "SOCKET: accept newSock=%d\n", newSock));
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2892
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2893
    if (blocking == false) {
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2894
# if defined(O_NDELAY) && defined(SET_NDELAY)
3223
b126729a904b class: Socket
Stefan Vogel <sv@exept.de>
parents: 3218
diff changeset
  2895
        fcntl(sock, F_SETFL, flags);
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2896
# endif
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2897
    }
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2898
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2899
    if (newSock < 0) {
3223
b126729a904b class: Socket
Stefan Vogel <sv@exept.de>
parents: 3218
diff changeset
  2900
        DBGPRINTF(("SOCKET: accept call failed errno=%d\n", errno));
b126729a904b class: Socket
Stefan Vogel <sv@exept.de>
parents: 3218
diff changeset
  2901
        __INST(lastErrorNumber) = __MKSMALLINT(errno);
b126729a904b class: Socket
Stefan Vogel <sv@exept.de>
parents: 3218
diff changeset
  2902
        RETURN (false);
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2903
    }
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2904
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2905
    if (__isNonNilObject(addr)) {
3223
b126729a904b class: Socket
Stefan Vogel <sv@exept.de>
parents: 3218
diff changeset
  2906
        OBJ oClass = __qClass(addr);
b126729a904b class: Socket
Stefan Vogel <sv@exept.de>
parents: 3218
diff changeset
  2907
        int nInstVars, nInstBytes, objSize;
b126729a904b class: Socket
Stefan Vogel <sv@exept.de>
parents: 3218
diff changeset
  2908
        char *addrP;
b126729a904b class: Socket
Stefan Vogel <sv@exept.de>
parents: 3218
diff changeset
  2909
b126729a904b class: Socket
Stefan Vogel <sv@exept.de>
parents: 3218
diff changeset
  2910
        if (! __isBytes(addr) ) {
b126729a904b class: Socket
Stefan Vogel <sv@exept.de>
parents: 3218
diff changeset
  2911
            DBGPRINTF(("SOCKET: bad addr\n"));
b126729a904b class: Socket
Stefan Vogel <sv@exept.de>
parents: 3218
diff changeset
  2912
            closesocket(newSock);
b126729a904b class: Socket
Stefan Vogel <sv@exept.de>
parents: 3218
diff changeset
  2913
            RETURN (false);
b126729a904b class: Socket
Stefan Vogel <sv@exept.de>
parents: 3218
diff changeset
  2914
        }
b126729a904b class: Socket
Stefan Vogel <sv@exept.de>
parents: 3218
diff changeset
  2915
b126729a904b class: Socket
Stefan Vogel <sv@exept.de>
parents: 3218
diff changeset
  2916
        nInstVars = __intVal(__ClassInstPtr(oClass)->c_ninstvars);
b126729a904b class: Socket
Stefan Vogel <sv@exept.de>
parents: 3218
diff changeset
  2917
        nInstBytes = OHDR_SIZE + (nInstVars * sizeof(OBJ));
b126729a904b class: Socket
Stefan Vogel <sv@exept.de>
parents: 3218
diff changeset
  2918
        objSize = __qSize(addr) - nInstBytes;
b126729a904b class: Socket
Stefan Vogel <sv@exept.de>
parents: 3218
diff changeset
  2919
        addrP = (char *)__InstPtr(addr) + nInstBytes;
b126729a904b class: Socket
Stefan Vogel <sv@exept.de>
parents: 3218
diff changeset
  2920
        if (objSize < alen) {
b126729a904b class: Socket
Stefan Vogel <sv@exept.de>
parents: 3218
diff changeset
  2921
            DBGPRINTF(("SOCKET: bad addr\n"));
b126729a904b class: Socket
Stefan Vogel <sv@exept.de>
parents: 3218
diff changeset
  2922
            closesocket(newSock);
b126729a904b class: Socket
Stefan Vogel <sv@exept.de>
parents: 3218
diff changeset
  2923
            RETURN (false);
b126729a904b class: Socket
Stefan Vogel <sv@exept.de>
parents: 3218
diff changeset
  2924
        }
b126729a904b class: Socket
Stefan Vogel <sv@exept.de>
parents: 3218
diff changeset
  2925
b126729a904b class: Socket
Stefan Vogel <sv@exept.de>
parents: 3218
diff changeset
  2926
        /*
b126729a904b class: Socket
Stefan Vogel <sv@exept.de>
parents: 3218
diff changeset
  2927
         * extract the partners address
b126729a904b class: Socket
Stefan Vogel <sv@exept.de>
parents: 3218
diff changeset
  2928
         */
b126729a904b class: Socket
Stefan Vogel <sv@exept.de>
parents: 3218
diff changeset
  2929
        memcpy(addrP, (char *)&sa, alen);
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2930
    }
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2931
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2932
    /*
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2933
     * make it a FILE *
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2934
     */
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2935
# ifdef WIN32
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2936
    {
3223
b126729a904b class: Socket
Stefan Vogel <sv@exept.de>
parents: 3218
diff changeset
  2937
        int _fd;
b126729a904b class: Socket
Stefan Vogel <sv@exept.de>
parents: 3218
diff changeset
  2938
        __stxWrapApiEnterCritical();
2915
896fffb0f02e mingw64
Claus Gittinger <cg@exept.de>
parents: 2909
diff changeset
  2939
#  if defined( __BORLANDC__ ) || defined( __MINGW__ )
3223
b126729a904b class: Socket
Stefan Vogel <sv@exept.de>
parents: 3218
diff changeset
  2940
        _fd = _open_osfhandle((long)newSock, 0);
2773
ab3049f4a351 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2748
diff changeset
  2941
#  else
3223
b126729a904b class: Socket
Stefan Vogel <sv@exept.de>
parents: 3218
diff changeset
  2942
        _fd = (int)newSock;
2773
ab3049f4a351 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2748
diff changeset
  2943
#  endif
3223
b126729a904b class: Socket
Stefan Vogel <sv@exept.de>
parents: 3218
diff changeset
  2944
        fp = fdopen(_fd, "r+");
b126729a904b class: Socket
Stefan Vogel <sv@exept.de>
parents: 3218
diff changeset
  2945
        __stxWrapApiLeaveCritical();
b126729a904b class: Socket
Stefan Vogel <sv@exept.de>
parents: 3218
diff changeset
  2946
        DBGPRINTF(("SOCKET: sock=%d fd=%d fp=%"_lx_"\n",newSock, _fd, (INT)fp));
1558
a563aac90660 No need to ask Socket>>#networkXXXOrderIsMSB, because the return value is
Stefan Vogel <sv@exept.de>
parents: 1542
diff changeset
  2947
    }
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2948
# else
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2949
    fp = fdopen(newSock, "r+");
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2950
# endif
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2951
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2952
    if (! fp) {
3223
b126729a904b class: Socket
Stefan Vogel <sv@exept.de>
parents: 3218
diff changeset
  2953
        DBGPRINTF(("SOCKET: fdopen call failed\n"));
b126729a904b class: Socket
Stefan Vogel <sv@exept.de>
parents: 3218
diff changeset
  2954
        __INST(lastErrorNumber) = __MKSMALLINT(errno);
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2955
#  ifdef DO_WRAP_CALLS
3223
b126729a904b class: Socket
Stefan Vogel <sv@exept.de>
parents: 3218
diff changeset
  2956
        {
b126729a904b class: Socket
Stefan Vogel <sv@exept.de>
parents: 3218
diff changeset
  2957
          INT ret;
b126729a904b class: Socket
Stefan Vogel <sv@exept.de>
parents: 3218
diff changeset
  2958
          do {
b126729a904b class: Socket
Stefan Vogel <sv@exept.de>
parents: 3218
diff changeset
  2959
              __threadErrno = 0;
b126729a904b class: Socket
Stefan Vogel <sv@exept.de>
parents: 3218
diff changeset
  2960
              ret = (INT)STX_WSA_CALL1("closesocket", closesocket, newSock);
b126729a904b class: Socket
Stefan Vogel <sv@exept.de>
parents: 3218
diff changeset
  2961
          } while ((ret < 0) && (__threadErrno == EINTR));
b126729a904b class: Socket
Stefan Vogel <sv@exept.de>
parents: 3218
diff changeset
  2962
        }
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2963
#  else
3223
b126729a904b class: Socket
Stefan Vogel <sv@exept.de>
parents: 3218
diff changeset
  2964
        closesocket(newSock);
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2965
#  endif
3223
b126729a904b class: Socket
Stefan Vogel <sv@exept.de>
parents: 3218
diff changeset
  2966
        DBGFPRINTF((stderr, "SOCKET: close (fdopen failed) (%d)\n", newSock));
b126729a904b class: Socket
Stefan Vogel <sv@exept.de>
parents: 3218
diff changeset
  2967
        RETURN (false);
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2968
    }
2340
2dc6e31f0142 handleType
Claus Gittinger <cg@exept.de>
parents: 2331
diff changeset
  2969
    __INST(handleType) = @symbol(socketFilePointer);
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2970
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2971
    if ((@global(FileOpenTrace) == true) || __debugging__) {
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2972
# ifdef WIN32
3223
b126729a904b class: Socket
Stefan Vogel <sv@exept.de>
parents: 3218
diff changeset
  2973
        {
b126729a904b class: Socket
Stefan Vogel <sv@exept.de>
parents: 3218
diff changeset
  2974
            HANDLE h;
b126729a904b class: Socket
Stefan Vogel <sv@exept.de>
parents: 3218
diff changeset
  2975
b126729a904b class: Socket
Stefan Vogel <sv@exept.de>
parents: 3218
diff changeset
  2976
            int _fd = fileno(fp);
b126729a904b class: Socket
Stefan Vogel <sv@exept.de>
parents: 3218
diff changeset
  2977
            h = (HANDLE)_get_osfhandle(_fd);
b126729a904b class: Socket
Stefan Vogel <sv@exept.de>
parents: 3218
diff changeset
  2978
            console_fprintf(stderr, "fdopen [Socket accept] -> %"_lx_" (fd: %d) (H: %"_lx_")\n", (INT)fp, _fd, (INT)h);
b126729a904b class: Socket
Stefan Vogel <sv@exept.de>
parents: 3218
diff changeset
  2979
        }
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2980
# else
3223
b126729a904b class: Socket
Stefan Vogel <sv@exept.de>
parents: 3218
diff changeset
  2981
        console_fprintf(stderr, "fdopen [Socket accept] -> %"_lx_" (fd: %d)\n", (INT)fp, newSock);
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2982
# endif
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2983
    }
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2984
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2985
# ifdef BUGGY_STDIO_LIB
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2986
    setbuf(fp, NULL);
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2987
    __INST(buffered) = false;
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2988
# endif
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2989
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2990
# if 0
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2991
    // The original code was:
2417
6df5cc0fc132 Use __MKEXTERNALADDRESS() instead of __MKOBJ()
Stefan Vogel <sv@exept.de>
parents: 2414
diff changeset
  2992
    __INST(handle) = __MKEXTERNALADDRESS(fp); __STORESELF(handle);
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2993
    // but for that, gcc generates wrong code, which loads self (volatile) into
2417
6df5cc0fc132 Use __MKEXTERNALADDRESS() instead of __MKOBJ()
Stefan Vogel <sv@exept.de>
parents: 2414
diff changeset
  2994
    // a register (bp), then calls __MKEXTERNALADDRESS, then stores indirect bp.
6df5cc0fc132 Use __MKEXTERNALADDRESS() instead of __MKOBJ()
Stefan Vogel <sv@exept.de>
parents: 2414
diff changeset
  2995
    // That is wrong if a scavenge occurs in __MKEXTERNALADDRESS, as bp is now still pointing to the old
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2996
    // object.
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2997
# endif
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2998
    {
3223
b126729a904b class: Socket
Stefan Vogel <sv@exept.de>
parents: 3218
diff changeset
  2999
        OBJ t;
b126729a904b class: Socket
Stefan Vogel <sv@exept.de>
parents: 3218
diff changeset
  3000
b126729a904b class: Socket
Stefan Vogel <sv@exept.de>
parents: 3218
diff changeset
  3001
        t = __MKEXTERNALADDRESS(fp);
b126729a904b class: Socket
Stefan Vogel <sv@exept.de>
parents: 3218
diff changeset
  3002
        __INST(handle) = t;
b126729a904b class: Socket
Stefan Vogel <sv@exept.de>
parents: 3218
diff changeset
  3003
        __STORE(self, t);
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  3004
    }
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  3005
#endif /* not NO_SOCKET */
1558
a563aac90660 No need to ask Socket>>#networkXXXOrderIsMSB, because the return value is
Stefan Vogel <sv@exept.de>
parents: 1542
diff changeset
  3006
%}.
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  3007
    mode := #readwrite.
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  3008
    Lobby register:self.
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  3009
    binary := false.
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  3010
    port := aSocket port.
3059
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  3011
    peer := addr.
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  3012
1558
a563aac90660 No need to ask Socket>>#networkXXXOrderIsMSB, because the return value is
Stefan Vogel <sv@exept.de>
parents: 1542
diff changeset
  3013
    ^ true
2551
6da1bc89b74a changed:
Stefan Vogel <sv@exept.de>
parents: 2516
diff changeset
  3014
!
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3015
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3016
setSocketOption:option argument:arg1 argument:arg2
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3017
    |ok|
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3018
2551
6da1bc89b74a changed:
Stefan Vogel <sv@exept.de>
parents: 2516
diff changeset
  3019
    handle isNil ifTrue:[
2579
d70306ae12ac visual c compilable
Claus Gittinger <cg@exept.de>
parents: 2551
diff changeset
  3020
	^ self errorNotOpen
2551
6da1bc89b74a changed:
Stefan Vogel <sv@exept.de>
parents: 2516
diff changeset
  3021
    ].
6da1bc89b74a changed:
Stefan Vogel <sv@exept.de>
parents: 2516
diff changeset
  3022
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3023
%{  /* STACK: 32000 */
2818
94d67df5c00d compilable with tcc
Claus Gittinger <cg@exept.de>
parents: 2773
diff changeset
  3024
#ifndef NO_SOCKET
2321
6f4cc7b644db filePointer -> handle migration
Claus Gittinger <cg@exept.de>
parents: 2308
diff changeset
  3025
    OBJ fp = __INST(handle);
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3026
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3027
    if (fp != nil) {
2579
d70306ae12ac visual c compilable
Claus Gittinger <cg@exept.de>
parents: 2551
diff changeset
  3028
	SOCKET sock;
d70306ae12ac visual c compilable
Claus Gittinger <cg@exept.de>
parents: 2551
diff changeset
  3029
	int opt = -1;
d70306ae12ac visual c compilable
Claus Gittinger <cg@exept.de>
parents: 2551
diff changeset
  3030
	int level = -1;
d70306ae12ac visual c compilable
Claus Gittinger <cg@exept.de>
parents: 2551
diff changeset
  3031
	int usize = -1;
d70306ae12ac visual c compilable
Claus Gittinger <cg@exept.de>
parents: 2551
diff changeset
  3032
	int ret;
d70306ae12ac visual c compilable
Claus Gittinger <cg@exept.de>
parents: 2551
diff changeset
  3033
	union u {
d70306ae12ac visual c compilable
Claus Gittinger <cg@exept.de>
parents: 2551
diff changeset
  3034
	    BOOL        u_bool;
d70306ae12ac visual c compilable
Claus Gittinger <cg@exept.de>
parents: 2551
diff changeset
  3035
	    int         u_int;
d70306ae12ac visual c compilable
Claus Gittinger <cg@exept.de>
parents: 2551
diff changeset
  3036
	    struct linger u_linger;
2516
592619f82885 Add setsockopt for Multicast stuff
Stefan Vogel <sv@exept.de>
parents: 2465
diff changeset
  3037
# ifdef IP_ADD_MEMBERSHIP
2579
d70306ae12ac visual c compilable
Claus Gittinger <cg@exept.de>
parents: 2551
diff changeset
  3038
	    struct ip_mreq      u_ip_mreq;
2516
592619f82885 Add setsockopt for Multicast stuff
Stefan Vogel <sv@exept.de>
parents: 2465
diff changeset
  3039
# endif
2579
d70306ae12ac visual c compilable
Claus Gittinger <cg@exept.de>
parents: 2551
diff changeset
  3040
	} u;
d70306ae12ac visual c compilable
Claus Gittinger <cg@exept.de>
parents: 2551
diff changeset
  3041
d70306ae12ac visual c compilable
Claus Gittinger <cg@exept.de>
parents: 2551
diff changeset
  3042
	sock = SOCKET_FROM_FILE_OBJECT(fp);
2516
592619f82885 Add setsockopt for Multicast stuff
Stefan Vogel <sv@exept.de>
parents: 2465
diff changeset
  3043
592619f82885 Add setsockopt for Multicast stuff
Stefan Vogel <sv@exept.de>
parents: 2465
diff changeset
  3044
# ifdef IP_ADD_MEMBERSHIP
2579
d70306ae12ac visual c compilable
Claus Gittinger <cg@exept.de>
parents: 2551
diff changeset
  3045
	if (option == @symbol(IP_DROP_MEMBERSHIP)) {
d70306ae12ac visual c compilable
Claus Gittinger <cg@exept.de>
parents: 2551
diff changeset
  3046
	    opt = IP_DROP_MEMBERSHIP;
d70306ae12ac visual c compilable
Claus Gittinger <cg@exept.de>
parents: 2551
diff changeset
  3047
	    goto dropOrAdd;
d70306ae12ac visual c compilable
Claus Gittinger <cg@exept.de>
parents: 2551
diff changeset
  3048
	}
d70306ae12ac visual c compilable
Claus Gittinger <cg@exept.de>
parents: 2551
diff changeset
  3049
	if (option == @symbol(IP_ADD_MEMBERSHIP)) {
d70306ae12ac visual c compilable
Claus Gittinger <cg@exept.de>
parents: 2551
diff changeset
  3050
	    /* add membership to a multicast group */
d70306ae12ac visual c compilable
Claus Gittinger <cg@exept.de>
parents: 2551
diff changeset
  3051
	    opt = IP_ADD_MEMBERSHIP;
2516
592619f82885 Add setsockopt for Multicast stuff
Stefan Vogel <sv@exept.de>
parents: 2465
diff changeset
  3052
dropOrAdd:
2579
d70306ae12ac visual c compilable
Claus Gittinger <cg@exept.de>
parents: 2551
diff changeset
  3053
	    level = IPPROTO_IP;
d70306ae12ac visual c compilable
Claus Gittinger <cg@exept.de>
parents: 2551
diff changeset
  3054
	    usize = sizeof(u.u_ip_mreq);
d70306ae12ac visual c compilable
Claus Gittinger <cg@exept.de>
parents: 2551
diff changeset
  3055
	    if (__isByteArrayLike(arg1) && __isByteArrayLike(arg2)) {
d70306ae12ac visual c compilable
Claus Gittinger <cg@exept.de>
parents: 2551
diff changeset
  3056
		memcpy(&u.u_ip_mreq.imr_multiaddr, __byteArrayVal(arg1), sizeof(u.u_ip_mreq.imr_multiaddr));
d70306ae12ac visual c compilable
Claus Gittinger <cg@exept.de>
parents: 2551
diff changeset
  3057
		memcpy(&u.u_ip_mreq.imr_interface, __byteArrayVal(arg2), sizeof(u.u_ip_mreq.imr_interface));
d70306ae12ac visual c compilable
Claus Gittinger <cg@exept.de>
parents: 2551
diff changeset
  3058
	    }
d70306ae12ac visual c compilable
Claus Gittinger <cg@exept.de>
parents: 2551
diff changeset
  3059
	    else
d70306ae12ac visual c compilable
Claus Gittinger <cg@exept.de>
parents: 2551
diff changeset
  3060
		goto argError;
d70306ae12ac visual c compilable
Claus Gittinger <cg@exept.de>
parents: 2551
diff changeset
  3061
	}
2516
592619f82885 Add setsockopt for Multicast stuff
Stefan Vogel <sv@exept.de>
parents: 2465
diff changeset
  3062
# endif /* IP_ADD_MEMBERSHIP */
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3063
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3064
# ifdef SO_BROADCAST
2579
d70306ae12ac visual c compilable
Claus Gittinger <cg@exept.de>
parents: 2551
diff changeset
  3065
	if (option == @symbol(SO_BROADCAST)) {
d70306ae12ac visual c compilable
Claus Gittinger <cg@exept.de>
parents: 2551
diff changeset
  3066
	    /* Enables transmission and receipt of broadcast messages on the socket. */
d70306ae12ac visual c compilable
Claus Gittinger <cg@exept.de>
parents: 2551
diff changeset
  3067
	    opt = SO_BROADCAST;
d70306ae12ac visual c compilable
Claus Gittinger <cg@exept.de>
parents: 2551
diff changeset
  3068
	    level = SOL_SOCKET;
d70306ae12ac visual c compilable
Claus Gittinger <cg@exept.de>
parents: 2551
diff changeset
  3069
	    usize = sizeof(u.u_bool);
d70306ae12ac visual c compilable
Claus Gittinger <cg@exept.de>
parents: 2551
diff changeset
  3070
	    if (arg1 == true) u.u_bool = TRUE;
d70306ae12ac visual c compilable
Claus Gittinger <cg@exept.de>
parents: 2551
diff changeset
  3071
	    else if (arg1 == false) u.u_bool = FALSE;
d70306ae12ac visual c compilable
Claus Gittinger <cg@exept.de>
parents: 2551
diff changeset
  3072
	    else goto argError;
d70306ae12ac visual c compilable
Claus Gittinger <cg@exept.de>
parents: 2551
diff changeset
  3073
	}
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3074
# endif /* SO_BROADCAST */
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3075
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3076
# ifdef SO_CONDITIONAL
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3077
#  if 0
2579
d70306ae12ac visual c compilable
Claus Gittinger <cg@exept.de>
parents: 2551
diff changeset
  3078
	if (option == @symbol(SO_CONDITIONAL)) {
d70306ae12ac visual c compilable
Claus Gittinger <cg@exept.de>
parents: 2551
diff changeset
  3079
	    /* Enables sockets to delay the acknowledgment of a connection until after the WSAAccept condition function is called. */
d70306ae12ac visual c compilable
Claus Gittinger <cg@exept.de>
parents: 2551
diff changeset
  3080
	    opt = SO_CONDITIONAL;
d70306ae12ac visual c compilable
Claus Gittinger <cg@exept.de>
parents: 2551
diff changeset
  3081
	    level = SOL_SOCKET;
d70306ae12ac visual c compilable
Claus Gittinger <cg@exept.de>
parents: 2551
diff changeset
  3082
	    usize = sizeof(u.u_bool);
d70306ae12ac visual c compilable
Claus Gittinger <cg@exept.de>
parents: 2551
diff changeset
  3083
	    if (arg1 == true) u.u_bool = TRUE;
d70306ae12ac visual c compilable
Claus Gittinger <cg@exept.de>
parents: 2551
diff changeset
  3084
	    else if (arg1 == false) u.u_bool = FALSE;
d70306ae12ac visual c compilable
Claus Gittinger <cg@exept.de>
parents: 2551
diff changeset
  3085
	    else goto argError;
d70306ae12ac visual c compilable
Claus Gittinger <cg@exept.de>
parents: 2551
diff changeset
  3086
	}
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3087
#  endif
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3088
# endif /* SO_CONDITIONAL */
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3089
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3090
# ifdef SO_DEBUG
2579
d70306ae12ac visual c compilable
Claus Gittinger <cg@exept.de>
parents: 2551
diff changeset
  3091
	if (option == @symbol(SO_DEBUG)) {
d70306ae12ac visual c compilable
Claus Gittinger <cg@exept.de>
parents: 2551
diff changeset
  3092
	    /* Records debugging information. */
d70306ae12ac visual c compilable
Claus Gittinger <cg@exept.de>
parents: 2551
diff changeset
  3093
	    opt = SO_DEBUG;
d70306ae12ac visual c compilable
Claus Gittinger <cg@exept.de>
parents: 2551
diff changeset
  3094
	    level = SOL_SOCKET;
d70306ae12ac visual c compilable
Claus Gittinger <cg@exept.de>
parents: 2551
diff changeset
  3095
	    usize = sizeof(u.u_bool);
d70306ae12ac visual c compilable
Claus Gittinger <cg@exept.de>
parents: 2551
diff changeset
  3096
	    if (arg1 == true) u.u_bool = TRUE;
d70306ae12ac visual c compilable
Claus Gittinger <cg@exept.de>
parents: 2551
diff changeset
  3097
	    else if (arg1 == false) u.u_bool = FALSE;
d70306ae12ac visual c compilable
Claus Gittinger <cg@exept.de>
parents: 2551
diff changeset
  3098
	    else goto argError;
d70306ae12ac visual c compilable
Claus Gittinger <cg@exept.de>
parents: 2551
diff changeset
  3099
	}
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3100
# endif /* SO_DEBUG */
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3101
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3102
# ifdef SO_DONTLINGER
2579
d70306ae12ac visual c compilable
Claus Gittinger <cg@exept.de>
parents: 2551
diff changeset
  3103
	if (option == @symbol(SO_DONTLINGER)) {
d70306ae12ac visual c compilable
Claus Gittinger <cg@exept.de>
parents: 2551
diff changeset
  3104
	    /* Does not block close waiting for unsent data to be sent.
d70306ae12ac visual c compilable
Claus Gittinger <cg@exept.de>
parents: 2551
diff changeset
  3105
	       Setting this option is equivalent to setting SO_LINGER with l_onoff set to zero. */
d70306ae12ac visual c compilable
Claus Gittinger <cg@exept.de>
parents: 2551
diff changeset
  3106
	    opt = SO_DONTLINGER;
d70306ae12ac visual c compilable
Claus Gittinger <cg@exept.de>
parents: 2551
diff changeset
  3107
	    level = SOL_SOCKET;
d70306ae12ac visual c compilable
Claus Gittinger <cg@exept.de>
parents: 2551
diff changeset
  3108
	    usize = sizeof(u.u_bool);
d70306ae12ac visual c compilable
Claus Gittinger <cg@exept.de>
parents: 2551
diff changeset
  3109
	    if (arg1 == true) u.u_bool = TRUE;
d70306ae12ac visual c compilable
Claus Gittinger <cg@exept.de>
parents: 2551
diff changeset
  3110
	    else if (arg1 == false) u.u_bool = FALSE;
d70306ae12ac visual c compilable
Claus Gittinger <cg@exept.de>
parents: 2551
diff changeset
  3111
	    else goto argError;
d70306ae12ac visual c compilable
Claus Gittinger <cg@exept.de>
parents: 2551
diff changeset
  3112
	}
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3113
# endif /* SO_DONTLINGER */
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3114
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3115
# ifdef SO_DONTROUTE
2579
d70306ae12ac visual c compilable
Claus Gittinger <cg@exept.de>
parents: 2551
diff changeset
  3116
	if (option == @symbol(SO_DONTROUTE)) {
d70306ae12ac visual c compilable
Claus Gittinger <cg@exept.de>
parents: 2551
diff changeset
  3117
	    /* Does not route: sends directly to interface.
d70306ae12ac visual c compilable
Claus Gittinger <cg@exept.de>
parents: 2551
diff changeset
  3118
	       Succeeds but is ignored on AF_INET sockets;
d70306ae12ac visual c compilable
Claus Gittinger <cg@exept.de>
parents: 2551
diff changeset
  3119
	       fails on AF_INET6 sockets with WSAENOPROTOOPT.
d70306ae12ac visual c compilable
Claus Gittinger <cg@exept.de>
parents: 2551
diff changeset
  3120
	       Not supported on ATM sockets (results in an error). */
d70306ae12ac visual c compilable
Claus Gittinger <cg@exept.de>
parents: 2551
diff changeset
  3121
	    opt = SO_DONTROUTE;
d70306ae12ac visual c compilable
Claus Gittinger <cg@exept.de>
parents: 2551
diff changeset
  3122
	    level = SOL_SOCKET;
d70306ae12ac visual c compilable
Claus Gittinger <cg@exept.de>
parents: 2551
diff changeset
  3123
	    usize = sizeof(u.u_bool);
d70306ae12ac visual c compilable
Claus Gittinger <cg@exept.de>
parents: 2551
diff changeset
  3124
	    if (arg1 == true) u.u_bool = TRUE;
d70306ae12ac visual c compilable
Claus Gittinger <cg@exept.de>
parents: 2551
diff changeset
  3125
	    else if (arg1 == false) u.u_bool = FALSE;
d70306ae12ac visual c compilable
Claus Gittinger <cg@exept.de>
parents: 2551
diff changeset
  3126
	    else goto argError;
d70306ae12ac visual c compilable
Claus Gittinger <cg@exept.de>
parents: 2551
diff changeset
  3127
	}
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3128
# endif /* SO_DONTROUTE */
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3129
2516
592619f82885 Add setsockopt for Multicast stuff
Stefan Vogel <sv@exept.de>
parents: 2465
diff changeset
  3130
#if defined(IPPROTO_TCP) && defined(TCP_NODELAY)
2579
d70306ae12ac visual c compilable
Claus Gittinger <cg@exept.de>
parents: 2551
diff changeset
  3131
	if (option == @symbol(TCP_NODELAY)) {
d70306ae12ac visual c compilable
Claus Gittinger <cg@exept.de>
parents: 2551
diff changeset
  3132
	    /* enable/disable TCP_NODELAY (i.e. disable/enable the Nagle algorithm) */
d70306ae12ac visual c compilable
Claus Gittinger <cg@exept.de>
parents: 2551
diff changeset
  3133
	    opt = TCP_NODELAY;
d70306ae12ac visual c compilable
Claus Gittinger <cg@exept.de>
parents: 2551
diff changeset
  3134
	    level = IPPROTO_TCP;
d70306ae12ac visual c compilable
Claus Gittinger <cg@exept.de>
parents: 2551
diff changeset
  3135
	    usize = sizeof(u.u_bool);
d70306ae12ac visual c compilable
Claus Gittinger <cg@exept.de>
parents: 2551
diff changeset
  3136
	    if (arg1 == true) u.u_bool = TRUE;
d70306ae12ac visual c compilable
Claus Gittinger <cg@exept.de>
parents: 2551
diff changeset
  3137
	    else if (arg1 == false) u.u_bool = FALSE;
d70306ae12ac visual c compilable
Claus Gittinger <cg@exept.de>
parents: 2551
diff changeset
  3138
	    else goto argError;
d70306ae12ac visual c compilable
Claus Gittinger <cg@exept.de>
parents: 2551
diff changeset
  3139
	}
2516
592619f82885 Add setsockopt for Multicast stuff
Stefan Vogel <sv@exept.de>
parents: 2465
diff changeset
  3140
# endif /* TCP_NODELAY */
592619f82885 Add setsockopt for Multicast stuff
Stefan Vogel <sv@exept.de>
parents: 2465
diff changeset
  3141
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3142
# ifdef SO_KEEPALIVE
2579
d70306ae12ac visual c compilable
Claus Gittinger <cg@exept.de>
parents: 2551
diff changeset
  3143
	if (option == @symbol(SO_KEEPALIVE)) {
d70306ae12ac visual c compilable
Claus Gittinger <cg@exept.de>
parents: 2551
diff changeset
  3144
	    /* Sends keep-alives. Not supported on ATM sockets (results in an error). */
d70306ae12ac visual c compilable
Claus Gittinger <cg@exept.de>
parents: 2551
diff changeset
  3145
	    opt = SO_KEEPALIVE;
d70306ae12ac visual c compilable
Claus Gittinger <cg@exept.de>
parents: 2551
diff changeset
  3146
	    level = SOL_SOCKET;
d70306ae12ac visual c compilable
Claus Gittinger <cg@exept.de>
parents: 2551
diff changeset
  3147
	    usize = sizeof(u.u_bool);
d70306ae12ac visual c compilable
Claus Gittinger <cg@exept.de>
parents: 2551
diff changeset
  3148
	    if (arg1 == true) u.u_bool = TRUE;
d70306ae12ac visual c compilable
Claus Gittinger <cg@exept.de>
parents: 2551
diff changeset
  3149
	    else if (arg1 == false) u.u_bool = FALSE;
d70306ae12ac visual c compilable
Claus Gittinger <cg@exept.de>
parents: 2551
diff changeset
  3150
	    else goto argError;
d70306ae12ac visual c compilable
Claus Gittinger <cg@exept.de>
parents: 2551
diff changeset
  3151
	}
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3152
# endif /* SO_KEEPALIVE */
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3153
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3154
# ifdef SO_LINGER
2579
d70306ae12ac visual c compilable
Claus Gittinger <cg@exept.de>
parents: 2551
diff changeset
  3155
	if (option == @symbol(SO_LINGER)) {
d70306ae12ac visual c compilable
Claus Gittinger <cg@exept.de>
parents: 2551
diff changeset
  3156
	    /* Lingers on close if unsent data is present. */
d70306ae12ac visual c compilable
Claus Gittinger <cg@exept.de>
parents: 2551
diff changeset
  3157
	    opt = SO_LINGER;
d70306ae12ac visual c compilable
Claus Gittinger <cg@exept.de>
parents: 2551
diff changeset
  3158
	    level = SOL_SOCKET;
d70306ae12ac visual c compilable
Claus Gittinger <cg@exept.de>
parents: 2551
diff changeset
  3159
	    usize = sizeof(u.u_linger);
d70306ae12ac visual c compilable
Claus Gittinger <cg@exept.de>
parents: 2551
diff changeset
  3160
	    if (arg1 == true) u.u_linger.l_onoff = TRUE;
d70306ae12ac visual c compilable
Claus Gittinger <cg@exept.de>
parents: 2551
diff changeset
  3161
	    else if (arg1 == false) u.u_linger.l_onoff = FALSE;
d70306ae12ac visual c compilable
Claus Gittinger <cg@exept.de>
parents: 2551
diff changeset
  3162
	    else goto argError;
d70306ae12ac visual c compilable
Claus Gittinger <cg@exept.de>
parents: 2551
diff changeset
  3163
	    if (arg2 == nil) u.u_linger.l_linger = 0;
d70306ae12ac visual c compilable
Claus Gittinger <cg@exept.de>
parents: 2551
diff changeset
  3164
	    else if (__isSmallInteger(arg2))u.u_linger.l_linger = __intVal(arg2);
d70306ae12ac visual c compilable
Claus Gittinger <cg@exept.de>
parents: 2551
diff changeset
  3165
	    else goto argError;
d70306ae12ac visual c compilable
Claus Gittinger <cg@exept.de>
parents: 2551
diff changeset
  3166
	    DBGPRINTF(("SOCKET: SO_LINGER %d %d\n", u.u_linger.l_onoff, u.u_linger.l_linger));
d70306ae12ac visual c compilable
Claus Gittinger <cg@exept.de>
parents: 2551
diff changeset
  3167
	}
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3168
# endif /* SO_LINGER */
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3169
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3170
# ifdef SO_OOBINLINE
2579
d70306ae12ac visual c compilable
Claus Gittinger <cg@exept.de>
parents: 2551
diff changeset
  3171
	if (option == @symbol(SO_OOBINLINE)) {
d70306ae12ac visual c compilable
Claus Gittinger <cg@exept.de>
parents: 2551
diff changeset
  3172
	    /* Receives OOB data in the normal data stream. */
d70306ae12ac visual c compilable
Claus Gittinger <cg@exept.de>
parents: 2551
diff changeset
  3173
	    opt = SO_OOBINLINE;
d70306ae12ac visual c compilable
Claus Gittinger <cg@exept.de>
parents: 2551
diff changeset
  3174
	    level = SOL_SOCKET;
d70306ae12ac visual c compilable
Claus Gittinger <cg@exept.de>
parents: 2551
diff changeset
  3175
	    usize = sizeof(u.u_bool);
d70306ae12ac visual c compilable
Claus Gittinger <cg@exept.de>
parents: 2551
diff changeset
  3176
	    if (arg1 == true) u.u_bool = TRUE;
d70306ae12ac visual c compilable
Claus Gittinger <cg@exept.de>
parents: 2551
diff changeset
  3177
	    else if (arg1 == false) u.u_bool = FALSE;
d70306ae12ac visual c compilable
Claus Gittinger <cg@exept.de>
parents: 2551
diff changeset
  3178
	    else goto argError;
d70306ae12ac visual c compilable
Claus Gittinger <cg@exept.de>
parents: 2551
diff changeset
  3179
	}
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3180
# endif /* SO_OOBINLINE */
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3181
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3182
# ifdef SO_RCVBUF
2579
d70306ae12ac visual c compilable
Claus Gittinger <cg@exept.de>
parents: 2551
diff changeset
  3183
	if (option == @symbol(SO_RCVBUF)) {
d70306ae12ac visual c compilable
Claus Gittinger <cg@exept.de>
parents: 2551
diff changeset
  3184
	    /* Specifies the total per-socket buffer space reserved for receives.
d70306ae12ac visual c compilable
Claus Gittinger <cg@exept.de>
parents: 2551
diff changeset
  3185
	       This is unrelated to SO_MAX_MSG_SIZE or the size of a TCP window. */
d70306ae12ac visual c compilable
Claus Gittinger <cg@exept.de>
parents: 2551
diff changeset
  3186
	    opt = SO_RCVBUF;
d70306ae12ac visual c compilable
Claus Gittinger <cg@exept.de>
parents: 2551
diff changeset
  3187
	    level = SOL_SOCKET;
d70306ae12ac visual c compilable
Claus Gittinger <cg@exept.de>
parents: 2551
diff changeset
  3188
	    usize = sizeof(u.u_int);
d70306ae12ac visual c compilable
Claus Gittinger <cg@exept.de>
parents: 2551
diff changeset
  3189
	    if (__isSmallInteger(arg1))u.u_int = __intVal(arg1);
d70306ae12ac visual c compilable
Claus Gittinger <cg@exept.de>
parents: 2551
diff changeset
  3190
	    else goto argError;
d70306ae12ac visual c compilable
Claus Gittinger <cg@exept.de>
parents: 2551
diff changeset
  3191
	}
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3192
# endif /* SO_RCVBUF */
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3193
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3194
# ifdef SO_SNDBUF
2579
d70306ae12ac visual c compilable
Claus Gittinger <cg@exept.de>
parents: 2551
diff changeset
  3195
	if (option == @symbol(SO_SNDBUF)) {
d70306ae12ac visual c compilable
Claus Gittinger <cg@exept.de>
parents: 2551
diff changeset
  3196
	    /* Specifies the total per-socket buffer space reserved for sends.
d70306ae12ac visual c compilable
Claus Gittinger <cg@exept.de>
parents: 2551
diff changeset
  3197
	       This is unrelated to SO_MAX_MSG_SIZE or the size of a TCP window. */
d70306ae12ac visual c compilable
Claus Gittinger <cg@exept.de>
parents: 2551
diff changeset
  3198
	    opt = SO_SNDBUF;
d70306ae12ac visual c compilable
Claus Gittinger <cg@exept.de>
parents: 2551
diff changeset
  3199
	    level = SOL_SOCKET;
d70306ae12ac visual c compilable
Claus Gittinger <cg@exept.de>
parents: 2551
diff changeset
  3200
	    usize = sizeof(u.u_int);
d70306ae12ac visual c compilable
Claus Gittinger <cg@exept.de>
parents: 2551
diff changeset
  3201
	    if (__isSmallInteger(arg1))u.u_int = __intVal(arg1);
d70306ae12ac visual c compilable
Claus Gittinger <cg@exept.de>
parents: 2551
diff changeset
  3202
	    else goto argError;
d70306ae12ac visual c compilable
Claus Gittinger <cg@exept.de>
parents: 2551
diff changeset
  3203
	}
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3204
# endif /* SO_SNDBUF */
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3205
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3206
# ifdef SO_REUSEADDR
2579
d70306ae12ac visual c compilable
Claus Gittinger <cg@exept.de>
parents: 2551
diff changeset
  3207
	if (option == @symbol(SO_REUSEADDR)) {
d70306ae12ac visual c compilable
Claus Gittinger <cg@exept.de>
parents: 2551
diff changeset
  3208
	    /* Allows the socket to be bound to an address that is already in use.  */
d70306ae12ac visual c compilable
Claus Gittinger <cg@exept.de>
parents: 2551
diff changeset
  3209
	    opt = SO_REUSEADDR;
d70306ae12ac visual c compilable
Claus Gittinger <cg@exept.de>
parents: 2551
diff changeset
  3210
	    level = SOL_SOCKET;
d70306ae12ac visual c compilable
Claus Gittinger <cg@exept.de>
parents: 2551
diff changeset
  3211
	    usize = sizeof(u.u_bool);
d70306ae12ac visual c compilable
Claus Gittinger <cg@exept.de>
parents: 2551
diff changeset
  3212
	    if (arg1 == true) u.u_bool = TRUE;
d70306ae12ac visual c compilable
Claus Gittinger <cg@exept.de>
parents: 2551
diff changeset
  3213
	    else if (arg1 == false) u.u_bool = FALSE;
d70306ae12ac visual c compilable
Claus Gittinger <cg@exept.de>
parents: 2551
diff changeset
  3214
	    else goto argError;
d70306ae12ac visual c compilable
Claus Gittinger <cg@exept.de>
parents: 2551
diff changeset
  3215
	}
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3216
# endif /* SO_OOBINLINE */
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3217
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3218
# ifdef SO_EXCLUSIVEADDRUSE
2579
d70306ae12ac visual c compilable
Claus Gittinger <cg@exept.de>
parents: 2551
diff changeset
  3219
	if (option == @symbol(SO_EXCLUSIVEADDRUSE)) {
d70306ae12ac visual c compilable
Claus Gittinger <cg@exept.de>
parents: 2551
diff changeset
  3220
	    /* Enables a socket to be bound for exclusive access.
d70306ae12ac visual c compilable
Claus Gittinger <cg@exept.de>
parents: 2551
diff changeset
  3221
	       Does not require administrative privilege.  */
d70306ae12ac visual c compilable
Claus Gittinger <cg@exept.de>
parents: 2551
diff changeset
  3222
	    opt = SO_EXCLUSIVEADDRUSE;
d70306ae12ac visual c compilable
Claus Gittinger <cg@exept.de>
parents: 2551
diff changeset
  3223
	    level = SOL_SOCKET;
d70306ae12ac visual c compilable
Claus Gittinger <cg@exept.de>
parents: 2551
diff changeset
  3224
	    usize = sizeof(u.u_bool);
d70306ae12ac visual c compilable
Claus Gittinger <cg@exept.de>
parents: 2551
diff changeset
  3225
	    if (arg1 == true) u.u_bool = TRUE;
d70306ae12ac visual c compilable
Claus Gittinger <cg@exept.de>
parents: 2551
diff changeset
  3226
	    else if (arg1 == false) u.u_bool = FALSE;
d70306ae12ac visual c compilable
Claus Gittinger <cg@exept.de>
parents: 2551
diff changeset
  3227
	    else goto argError;
d70306ae12ac visual c compilable
Claus Gittinger <cg@exept.de>
parents: 2551
diff changeset
  3228
	}
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3229
# endif /* SO_OOBINLINE */
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3230
2579
d70306ae12ac visual c compilable
Claus Gittinger <cg@exept.de>
parents: 2551
diff changeset
  3231
	if (usize == -1) goto argError;
d70306ae12ac visual c compilable
Claus Gittinger <cg@exept.de>
parents: 2551
diff changeset
  3232
2909
aacef77a1697 64bit fixes
Claus Gittinger <cg@exept.de>
parents: 2904
diff changeset
  3233
	ok = ( setsockopt( sock, level, opt, (char *)(&u), usize) >= 0) ? true : false;
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3234
    }
1529
911273d090c1 Re-unified Win32 and Unix code into single Socket.st.
Claus Gittinger <cg@exept.de>
parents: 1505
diff changeset
  3235
argError: ;
2818
94d67df5c00d compilable with tcc
Claus Gittinger <cg@exept.de>
parents: 2773
diff changeset
  3236
#endif /* NO_SOCKET */
1529
911273d090c1 Re-unified Win32 and Unix code into single Socket.st.
Claus Gittinger <cg@exept.de>
parents: 1505
diff changeset
  3237
%}.
911273d090c1 Re-unified Win32 and Unix code into single Socket.st.
Claus Gittinger <cg@exept.de>
parents: 1505
diff changeset
  3238
    ok isNil ifTrue:[
2579
d70306ae12ac visual c compilable
Claus Gittinger <cg@exept.de>
parents: 2551
diff changeset
  3239
	self primitiveFailed
1529
911273d090c1 Re-unified Win32 and Unix code into single Socket.st.
Claus Gittinger <cg@exept.de>
parents: 1505
diff changeset
  3240
    ].
911273d090c1 Re-unified Win32 and Unix code into single Socket.st.
Claus Gittinger <cg@exept.de>
parents: 1505
diff changeset
  3241
    ok ifFalse:[
2579
d70306ae12ac visual c compilable
Claus Gittinger <cg@exept.de>
parents: 2551
diff changeset
  3242
	'setsocketoption failed' infoPrintCR.
1529
911273d090c1 Re-unified Win32 and Unix code into single Socket.st.
Claus Gittinger <cg@exept.de>
parents: 1505
diff changeset
  3243
    ].
2551
6da1bc89b74a changed:
Stefan Vogel <sv@exept.de>
parents: 2516
diff changeset
  3244
!
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3245
2823
10179ccfae5d Default for close - linger in background instead 30s in foreground
Stefan Vogel <sv@exept.de>
parents: 2818
diff changeset
  3246
shutdown:howNum
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3247
    "shutDown the socket - inform it that no more I/O will be performed.
2825
e5b7d2005351 fixed for compilability
Claus Gittinger <cg@exept.de>
parents: 2824
diff changeset
  3248
	 0 - read side   (no further reads)
e5b7d2005351 fixed for compilability
Claus Gittinger <cg@exept.de>
parents: 2824
diff changeset
  3249
	     the tcp receive window is closed, so the peer cannot send more data.
e5b7d2005351 fixed for compilability
Claus Gittinger <cg@exept.de>
parents: 2824
diff changeset
  3250
	 1 - write side  (no further writes)
e5b7d2005351 fixed for compilability
Claus Gittinger <cg@exept.de>
parents: 2824
diff changeset
  3251
	     first, all queued data will be delivered to the peer.
e5b7d2005351 fixed for compilability
Claus Gittinger <cg@exept.de>
parents: 2824
diff changeset
  3252
	     Then, an orderly release (TCP FIN) is sent to signal the peer,
e5b7d2005351 fixed for compilability
Claus Gittinger <cg@exept.de>
parents: 2824
diff changeset
  3253
	     that we will not send more data.
e5b7d2005351 fixed for compilability
Claus Gittinger <cg@exept.de>
parents: 2824
diff changeset
  3254
	 2 - both read side and write side."
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3255
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3256
%{
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3257
#ifndef NO_SOCKET
2823
10179ccfae5d Default for close - linger in background instead 30s in foreground
Stefan Vogel <sv@exept.de>
parents: 2818
diff changeset
  3258
    OBJ __handle = __INST(handle);
10179ccfae5d Default for close - linger in background instead 30s in foreground
Stefan Vogel <sv@exept.de>
parents: 2818
diff changeset
  3259
    if ((__handle != nil) && __isSmallInteger(howNum)) {
2825
e5b7d2005351 fixed for compilability
Claus Gittinger <cg@exept.de>
parents: 2824
diff changeset
  3260
	FILE *fp = __FILEVal(__handle);
e5b7d2005351 fixed for compilability
Claus Gittinger <cg@exept.de>
parents: 2824
diff changeset
  3261
	SOCKET sock = SOCKET_FROM_FILE(fp);
2909
aacef77a1697 64bit fixes
Claus Gittinger <cg@exept.de>
parents: 2904
diff changeset
  3262
	INT how = __intVal(howNum);
aacef77a1697 64bit fixes
Claus Gittinger <cg@exept.de>
parents: 2904
diff changeset
  3263
	INT ret;
2823
10179ccfae5d Default for close - linger in background instead 30s in foreground
Stefan Vogel <sv@exept.de>
parents: 2818
diff changeset
  3264
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3265
# ifdef DO_WRAP_CALLS
2825
e5b7d2005351 fixed for compilability
Claus Gittinger <cg@exept.de>
parents: 2824
diff changeset
  3266
	if (how > 0 && __INST(buffered) == true) {
e5b7d2005351 fixed for compilability
Claus Gittinger <cg@exept.de>
parents: 2824
diff changeset
  3267
	    // do a fflush() first, so that fclose() doesn't block
e5b7d2005351 fixed for compilability
Claus Gittinger <cg@exept.de>
parents: 2824
diff changeset
  3268
	    do {
e5b7d2005351 fixed for compilability
Claus Gittinger <cg@exept.de>
parents: 2824
diff changeset
  3269
		__threadErrno = 0;
2909
aacef77a1697 64bit fixes
Claus Gittinger <cg@exept.de>
parents: 2904
diff changeset
  3270
		ret = (INT)__STX_C_CALL1("fflush", fflush, fp);
2825
e5b7d2005351 fixed for compilability
Claus Gittinger <cg@exept.de>
parents: 2824
diff changeset
  3271
	    } while((ret < 0) && (__threadErrno == EINTR));
e5b7d2005351 fixed for compilability
Claus Gittinger <cg@exept.de>
parents: 2824
diff changeset
  3272
	}
e5b7d2005351 fixed for compilability
Claus Gittinger <cg@exept.de>
parents: 2824
diff changeset
  3273
	do {
e5b7d2005351 fixed for compilability
Claus Gittinger <cg@exept.de>
parents: 2824
diff changeset
  3274
	    __threadErrno = 0;
e5b7d2005351 fixed for compilability
Claus Gittinger <cg@exept.de>
parents: 2824
diff changeset
  3275
	    DBGFPRINTF((stderr, "SOCKET: shutDown...\n"));
2909
aacef77a1697 64bit fixes
Claus Gittinger <cg@exept.de>
parents: 2904
diff changeset
  3276
	    ret = (INT)STX_WSA_NOINT_CALL2("shutdown", shutdown, sock, how);
2825
e5b7d2005351 fixed for compilability
Claus Gittinger <cg@exept.de>
parents: 2824
diff changeset
  3277
	    DBGFPRINTF((stderr, "SOCKET: shutDown -> %d (%d)\n", ret, __threadErrno));
e5b7d2005351 fixed for compilability
Claus Gittinger <cg@exept.de>
parents: 2824
diff changeset
  3278
	} while ((ret < 0) && (__threadErrno == EINTR));
1529
911273d090c1 Re-unified Win32 and Unix code into single Socket.st.
Claus Gittinger <cg@exept.de>
parents: 1505
diff changeset
  3279
# else
2825
e5b7d2005351 fixed for compilability
Claus Gittinger <cg@exept.de>
parents: 2824
diff changeset
  3280
	if (how > 0 && __INST(buffered) == true) {
e5b7d2005351 fixed for compilability
Claus Gittinger <cg@exept.de>
parents: 2824
diff changeset
  3281
	    fflush(fp);
e5b7d2005351 fixed for compilability
Claus Gittinger <cg@exept.de>
parents: 2824
diff changeset
  3282
	}
e5b7d2005351 fixed for compilability
Claus Gittinger <cg@exept.de>
parents: 2824
diff changeset
  3283
	__BEGIN_INTERRUPTABLE__
e5b7d2005351 fixed for compilability
Claus Gittinger <cg@exept.de>
parents: 2824
diff changeset
  3284
	shutdown(sock, how);
e5b7d2005351 fixed for compilability
Claus Gittinger <cg@exept.de>
parents: 2824
diff changeset
  3285
	__END_INTERRUPTABLE__
1529
911273d090c1 Re-unified Win32 and Unix code into single Socket.st.
Claus Gittinger <cg@exept.de>
parents: 1505
diff changeset
  3286
# endif
781
4d61e7588ff3 added #waitForNewConnectionOrDataOnAny:timeout:
Claus Gittinger <cg@exept.de>
parents: 776
diff changeset
  3287
    }
4d61e7588ff3 added #waitForNewConnectionOrDataOnAny:timeout:
Claus Gittinger <cg@exept.de>
parents: 776
diff changeset
  3288
#endif
1339
cc973a42aa54 shutdown: added
Claus Gittinger <cg@exept.de>
parents: 1338
diff changeset
  3289
%}.
781
4d61e7588ff3 added #waitForNewConnectionOrDataOnAny:timeout:
Claus Gittinger <cg@exept.de>
parents: 776
diff changeset
  3290
! !
4d61e7588ff3 added #waitForNewConnectionOrDataOnAny:timeout:
Claus Gittinger <cg@exept.de>
parents: 776
diff changeset
  3291
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3292
!Socket methodsFor:'printing & storing'!
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3293
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3294
printOn:aStream
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3295
    aStream nextPutAll:self className; nextPutAll:'(protocol='.
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3296
    protocol printOn:aStream.
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3297
    aStream nextPutAll:' port='.
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  3298
    self port printOn:aStream.
1462
5602fce52b42 squeak stuff
Claus Gittinger <cg@exept.de>
parents: 1413
diff changeset
  3299
    aStream nextPutAll:' peer='.
5602fce52b42 squeak stuff
Claus Gittinger <cg@exept.de>
parents: 1413
diff changeset
  3300
    peer printOn:aStream.
1842
88c04d1e9e6b changed #printOn:
Stefan Vogel <sv@exept.de>
parents: 1839
diff changeset
  3301
    aStream nextPut:$).
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3302
! !
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3303
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3304
!Socket methodsFor:'queries'!
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3305
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3306
domain
3059
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  3307
    "return the sockets addressing domain (i.e. #AF_INET, #AF_INET6, #AF_UNIX, ...)"
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3308
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3309
    ^ domain
126
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
  3310
!
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
  3311
3059
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  3312
getFullPeerAddress
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  3313
    "implemented for swazoo project (primitive code can't be loaded as extension)
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3314
     Answer my own address (I am bound to this address).
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3315
     Note that this address may change after a connect or accept."
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3316
3059
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  3317
    |error domainClass addr|
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3318
2321
6f4cc7b644db filePointer -> handle migration
Claus Gittinger <cg@exept.de>
parents: 2308
diff changeset
  3319
    handle isNil ifTrue:[
3217
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  3320
	^ self errorNotOpen
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3321
    ].
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3322
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3323
    domainClass := self class socketAddressClassForDomain:domain.
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3324
    domainClass isNil ifTrue:[
3217
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  3325
	^ self error:'invalid (unsupported) domain'.
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3326
    ].
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3327
    addr := domainClass new.
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3328
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3329
%{
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3330
#ifndef NO_SOCKET
2321
6f4cc7b644db filePointer -> handle migration
Claus Gittinger <cg@exept.de>
parents: 2308
diff changeset
  3331
    OBJ fp = __INST(handle);
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3332
    SOCKET sock;
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3333
    int ret;
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3334
    union sockaddr_u sa;
3059
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  3335
    unsigned int alen = sizeof(sa);
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3336
    char *addrP;
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3337
    int addrObjSize, nAddrInstBytes;
3059
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  3338
    OBJ addrClass;
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  3339
    int nAddrInstVars;
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3340
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3341
    if (!__isNonNilObject(addr) || !__isBytes(addr)) {
3217
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  3342
	DBGPRINTF(("SOCKET: bad addr\n"));
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  3343
	error = @symbol(badArgument);
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  3344
	goto err;
3059
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  3345
    }
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  3346
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  3347
    addrClass = __qClass(addr);
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  3348
    nAddrInstVars = __intVal(__ClassInstPtr(addrClass)->c_ninstvars);
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  3349
    nAddrInstBytes = OHDR_SIZE + (nAddrInstVars * sizeof(OBJ));
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  3350
    addrObjSize = __qSize(addr) - nAddrInstBytes;
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  3351
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  3352
    sock = SOCKET_FROM_FILE_OBJECT(fp);
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  3353
    ret = getpeername(sock, (struct sockaddr *)&sa, &alen);
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  3354
    if (ret < 0) {
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  3355
# ifdef WIN32
3217
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  3356
	errno = WSAGetLastError();
3059
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  3357
# endif
3217
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  3358
	DBGPRINTF(("SOCKET: getsocketname failed ret=%d errno=%d\n", ret, errno));
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  3359
	error = __MKSMALLINT(errno);
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  3360
	goto err;
3059
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  3361
    }
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  3362
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  3363
    if (addrObjSize < alen) {
3217
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  3364
	DBGPRINTF(("SOCKET: bad addr\n"));
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  3365
	error = @symbol(badArgument);
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  3366
	goto err;
3059
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  3367
    }
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  3368
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  3369
    addrP = (char *)__InstPtr(addr) + nAddrInstBytes;
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  3370
    memcpy(addrP, (char *)&sa, alen);
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  3371
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  3372
err:;
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  3373
#else /* NO_SOCKET */
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  3374
    error = @symbol(notImplemented);
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  3375
#endif /* NO_SOCKET */
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  3376
%}.
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  3377
    error notNil ifTrue:[
3217
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  3378
	^ self errorReporter reportOn:error
3059
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  3379
    ].
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  3380
    ^ addr
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  3381
!
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  3382
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  3383
getFullSocketAddress
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  3384
    "implemented for swazoo project (primitive code can't be loaded as extension)
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  3385
     Answer my own address (I am bound to this address).
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  3386
     Note that this address may change after a connect or accept."
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  3387
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  3388
    |error domainClass addr|
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  3389
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  3390
    handle isNil ifTrue:[
3217
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  3391
	^ self errorNotOpen
3059
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  3392
    ].
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  3393
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  3394
    domainClass := self class socketAddressClassForDomain:domain.
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  3395
    domainClass isNil ifTrue:[
3217
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  3396
	^ self error:'invalid (unsupported) domain'.
3059
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  3397
    ].
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  3398
    addr := domainClass new.
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  3399
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  3400
%{
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  3401
#ifndef NO_SOCKET
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  3402
    OBJ fp = __INST(handle);
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  3403
    SOCKET sock;
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  3404
    int ret;
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  3405
    union sockaddr_u sa;
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  3406
    unsigned int alen = sizeof(sa);
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  3407
    char *addrP;
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  3408
    int addrObjSize, nAddrInstBytes;
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  3409
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  3410
    if (!__isNonNilObject(addr) || !__isBytes(addr)) {
3217
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  3411
	DBGPRINTF(("SOCKET: bad addr\n"));
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  3412
	error = @symbol(badArgument);
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  3413
	goto err;
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3414
    }
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3415
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3416
    {
3217
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  3417
	OBJ addrClass;
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  3418
	int nAddrInstVars;
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  3419
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  3420
	addrClass = __qClass(addr);
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  3421
	nAddrInstVars = __intVal(__ClassInstPtr(addrClass)->c_ninstvars);
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  3422
	nAddrInstBytes = OHDR_SIZE + (nAddrInstVars * sizeof(OBJ));
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  3423
	addrObjSize = __qSize(addr) - nAddrInstBytes;
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3424
    }
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3425
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3426
    sock = SOCKET_FROM_FILE_OBJECT(fp);
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3427
    ret = getsockname(sock, (struct sockaddr *)&sa, &alen);
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3428
    if (ret < 0) {
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3429
# ifdef WIN32
3217
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  3430
	errno = WSAGetLastError();
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3431
# endif
3217
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  3432
	DBGPRINTF(("SOCKET: getsocketname failed ret=%d errno=%d\n", ret, errno));
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  3433
	error = __MKSMALLINT(errno);
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  3434
	goto err;
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3435
    }
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3436
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3437
    if (addrObjSize < alen) {
3217
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  3438
	DBGPRINTF(("SOCKET: bad addr\n"));
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  3439
	error = @symbol(badArgument);
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  3440
	goto err;
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3441
    }
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3442
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3443
    addrP = (char *)__InstPtr(addr) + nAddrInstBytes;
3059
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  3444
    memcpy(addrP, (char *)&sa, alen);
1535
f6aa0fc8c3cc getSocketAddress
Claus Gittinger <cg@exept.de>
parents: 1533
diff changeset
  3445
f6aa0fc8c3cc getSocketAddress
Claus Gittinger <cg@exept.de>
parents: 1533
diff changeset
  3446
err:;
f6aa0fc8c3cc getSocketAddress
Claus Gittinger <cg@exept.de>
parents: 1533
diff changeset
  3447
#else /* NO_SOCKET */
f6aa0fc8c3cc getSocketAddress
Claus Gittinger <cg@exept.de>
parents: 1533
diff changeset
  3448
    error = @symbol(notImplemented);
f6aa0fc8c3cc getSocketAddress
Claus Gittinger <cg@exept.de>
parents: 1533
diff changeset
  3449
#endif /* NO_SOCKET */
f6aa0fc8c3cc getSocketAddress
Claus Gittinger <cg@exept.de>
parents: 1533
diff changeset
  3450
%}.
f6aa0fc8c3cc getSocketAddress
Claus Gittinger <cg@exept.de>
parents: 1533
diff changeset
  3451
    error notNil ifTrue:[
3217
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  3452
	^ self errorReporter reportOn:error
1535
f6aa0fc8c3cc getSocketAddress
Claus Gittinger <cg@exept.de>
parents: 1533
diff changeset
  3453
    ].
f6aa0fc8c3cc getSocketAddress
Claus Gittinger <cg@exept.de>
parents: 1533
diff changeset
  3454
    ^ addr
f6aa0fc8c3cc getSocketAddress
Claus Gittinger <cg@exept.de>
parents: 1533
diff changeset
  3455
!
f6aa0fc8c3cc getSocketAddress
Claus Gittinger <cg@exept.de>
parents: 1533
diff changeset
  3456
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3457
getName
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3458
    "return the name; here, we return the ports name"
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3459
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  3460
    ^ self port printString
126
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
  3461
!
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
  3462
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3463
getPeer
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3464
    "ST-80 compatibility: return an IPSocketAddress instance representing
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3465
     my hostname/port combination.
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3466
     If you are interested in the hostname, use getPeerName directly."
102
5dc264007513 added getPeer for ST-80 compatibility
Claus Gittinger <cg@exept.de>
parents: 99
diff changeset
  3467
1187
7e5f2f6b177d getHostByAddr - call is now done lazy, when the socket is asked for the peer
Claus Gittinger <cg@exept.de>
parents: 1186
diff changeset
  3468
    ^ peer
102
5dc264007513 added getPeer for ST-80 compatibility
Claus Gittinger <cg@exept.de>
parents: 99
diff changeset
  3469
!
5dc264007513 added getPeer for ST-80 compatibility
Claus Gittinger <cg@exept.de>
parents: 99
diff changeset
  3470
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3471
getPeerName
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3472
    "return the peer name; thats the hostname (or dotted name) of the
25
996051271ce9 *** empty log message ***
claus
parents: 21
diff changeset
  3473
     partners host after an accept."
996051271ce9 *** empty log message ***
claus
parents: 21
diff changeset
  3474
1187
7e5f2f6b177d getHostByAddr - call is now done lazy, when the socket is asked for the peer
Claus Gittinger <cg@exept.de>
parents: 1186
diff changeset
  3475
    peerName isNil ifTrue:[
1343
cc3bed115c0a definitions cleanup with stxOSDefs.h
penk
parents: 1342
diff changeset
  3476
	peerName := self class peerNameFromDomain:domain peer:peer.
1187
7e5f2f6b177d getHostByAddr - call is now done lazy, when the socket is asked for the peer
Claus Gittinger <cg@exept.de>
parents: 1186
diff changeset
  3477
    ].
25
996051271ce9 *** empty log message ***
claus
parents: 21
diff changeset
  3478
    ^ peerName
28
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  3479
!
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  3480
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3481
getSocketAddress
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3482
    "implemented for swazoo project primitive code cant load as extension
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3483
     answer my own address (I am bound to this address).
1146
71a9df78ba9e bad spelling
Stefan Vogel <sv@exept.de>
parents: 1136
diff changeset
  3484
     Note that this address may change after connect or accept."
1029
5906977e62f0 implement getSocketName for swazoo as primitive cant load as extension
penk
parents: 1010
diff changeset
  3485
1535
f6aa0fc8c3cc getSocketAddress
Claus Gittinger <cg@exept.de>
parents: 1533
diff changeset
  3486
    ^ self getFullSocketAddress hostAddress
1146
71a9df78ba9e bad spelling
Stefan Vogel <sv@exept.de>
parents: 1136
diff changeset
  3487
!
71a9df78ba9e bad spelling
Stefan Vogel <sv@exept.de>
parents: 1136
diff changeset
  3488
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3489
isActive
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3490
    "return true, if the receiver has a connection"
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3491
2321
6f4cc7b644db filePointer -> handle migration
Claus Gittinger <cg@exept.de>
parents: 2308
diff changeset
  3492
    ^ handle notNil
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3493
!
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3494
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3495
isConnected
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3496
    "return true, if the receiver has a connection"
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3497
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3498
    ^ self isActive
2321
6f4cc7b644db filePointer -> handle migration
Claus Gittinger <cg@exept.de>
parents: 2308
diff changeset
  3499
	and:[peer notNil]
1558
a563aac90660 No need to ask Socket>>#networkXXXOrderIsMSB, because the return value is
Stefan Vogel <sv@exept.de>
parents: 1542
diff changeset
  3500
!
a563aac90660 No need to ask Socket>>#networkXXXOrderIsMSB, because the return value is
Stefan Vogel <sv@exept.de>
parents: 1542
diff changeset
  3501
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3502
port
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  3503
    "return the port number (or name for unix-sockets) to which the socket is bound
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  3504
     - so this is the local port."
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  3505
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  3506
"/    port isNil ifTrue:[
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  3507
"/        port := self getFullSocketAddress port.
1505
Stefan Vogel <sv@exept.de>
parents: 1504
diff changeset
  3508
"/    ].
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  3509
71
claus
parents: 63
diff changeset
  3510
    ^ port
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3511
!
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3512
3059
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  3513
socketAddressClass
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  3514
    "get the matchon SocketAddress class for this socket"
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  3515
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  3516
    |domainClass|
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  3517
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  3518
    domainClass := self class socketAddressClassForDomain:domain.
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  3519
    domainClass isNil ifTrue:[
3217
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  3520
	^ self error:'invalid (unsupported) domain'.
3059
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  3521
    ].
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  3522
    ^ domainClass.
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  3523
!
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  3524
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3525
type
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3526
    "return the sockets connection type (i.e. #datagram, #stream etc)"
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3527
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3528
    ^ socketType
81
claus
parents: 79
diff changeset
  3529
! !
claus
parents: 79
diff changeset
  3530
126
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
  3531
!Socket methodsFor:'socket setup'!
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
  3532
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3533
domain:domainArg type:typeArg
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3534
    "set up socket with domain and type.
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3535
     This is a low level entry; no binding, listening or connect
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3536
     is done. Both arguments must be symbols from one of
3059
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  3537
      #AF_INET, #AF_INET6, #AF_UNIX ... and #stream, #datagram, #raw resp."
126
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
  3538
3137
df3e9cebf52c class: Socket
Stefan Vogel <sv@exept.de>
parents: 3127
diff changeset
  3539
    ^ self domain:domainArg type:typeArg protocol:nil
126
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
  3540
!
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
  3541
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3542
domain:domainArg type:typeArg protocol:protocolNumber
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3543
    "set up socket with domain, type and protocol number.
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3544
     This is a low level entry; no binding, listening or connect
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3545
     is done. Both arguments must be symbols from one of
3059
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  3546
     #AF_INET, #AF_INET6, #AF_UNIX ... and #stream, #datagram, #raw resp."
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3547
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3548
    |domainName domainCode typeCode error|
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3549
2321
6f4cc7b644db filePointer -> handle migration
Claus Gittinger <cg@exept.de>
parents: 2308
diff changeset
  3550
    handle notNil ifTrue:[
3223
b126729a904b class: Socket
Stefan Vogel <sv@exept.de>
parents: 3218
diff changeset
  3551
        ^ self errorAlreadyOpen
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3552
    ].
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3553
    domainName := SocketAddress domainCodeFromName:domainArg.
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3554
    domainCode := OperatingSystem domainCodeOf:domainName.
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3555
    typeCode := OperatingSystem socketTypeCodeOf:typeArg.
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3556
%{
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3557
#ifndef NO_SOCKET
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3558
    FILE *fp;
3137
df3e9cebf52c class: Socket
Stefan Vogel <sv@exept.de>
parents: 3127
diff changeset
  3559
    int dom, typ, proto = 0;
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3560
    int on = 1;
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3561
    SOCKET sock;
3123
55ef9ca4f09f class: Socket
Stefan Vogel <sv@exept.de>
parents: 3077
diff changeset
  3562
# ifdef WIN32
55ef9ca4f09f class: Socket
Stefan Vogel <sv@exept.de>
parents: 3077
diff changeset
  3563
#  ifndef WSA_FLAG_NO_HANDLE_INHERIT
55ef9ca4f09f class: Socket
Stefan Vogel <sv@exept.de>
parents: 3077
diff changeset
  3564
#   define WSA_FLAG_NO_HANDLE_INHERIT 0x80
55ef9ca4f09f class: Socket
Stefan Vogel <sv@exept.de>
parents: 3077
diff changeset
  3565
#  endif
55ef9ca4f09f class: Socket
Stefan Vogel <sv@exept.de>
parents: 3077
diff changeset
  3566
    static int noInheritFlag = WSA_FLAG_NO_HANDLE_INHERIT;
55ef9ca4f09f class: Socket
Stefan Vogel <sv@exept.de>
parents: 3077
diff changeset
  3567
# endif
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3568
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3569
    if (! __isSmallInteger(domainCode)) {
3223
b126729a904b class: Socket
Stefan Vogel <sv@exept.de>
parents: 3218
diff changeset
  3570
        error = @symbol(badArgument1);
b126729a904b class: Socket
Stefan Vogel <sv@exept.de>
parents: 3218
diff changeset
  3571
        goto out;
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3572
    }
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3573
    if (! __isSmallInteger(typeCode)) {
3223
b126729a904b class: Socket
Stefan Vogel <sv@exept.de>
parents: 3218
diff changeset
  3574
        error = @symbol(badArgument2);
b126729a904b class: Socket
Stefan Vogel <sv@exept.de>
parents: 3218
diff changeset
  3575
        goto out;
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3576
    }
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3577
    if (protocolNumber != nil) {
3223
b126729a904b class: Socket
Stefan Vogel <sv@exept.de>
parents: 3218
diff changeset
  3578
        if (!__isSmallInteger(protocolNumber)) {
b126729a904b class: Socket
Stefan Vogel <sv@exept.de>
parents: 3218
diff changeset
  3579
            error = @symbol(badArgument3);
b126729a904b class: Socket
Stefan Vogel <sv@exept.de>
parents: 3218
diff changeset
  3580
            goto out;
b126729a904b class: Socket
Stefan Vogel <sv@exept.de>
parents: 3218
diff changeset
  3581
        }
b126729a904b class: Socket
Stefan Vogel <sv@exept.de>
parents: 3218
diff changeset
  3582
        proto = __intVal(protocolNumber);
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3583
    }
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3584
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3585
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3586
    /*
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3587
     * get address and protocol-family
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3588
     */
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3589
    dom = __intVal(domainCode);
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3590
    typ = __intVal(typeCode);
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3591
3123
55ef9ca4f09f class: Socket
Stefan Vogel <sv@exept.de>
parents: 3077
diff changeset
  3592
# ifdef WIN32
55ef9ca4f09f class: Socket
Stefan Vogel <sv@exept.de>
parents: 3077
diff changeset
  3593
    sock = WSASocket(dom, typ, proto, 0, 0, noInheritFlag);
55ef9ca4f09f class: Socket
Stefan Vogel <sv@exept.de>
parents: 3077
diff changeset
  3594
    if (sock == INVALID_SOCKET && noInheritFlag) {
3223
b126729a904b class: Socket
Stefan Vogel <sv@exept.de>
parents: 3218
diff changeset
  3595
        // tried to open socket with WSA_FLAG_NO_HANDLE_INHERIT
b126729a904b class: Socket
Stefan Vogel <sv@exept.de>
parents: 3218
diff changeset
  3596
        // This fails on older windows versions, e.g. Windows XP
b126729a904b class: Socket
Stefan Vogel <sv@exept.de>
parents: 3218
diff changeset
  3597
        sock = WSASocket(dom, typ, proto, 0, 0, 0);
b126729a904b class: Socket
Stefan Vogel <sv@exept.de>
parents: 3218
diff changeset
  3598
        if (sock != INVALID_SOCKET) {
b126729a904b class: Socket
Stefan Vogel <sv@exept.de>
parents: 3218
diff changeset
  3599
            // no error without WSA_FLAG_NO_HANDLE_INHERIT,
b126729a904b class: Socket
Stefan Vogel <sv@exept.de>
parents: 3218
diff changeset
  3600
            // never use this flag again!
b126729a904b class: Socket
Stefan Vogel <sv@exept.de>
parents: 3218
diff changeset
  3601
            noInheritFlag = 0;
b126729a904b class: Socket
Stefan Vogel <sv@exept.de>
parents: 3218
diff changeset
  3602
        }
3123
55ef9ca4f09f class: Socket
Stefan Vogel <sv@exept.de>
parents: 3077
diff changeset
  3603
    }
55ef9ca4f09f class: Socket
Stefan Vogel <sv@exept.de>
parents: 3077
diff changeset
  3604
    if (sock == INVALID_SOCKET) {
3223
b126729a904b class: Socket
Stefan Vogel <sv@exept.de>
parents: 3218
diff changeset
  3605
        errno = WSAGetLastError();
3123
55ef9ca4f09f class: Socket
Stefan Vogel <sv@exept.de>
parents: 3077
diff changeset
  3606
55ef9ca4f09f class: Socket
Stefan Vogel <sv@exept.de>
parents: 3077
diff changeset
  3607
# else  // !WIN32
55ef9ca4f09f class: Socket
Stefan Vogel <sv@exept.de>
parents: 3077
diff changeset
  3608
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3609
    sock = socket(dom, typ, proto);
3123
55ef9ca4f09f class: Socket
Stefan Vogel <sv@exept.de>
parents: 3077
diff changeset
  3610
# if defined(EPROTONOSUPPORT) /* for SGI */
55ef9ca4f09f class: Socket
Stefan Vogel <sv@exept.de>
parents: 3077
diff changeset
  3611
    if ((sock < 0) && (proto != 0) && (errno == EPROTONOSUPPORT)) {
3223
b126729a904b class: Socket
Stefan Vogel <sv@exept.de>
parents: 3218
diff changeset
  3612
        DBGPRINTF(("SOCKET: retry with UNSPEC protocol\n"));
b126729a904b class: Socket
Stefan Vogel <sv@exept.de>
parents: 3218
diff changeset
  3613
        proto = 0;
b126729a904b class: Socket
Stefan Vogel <sv@exept.de>
parents: 3218
diff changeset
  3614
        sock = socket(dom, typ, 0);
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3615
    }
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3616
# endif
3123
55ef9ca4f09f class: Socket
Stefan Vogel <sv@exept.de>
parents: 3077
diff changeset
  3617
    if (sock < 0) {
55ef9ca4f09f class: Socket
Stefan Vogel <sv@exept.de>
parents: 3077
diff changeset
  3618
# endif // !WIN32
55ef9ca4f09f class: Socket
Stefan Vogel <sv@exept.de>
parents: 3077
diff changeset
  3619
3223
b126729a904b class: Socket
Stefan Vogel <sv@exept.de>
parents: 3218
diff changeset
  3620
        DBGPRINTF(("SOCKET: socket(dom=%d typ=%d proto=%d) call failed errno=%d\n", dom, typ, proto, errno));
b126729a904b class: Socket
Stefan Vogel <sv@exept.de>
parents: 3218
diff changeset
  3621
        error = __MKSMALLINT(errno);
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3622
    } else {
3123
55ef9ca4f09f class: Socket
Stefan Vogel <sv@exept.de>
parents: 3077
diff changeset
  3623
# if defined(SET_LINGER_WHEN_CREATING_SOCKET) && defined(SO_LINGER)
3223
b126729a904b class: Socket
Stefan Vogel <sv@exept.de>
parents: 3218
diff changeset
  3624
        {
b126729a904b class: Socket
Stefan Vogel <sv@exept.de>
parents: 3218
diff changeset
  3625
            struct linger l;
b126729a904b class: Socket
Stefan Vogel <sv@exept.de>
parents: 3218
diff changeset
  3626
b126729a904b class: Socket
Stefan Vogel <sv@exept.de>
parents: 3218
diff changeset
  3627
            l.l_onoff = 1;
b126729a904b class: Socket
Stefan Vogel <sv@exept.de>
parents: 3218
diff changeset
  3628
            l.l_linger = 30;
b126729a904b class: Socket
Stefan Vogel <sv@exept.de>
parents: 3218
diff changeset
  3629
            setsockopt( sock, SOL_SOCKET, SO_LINGER, &l, sizeof(l));
b126729a904b class: Socket
Stefan Vogel <sv@exept.de>
parents: 3218
diff changeset
  3630
        }
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3631
# endif
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3632
# ifdef WIN32
3223
b126729a904b class: Socket
Stefan Vogel <sv@exept.de>
parents: 3218
diff changeset
  3633
        /*
b126729a904b class: Socket
Stefan Vogel <sv@exept.de>
parents: 3218
diff changeset
  3634
         * make it blocking
b126729a904b class: Socket
Stefan Vogel <sv@exept.de>
parents: 3218
diff changeset
  3635
         */
b126729a904b class: Socket
Stefan Vogel <sv@exept.de>
parents: 3218
diff changeset
  3636
        {
b126729a904b class: Socket
Stefan Vogel <sv@exept.de>
parents: 3218
diff changeset
  3637
            unsigned long zero = 0;
b126729a904b class: Socket
Stefan Vogel <sv@exept.de>
parents: 3218
diff changeset
  3638
            ioctlsocket(sock, FIONBIO, &zero);
b126729a904b class: Socket
Stefan Vogel <sv@exept.de>
parents: 3218
diff changeset
  3639
        }
b126729a904b class: Socket
Stefan Vogel <sv@exept.de>
parents: 3218
diff changeset
  3640
        /*
b126729a904b class: Socket
Stefan Vogel <sv@exept.de>
parents: 3218
diff changeset
  3641
         * make it a FILE *
b126729a904b class: Socket
Stefan Vogel <sv@exept.de>
parents: 3218
diff changeset
  3642
         */
b126729a904b class: Socket
Stefan Vogel <sv@exept.de>
parents: 3218
diff changeset
  3643
        {
b126729a904b class: Socket
Stefan Vogel <sv@exept.de>
parents: 3218
diff changeset
  3644
            int _fd;
b126729a904b class: Socket
Stefan Vogel <sv@exept.de>
parents: 3218
diff changeset
  3645
            __stxWrapApiEnterCritical();
2915
896fffb0f02e mingw64
Claus Gittinger <cg@exept.de>
parents: 2909
diff changeset
  3646
#  if defined( __BORLANDC__ ) || defined( __MINGW__ )
3223
b126729a904b class: Socket
Stefan Vogel <sv@exept.de>
parents: 3218
diff changeset
  3647
            _fd = _open_osfhandle((long)sock, 0);
2773
ab3049f4a351 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2748
diff changeset
  3648
#  else
3223
b126729a904b class: Socket
Stefan Vogel <sv@exept.de>
parents: 3218
diff changeset
  3649
            _fd = (int)sock;
2773
ab3049f4a351 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2748
diff changeset
  3650
#  endif
3223
b126729a904b class: Socket
Stefan Vogel <sv@exept.de>
parents: 3218
diff changeset
  3651
            fp = fdopen(_fd, "r+");
b126729a904b class: Socket
Stefan Vogel <sv@exept.de>
parents: 3218
diff changeset
  3652
            __stxWrapApiLeaveCritical();
b126729a904b class: Socket
Stefan Vogel <sv@exept.de>
parents: 3218
diff changeset
  3653
            DBGPRINTF(("SOCKET: sock=%d fd=%d fp=%"_lx_"\n",sock, _fd, (INT)fp));
b126729a904b class: Socket
Stefan Vogel <sv@exept.de>
parents: 3218
diff changeset
  3654
        }
2680
ff00563f0444 Protect against concurrent access when doing fclose and fdopen
Stefan Vogel <sv@exept.de>
parents: 2579
diff changeset
  3655
# else
3223
b126729a904b class: Socket
Stefan Vogel <sv@exept.de>
parents: 3218
diff changeset
  3656
        fp = fdopen(sock, "r+");
2680
ff00563f0444 Protect against concurrent access when doing fclose and fdopen
Stefan Vogel <sv@exept.de>
parents: 2579
diff changeset
  3657
# endif
3223
b126729a904b class: Socket
Stefan Vogel <sv@exept.de>
parents: 3218
diff changeset
  3658
        if (! fp) {
b126729a904b class: Socket
Stefan Vogel <sv@exept.de>
parents: 3218
diff changeset
  3659
            DBGPRINTF(("SOCKET: fdopen call failed\n"));
b126729a904b class: Socket
Stefan Vogel <sv@exept.de>
parents: 3218
diff changeset
  3660
            error = __MKSMALLINT(errno);
2773
ab3049f4a351 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2748
diff changeset
  3661
# ifdef DO_WRAP_CALLS
3223
b126729a904b class: Socket
Stefan Vogel <sv@exept.de>
parents: 3218
diff changeset
  3662
            {
b126729a904b class: Socket
Stefan Vogel <sv@exept.de>
parents: 3218
diff changeset
  3663
                INT ret;
b126729a904b class: Socket
Stefan Vogel <sv@exept.de>
parents: 3218
diff changeset
  3664
b126729a904b class: Socket
Stefan Vogel <sv@exept.de>
parents: 3218
diff changeset
  3665
                do {
b126729a904b class: Socket
Stefan Vogel <sv@exept.de>
parents: 3218
diff changeset
  3666
                  __threadErrno = 0;
b126729a904b class: Socket
Stefan Vogel <sv@exept.de>
parents: 3218
diff changeset
  3667
                  ret = (INT)STX_WSA_NOINT_CALL1("closesocket", closesocket, sock);
b126729a904b class: Socket
Stefan Vogel <sv@exept.de>
parents: 3218
diff changeset
  3668
                } while ((ret < 0) && (__threadErrno == EINTR));
b126729a904b class: Socket
Stefan Vogel <sv@exept.de>
parents: 3218
diff changeset
  3669
            }
2773
ab3049f4a351 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2748
diff changeset
  3670
# else
3223
b126729a904b class: Socket
Stefan Vogel <sv@exept.de>
parents: 3218
diff changeset
  3671
            __BEGIN_INTERRUPTABLE__
b126729a904b class: Socket
Stefan Vogel <sv@exept.de>
parents: 3218
diff changeset
  3672
            closesocket(sock);
b126729a904b class: Socket
Stefan Vogel <sv@exept.de>
parents: 3218
diff changeset
  3673
            DBGFPRINTF((stderr, "SOCKET: fdopen failed (%d)\n", sock));
b126729a904b class: Socket
Stefan Vogel <sv@exept.de>
parents: 3218
diff changeset
  3674
            __END_INTERRUPTABLE__
2773
ab3049f4a351 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2748
diff changeset
  3675
# endif
3223
b126729a904b class: Socket
Stefan Vogel <sv@exept.de>
parents: 3218
diff changeset
  3676
        } else {
b126729a904b class: Socket
Stefan Vogel <sv@exept.de>
parents: 3218
diff changeset
  3677
            if (@global(FileOpenTrace) == true) {
b126729a904b class: Socket
Stefan Vogel <sv@exept.de>
parents: 3218
diff changeset
  3678
# ifdef WIN32
b126729a904b class: Socket
Stefan Vogel <sv@exept.de>
parents: 3218
diff changeset
  3679
                {
b126729a904b class: Socket
Stefan Vogel <sv@exept.de>
parents: 3218
diff changeset
  3680
                    int _fd = fileno(fp);
b126729a904b class: Socket
Stefan Vogel <sv@exept.de>
parents: 3218
diff changeset
  3681
                    HANDLE h = (HANDLE)_get_osfhandle(_fd);
b126729a904b class: Socket
Stefan Vogel <sv@exept.de>
parents: 3218
diff changeset
  3682
                    console_fprintf(stderr, "fdopen [Socket create] -> %"_lx_" (fd: %d) (H: %"_lx_")\n", (INT)fp, sock, (INT)h);
b126729a904b class: Socket
Stefan Vogel <sv@exept.de>
parents: 3218
diff changeset
  3683
                }
b126729a904b class: Socket
Stefan Vogel <sv@exept.de>
parents: 3218
diff changeset
  3684
# else
b126729a904b class: Socket
Stefan Vogel <sv@exept.de>
parents: 3218
diff changeset
  3685
                console_fprintf(stderr, "fdopen [Socket] -> %"_lx_" (fd: %d)\n", (INT)fp, sock);
b126729a904b class: Socket
Stefan Vogel <sv@exept.de>
parents: 3218
diff changeset
  3686
# endif
b126729a904b class: Socket
Stefan Vogel <sv@exept.de>
parents: 3218
diff changeset
  3687
            }
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3688
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3689
# if 0
3223
b126729a904b class: Socket
Stefan Vogel <sv@exept.de>
parents: 3218
diff changeset
  3690
            // The original code was:
b126729a904b class: Socket
Stefan Vogel <sv@exept.de>
parents: 3218
diff changeset
  3691
            __INST(handle) = __MKEXTERNALADDRESS(fp); __STORESELF(handle);
b126729a904b class: Socket
Stefan Vogel <sv@exept.de>
parents: 3218
diff changeset
  3692
            // but for that, gcc generates wrong code, which loads self (volatile) into
b126729a904b class: Socket
Stefan Vogel <sv@exept.de>
parents: 3218
diff changeset
  3693
            // a register (bp), then calls __MKEXTERNALADDRESS, then stores indirect bp.
b126729a904b class: Socket
Stefan Vogel <sv@exept.de>
parents: 3218
diff changeset
  3694
            // That is wrong if a scavenge occurs in __MKEXTERNALADDRESS, as bp is now still pointing to the old
b126729a904b class: Socket
Stefan Vogel <sv@exept.de>
parents: 3218
diff changeset
  3695
            // object.
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3696
# endif
3223
b126729a904b class: Socket
Stefan Vogel <sv@exept.de>
parents: 3218
diff changeset
  3697
            __INST(handleType) = @symbol(socketFilePointer);
b126729a904b class: Socket
Stefan Vogel <sv@exept.de>
parents: 3218
diff changeset
  3698
b126729a904b class: Socket
Stefan Vogel <sv@exept.de>
parents: 3218
diff changeset
  3699
            {
b126729a904b class: Socket
Stefan Vogel <sv@exept.de>
parents: 3218
diff changeset
  3700
                OBJ t = __MKEXTERNALADDRESS(fp);
b126729a904b class: Socket
Stefan Vogel <sv@exept.de>
parents: 3218
diff changeset
  3701
                __INST(handle) = t;
b126729a904b class: Socket
Stefan Vogel <sv@exept.de>
parents: 3218
diff changeset
  3702
                __STORE(self, t);
b126729a904b class: Socket
Stefan Vogel <sv@exept.de>
parents: 3218
diff changeset
  3703
            }
b126729a904b class: Socket
Stefan Vogel <sv@exept.de>
parents: 3218
diff changeset
  3704
        }
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3705
    }
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3706
#endif
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3707
out:;
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3708
%}.
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3709
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3710
    "all ok?"
2321
6f4cc7b644db filePointer -> handle migration
Claus Gittinger <cg@exept.de>
parents: 2308
diff changeset
  3711
    handle notNil ifTrue:[
3223
b126729a904b class: Socket
Stefan Vogel <sv@exept.de>
parents: 3218
diff changeset
  3712
        domain := domainArg.
b126729a904b class: Socket
Stefan Vogel <sv@exept.de>
parents: 3218
diff changeset
  3713
        socketType := typeArg.
b126729a904b class: Socket
Stefan Vogel <sv@exept.de>
parents: 3218
diff changeset
  3714
        Lobby register:self.
b126729a904b class: Socket
Stefan Vogel <sv@exept.de>
parents: 3218
diff changeset
  3715
        ^ self.
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3716
    ].
3217
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  3717
    error isInteger ifTrue:[
3223
b126729a904b class: Socket
Stefan Vogel <sv@exept.de>
parents: 3218
diff changeset
  3718
        lastErrorNumber := error.
b126729a904b class: Socket
Stefan Vogel <sv@exept.de>
parents: 3218
diff changeset
  3719
        ^ self openError:error.
3217
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  3720
    ].
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  3721
    ^ self primitiveFailed:error.
126
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
  3722
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
  3723
    "
3059
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  3724
     Socket new domain:#AF_INET type:#stream
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  3725
     Socket new domain:#AF_UNIX type:#stream
126
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
  3726
    "
28
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  3727
! !
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  3728
3214
ea8288395d80 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3157
diff changeset
  3729
28
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  3730
!Socket methodsFor:'specials'!
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  3731
3224
bad706c50347 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3223
diff changeset
  3732
linger:anIntegerOrNil 
bad706c50347 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3223
diff changeset
  3733
    "set the linger behavior on close:
bad706c50347 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3223
diff changeset
  3734
      anIntegerOrNil == nil: close returns immediately, socket tries
bad706c50347 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3223
diff changeset
  3735
                             to send buffered data in background.
bad706c50347 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3223
diff changeset
  3736
      anIntegerOrNil == 0:   close returns immediately, bufferd data is discarded.
bad706c50347 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3223
diff changeset
  3737
      anIntegerOrNil > 0:    close waits this many seconds for buffered data
bad706c50347 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3223
diff changeset
  3738
                             to be delivered, after this time buffered data is
bad706c50347 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3223
diff changeset
  3739
                             discarded and close returns"
bad706c50347 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3223
diff changeset
  3740
    
bad706c50347 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3223
diff changeset
  3741
    ^ self 
bad706c50347 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3223
diff changeset
  3742
        setSocketOption:#'SO_LINGER'
bad706c50347 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3223
diff changeset
  3743
        argument:anIntegerOrNil notNil
bad706c50347 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3223
diff changeset
  3744
        argument:anIntegerOrNil.
bad706c50347 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3223
diff changeset
  3745
!
bad706c50347 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3223
diff changeset
  3746
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3747
receiveBufferSize
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3748
    "get the send buffer size - for special applications only.
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3749
     Not all operatingSystems offer this functionality
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3750
     (returns nil, if unsupported)"
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3751
2321
6f4cc7b644db filePointer -> handle migration
Claus Gittinger <cg@exept.de>
parents: 2308
diff changeset
  3752
    handle isNil ifTrue:[
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3753
	^ self errorNotOpen
1335
0fafb78d7a80 sockopt utilities added
Claus Gittinger <cg@exept.de>
parents: 1316
diff changeset
  3754
    ].
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3755
%{
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3756
#if defined(SO_RCVBUF) && defined(SOL_SOCKET)
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3757
    {
2321
6f4cc7b644db filePointer -> handle migration
Claus Gittinger <cg@exept.de>
parents: 2308
diff changeset
  3758
	OBJ fp = __INST(handle);
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3759
	SOCKET sock;
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3760
	int opt;
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3761
	unsigned int size;
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3762
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3763
	sock = SOCKET_FROM_FILE_OBJECT(fp);
1568
3bca500e0c7a send and receiveTimeout fixed
Claus Gittinger <cg@exept.de>
parents: 1561
diff changeset
  3764
	if (getsockopt(sock, SOL_SOCKET, SO_RCVBUF, (char *)&opt, &size) >= 0) {
3bca500e0c7a send and receiveTimeout fixed
Claus Gittinger <cg@exept.de>
parents: 1561
diff changeset
  3765
	    RETURN( __MKSMALLINT(opt) );
3bca500e0c7a send and receiveTimeout fixed
Claus Gittinger <cg@exept.de>
parents: 1561
diff changeset
  3766
	}
1335
0fafb78d7a80 sockopt utilities added
Claus Gittinger <cg@exept.de>
parents: 1316
diff changeset
  3767
    }
0fafb78d7a80 sockopt utilities added
Claus Gittinger <cg@exept.de>
parents: 1316
diff changeset
  3768
#endif
0fafb78d7a80 sockopt utilities added
Claus Gittinger <cg@exept.de>
parents: 1316
diff changeset
  3769
%}.
0fafb78d7a80 sockopt utilities added
Claus Gittinger <cg@exept.de>
parents: 1316
diff changeset
  3770
    ^ nil
0fafb78d7a80 sockopt utilities added
Claus Gittinger <cg@exept.de>
parents: 1316
diff changeset
  3771
!
0fafb78d7a80 sockopt utilities added
Claus Gittinger <cg@exept.de>
parents: 1316
diff changeset
  3772
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3773
receiveBufferSize:size
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3774
    "set the receive buffer size - for special applications only.
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3775
     Not all operatingSystems offer this functionality
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3776
     (returns false, if unsupported)"
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3777
2321
6f4cc7b644db filePointer -> handle migration
Claus Gittinger <cg@exept.de>
parents: 2308
diff changeset
  3778
    handle isNil ifTrue:[
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3779
	^ self errorNotOpen
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3780
    ].
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3781
%{
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3782
#if defined(SO_RCVBUF) && defined(SOL_SOCKET)
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3783
    if (__isSmallInteger(size)) {
2321
6f4cc7b644db filePointer -> handle migration
Claus Gittinger <cg@exept.de>
parents: 2308
diff changeset
  3784
	OBJ fp = __INST(handle);
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3785
	SOCKET sock;
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3786
	int opt;
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3787
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3788
	sock = SOCKET_FROM_FILE_OBJECT(fp);
1343
cc3bed115c0a definitions cleanup with stxOSDefs.h
penk
parents: 1342
diff changeset
  3789
	opt = __intVal(size);
1529
911273d090c1 Re-unified Win32 and Unix code into single Socket.st.
Claus Gittinger <cg@exept.de>
parents: 1505
diff changeset
  3790
	if (setsockopt(sock, SOL_SOCKET, SO_RCVBUF, (char *)&opt, sizeof(int)) >= 0 ) {
911273d090c1 Re-unified Win32 and Unix code into single Socket.st.
Claus Gittinger <cg@exept.de>
parents: 1505
diff changeset
  3791
	    RETURN(true);
911273d090c1 Re-unified Win32 and Unix code into single Socket.st.
Claus Gittinger <cg@exept.de>
parents: 1505
diff changeset
  3792
	}
1335
0fafb78d7a80 sockopt utilities added
Claus Gittinger <cg@exept.de>
parents: 1316
diff changeset
  3793
    }
0fafb78d7a80 sockopt utilities added
Claus Gittinger <cg@exept.de>
parents: 1316
diff changeset
  3794
#endif
0fafb78d7a80 sockopt utilities added
Claus Gittinger <cg@exept.de>
parents: 1316
diff changeset
  3795
%}.
0fafb78d7a80 sockopt utilities added
Claus Gittinger <cg@exept.de>
parents: 1316
diff changeset
  3796
    ^ false
0fafb78d7a80 sockopt utilities added
Claus Gittinger <cg@exept.de>
parents: 1316
diff changeset
  3797
!
0fafb78d7a80 sockopt utilities added
Claus Gittinger <cg@exept.de>
parents: 1316
diff changeset
  3798
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3799
receiveTimeout
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3800
    "get the receive timeout in millis - for special applications only.
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3801
     Not all operatingSystems offer this functionality
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3802
     (returns nil, if unsupported)"
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3803
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3804
    |millis|
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3805
2321
6f4cc7b644db filePointer -> handle migration
Claus Gittinger <cg@exept.de>
parents: 2308
diff changeset
  3806
    handle isNil ifTrue:[
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3807
	^ self errorNotOpen
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3808
    ].
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3809
%{
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3810
#if defined(SO_RCVTIMEO) && defined(SOL_SOCKET)
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3811
    {
2321
6f4cc7b644db filePointer -> handle migration
Claus Gittinger <cg@exept.de>
parents: 2308
diff changeset
  3812
	OBJ fp = __INST(handle);
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3813
	int sock;
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3814
	int len;
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3815
	int __millis;
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3816
	struct timeval tv = {0, 0};
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3817
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3818
	sock = fileno(__FILEVal(fp));
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3819
	len = sizeof(struct timeval);
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3820
	if (getsockopt(sock, SOL_SOCKET, SO_RCVTIMEO, (void *)&tv, &len) == 0) {
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3821
	    __millis = (tv.tv_sec * 1000) + (tv.tv_usec / 1000);
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3822
	    millis = __mkSmallInteger(__millis);
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3823
# if 0
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3824
	    console_fprintf(stderr, "getsockopt -> s:%d us:%d -> millis:%d\n", tv.tv_sec, tv.tv_usec, __millis);
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3825
# endif
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3826
	} else {
1839
c10cd58ec334 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1781
diff changeset
  3827
	    console_fprintf(stderr, "Socket [warning]: getsockopt %d failed; errno=%d\n", sock, errno);
1568
3bca500e0c7a send and receiveTimeout fixed
Claus Gittinger <cg@exept.de>
parents: 1561
diff changeset
  3828
	}
3bca500e0c7a send and receiveTimeout fixed
Claus Gittinger <cg@exept.de>
parents: 1561
diff changeset
  3829
    }
3bca500e0c7a send and receiveTimeout fixed
Claus Gittinger <cg@exept.de>
parents: 1561
diff changeset
  3830
#endif
3bca500e0c7a send and receiveTimeout fixed
Claus Gittinger <cg@exept.de>
parents: 1561
diff changeset
  3831
%}.
3bca500e0c7a send and receiveTimeout fixed
Claus Gittinger <cg@exept.de>
parents: 1561
diff changeset
  3832
    millis notNil ifTrue:[^ millis / 1000 ].
3bca500e0c7a send and receiveTimeout fixed
Claus Gittinger <cg@exept.de>
parents: 1561
diff changeset
  3833
    ^ nil
3bca500e0c7a send and receiveTimeout fixed
Claus Gittinger <cg@exept.de>
parents: 1561
diff changeset
  3834
!
3bca500e0c7a send and receiveTimeout fixed
Claus Gittinger <cg@exept.de>
parents: 1561
diff changeset
  3835
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3836
receiveTimeout:seconds
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3837
    "set the receive timeout - for special applications only.
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3838
     Not all operatingSystems offer this functionality
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3839
     (returns false, if unsupported)"
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3840
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3841
    |millis|
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3842
2321
6f4cc7b644db filePointer -> handle migration
Claus Gittinger <cg@exept.de>
parents: 2308
diff changeset
  3843
    handle isNil ifTrue:[
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3844
	^ self errorNotOpen
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3845
    ].
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3846
    millis := (seconds * 1000) rounded.
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3847
%{
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3848
#if defined(SO_RCVTIMEO) && defined(SOL_SOCKET)
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3849
    if (__isSmallInteger(millis)) {
2321
6f4cc7b644db filePointer -> handle migration
Claus Gittinger <cg@exept.de>
parents: 2308
diff changeset
  3850
	OBJ fp = __INST(handle);
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3851
	int sock;
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3852
	int __millis = __intVal(millis);
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3853
	struct timeval tv = {0, 0};
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3854
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3855
	sock = fileno(__FILEVal(fp));
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3856
	tv.tv_sec = __millis / 1000;
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3857
	tv.tv_usec = (__millis % 1000) * 1000;
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3858
# if 0
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3859
	console_fprintf(stderr, "setsockopt -> millis:%d -> s:%d us:%d \n", __millis, tv.tv_sec, tv.tv_usec);
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3860
# endif
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3861
	if (setsockopt(sock, SOL_SOCKET, SO_RCVTIMEO, (void *)&tv, sizeof(struct timeval)) == 0) {
1529
911273d090c1 Re-unified Win32 and Unix code into single Socket.st.
Claus Gittinger <cg@exept.de>
parents: 1505
diff changeset
  3862
	    RETURN(true);
911273d090c1 Re-unified Win32 and Unix code into single Socket.st.
Claus Gittinger <cg@exept.de>
parents: 1505
diff changeset
  3863
	}
1839
c10cd58ec334 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1781
diff changeset
  3864
	console_fprintf(stderr, "Socket [warning]: setsockopt %d failed; errno=%d\n", sock, errno);
28
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  3865
    }
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  3866
#endif
71
claus
parents: 63
diff changeset
  3867
%}.
28
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  3868
    ^ false
81
claus
parents: 79
diff changeset
  3869
!
claus
parents: 79
diff changeset
  3870
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3871
sendBufferSize
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3872
    "get the send buffer size - for special applications only.
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3873
     Not all operatingSystems offer this functionality
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3874
     (returns nil, if unsupported)"
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3875
2321
6f4cc7b644db filePointer -> handle migration
Claus Gittinger <cg@exept.de>
parents: 2308
diff changeset
  3876
    handle isNil ifTrue:[
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3877
	^ self errorNotOpen
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3878
    ].
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3879
%{
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3880
#if defined(SO_SNDBUF) && defined(SOL_SOCKET)
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3881
    {
2321
6f4cc7b644db filePointer -> handle migration
Claus Gittinger <cg@exept.de>
parents: 2308
diff changeset
  3882
	OBJ fp = __INST(handle);
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3883
	SOCKET sock;
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3884
	int opt;
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3885
	unsigned int size;
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3886
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3887
	sock = SOCKET_FROM_FILE_OBJECT(fp);
1568
3bca500e0c7a send and receiveTimeout fixed
Claus Gittinger <cg@exept.de>
parents: 1561
diff changeset
  3888
	if (getsockopt(sock, SOL_SOCKET, SO_SNDBUF, (char *)&opt, &size) >= 0) {
3bca500e0c7a send and receiveTimeout fixed
Claus Gittinger <cg@exept.de>
parents: 1561
diff changeset
  3889
	    RETURN( __MKSMALLINT(opt) );
3bca500e0c7a send and receiveTimeout fixed
Claus Gittinger <cg@exept.de>
parents: 1561
diff changeset
  3890
	}
1335
0fafb78d7a80 sockopt utilities added
Claus Gittinger <cg@exept.de>
parents: 1316
diff changeset
  3891
    }
0fafb78d7a80 sockopt utilities added
Claus Gittinger <cg@exept.de>
parents: 1316
diff changeset
  3892
#endif
0fafb78d7a80 sockopt utilities added
Claus Gittinger <cg@exept.de>
parents: 1316
diff changeset
  3893
%}.
0fafb78d7a80 sockopt utilities added
Claus Gittinger <cg@exept.de>
parents: 1316
diff changeset
  3894
    ^ nil
0fafb78d7a80 sockopt utilities added
Claus Gittinger <cg@exept.de>
parents: 1316
diff changeset
  3895
!
0fafb78d7a80 sockopt utilities added
Claus Gittinger <cg@exept.de>
parents: 1316
diff changeset
  3896
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3897
sendBufferSize:size
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3898
    "set the send buffer size - for special applications only.
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3899
     Not all operatingSystems offer this functionality
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3900
     (returns false, if unsupported)"
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3901
2321
6f4cc7b644db filePointer -> handle migration
Claus Gittinger <cg@exept.de>
parents: 2308
diff changeset
  3902
    handle isNil ifTrue:[
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3903
	^ self errorNotOpen
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3904
    ].
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3905
%{
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3906
#if defined(SO_SNDBUF) && defined(SOL_SOCKET)
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3907
    if (__isSmallInteger(size)) {
2321
6f4cc7b644db filePointer -> handle migration
Claus Gittinger <cg@exept.de>
parents: 2308
diff changeset
  3908
	OBJ fp = __INST(handle);
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3909
	SOCKET sock;
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3910
	int opt;
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3911
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3912
	sock = SOCKET_FROM_FILE_OBJECT(fp);
1343
cc3bed115c0a definitions cleanup with stxOSDefs.h
penk
parents: 1342
diff changeset
  3913
	opt = __intVal(size);
1529
911273d090c1 Re-unified Win32 and Unix code into single Socket.st.
Claus Gittinger <cg@exept.de>
parents: 1505
diff changeset
  3914
	if (setsockopt(sock, SOL_SOCKET, SO_SNDBUF, (char *)&opt, sizeof(int)) >= 0) {
911273d090c1 Re-unified Win32 and Unix code into single Socket.st.
Claus Gittinger <cg@exept.de>
parents: 1505
diff changeset
  3915
	    RETURN(true);
911273d090c1 Re-unified Win32 and Unix code into single Socket.st.
Claus Gittinger <cg@exept.de>
parents: 1505
diff changeset
  3916
	}
1335
0fafb78d7a80 sockopt utilities added
Claus Gittinger <cg@exept.de>
parents: 1316
diff changeset
  3917
    }
0fafb78d7a80 sockopt utilities added
Claus Gittinger <cg@exept.de>
parents: 1316
diff changeset
  3918
#endif
0fafb78d7a80 sockopt utilities added
Claus Gittinger <cg@exept.de>
parents: 1316
diff changeset
  3919
%}.
0fafb78d7a80 sockopt utilities added
Claus Gittinger <cg@exept.de>
parents: 1316
diff changeset
  3920
    ^ false
0fafb78d7a80 sockopt utilities added
Claus Gittinger <cg@exept.de>
parents: 1316
diff changeset
  3921
!
0fafb78d7a80 sockopt utilities added
Claus Gittinger <cg@exept.de>
parents: 1316
diff changeset
  3922
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3923
sendTimeout
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3924
    "get the send timeout in millis - for special applications only.
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3925
     Not all operatingSystems offer this functionality
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3926
     (returns nil, if unsupported)"
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3927
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3928
    |millis|
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3929
2321
6f4cc7b644db filePointer -> handle migration
Claus Gittinger <cg@exept.de>
parents: 2308
diff changeset
  3930
    handle isNil ifTrue:[
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3931
	^ self errorNotOpen
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3932
    ].
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3933
%{
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3934
#if defined(SO_SNDTIMEO) && defined(SOL_SOCKET)
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3935
    {
2321
6f4cc7b644db filePointer -> handle migration
Claus Gittinger <cg@exept.de>
parents: 2308
diff changeset
  3936
	OBJ fp = __INST(handle);
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3937
	int sock;
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3938
	int len;
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3939
	int __millis;
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3940
	struct timeval tv = {0, 0};
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3941
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3942
	sock = fileno(__FILEVal(fp));
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3943
	len = sizeof(struct timeval);
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3944
	if (getsockopt(sock, SOL_SOCKET, SO_SNDTIMEO, (void *)&tv, &len) == 0) {
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3945
	    __millis = (tv.tv_sec * 1000) + (tv.tv_usec / 1000);
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3946
	    millis = __mkSmallInteger(__millis);
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3947
# if 0
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3948
	    console_fprintf(stderr, "getsockopt -> s:%d us:%d -> millis:%d\n", tv.tv_sec, tv.tv_usec, __millis);
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3949
# endif
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3950
	} else {
1839
c10cd58ec334 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1781
diff changeset
  3951
	    console_fprintf(stderr, "Socket [warning]: getsockopt %d failed; errno=%d\n", sock, errno);
1568
3bca500e0c7a send and receiveTimeout fixed
Claus Gittinger <cg@exept.de>
parents: 1561
diff changeset
  3952
	}
3bca500e0c7a send and receiveTimeout fixed
Claus Gittinger <cg@exept.de>
parents: 1561
diff changeset
  3953
    }
3bca500e0c7a send and receiveTimeout fixed
Claus Gittinger <cg@exept.de>
parents: 1561
diff changeset
  3954
#endif
3bca500e0c7a send and receiveTimeout fixed
Claus Gittinger <cg@exept.de>
parents: 1561
diff changeset
  3955
%}.
3bca500e0c7a send and receiveTimeout fixed
Claus Gittinger <cg@exept.de>
parents: 1561
diff changeset
  3956
    millis notNil ifTrue:[^ millis / 1000 ].
3bca500e0c7a send and receiveTimeout fixed
Claus Gittinger <cg@exept.de>
parents: 1561
diff changeset
  3957
    ^ nil
3bca500e0c7a send and receiveTimeout fixed
Claus Gittinger <cg@exept.de>
parents: 1561
diff changeset
  3958
!
3bca500e0c7a send and receiveTimeout fixed
Claus Gittinger <cg@exept.de>
parents: 1561
diff changeset
  3959
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3960
sendTimeout:seconds
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3961
    "set the send timeout - for special applications only.
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3962
     Not all operatingSystems offer this functionality
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3963
     (returns false, if unsupported)"
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3964
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3965
    |millis|
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3966
2321
6f4cc7b644db filePointer -> handle migration
Claus Gittinger <cg@exept.de>
parents: 2308
diff changeset
  3967
    handle isNil ifTrue:[
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3968
	^ self errorNotOpen
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3969
    ].
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3970
    millis := (seconds * 1000) rounded.
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3971
%{
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3972
#if defined(SO_SNDTIMEO) && defined(SOL_SOCKET)
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3973
    if (__isSmallInteger(millis)) {
2321
6f4cc7b644db filePointer -> handle migration
Claus Gittinger <cg@exept.de>
parents: 2308
diff changeset
  3974
	OBJ fp = __INST(handle);
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3975
	int sock;
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3976
	int __millis = __intVal(millis);
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3977
	struct timeval tv = {0, 0};
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3978
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3979
	sock = fileno(__FILEVal(fp));
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3980
	tv.tv_sec = __millis / 1000;
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3981
	tv.tv_usec = (__millis % 1000) * 1000;
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3982
# if 0
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3983
	console_fprintf(stderr, "setsockopt -> millis:%d -> s:%d us:%d \n", __millis, tv.tv_sec, tv.tv_usec);
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3984
# endif
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3985
	if (setsockopt(sock, SOL_SOCKET, SO_SNDTIMEO, (void *)&tv, sizeof(struct timeval)) == 0) {
1529
911273d090c1 Re-unified Win32 and Unix code into single Socket.st.
Claus Gittinger <cg@exept.de>
parents: 1505
diff changeset
  3986
	    RETURN(true);
911273d090c1 Re-unified Win32 and Unix code into single Socket.st.
Claus Gittinger <cg@exept.de>
parents: 1505
diff changeset
  3987
	}
1839
c10cd58ec334 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1781
diff changeset
  3988
	console_fprintf(stderr, "Socket [warning]: setsockopt %d failed; errno=%d\n", sock, errno);
126
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
  3989
    }
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
  3990
#endif
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
  3991
%}.
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
  3992
    ^ false
1568
3bca500e0c7a send and receiveTimeout fixed
Claus Gittinger <cg@exept.de>
parents: 1561
diff changeset
  3993
1340
eb9b1f1340e5 setTCP_NODELAY
Claus Gittinger <cg@exept.de>
parents: 1339
diff changeset
  3994
!
eb9b1f1340e5 setTCP_NODELAY
Claus Gittinger <cg@exept.de>
parents: 1339
diff changeset
  3995
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3996
setTCPCork:aBoolean
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3997
    "enable/disable TCP_CORK (do-not-send-partial-frames)
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3998
     For special applications only.
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3999
     Not all OperatingSystems offer this functionality
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  4000
     (returns false, if unsupported)"
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  4001
2551
6da1bc89b74a changed:
Stefan Vogel <sv@exept.de>
parents: 2516
diff changeset
  4002
    ^ self setSocketOption:#'TCP_CORK' argument:aBoolean argument:nil.
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  4003
!
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  4004
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  4005
setTCPNoDelay:aBoolean
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  4006
    "enable/disable TCP_NODELAY (i.e. disable/enable the Nagle algorithm)
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  4007
     For special applications only.
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  4008
     Not all OperatingSystems offer this functionality
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  4009
     (returns false, if unsupported)"
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  4010
2551
6da1bc89b74a changed:
Stefan Vogel <sv@exept.de>
parents: 2516
diff changeset
  4011
    ^ self setSocketOption:#'TCP_NODELAY' argument:aBoolean argument:nil.
126
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
  4012
! !
82
claus
parents: 81
diff changeset
  4013
3043
8b7ec7116ae3 class: Socket
Stefan Vogel <sv@exept.de>
parents: 2998
diff changeset
  4014
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  4015
!Socket methodsFor:'waiting'!
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  4016
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  4017
waitForNewConnectionOrDataOnAny:otherConnections timeout:timeoutSeconds
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  4018
    "suspend the current process, until either a new connection comes
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  4019
     in at the receiver, or data arrives on any of the otherConnections.
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  4020
     For a new connection, an accept is performed and the new socket is returned.
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  4021
     For an old connection, that socket is returned.
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  4022
     In any case, the caller gets a socket to operate on as return value,
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  4023
     or nil, if a timeout occured.
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  4024
     This method implements the inner wait-primitive of a multi-connection
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  4025
     server application."
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  4026
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  4027
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  4028
    |wasBlocked sema|
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  4029
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  4030
    "first, a quick check if data is already available"
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  4031
    self canReadWithoutBlocking ifTrue:[
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  4032
	^ self accept.
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  4033
    ].
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  4034
    otherConnections do:[:aConnection |
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  4035
	aConnection canReadWithoutBlocking ifTrue:[
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  4036
	    ^ aConnection
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  4037
	]
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  4038
    ].
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  4039
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  4040
    [
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  4041
	"check again - prevent incoming interrupts from disturbing our setup"
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  4042
	wasBlocked := OperatingSystem blockInterrupts.
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  4043
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  4044
	self canReadWithoutBlocking ifTrue:[
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  4045
	    ^ self accept.
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  4046
	].
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  4047
	otherConnections do:[:aConnection |
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  4048
	    aConnection canReadWithoutBlocking ifTrue:[
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  4049
		^ aConnection
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  4050
	    ]
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  4051
	].
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  4052
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  4053
	"nope - must wait"
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  4054
	sema := Semaphore new name:'multiReadWait'.
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  4055
	otherConnections do:[:aConnection |
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  4056
	    Processor signal:sema onInput:(aConnection fileDescriptor).
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  4057
	].
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  4058
	Processor signal:sema onInput:(self fileDescriptor).
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  4059
	timeoutSeconds notNil ifTrue:[
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  4060
	    Processor signal:sema afterSeconds:timeoutSeconds
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  4061
	].
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  4062
	Processor activeProcess state:#ioWait.
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  4063
	sema wait.
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  4064
    ] ensure:[
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  4065
	sema notNil ifTrue:[Processor disableSemaphore:sema].
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  4066
	wasBlocked ifFalse:[OperatingSystem unblockInterrupts].
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  4067
    ].
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  4068
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  4069
    "see who it was ..."
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  4070
    self canReadWithoutBlocking ifTrue:[
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  4071
	^ self accept.
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  4072
    ].
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  4073
    otherConnections do:[:aConnection |
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  4074
	aConnection canReadWithoutBlocking ifTrue:[
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  4075
	    ^ aConnection
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  4076
	]
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  4077
    ].
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  4078
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  4079
    "none - a timeout"
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  4080
    ^ nil
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  4081
!
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  4082
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  4083
waitForNewConnectionWithTimeout:timeoutSeconds
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  4084
    "suspend the current process, until a new connection comes
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  4085
     in at the receiver or a timeout occurs.
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  4086
     For a new connection, an accept is performed and the new socket is returned.
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  4087
     Returns nil, if a timeout occured.
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  4088
     This method implements the inner wait-primitive of a single-connection
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  4089
     server application."
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  4090
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  4091
    (self readWaitWithTimeout:timeoutSeconds) ifTrue:[
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  4092
	"a timeout occurred - no connection within timeout"
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  4093
	^ nil
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  4094
    ].
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  4095
    ^ self accept.
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  4096
! !
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  4097
464
600b101a7035 alen in accept
Claus Gittinger <cg@exept.de>
parents: 463
diff changeset
  4098
!Socket class methodsFor:'documentation'!
206
77166a6b3ee6 For ST80 style socket creation: register socket in Lobby.
Stefan Vogel <sv@exept.de>
parents: 203
diff changeset
  4099
77166a6b3ee6 For ST80 style socket creation: register socket in Lobby.
Stefan Vogel <sv@exept.de>
parents: 203
diff changeset
  4100
version
3224
bad706c50347 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3223
diff changeset
  4101
    ^ '$Header: /cvs/stx/stx/libbasic2/Socket.st,v 1.302 2014-04-16 08:33:22 stefan Exp $'
2292
c4b0b901278e added: #standardTimeout
Claus Gittinger <cg@exept.de>
parents: 1940
diff changeset
  4102
!
c4b0b901278e added: #standardTimeout
Claus Gittinger <cg@exept.de>
parents: 1940
diff changeset
  4103
c4b0b901278e added: #standardTimeout
Claus Gittinger <cg@exept.de>
parents: 1940
diff changeset
  4104
version_CVS
3224
bad706c50347 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3223
diff changeset
  4105
    ^ '$Header: /cvs/stx/stx/libbasic2/Socket.st,v 1.302 2014-04-16 08:33:22 stefan Exp $'
206
77166a6b3ee6 For ST80 style socket creation: register socket in Lobby.
Stefan Vogel <sv@exept.de>
parents: 203
diff changeset
  4106
! !
2953
855e7a58faa0 class: Socket
Claus Gittinger <cg@exept.de>
parents: 2915
diff changeset
  4107