Socket.st
author Stefan Vogel <sv@exept.de>
Wed, 01 Aug 2018 15:12:02 +0200
changeset 4708 713e81a051ec
parent 4671 4943f9446d1c
child 4736 c5a3e2dae276
permissions -rw-r--r--
#BUGFIX by stefan class: List removed: #synchronizationSemaphore: changed: #asSharedCollection #beSynchronized Do not make me implicitly #beSynchronized, if someone sends a #synchronized: message to myself.
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
3462
cfdc47761d0f class: Socket
Claus Gittinger <cg@exept.de>
parents: 3281
diff changeset
    14
"{ NameSpace: Smalltalk }"
cfdc47761d0f class: Socket
Claus Gittinger <cg@exept.de>
parents: 3281
diff changeset
    15
63
7dd3d5b7877e *** empty log message ***
claus
parents: 58
diff changeset
    16
NonPositionableExternalStream subclass:#Socket
4234
eb1b470a27ee #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 4206
diff changeset
    17
	instanceVariableNames:'domain socketType protocol port peer peerName listening'
206
77166a6b3ee6 For ST80 style socket creation: register socket in Lobby.
Stefan Vogel <sv@exept.de>
parents: 203
diff changeset
    18
	classVariableNames:''
77166a6b3ee6 For ST80 style socket creation: register socket in Lobby.
Stefan Vogel <sv@exept.de>
parents: 203
diff changeset
    19
	poolDictionaries:''
77166a6b3ee6 For ST80 style socket creation: register socket in Lobby.
Stefan Vogel <sv@exept.de>
parents: 203
diff changeset
    20
	category:'Streams-External'
0
1cf8d1747859 Initial revision
claus
parents:
diff changeset
    21
!
1cf8d1747859 Initial revision
claus
parents:
diff changeset
    22
126
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
    23
!Socket primitiveDefinitions!
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
    24
%{
1009
e0839f923a3c double underlines;
Claus Gittinger <cg@exept.de>
parents: 1007
diff changeset
    25
/* #define DGRAM_DEBUG /* */
e0839f923a3c double underlines;
Claus Gittinger <cg@exept.de>
parents: 1007
diff changeset
    26
3590
3487165a9cdf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3550
diff changeset
    27
#ifdef __MINGW__
3487165a9cdf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3550
diff changeset
    28
# include <stdio.h>
3487165a9cdf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3550
diff changeset
    29
#endif
1343
cc3bed115c0a definitions cleanup with stxOSDefs.h
penk
parents: 1342
diff changeset
    30
#include "stxOSDefs.h"
126
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
    31
3843
fbced69597a7 oops - error check was disabled
Claus Gittinger <cg@exept.de>
parents: 3742
diff changeset
    32
#ifdef __win32__
3123
55ef9ca4f09f class: Socket
Stefan Vogel <sv@exept.de>
parents: 3077
diff changeset
    33
//#define DEBUG 1
2818
94d67df5c00d compilable with tcc
Claus Gittinger <cg@exept.de>
parents: 2773
diff changeset
    34
/* 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
    35
# undef __BEGIN_INTERRUPTABLE__
4d97e4191d04 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1499
diff changeset
    36
# undef __END_INTERRUPTABLE__
2818
94d67df5c00d compilable with tcc
Claus Gittinger <cg@exept.de>
parents: 2773
diff changeset
    37
# ifdef __TCC__
94d67df5c00d compilable with tcc
Claus Gittinger <cg@exept.de>
parents: 2773
diff changeset
    38
#  define __BEGIN_INTERRUPTABLE__ xxxx
94d67df5c00d compilable with tcc
Claus Gittinger <cg@exept.de>
parents: 2773
diff changeset
    39
#  define __END_INTERRUPTABLE__ yyyy
94d67df5c00d compilable with tcc
Claus Gittinger <cg@exept.de>
parents: 2773
diff changeset
    40
# else
94d67df5c00d compilable with tcc
Claus Gittinger <cg@exept.de>
parents: 2773
diff changeset
    41
#  define __BEGIN_INTERRUPTABLE__ ..
94d67df5c00d compilable with tcc
Claus Gittinger <cg@exept.de>
parents: 2773
diff changeset
    42
#  define __END_INTERRUPTABLE__ ..
94d67df5c00d compilable with tcc
Claus Gittinger <cg@exept.de>
parents: 2773
diff changeset
    43
# endif
1503
4d97e4191d04 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1499
diff changeset
    44
1504
92005eec5c9d fixed moving-object-when-interrupted-with-scavenge bugs;
Claus Gittinger <cg@exept.de>
parents: 1503
diff changeset
    45
# define WRAP_STDIO
2823
10179ccfae5d Default for close - linger in background instead 30s in foreground
Stefan Vogel <sv@exept.de>
parents: 2818
diff changeset
    46
// 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
    47
// 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
    48
// 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
    49
//# 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
    50
3742
a12020350fa0 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3741
diff changeset
    51
# ifdef __xxMINGW__
2909
aacef77a1697 64bit fixes
Claus Gittinger <cg@exept.de>
parents: 2904
diff changeset
    52
extern HANDLE _get_osfhandle();
1845
df4d79bfba9d closesocket is still tricky
Claus Gittinger <cg@exept.de>
parents: 1844
diff changeset
    53
# endif
df4d79bfba9d closesocket is still tricky
Claus Gittinger <cg@exept.de>
parents: 1844
diff changeset
    54
3620
c648d063bccc #REFACTORING
Stefan Vogel <sv@exept.de>
parents: 3617
diff changeset
    55
# if defined(__BORLANDC__)
c648d063bccc #REFACTORING
Stefan Vogel <sv@exept.de>
parents: 3617
diff changeset
    56
// not defined in borland headers
c648d063bccc #REFACTORING
Stefan Vogel <sv@exept.de>
parents: 3617
diff changeset
    57
typedef unsigned int socklen_t;
c648d063bccc #REFACTORING
Stefan Vogel <sv@exept.de>
parents: 3617
diff changeset
    58
# endif
c648d063bccc #REFACTORING
Stefan Vogel <sv@exept.de>
parents: 3617
diff changeset
    59
3246
c75a006f9a7a Win32 sockets use handles instead of file pointers
Stefan Vogel <sv@exept.de>
parents: 3224
diff changeset
    60
# if 0 && (defined( __BORLANDC__ ) || defined( __MINGW__ ))
2915
896fffb0f02e mingw64
Claus Gittinger <cg@exept.de>
parents: 2909
diff changeset
    61
#  define SOCKET_FROM_FD(fd)               (SOCKET)(_get_osfhandle(fd))
2909
aacef77a1697 64bit fixes
Claus Gittinger <cg@exept.de>
parents: 2904
diff changeset
    62
# else
3246
c75a006f9a7a Win32 sockets use handles instead of file pointers
Stefan Vogel <sv@exept.de>
parents: 3224
diff changeset
    63
#  define SOCKET_FROM_FD(fd)               (SOCKET)(fd)
2909
aacef77a1697 64bit fixes
Claus Gittinger <cg@exept.de>
parents: 2904
diff changeset
    64
# endif
3843
fbced69597a7 oops - error check was disabled
Claus Gittinger <cg@exept.de>
parents: 3742
diff changeset
    65
#else /* not __win32__ */
3215
342d793d938c class: Socket
Stefan Vogel <sv@exept.de>
parents: 3214
diff changeset
    66
# define SOCKET_FROM_FD(fd)   (fd)
342d793d938c class: Socket
Stefan Vogel <sv@exept.de>
parents: 3214
diff changeset
    67
# define closesocket(sock)    close(sock)
342d793d938c class: Socket
Stefan Vogel <sv@exept.de>
parents: 3214
diff changeset
    68
# define SOCKET               int
3843
fbced69597a7 oops - error check was disabled
Claus Gittinger <cg@exept.de>
parents: 3742
diff changeset
    69
#endif /* ! __win32__ */
1503
4d97e4191d04 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1499
diff changeset
    70
1843
8ee90d243b49 closeSocket after fclose: no longer (Q: is this the right thing)
Claus Gittinger <cg@exept.de>
parents: 1842
diff changeset
    71
#define SOCKET_FROM_FILE(f)             (SOCKET_FROM_FD(fileno(f)))
3246
c75a006f9a7a Win32 sockets use handles instead of file pointers
Stefan Vogel <sv@exept.de>
parents: 3224
diff changeset
    72
#define SOCKET_FROM_FILE_OBJECT(f)      (__INST(handleType) == @symbol(socketHandle) ? SOCKET_FROM_FD(__FILEVal(f)) : SOCKET_FROM_FILE(__FILEVal(f)))
1539
c0e89dcb58b3 non blocking stuff done right here;
Claus Gittinger <cg@exept.de>
parents: 1538
diff changeset
    73
3590
3487165a9cdf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3550
diff changeset
    74
#ifndef __MINGW__
3487165a9cdf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3550
diff changeset
    75
# include <stdio.h>
3487165a9cdf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3550
diff changeset
    76
#endif
126
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
    77
#include <errno.h>
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
    78
1343
cc3bed115c0a definitions cleanup with stxOSDefs.h
penk
parents: 1342
diff changeset
    79
#ifdef WANT__TCP_DOT_H
cc3bed115c0a definitions cleanup with stxOSDefs.h
penk
parents: 1342
diff changeset
    80
# include <netinet/tcp.h>
cc3bed115c0a definitions cleanup with stxOSDefs.h
penk
parents: 1342
diff changeset
    81
#endif
cc3bed115c0a definitions cleanup with stxOSDefs.h
penk
parents: 1342
diff changeset
    82
1344
70d73917ac78 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1343
diff changeset
    83
#ifdef WANT__NETDB_DOT_H
70d73917ac78 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1343
diff changeset
    84
# include <netdb.h>
1343
cc3bed115c0a definitions cleanup with stxOSDefs.h
penk
parents: 1342
diff changeset
    85
#endif
cc3bed115c0a definitions cleanup with stxOSDefs.h
penk
parents: 1342
diff changeset
    86
739
eb3878300c3b removed WIN32 ifdef's - win32 uses Socket_win32.st anyway.
Claus Gittinger <cg@exept.de>
parents: 726
diff changeset
    87
#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
    88
# define USE_H_ERRNO
eb3878300c3b removed WIN32 ifdef's - win32 uses Socket_win32.st anyway.
Claus Gittinger <cg@exept.de>
parents: 726
diff changeset
    89
#endif
eb3878300c3b removed WIN32 ifdef's - win32 uses Socket_win32.st anyway.
Claus Gittinger <cg@exept.de>
parents: 726
diff changeset
    90
126
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
    91
/*
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
    92
 * on some systems errno is a macro ... check for it here
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
    93
 */
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
    94
#ifndef errno
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
    95
 extern errno;
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
    96
#endif
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
    97
648
58e11a70ddaf gethostbyname behaves strange, if a name-server lookup is involved.
Claus Gittinger <cg@exept.de>
parents: 617
diff changeset
    98
#ifdef USE_H_ERRNO
58e11a70ddaf gethostbyname behaves strange, if a name-server lookup is involved.
Claus Gittinger <cg@exept.de>
parents: 617
diff changeset
    99
# ifndef h_errno
58e11a70ddaf gethostbyname behaves strange, if a name-server lookup is involved.
Claus Gittinger <cg@exept.de>
parents: 617
diff changeset
   100
 extern h_errno;
58e11a70ddaf gethostbyname behaves strange, if a name-server lookup is involved.
Claus Gittinger <cg@exept.de>
parents: 617
diff changeset
   101
# endif
58e11a70ddaf gethostbyname behaves strange, if a name-server lookup is involved.
Claus Gittinger <cg@exept.de>
parents: 617
diff changeset
   102
#endif
58e11a70ddaf gethostbyname behaves strange, if a name-server lookup is involved.
Claus Gittinger <cg@exept.de>
parents: 617
diff changeset
   103
126
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
   104
#ifdef DEBUG
1839
c10cd58ec334 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1781
diff changeset
   105
# define DBGPRINTF(x)    { if (__debugging__) console_printf x; }
c10cd58ec334 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1781
diff changeset
   106
# define DBGFPRINTF(x)   { if (__debugging__) console_fprintf x; }
126
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
   107
#else
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
   108
# define DBGPRINTF(x)    /* as nothing */
821
40b0b69bf4b5 more debugs; fixed at-addresses
Claus Gittinger <cg@exept.de>
parents: 820
diff changeset
   109
# define DBGFPRINTF(x)   /* as nothing */
126
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
   110
#endif
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
   111
1531
ec98158988ca compilable under unix
Claus Gittinger <cg@exept.de>
parents: 1529
diff changeset
   112
#ifndef TRUE
1535
f6aa0fc8c3cc getSocketAddress
Claus Gittinger <cg@exept.de>
parents: 1533
diff changeset
   113
# define TRUE   1
1531
ec98158988ca compilable under unix
Claus Gittinger <cg@exept.de>
parents: 1529
diff changeset
   114
#endif
ec98158988ca compilable under unix
Claus Gittinger <cg@exept.de>
parents: 1529
diff changeset
   115
#ifndef FALSE
1535
f6aa0fc8c3cc getSocketAddress
Claus Gittinger <cg@exept.de>
parents: 1533
diff changeset
   116
# define FALSE  0
1531
ec98158988ca compilable under unix
Claus Gittinger <cg@exept.de>
parents: 1529
diff changeset
   117
#endif
3843
fbced69597a7 oops - error check was disabled
Claus Gittinger <cg@exept.de>
parents: 3742
diff changeset
   118
#ifndef __win32__
1531
ec98158988ca compilable under unix
Claus Gittinger <cg@exept.de>
parents: 1529
diff changeset
   119
typedef int BOOL;
ec98158988ca compilable under unix
Claus Gittinger <cg@exept.de>
parents: 1529
diff changeset
   120
#endif
ec98158988ca compilable under unix
Claus Gittinger <cg@exept.de>
parents: 1529
diff changeset
   121
3843
fbced69597a7 oops - error check was disabled
Claus Gittinger <cg@exept.de>
parents: 3742
diff changeset
   122
#ifdef __win32__
1843
8ee90d243b49 closeSocket after fclose: no longer (Q: is this the right thing)
Claus Gittinger <cg@exept.de>
parents: 1842
diff changeset
   123
# undef stdout
8ee90d243b49 closeSocket after fclose: no longer (Q: is this the right thing)
Claus Gittinger <cg@exept.de>
parents: 1842
diff changeset
   124
# undef stderr
8ee90d243b49 closeSocket after fclose: no longer (Q: is this the right thing)
Claus Gittinger <cg@exept.de>
parents: 1842
diff changeset
   125
# 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
   126
# 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
   127
#endif
126
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
   128
%}
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
   129
! !
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
   130
511
c071e228cb24 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 510
diff changeset
   131
!Socket primitiveVariables!
c071e228cb24 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 510
diff changeset
   132
%{
1844
decc9d62520d oops - debug
Claus Gittinger <cg@exept.de>
parents: 1843
diff changeset
   133
static int __debugging__ = 0;
511
c071e228cb24 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 510
diff changeset
   134
%}
c071e228cb24 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 510
diff changeset
   135
! !
c071e228cb24 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 510
diff changeset
   136
1504
92005eec5c9d fixed moving-object-when-interrupted-with-scavenge bugs;
Claus Gittinger <cg@exept.de>
parents: 1503
diff changeset
   137
!Socket primitiveFunctions!
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
1529
911273d090c1 Re-unified Win32 and Unix code into single Socket.st.
Claus Gittinger <cg@exept.de>
parents: 1505
diff changeset
   140
static int
3616
Stefan Vogel <sv@exept.de>
parents: 3615
diff changeset
   141
setupBufferParameters(OBJ aDataBuffer, OBJ startIndex, char **p_extPtr, INT *p_offs, size_t *p_objSize)
1504
92005eec5c9d fixed moving-object-when-interrupted-with-scavenge bugs;
Claus Gittinger <cg@exept.de>
parents: 1503
diff changeset
   142
{
3657
Stefan Vogel <sv@exept.de>
parents: 3655
diff changeset
   143
	char *extPtr = 0;
Stefan Vogel <sv@exept.de>
parents: 3655
diff changeset
   144
	int sIdx = 0, objSize = 0, offs = 0;
Stefan Vogel <sv@exept.de>
parents: 3655
diff changeset
   145
Stefan Vogel <sv@exept.de>
parents: 3655
diff changeset
   146
	sIdx = 0;
Stefan Vogel <sv@exept.de>
parents: 3655
diff changeset
   147
	if (__isSmallInteger(startIndex)) {
Stefan Vogel <sv@exept.de>
parents: 3655
diff changeset
   148
	    sIdx = __intVal(startIndex) - 1;
Stefan Vogel <sv@exept.de>
parents: 3655
diff changeset
   149
	}
Stefan Vogel <sv@exept.de>
parents: 3655
diff changeset
   150
Stefan Vogel <sv@exept.de>
parents: 3655
diff changeset
   151
	if (__isExternalBytesLike(aDataBuffer)) {
Stefan Vogel <sv@exept.de>
parents: 3655
diff changeset
   152
	    OBJ sz;
Stefan Vogel <sv@exept.de>
parents: 3655
diff changeset
   153
Stefan Vogel <sv@exept.de>
parents: 3655
diff changeset
   154
	    extPtr = (char *)(__externalBytesAddress(aDataBuffer));
Stefan Vogel <sv@exept.de>
parents: 3655
diff changeset
   155
	    sz = __externalBytesSize(aDataBuffer);
Stefan Vogel <sv@exept.de>
parents: 3655
diff changeset
   156
	    if (__isSmallInteger(sz)) {
Stefan Vogel <sv@exept.de>
parents: 3655
diff changeset
   157
		objSize = __intVal(sz);
Stefan Vogel <sv@exept.de>
parents: 3655
diff changeset
   158
	    } else {
Stefan Vogel <sv@exept.de>
parents: 3655
diff changeset
   159
		objSize = 0; /* unknown */
Stefan Vogel <sv@exept.de>
parents: 3655
diff changeset
   160
	    }
Stefan Vogel <sv@exept.de>
parents: 3655
diff changeset
   161
	    offs = sIdx;
Stefan Vogel <sv@exept.de>
parents: 3655
diff changeset
   162
	} else {
Stefan Vogel <sv@exept.de>
parents: 3655
diff changeset
   163
	    OBJ oClass;
Stefan Vogel <sv@exept.de>
parents: 3655
diff changeset
   164
	    int nInstVars, nInstBytes;
Stefan Vogel <sv@exept.de>
parents: 3655
diff changeset
   165
Stefan Vogel <sv@exept.de>
parents: 3655
diff changeset
   166
	    extPtr = (char *)0;
Stefan Vogel <sv@exept.de>
parents: 3655
diff changeset
   167
	    oClass = __Class(aDataBuffer);
Stefan Vogel <sv@exept.de>
parents: 3655
diff changeset
   168
	    switch (__intVal(__ClassInstPtr(oClass)->c_flags) & ARRAYMASK) {
Stefan Vogel <sv@exept.de>
parents: 3655
diff changeset
   169
		case BYTEARRAY:
Stefan Vogel <sv@exept.de>
parents: 3655
diff changeset
   170
		    offs = sIdx;
Stefan Vogel <sv@exept.de>
parents: 3655
diff changeset
   171
		    break;
Stefan Vogel <sv@exept.de>
parents: 3655
diff changeset
   172
		case WORDARRAY:
Stefan Vogel <sv@exept.de>
parents: 3655
diff changeset
   173
		case SWORDARRAY:
Stefan Vogel <sv@exept.de>
parents: 3655
diff changeset
   174
		    offs = sIdx * 2;
Stefan Vogel <sv@exept.de>
parents: 3655
diff changeset
   175
		    break;
Stefan Vogel <sv@exept.de>
parents: 3655
diff changeset
   176
		case LONGARRAY:
Stefan Vogel <sv@exept.de>
parents: 3655
diff changeset
   177
		case SLONGARRAY:
Stefan Vogel <sv@exept.de>
parents: 3655
diff changeset
   178
		    offs = sIdx * 4;
Stefan Vogel <sv@exept.de>
parents: 3655
diff changeset
   179
		    break;
Stefan Vogel <sv@exept.de>
parents: 3655
diff changeset
   180
		case LONGLONGARRAY:
Stefan Vogel <sv@exept.de>
parents: 3655
diff changeset
   181
		case SLONGLONGARRAY:
Stefan Vogel <sv@exept.de>
parents: 3655
diff changeset
   182
		    offs = sIdx * 8;
1504
92005eec5c9d fixed moving-object-when-interrupted-with-scavenge bugs;
Claus Gittinger <cg@exept.de>
parents: 1503
diff changeset
   183
# ifdef __NEED_LONGLONG_ALIGN
3657
Stefan Vogel <sv@exept.de>
parents: 3655
diff changeset
   184
		    offs += 4;
1504
92005eec5c9d fixed moving-object-when-interrupted-with-scavenge bugs;
Claus Gittinger <cg@exept.de>
parents: 1503
diff changeset
   185
# endif
3657
Stefan Vogel <sv@exept.de>
parents: 3655
diff changeset
   186
		    break;
Stefan Vogel <sv@exept.de>
parents: 3655
diff changeset
   187
		case FLOATARRAY:
Stefan Vogel <sv@exept.de>
parents: 3655
diff changeset
   188
		    offs = sIdx * sizeof(float);
Stefan Vogel <sv@exept.de>
parents: 3655
diff changeset
   189
		    break;
Stefan Vogel <sv@exept.de>
parents: 3655
diff changeset
   190
		case DOUBLEARRAY:
Stefan Vogel <sv@exept.de>
parents: 3655
diff changeset
   191
		    offs = sIdx * sizeof(double);
1504
92005eec5c9d fixed moving-object-when-interrupted-with-scavenge bugs;
Claus Gittinger <cg@exept.de>
parents: 1503
diff changeset
   192
# ifdef __NEED_DOUBLE_ALIGN
3657
Stefan Vogel <sv@exept.de>
parents: 3655
diff changeset
   193
		    offs += 4;
1504
92005eec5c9d fixed moving-object-when-interrupted-with-scavenge bugs;
Claus Gittinger <cg@exept.de>
parents: 1503
diff changeset
   194
# endif
3657
Stefan Vogel <sv@exept.de>
parents: 3655
diff changeset
   195
		    break;
Stefan Vogel <sv@exept.de>
parents: 3655
diff changeset
   196
		default:
Stefan Vogel <sv@exept.de>
parents: 3655
diff changeset
   197
		    *p_objSize = -1;
Stefan Vogel <sv@exept.de>
parents: 3655
diff changeset
   198
		    return 0;
Stefan Vogel <sv@exept.de>
parents: 3655
diff changeset
   199
	    }
Stefan Vogel <sv@exept.de>
parents: 3655
diff changeset
   200
	    nInstVars = __intVal(__ClassInstPtr(oClass)->c_ninstvars);
Stefan Vogel <sv@exept.de>
parents: 3655
diff changeset
   201
	    nInstBytes = OHDR_SIZE + nInstVars * sizeof(OBJ);
Stefan Vogel <sv@exept.de>
parents: 3655
diff changeset
   202
	    offs = offs + nInstBytes;
Stefan Vogel <sv@exept.de>
parents: 3655
diff changeset
   203
	    objSize = __Size(aDataBuffer) - offs;
Stefan Vogel <sv@exept.de>
parents: 3655
diff changeset
   204
	}
Stefan Vogel <sv@exept.de>
parents: 3655
diff changeset
   205
	*p_extPtr = extPtr;
Stefan Vogel <sv@exept.de>
parents: 3655
diff changeset
   206
	*p_objSize = objSize;
Stefan Vogel <sv@exept.de>
parents: 3655
diff changeset
   207
	*p_offs = offs;
Stefan Vogel <sv@exept.de>
parents: 3655
diff changeset
   208
	return 1;
1504
92005eec5c9d fixed moving-object-when-interrupted-with-scavenge bugs;
Claus Gittinger <cg@exept.de>
parents: 1503
diff changeset
   209
}
92005eec5c9d fixed moving-object-when-interrupted-with-scavenge bugs;
Claus Gittinger <cg@exept.de>
parents: 1503
diff changeset
   210
%}
92005eec5c9d fixed moving-object-when-interrupted-with-scavenge bugs;
Claus Gittinger <cg@exept.de>
parents: 1503
diff changeset
   211
! !
92005eec5c9d fixed moving-object-when-interrupted-with-scavenge bugs;
Claus Gittinger <cg@exept.de>
parents: 1503
diff changeset
   212
464
600b101a7035 alen in accept
Claus Gittinger <cg@exept.de>
parents: 463
diff changeset
   213
!Socket class methodsFor:'documentation'!
25
996051271ce9 *** empty log message ***
claus
parents: 21
diff changeset
   214
31
e223f3cf2995 *** empty log message ***
claus
parents: 28
diff changeset
   215
copyright
e223f3cf2995 *** empty log message ***
claus
parents: 28
diff changeset
   216
"
e223f3cf2995 *** empty log message ***
claus
parents: 28
diff changeset
   217
 COPYRIGHT (c) 1992 by Claus Gittinger
42
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   218
	      All Rights Reserved
31
e223f3cf2995 *** empty log message ***
claus
parents: 28
diff changeset
   219
e223f3cf2995 *** empty log message ***
claus
parents: 28
diff changeset
   220
 This software is furnished under a license and may be used
e223f3cf2995 *** empty log message ***
claus
parents: 28
diff changeset
   221
 only in accordance with the terms of that license and with the
e223f3cf2995 *** empty log message ***
claus
parents: 28
diff changeset
   222
 inclusion of the above copyright notice.   This software may not
e223f3cf2995 *** empty log message ***
claus
parents: 28
diff changeset
   223
 be provided or otherwise made available to, or used by, any
e223f3cf2995 *** empty log message ***
claus
parents: 28
diff changeset
   224
 other person.  No title to or ownership of the software is
e223f3cf2995 *** empty log message ***
claus
parents: 28
diff changeset
   225
 hereby transferred.
e223f3cf2995 *** empty log message ***
claus
parents: 28
diff changeset
   226
"
e223f3cf2995 *** empty log message ***
claus
parents: 28
diff changeset
   227
!
e223f3cf2995 *** empty log message ***
claus
parents: 28
diff changeset
   228
25
996051271ce9 *** empty log message ***
claus
parents: 21
diff changeset
   229
documentation
996051271ce9 *** empty log message ***
claus
parents: 21
diff changeset
   230
"
524
8287da54eccf more empty code for other domains;
Claus Gittinger <cg@exept.de>
parents: 513
diff changeset
   231
    This class provides access to sockets for interprocess communication.
25
996051271ce9 *** empty log message ***
claus
parents: 21
diff changeset
   232
1529
911273d090c1 Re-unified Win32 and Unix code into single Socket.st.
Claus Gittinger <cg@exept.de>
parents: 1505
diff changeset
   233
    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
   234
    tested and supported.
525
5891518d17a3 appletalk support - untested
Claus Gittinger <cg@exept.de>
parents: 524
diff changeset
   235
    Code for appletalk is included, but was never tested ...
5891518d17a3 appletalk support - untested
Claus Gittinger <cg@exept.de>
parents: 524
diff changeset
   236
    More may be added in the future.
5891518d17a3 appletalk support - untested
Claus Gittinger <cg@exept.de>
parents: 524
diff changeset
   237
    (the code is prepared for things like SNA or decNet;
5891518d17a3 appletalk support - untested
Claus Gittinger <cg@exept.de>
parents: 524
diff changeset
   238
     however, right now, this code is empty and needs a little work.
3989
d99b5df54e27 #DOCUMENTATION by mawalch
mawalch
parents: 3988
diff changeset
   239
     Implementing those is pretty straightforward, once the address
525
5891518d17a3 appletalk support - untested
Claus Gittinger <cg@exept.de>
parents: 524
diff changeset
   240
     data structures are known.)
524
8287da54eccf more empty code for other domains;
Claus Gittinger <cg@exept.de>
parents: 513
diff changeset
   241
28
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   242
    Due to historic reasons (I started this class, before I got hold of some
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   243
    code using ST-80 Sockets i.e. RemoteInvocation), there is some old interface
3481
b28077459fde class: Socket
Claus Gittinger <cg@exept.de>
parents: 3467
diff changeset
   244
    which is still supported.
b28077459fde class: Socket
Claus Gittinger <cg@exept.de>
parents: 3467
diff changeset
   245
    This may vanish; use the #family:type: or #newTCPxxx and #newUDPxxx interfaces,
71
claus
parents: 63
diff changeset
   246
    together with the bind/listen and accept calls,
claus
parents: 63
diff changeset
   247
    which are meant to be compatible to ST-80's UnixSocketAccessor interface.
claus
parents: 63
diff changeset
   248
3481
b28077459fde class: Socket
Claus Gittinger <cg@exept.de>
parents: 3467
diff changeset
   249
    TODO: cleanup historic leftovers,
4414
42edc97b2323 bcopy -> memcpy
Claus Gittinger <cg@exept.de>
parents: 4341
diff changeset
   250
	  change to raise more signals on errors.
259
6d36f3ac42a2 documentation
Claus Gittinger <cg@exept.de>
parents: 220
diff changeset
   251
6d36f3ac42a2 documentation
Claus Gittinger <cg@exept.de>
parents: 220
diff changeset
   252
    [author:]
4414
42edc97b2323 bcopy -> memcpy
Claus Gittinger <cg@exept.de>
parents: 4341
diff changeset
   253
	Claus Gittinger
48
18b9353c9d07 *** empty log message ***
claus
parents: 44
diff changeset
   254
"
18b9353c9d07 *** empty log message ***
claus
parents: 44
diff changeset
   255
!
28
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   256
48
18b9353c9d07 *** empty log message ***
claus
parents: 44
diff changeset
   257
examples
18b9353c9d07 *** empty log message ***
claus
parents: 44
diff changeset
   258
"
28
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   259
    example (get help info from an nntp server):
4414
42edc97b2323 bcopy -> memcpy
Claus Gittinger <cg@exept.de>
parents: 4341
diff changeset
   260
									[exBegin]
42edc97b2323 bcopy -> memcpy
Claus Gittinger <cg@exept.de>
parents: 4341
diff changeset
   261
	|sock|
42edc97b2323 bcopy -> memcpy
Claus Gittinger <cg@exept.de>
parents: 4341
diff changeset
   262
42edc97b2323 bcopy -> memcpy
Claus Gittinger <cg@exept.de>
parents: 4341
diff changeset
   263
	sock := Socket newTCPclientToHost:'smtp.exept.de' port:'smtp'.
42edc97b2323 bcopy -> memcpy
Claus Gittinger <cg@exept.de>
parents: 4341
diff changeset
   264
	sock isNil ifTrue:[
42edc97b2323 bcopy -> memcpy
Claus Gittinger <cg@exept.de>
parents: 4341
diff changeset
   265
	    self warn:'no smtp daemon is running'.
42edc97b2323 bcopy -> memcpy
Claus Gittinger <cg@exept.de>
parents: 4341
diff changeset
   266
	    ^ self
42edc97b2323 bcopy -> memcpy
Claus Gittinger <cg@exept.de>
parents: 4341
diff changeset
   267
	].
42edc97b2323 bcopy -> memcpy
Claus Gittinger <cg@exept.de>
parents: 4341
diff changeset
   268
	Transcript showCR:sock nextLine.
42edc97b2323 bcopy -> memcpy
Claus Gittinger <cg@exept.de>
parents: 4341
diff changeset
   269
42edc97b2323 bcopy -> memcpy
Claus Gittinger <cg@exept.de>
parents: 4341
diff changeset
   270
	sock nextPutAll:'HELO STX socket test'; cr.
42edc97b2323 bcopy -> memcpy
Claus Gittinger <cg@exept.de>
parents: 4341
diff changeset
   271
	Transcript showCR:sock nextLine.
42edc97b2323 bcopy -> memcpy
Claus Gittinger <cg@exept.de>
parents: 4341
diff changeset
   272
	sock close
42edc97b2323 bcopy -> memcpy
Claus Gittinger <cg@exept.de>
parents: 4341
diff changeset
   273
									[exEnd]
209
2152fceba563 finger example
Claus Gittinger <cg@exept.de>
parents: 208
diff changeset
   274
28
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   275
209
2152fceba563 finger example
Claus Gittinger <cg@exept.de>
parents: 208
diff changeset
   276
    example (connect to finger daemon, get users entry):
4414
42edc97b2323 bcopy -> memcpy
Claus Gittinger <cg@exept.de>
parents: 4341
diff changeset
   277
									[exBegin]
42edc97b2323 bcopy -> memcpy
Claus Gittinger <cg@exept.de>
parents: 4341
diff changeset
   278
	|sock entry|
42edc97b2323 bcopy -> memcpy
Claus Gittinger <cg@exept.de>
parents: 4341
diff changeset
   279
42edc97b2323 bcopy -> memcpy
Claus Gittinger <cg@exept.de>
parents: 4341
diff changeset
   280
	sock := Socket newTCPclientToHost:'localhost' port:'finger'.
42edc97b2323 bcopy -> memcpy
Claus Gittinger <cg@exept.de>
parents: 4341
diff changeset
   281
	sock isNil ifTrue:[
42edc97b2323 bcopy -> memcpy
Claus Gittinger <cg@exept.de>
parents: 4341
diff changeset
   282
	    self warn:'no finger daemon is running'.
42edc97b2323 bcopy -> memcpy
Claus Gittinger <cg@exept.de>
parents: 4341
diff changeset
   283
	    ^ self
42edc97b2323 bcopy -> memcpy
Claus Gittinger <cg@exept.de>
parents: 4341
diff changeset
   284
	].
42edc97b2323 bcopy -> memcpy
Claus Gittinger <cg@exept.de>
parents: 4341
diff changeset
   285
	sock useCRLF:true.
42edc97b2323 bcopy -> memcpy
Claus Gittinger <cg@exept.de>
parents: 4341
diff changeset
   286
	sock buffered:false.
42edc97b2323 bcopy -> memcpy
Claus Gittinger <cg@exept.de>
parents: 4341
diff changeset
   287
	sock isNil ifTrue:[
42edc97b2323 bcopy -> memcpy
Claus Gittinger <cg@exept.de>
parents: 4341
diff changeset
   288
	    Transcript showCR:'cannot connect to local finger daemon'
42edc97b2323 bcopy -> memcpy
Claus Gittinger <cg@exept.de>
parents: 4341
diff changeset
   289
	] ifFalse:[
42edc97b2323 bcopy -> memcpy
Claus Gittinger <cg@exept.de>
parents: 4341
diff changeset
   290
	    sock nextPutAll:(OperatingSystem getLoginName).
42edc97b2323 bcopy -> memcpy
Claus Gittinger <cg@exept.de>
parents: 4341
diff changeset
   291
	    sock cr.
42edc97b2323 bcopy -> memcpy
Claus Gittinger <cg@exept.de>
parents: 4341
diff changeset
   292
42edc97b2323 bcopy -> memcpy
Claus Gittinger <cg@exept.de>
parents: 4341
diff changeset
   293
	    entry := sock nextLine.
42edc97b2323 bcopy -> memcpy
Claus Gittinger <cg@exept.de>
parents: 4341
diff changeset
   294
	    Transcript showCR:entry.
42edc97b2323 bcopy -> memcpy
Claus Gittinger <cg@exept.de>
parents: 4341
diff changeset
   295
42edc97b2323 bcopy -> memcpy
Claus Gittinger <cg@exept.de>
parents: 4341
diff changeset
   296
	    sock close
42edc97b2323 bcopy -> memcpy
Claus Gittinger <cg@exept.de>
parents: 4341
diff changeset
   297
	]
42edc97b2323 bcopy -> memcpy
Claus Gittinger <cg@exept.de>
parents: 4341
diff changeset
   298
									[exEnd]
99
7d016cc30052 fixed & moved pingWalk from SNMPSession to here;
Claus Gittinger <cg@exept.de>
parents: 98
diff changeset
   299
28
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   300
    example (connect to an ftp server):
4414
42edc97b2323 bcopy -> memcpy
Claus Gittinger <cg@exept.de>
parents: 4341
diff changeset
   301
									[exBegin]
42edc97b2323 bcopy -> memcpy
Claus Gittinger <cg@exept.de>
parents: 4341
diff changeset
   302
	|sock|
42edc97b2323 bcopy -> memcpy
Claus Gittinger <cg@exept.de>
parents: 4341
diff changeset
   303
42edc97b2323 bcopy -> memcpy
Claus Gittinger <cg@exept.de>
parents: 4341
diff changeset
   304
	sock := Socket newTCPclientToHost:'www.exept.de' port:'ftp'.
42edc97b2323 bcopy -> memcpy
Claus Gittinger <cg@exept.de>
parents: 4341
diff changeset
   305
42edc97b2323 bcopy -> memcpy
Claus Gittinger <cg@exept.de>
parents: 4341
diff changeset
   306
	sock buffered:false.
42edc97b2323 bcopy -> memcpy
Claus Gittinger <cg@exept.de>
parents: 4341
diff changeset
   307
	Transcript showCR:sock nextLine.
42edc97b2323 bcopy -> memcpy
Claus Gittinger <cg@exept.de>
parents: 4341
diff changeset
   308
	sock nextPutAll:('USER ' , 'anonymous'); cr.
42edc97b2323 bcopy -> memcpy
Claus Gittinger <cg@exept.de>
parents: 4341
diff changeset
   309
	Transcript showCR:sock nextLine.
42edc97b2323 bcopy -> memcpy
Claus Gittinger <cg@exept.de>
parents: 4341
diff changeset
   310
	sock nextPutAll:('PASS ' , 'fooBar'); cr.
42edc97b2323 bcopy -> memcpy
Claus Gittinger <cg@exept.de>
parents: 4341
diff changeset
   311
	Transcript showCR:sock nextLine.
42edc97b2323 bcopy -> memcpy
Claus Gittinger <cg@exept.de>
parents: 4341
diff changeset
   312
	sock nextPutAll:'HELP'; cr.
42edc97b2323 bcopy -> memcpy
Claus Gittinger <cg@exept.de>
parents: 4341
diff changeset
   313
	[
42edc97b2323 bcopy -> memcpy
Claus Gittinger <cg@exept.de>
parents: 4341
diff changeset
   314
	    |line|
42edc97b2323 bcopy -> memcpy
Claus Gittinger <cg@exept.de>
parents: 4341
diff changeset
   315
	    line := sock nextLine.
42edc97b2323 bcopy -> memcpy
Claus Gittinger <cg@exept.de>
parents: 4341
diff changeset
   316
	    Transcript showCR:line.
42edc97b2323 bcopy -> memcpy
Claus Gittinger <cg@exept.de>
parents: 4341
diff changeset
   317
	    (line at:4) = $-
42edc97b2323 bcopy -> memcpy
Claus Gittinger <cg@exept.de>
parents: 4341
diff changeset
   318
	] whileTrue.
42edc97b2323 bcopy -> memcpy
Claus Gittinger <cg@exept.de>
parents: 4341
diff changeset
   319
	sock close.
42edc97b2323 bcopy -> memcpy
Claus Gittinger <cg@exept.de>
parents: 4341
diff changeset
   320
42edc97b2323 bcopy -> memcpy
Claus Gittinger <cg@exept.de>
parents: 4341
diff changeset
   321
	'don't know enough of the ftp protocol to continue here ...'
42edc97b2323 bcopy -> memcpy
Claus Gittinger <cg@exept.de>
parents: 4341
diff changeset
   322
									[exEnd]
28
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   323
99
7d016cc30052 fixed & moved pingWalk from SNMPSession to here;
Claus Gittinger <cg@exept.de>
parents: 98
diff changeset
   324
93
Claus Gittinger <cg@exept.de>
parents: 92
diff changeset
   325
    example (connect to an snmp server [UDP]):
3985
f4df11cffecf #OTHER by mawalch
mawalch
parents: 3843
diff changeset
   326
    Note: this is not a real connection, only the destination address is
4414
42edc97b2323 bcopy -> memcpy
Claus Gittinger <cg@exept.de>
parents: 4341
diff changeset
   327
	  being fixed.
42edc97b2323 bcopy -> memcpy
Claus Gittinger <cg@exept.de>
parents: 4341
diff changeset
   328
									[exBegin]
42edc97b2323 bcopy -> memcpy
Claus Gittinger <cg@exept.de>
parents: 4341
diff changeset
   329
	|sock port|
42edc97b2323 bcopy -> memcpy
Claus Gittinger <cg@exept.de>
parents: 4341
diff changeset
   330
42edc97b2323 bcopy -> memcpy
Claus Gittinger <cg@exept.de>
parents: 4341
diff changeset
   331
	sock := Socket newUDP.
42edc97b2323 bcopy -> memcpy
Claus Gittinger <cg@exept.de>
parents: 4341
diff changeset
   332
	port := Socket portOfService:'snmp'.
42edc97b2323 bcopy -> memcpy
Claus Gittinger <cg@exept.de>
parents: 4341
diff changeset
   333
	sock connectTo:'localhost' port:port.
42edc97b2323 bcopy -> memcpy
Claus Gittinger <cg@exept.de>
parents: 4341
diff changeset
   334
	sock buffered:false.
42edc97b2323 bcopy -> memcpy
Claus Gittinger <cg@exept.de>
parents: 4341
diff changeset
   335
	Transcript showCR:'got it'.
42edc97b2323 bcopy -> memcpy
Claus Gittinger <cg@exept.de>
parents: 4341
diff changeset
   336
	sock close.
42edc97b2323 bcopy -> memcpy
Claus Gittinger <cg@exept.de>
parents: 4341
diff changeset
   337
									[exEnd]
42
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   338
99
7d016cc30052 fixed & moved pingWalk from SNMPSession to here;
Claus Gittinger <cg@exept.de>
parents: 98
diff changeset
   339
42
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   340
    example (await connection from a client and read some data):
4414
42edc97b2323 bcopy -> memcpy
Claus Gittinger <cg@exept.de>
parents: 4341
diff changeset
   341
									[exBegin]
42edc97b2323 bcopy -> memcpy
Claus Gittinger <cg@exept.de>
parents: 4341
diff changeset
   342
	|connectSock sock|
42edc97b2323 bcopy -> memcpy
Claus Gittinger <cg@exept.de>
parents: 4341
diff changeset
   343
42edc97b2323 bcopy -> memcpy
Claus Gittinger <cg@exept.de>
parents: 4341
diff changeset
   344
	connectSock := Socket newTCPserverAtPort:9998.
42edc97b2323 bcopy -> memcpy
Claus Gittinger <cg@exept.de>
parents: 4341
diff changeset
   345
	connectSock isNil ifTrue:[
42edc97b2323 bcopy -> memcpy
Claus Gittinger <cg@exept.de>
parents: 4341
diff changeset
   346
	    Transcript showCR:'socket setup failed.'.
42edc97b2323 bcopy -> memcpy
Claus Gittinger <cg@exept.de>
parents: 4341
diff changeset
   347
	] ifFalse:[
42edc97b2323 bcopy -> memcpy
Claus Gittinger <cg@exept.de>
parents: 4341
diff changeset
   348
	    Transcript showCR:'listen ..'.
42edc97b2323 bcopy -> memcpy
Claus Gittinger <cg@exept.de>
parents: 4341
diff changeset
   349
	    (connectSock listenFor:5) ifFalse:[
42edc97b2323 bcopy -> memcpy
Claus Gittinger <cg@exept.de>
parents: 4341
diff changeset
   350
		Transcript showCR:'listen failed.'.
42edc97b2323 bcopy -> memcpy
Claus Gittinger <cg@exept.de>
parents: 4341
diff changeset
   351
	    ] ifTrue:[
42edc97b2323 bcopy -> memcpy
Claus Gittinger <cg@exept.de>
parents: 4341
diff changeset
   352
		Transcript showCR:'wait'.
42edc97b2323 bcopy -> memcpy
Claus Gittinger <cg@exept.de>
parents: 4341
diff changeset
   353
		connectSock readWait.
42edc97b2323 bcopy -> memcpy
Claus Gittinger <cg@exept.de>
parents: 4341
diff changeset
   354
		Transcript showCR:'accept'.
42edc97b2323 bcopy -> memcpy
Claus Gittinger <cg@exept.de>
parents: 4341
diff changeset
   355
		sock := connectSock accept.
42edc97b2323 bcopy -> memcpy
Claus Gittinger <cg@exept.de>
parents: 4341
diff changeset
   356
		sock isNil ifTrue:[
42edc97b2323 bcopy -> memcpy
Claus Gittinger <cg@exept.de>
parents: 4341
diff changeset
   357
		    Transcript showCR:'accept failed.'.
42edc97b2323 bcopy -> memcpy
Claus Gittinger <cg@exept.de>
parents: 4341
diff changeset
   358
		] ifFalse:[
42edc97b2323 bcopy -> memcpy
Claus Gittinger <cg@exept.de>
parents: 4341
diff changeset
   359
		    sock buffered:false.
42edc97b2323 bcopy -> memcpy
Claus Gittinger <cg@exept.de>
parents: 4341
diff changeset
   360
		    Transcript showCR:'server: got it'.
42edc97b2323 bcopy -> memcpy
Claus Gittinger <cg@exept.de>
parents: 4341
diff changeset
   361
		    'can now do transfer via sock'.
42edc97b2323 bcopy -> memcpy
Claus Gittinger <cg@exept.de>
parents: 4341
diff changeset
   362
		    Transcript showCR:'read'.
42edc97b2323 bcopy -> memcpy
Claus Gittinger <cg@exept.de>
parents: 4341
diff changeset
   363
		    Transcript showCR:('got: ' , sock nextLine).
42edc97b2323 bcopy -> memcpy
Claus Gittinger <cg@exept.de>
parents: 4341
diff changeset
   364
42edc97b2323 bcopy -> memcpy
Claus Gittinger <cg@exept.de>
parents: 4341
diff changeset
   365
		    Transcript showCR:'close'.
42edc97b2323 bcopy -> memcpy
Claus Gittinger <cg@exept.de>
parents: 4341
diff changeset
   366
		    sock close
42edc97b2323 bcopy -> memcpy
Claus Gittinger <cg@exept.de>
parents: 4341
diff changeset
   367
		].
42edc97b2323 bcopy -> memcpy
Claus Gittinger <cg@exept.de>
parents: 4341
diff changeset
   368
		connectSock close.
42edc97b2323 bcopy -> memcpy
Claus Gittinger <cg@exept.de>
parents: 4341
diff changeset
   369
	    ]
42edc97b2323 bcopy -> memcpy
Claus Gittinger <cg@exept.de>
parents: 4341
diff changeset
   370
	]
42edc97b2323 bcopy -> memcpy
Claus Gittinger <cg@exept.de>
parents: 4341
diff changeset
   371
									[exEnd]
42
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   372
99
7d016cc30052 fixed & moved pingWalk from SNMPSession to here;
Claus Gittinger <cg@exept.de>
parents: 98
diff changeset
   373
42
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   374
    example (connect to above server and send some data):
4414
42edc97b2323 bcopy -> memcpy
Claus Gittinger <cg@exept.de>
parents: 4341
diff changeset
   375
									[exBegin]
42edc97b2323 bcopy -> memcpy
Claus Gittinger <cg@exept.de>
parents: 4341
diff changeset
   376
	|sock|
42edc97b2323 bcopy -> memcpy
Claus Gittinger <cg@exept.de>
parents: 4341
diff changeset
   377
42edc97b2323 bcopy -> memcpy
Claus Gittinger <cg@exept.de>
parents: 4341
diff changeset
   378
	sock := Socket newTCPclientToHost:'localhost' port:9998.
42edc97b2323 bcopy -> memcpy
Claus Gittinger <cg@exept.de>
parents: 4341
diff changeset
   379
	sock isNil ifTrue:[
42edc97b2323 bcopy -> memcpy
Claus Gittinger <cg@exept.de>
parents: 4341
diff changeset
   380
	    Transcript showCR:'nope'
42edc97b2323 bcopy -> memcpy
Claus Gittinger <cg@exept.de>
parents: 4341
diff changeset
   381
	] ifFalse:[
42edc97b2323 bcopy -> memcpy
Claus Gittinger <cg@exept.de>
parents: 4341
diff changeset
   382
	    sock buffered:false.
42edc97b2323 bcopy -> memcpy
Claus Gittinger <cg@exept.de>
parents: 4341
diff changeset
   383
	    Transcript showCR:'client: got it'.
42edc97b2323 bcopy -> memcpy
Claus Gittinger <cg@exept.de>
parents: 4341
diff changeset
   384
	    'can now do transfer via sock'.
42edc97b2323 bcopy -> memcpy
Claus Gittinger <cg@exept.de>
parents: 4341
diff changeset
   385
	    Transcript showCR:'sending <hello>'.
42edc97b2323 bcopy -> memcpy
Claus Gittinger <cg@exept.de>
parents: 4341
diff changeset
   386
	    sock nextPutLine:'hello'.
42edc97b2323 bcopy -> memcpy
Claus Gittinger <cg@exept.de>
parents: 4341
diff changeset
   387
	    sock close
42edc97b2323 bcopy -> memcpy
Claus Gittinger <cg@exept.de>
parents: 4341
diff changeset
   388
	]
42edc97b2323 bcopy -> memcpy
Claus Gittinger <cg@exept.de>
parents: 4341
diff changeset
   389
									[exEnd]
117
03cefad7e40b UD socket example & interruptable bind
Claus Gittinger <cg@exept.de>
parents: 116
diff changeset
   390
03cefad7e40b UD socket example & interruptable bind
Claus Gittinger <cg@exept.de>
parents: 116
diff changeset
   391
    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
   392
4414
42edc97b2323 bcopy -> memcpy
Claus Gittinger <cg@exept.de>
parents: 4341
diff changeset
   393
	|connectSock sock|
42edc97b2323 bcopy -> memcpy
Claus Gittinger <cg@exept.de>
parents: 4341
diff changeset
   394
42edc97b2323 bcopy -> memcpy
Claus Gittinger <cg@exept.de>
parents: 4341
diff changeset
   395
	'/tmp/ud_socket' asFilename remove.
42edc97b2323 bcopy -> memcpy
Claus Gittinger <cg@exept.de>
parents: 4341
diff changeset
   396
	connectSock := Socket newUNIXserverAt:'/tmp/ud_socket'.
42edc97b2323 bcopy -> memcpy
Claus Gittinger <cg@exept.de>
parents: 4341
diff changeset
   397
	connectSock isNil ifTrue:[
42edc97b2323 bcopy -> memcpy
Claus Gittinger <cg@exept.de>
parents: 4341
diff changeset
   398
	    Transcript showCR:'socket setup failed.'.
42edc97b2323 bcopy -> memcpy
Claus Gittinger <cg@exept.de>
parents: 4341
diff changeset
   399
	] ifFalse:[
42edc97b2323 bcopy -> memcpy
Claus Gittinger <cg@exept.de>
parents: 4341
diff changeset
   400
	    Transcript showCR:'listen ..'.
42edc97b2323 bcopy -> memcpy
Claus Gittinger <cg@exept.de>
parents: 4341
diff changeset
   401
	    (connectSock listenFor:5) ifFalse:[
42edc97b2323 bcopy -> memcpy
Claus Gittinger <cg@exept.de>
parents: 4341
diff changeset
   402
		Transcript showCR:'listen failed.'.
42edc97b2323 bcopy -> memcpy
Claus Gittinger <cg@exept.de>
parents: 4341
diff changeset
   403
	    ] ifTrue:[
42edc97b2323 bcopy -> memcpy
Claus Gittinger <cg@exept.de>
parents: 4341
diff changeset
   404
		Transcript showCR:'wait'.
42edc97b2323 bcopy -> memcpy
Claus Gittinger <cg@exept.de>
parents: 4341
diff changeset
   405
		connectSock buffered:false.
42edc97b2323 bcopy -> memcpy
Claus Gittinger <cg@exept.de>
parents: 4341
diff changeset
   406
		connectSock readWait.
42edc97b2323 bcopy -> memcpy
Claus Gittinger <cg@exept.de>
parents: 4341
diff changeset
   407
		Transcript showCR:'accept'.
42edc97b2323 bcopy -> memcpy
Claus Gittinger <cg@exept.de>
parents: 4341
diff changeset
   408
		sock := connectSock accept.
42edc97b2323 bcopy -> memcpy
Claus Gittinger <cg@exept.de>
parents: 4341
diff changeset
   409
		sock isNil ifTrue:[
42edc97b2323 bcopy -> memcpy
Claus Gittinger <cg@exept.de>
parents: 4341
diff changeset
   410
		    Transcript showCR:'accept failed.'.
42edc97b2323 bcopy -> memcpy
Claus Gittinger <cg@exept.de>
parents: 4341
diff changeset
   411
		] ifFalse:[
42edc97b2323 bcopy -> memcpy
Claus Gittinger <cg@exept.de>
parents: 4341
diff changeset
   412
		    sock buffered:false.
42edc97b2323 bcopy -> memcpy
Claus Gittinger <cg@exept.de>
parents: 4341
diff changeset
   413
		    Transcript showCR:'server: got it'.
42edc97b2323 bcopy -> memcpy
Claus Gittinger <cg@exept.de>
parents: 4341
diff changeset
   414
		    'can now do transfer via sock'.
42edc97b2323 bcopy -> memcpy
Claus Gittinger <cg@exept.de>
parents: 4341
diff changeset
   415
		    Transcript showCR:'read'.
42edc97b2323 bcopy -> memcpy
Claus Gittinger <cg@exept.de>
parents: 4341
diff changeset
   416
		    Transcript showCR:('got: ' , sock nextLine).
42edc97b2323 bcopy -> memcpy
Claus Gittinger <cg@exept.de>
parents: 4341
diff changeset
   417
42edc97b2323 bcopy -> memcpy
Claus Gittinger <cg@exept.de>
parents: 4341
diff changeset
   418
		    Transcript showCR:'close'.
42edc97b2323 bcopy -> memcpy
Claus Gittinger <cg@exept.de>
parents: 4341
diff changeset
   419
		    sock close
42edc97b2323 bcopy -> memcpy
Claus Gittinger <cg@exept.de>
parents: 4341
diff changeset
   420
		].
42edc97b2323 bcopy -> memcpy
Claus Gittinger <cg@exept.de>
parents: 4341
diff changeset
   421
		connectSock close.
42edc97b2323 bcopy -> memcpy
Claus Gittinger <cg@exept.de>
parents: 4341
diff changeset
   422
	    ]
42edc97b2323 bcopy -> memcpy
Claus Gittinger <cg@exept.de>
parents: 4341
diff changeset
   423
	]
117
03cefad7e40b UD socket example & interruptable bind
Claus Gittinger <cg@exept.de>
parents: 116
diff changeset
   424
03cefad7e40b UD socket example & interruptable bind
Claus Gittinger <cg@exept.de>
parents: 116
diff changeset
   425
118
142d5c273454 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 117
diff changeset
   426
    example (connect to above server and send some data;
4414
42edc97b2323 bcopy -> memcpy
Claus Gittinger <cg@exept.de>
parents: 4341
diff changeset
   427
	     Notice, this fails, if above server code is executed in the same ST/X image
42edc97b2323 bcopy -> memcpy
Claus Gittinger <cg@exept.de>
parents: 4341
diff changeset
   428
		     (at least on LINUX), since the OS does not correctly handle
42edc97b2323 bcopy -> memcpy
Claus Gittinger <cg@exept.de>
parents: 4341
diff changeset
   429
		     a connect from within an interrupted accept system call
42edc97b2323 bcopy -> memcpy
Claus Gittinger <cg@exept.de>
parents: 4341
diff changeset
   430
		     On SGI's SVR4, this works ok
42edc97b2323 bcopy -> memcpy
Claus Gittinger <cg@exept.de>
parents: 4341
diff changeset
   431
									[exBegin]
42edc97b2323 bcopy -> memcpy
Claus Gittinger <cg@exept.de>
parents: 4341
diff changeset
   432
	|sock|
42edc97b2323 bcopy -> memcpy
Claus Gittinger <cg@exept.de>
parents: 4341
diff changeset
   433
42edc97b2323 bcopy -> memcpy
Claus Gittinger <cg@exept.de>
parents: 4341
diff changeset
   434
	sock := Socket newUNIXclientTo:'/tmp/ud_socket'.
42edc97b2323 bcopy -> memcpy
Claus Gittinger <cg@exept.de>
parents: 4341
diff changeset
   435
	sock isNil ifTrue:[
42edc97b2323 bcopy -> memcpy
Claus Gittinger <cg@exept.de>
parents: 4341
diff changeset
   436
	    Transcript showCR:'nope'
42edc97b2323 bcopy -> memcpy
Claus Gittinger <cg@exept.de>
parents: 4341
diff changeset
   437
	] ifFalse:[
42edc97b2323 bcopy -> memcpy
Claus Gittinger <cg@exept.de>
parents: 4341
diff changeset
   438
	    sock buffered:false.
42edc97b2323 bcopy -> memcpy
Claus Gittinger <cg@exept.de>
parents: 4341
diff changeset
   439
	    Transcript showCR:'client: got it'.
42edc97b2323 bcopy -> memcpy
Claus Gittinger <cg@exept.de>
parents: 4341
diff changeset
   440
	    'can now do transfer via sock'.
42edc97b2323 bcopy -> memcpy
Claus Gittinger <cg@exept.de>
parents: 4341
diff changeset
   441
	    Transcript showCR:'sending <hello>'.
42edc97b2323 bcopy -> memcpy
Claus Gittinger <cg@exept.de>
parents: 4341
diff changeset
   442
	    sock nextPutLine:'hello'.
42edc97b2323 bcopy -> memcpy
Claus Gittinger <cg@exept.de>
parents: 4341
diff changeset
   443
	    sock close
42edc97b2323 bcopy -> memcpy
Claus Gittinger <cg@exept.de>
parents: 4341
diff changeset
   444
	]
42edc97b2323 bcopy -> memcpy
Claus Gittinger <cg@exept.de>
parents: 4341
diff changeset
   445
									[exEnd]
1007
5267b5738779 UDP examples
Claus Gittinger <cg@exept.de>
parents: 1004
diff changeset
   446
5267b5738779 UDP examples
Claus Gittinger <cg@exept.de>
parents: 1004
diff changeset
   447
5267b5738779 UDP examples
Claus Gittinger <cg@exept.de>
parents: 1004
diff changeset
   448
    example (UDP await packet from a client and read some data):
4414
42edc97b2323 bcopy -> memcpy
Claus Gittinger <cg@exept.de>
parents: 4341
diff changeset
   449
									[exBegin]
42edc97b2323 bcopy -> memcpy
Claus Gittinger <cg@exept.de>
parents: 4341
diff changeset
   450
	|udpSock sock addr n dataBuffer|
42edc97b2323 bcopy -> memcpy
Claus Gittinger <cg@exept.de>
parents: 4341
diff changeset
   451
42edc97b2323 bcopy -> memcpy
Claus Gittinger <cg@exept.de>
parents: 4341
diff changeset
   452
	udpSock := Socket newUDPserverAtPort:9999.
42edc97b2323 bcopy -> memcpy
Claus Gittinger <cg@exept.de>
parents: 4341
diff changeset
   453
	udpSock isNil ifTrue:[
42edc97b2323 bcopy -> memcpy
Claus Gittinger <cg@exept.de>
parents: 4341
diff changeset
   454
	    Transcript showCR:'socket setup failed.'.
42edc97b2323 bcopy -> memcpy
Claus Gittinger <cg@exept.de>
parents: 4341
diff changeset
   455
	] ifFalse:[
42edc97b2323 bcopy -> memcpy
Claus Gittinger <cg@exept.de>
parents: 4341
diff changeset
   456
	    Transcript showCR:'wait'.
42edc97b2323 bcopy -> memcpy
Claus Gittinger <cg@exept.de>
parents: 4341
diff changeset
   457
	    udpSock readWait.
42edc97b2323 bcopy -> memcpy
Claus Gittinger <cg@exept.de>
parents: 4341
diff changeset
   458
42edc97b2323 bcopy -> memcpy
Claus Gittinger <cg@exept.de>
parents: 4341
diff changeset
   459
	    addr := IPSocketAddress new.
42edc97b2323 bcopy -> memcpy
Claus Gittinger <cg@exept.de>
parents: 4341
diff changeset
   460
	    dataBuffer := ByteArray new:1000.
42edc97b2323 bcopy -> memcpy
Claus Gittinger <cg@exept.de>
parents: 4341
diff changeset
   461
	    n := udpSock receiveFrom:addr buffer:dataBuffer start:1 for:dataBuffer size.
42edc97b2323 bcopy -> memcpy
Claus Gittinger <cg@exept.de>
parents: 4341
diff changeset
   462
	    n > 0 ifTrue:[
42edc97b2323 bcopy -> memcpy
Claus Gittinger <cg@exept.de>
parents: 4341
diff changeset
   463
		Transcript showCR:('got: ' , n printString , 'bytes  from ' , addr printString).
42edc97b2323 bcopy -> memcpy
Claus Gittinger <cg@exept.de>
parents: 4341
diff changeset
   464
		Transcript showCR:('data: ' , (dataBuffer copyTo:n) printString).
42edc97b2323 bcopy -> memcpy
Claus Gittinger <cg@exept.de>
parents: 4341
diff changeset
   465
	    ] ifFalse:[
42edc97b2323 bcopy -> memcpy
Claus Gittinger <cg@exept.de>
parents: 4341
diff changeset
   466
		Transcript showCR:'read failed'.
42edc97b2323 bcopy -> memcpy
Claus Gittinger <cg@exept.de>
parents: 4341
diff changeset
   467
	    ].
42edc97b2323 bcopy -> memcpy
Claus Gittinger <cg@exept.de>
parents: 4341
diff changeset
   468
42edc97b2323 bcopy -> memcpy
Claus Gittinger <cg@exept.de>
parents: 4341
diff changeset
   469
	    Transcript showCR:'close'.
42edc97b2323 bcopy -> memcpy
Claus Gittinger <cg@exept.de>
parents: 4341
diff changeset
   470
	    udpSock close
42edc97b2323 bcopy -> memcpy
Claus Gittinger <cg@exept.de>
parents: 4341
diff changeset
   471
	]
42edc97b2323 bcopy -> memcpy
Claus Gittinger <cg@exept.de>
parents: 4341
diff changeset
   472
									[exEnd]
1007
5267b5738779 UDP examples
Claus Gittinger <cg@exept.de>
parents: 1004
diff changeset
   473
    example (connect to above UDP server and send some data;
4414
42edc97b2323 bcopy -> memcpy
Claus Gittinger <cg@exept.de>
parents: 4341
diff changeset
   474
									[exBegin]
42edc97b2323 bcopy -> memcpy
Claus Gittinger <cg@exept.de>
parents: 4341
diff changeset
   475
	|sock|
42edc97b2323 bcopy -> memcpy
Claus Gittinger <cg@exept.de>
parents: 4341
diff changeset
   476
42edc97b2323 bcopy -> memcpy
Claus Gittinger <cg@exept.de>
parents: 4341
diff changeset
   477
	sock := Socket newUDP.
42edc97b2323 bcopy -> memcpy
Claus Gittinger <cg@exept.de>
parents: 4341
diff changeset
   478
	sock isNil ifTrue:[
42edc97b2323 bcopy -> memcpy
Claus Gittinger <cg@exept.de>
parents: 4341
diff changeset
   479
	    Transcript showCR:'nope'
42edc97b2323 bcopy -> memcpy
Claus Gittinger <cg@exept.de>
parents: 4341
diff changeset
   480
	] ifFalse:[
42edc97b2323 bcopy -> memcpy
Claus Gittinger <cg@exept.de>
parents: 4341
diff changeset
   481
	    sock sendTo:(IPSocketAddress new hostName:'localhost' port:9999) buffer:'hello world'.
42edc97b2323 bcopy -> memcpy
Claus Gittinger <cg@exept.de>
parents: 4341
diff changeset
   482
	    sock close
42edc97b2323 bcopy -> memcpy
Claus Gittinger <cg@exept.de>
parents: 4341
diff changeset
   483
	]
42edc97b2323 bcopy -> memcpy
Claus Gittinger <cg@exept.de>
parents: 4341
diff changeset
   484
									[exEnd]
99
7d016cc30052 fixed & moved pingWalk from SNMPSession to here;
Claus Gittinger <cg@exept.de>
parents: 98
diff changeset
   485
7d016cc30052 fixed & moved pingWalk from SNMPSession to here;
Claus Gittinger <cg@exept.de>
parents: 98
diff changeset
   486
    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
   487
    Note: it dosen't use ICMP ping, but tries to reache the echo service,
4414
42edc97b2323 bcopy -> memcpy
Claus Gittinger <cg@exept.de>
parents: 4341
diff changeset
   488
	  which is disabled on most OS.
42edc97b2323 bcopy -> memcpy
Claus Gittinger <cg@exept.de>
parents: 4341
diff changeset
   489
									[exBegin]
42edc97b2323 bcopy -> memcpy
Claus Gittinger <cg@exept.de>
parents: 4341
diff changeset
   490
	|myAddress list top hosts walkProcess port|
42edc97b2323 bcopy -> memcpy
Claus Gittinger <cg@exept.de>
parents: 4341
diff changeset
   491
42edc97b2323 bcopy -> memcpy
Claus Gittinger <cg@exept.de>
parents: 4341
diff changeset
   492
	myAddress := OperatingSystem getNetworkAddresses
42edc97b2323 bcopy -> memcpy
Claus Gittinger <cg@exept.de>
parents: 4341
diff changeset
   493
			keysAndValuesSelect:[:eachIFName :eachAddress|
42edc97b2323 bcopy -> memcpy
Claus Gittinger <cg@exept.de>
parents: 4341
diff changeset
   494
			    eachAddress isLocal not
42edc97b2323 bcopy -> memcpy
Claus Gittinger <cg@exept.de>
parents: 4341
diff changeset
   495
			    and:[eachIFName = 'wlan0']
42edc97b2323 bcopy -> memcpy
Claus Gittinger <cg@exept.de>
parents: 4341
diff changeset
   496
			].
42edc97b2323 bcopy -> memcpy
Claus Gittinger <cg@exept.de>
parents: 4341
diff changeset
   497
	myAddress := myAddress first hostAddress.
42edc97b2323 bcopy -> memcpy
Claus Gittinger <cg@exept.de>
parents: 4341
diff changeset
   498
42edc97b2323 bcopy -> memcpy
Claus Gittinger <cg@exept.de>
parents: 4341
diff changeset
   499
	port := Socket portOfService:'echo'.
42edc97b2323 bcopy -> memcpy
Claus Gittinger <cg@exept.de>
parents: 4341
diff changeset
   500
	port isNil ifTrue:[
42edc97b2323 bcopy -> memcpy
Claus Gittinger <cg@exept.de>
parents: 4341
diff changeset
   501
	    self error:'dont know echo port'.
42edc97b2323 bcopy -> memcpy
Claus Gittinger <cg@exept.de>
parents: 4341
diff changeset
   502
	    ^ self
42edc97b2323 bcopy -> memcpy
Claus Gittinger <cg@exept.de>
parents: 4341
diff changeset
   503
	].
42edc97b2323 bcopy -> memcpy
Claus Gittinger <cg@exept.de>
parents: 4341
diff changeset
   504
42edc97b2323 bcopy -> memcpy
Claus Gittinger <cg@exept.de>
parents: 4341
diff changeset
   505
	top := StandardSystemView new.
42edc97b2323 bcopy -> memcpy
Claus Gittinger <cg@exept.de>
parents: 4341
diff changeset
   506
	top label:'PING net walk'.
42edc97b2323 bcopy -> memcpy
Claus Gittinger <cg@exept.de>
parents: 4341
diff changeset
   507
42edc97b2323 bcopy -> memcpy
Claus Gittinger <cg@exept.de>
parents: 4341
diff changeset
   508
	list := ScrollableView for:ListView in:top.
42edc97b2323 bcopy -> memcpy
Claus Gittinger <cg@exept.de>
parents: 4341
diff changeset
   509
	list origin:0.0@0.0 corner:1.0@1.0.
42edc97b2323 bcopy -> memcpy
Claus Gittinger <cg@exept.de>
parents: 4341
diff changeset
   510
42edc97b2323 bcopy -> memcpy
Claus Gittinger <cg@exept.de>
parents: 4341
diff changeset
   511
	top openAndWait.
42edc97b2323 bcopy -> memcpy
Claus Gittinger <cg@exept.de>
parents: 4341
diff changeset
   512
42edc97b2323 bcopy -> memcpy
Claus Gittinger <cg@exept.de>
parents: 4341
diff changeset
   513
	walkProcess := [
42edc97b2323 bcopy -> memcpy
Claus Gittinger <cg@exept.de>
parents: 4341
diff changeset
   514
	    |l low hi direction tryHostID dottedName hostName conn addr|
42edc97b2323 bcopy -> memcpy
Claus Gittinger <cg@exept.de>
parents: 4341
diff changeset
   515
42edc97b2323 bcopy -> memcpy
Claus Gittinger <cg@exept.de>
parents: 4341
diff changeset
   516
	    l := SortedCollection new.
42edc97b2323 bcopy -> memcpy
Claus Gittinger <cg@exept.de>
parents: 4341
diff changeset
   517
42edc97b2323 bcopy -> memcpy
Claus Gittinger <cg@exept.de>
parents: 4341
diff changeset
   518
	    ' only works with type C-net
42edc97b2323 bcopy -> memcpy
Claus Gittinger <cg@exept.de>
parents: 4341
diff changeset
   519
	      the code below could simply do 1 to:254 do:[:hostID }
42edc97b2323 bcopy -> memcpy
Claus Gittinger <cg@exept.de>
parents: 4341
diff changeset
   520
	      but, to probe likely hosts earlier, the probing is done
42edc97b2323 bcopy -> memcpy
Claus Gittinger <cg@exept.de>
parents: 4341
diff changeset
   521
	      ping-pong like around my ip-address (assuming, that other machines
42edc97b2323 bcopy -> memcpy
Claus Gittinger <cg@exept.de>
parents: 4341
diff changeset
   522
	      have numbers around my own)'.
42edc97b2323 bcopy -> memcpy
Claus Gittinger <cg@exept.de>
parents: 4341
diff changeset
   523
42edc97b2323 bcopy -> memcpy
Claus Gittinger <cg@exept.de>
parents: 4341
diff changeset
   524
	    low := hi := (myAddress at:4).
42edc97b2323 bcopy -> memcpy
Claus Gittinger <cg@exept.de>
parents: 4341
diff changeset
   525
	    direction := 1.
42edc97b2323 bcopy -> memcpy
Claus Gittinger <cg@exept.de>
parents: 4341
diff changeset
   526
42edc97b2323 bcopy -> memcpy
Claus Gittinger <cg@exept.de>
parents: 4341
diff changeset
   527
	    [low > 0 or:[hi < 255]] whileTrue:[
42edc97b2323 bcopy -> memcpy
Claus Gittinger <cg@exept.de>
parents: 4341
diff changeset
   528
		direction > 0 ifTrue:[
42edc97b2323 bcopy -> memcpy
Claus Gittinger <cg@exept.de>
parents: 4341
diff changeset
   529
		    hi := hi + 1.
42edc97b2323 bcopy -> memcpy
Claus Gittinger <cg@exept.de>
parents: 4341
diff changeset
   530
		    tryHostID := hi.
42edc97b2323 bcopy -> memcpy
Claus Gittinger <cg@exept.de>
parents: 4341
diff changeset
   531
		    direction := -1.
42edc97b2323 bcopy -> memcpy
Claus Gittinger <cg@exept.de>
parents: 4341
diff changeset
   532
		] ifFalse:[
42edc97b2323 bcopy -> memcpy
Claus Gittinger <cg@exept.de>
parents: 4341
diff changeset
   533
		    low := low - 1.
42edc97b2323 bcopy -> memcpy
Claus Gittinger <cg@exept.de>
parents: 4341
diff changeset
   534
		    tryHostID := low.
42edc97b2323 bcopy -> memcpy
Claus Gittinger <cg@exept.de>
parents: 4341
diff changeset
   535
		    direction := 1.
42edc97b2323 bcopy -> memcpy
Claus Gittinger <cg@exept.de>
parents: 4341
diff changeset
   536
		].
42edc97b2323 bcopy -> memcpy
Claus Gittinger <cg@exept.de>
parents: 4341
diff changeset
   537
		(tryHostID between:1 and:254) ifTrue:[
42edc97b2323 bcopy -> memcpy
Claus Gittinger <cg@exept.de>
parents: 4341
diff changeset
   538
		    dottedName := (myAddress at:1) printString
42edc97b2323 bcopy -> memcpy
Claus Gittinger <cg@exept.de>
parents: 4341
diff changeset
   539
				  , '.' , (myAddress at:2) printString
42edc97b2323 bcopy -> memcpy
Claus Gittinger <cg@exept.de>
parents: 4341
diff changeset
   540
				  , '.' , (myAddress at:3) printString
42edc97b2323 bcopy -> memcpy
Claus Gittinger <cg@exept.de>
parents: 4341
diff changeset
   541
				  , '.' , tryHostID printString.
42edc97b2323 bcopy -> memcpy
Claus Gittinger <cg@exept.de>
parents: 4341
diff changeset
   542
42edc97b2323 bcopy -> memcpy
Claus Gittinger <cg@exept.de>
parents: 4341
diff changeset
   543
		    top label:'PING net walk - trying ' , dottedName.
42edc97b2323 bcopy -> memcpy
Claus Gittinger <cg@exept.de>
parents: 4341
diff changeset
   544
42edc97b2323 bcopy -> memcpy
Claus Gittinger <cg@exept.de>
parents: 4341
diff changeset
   545
		    top windowGroup withCursor:Cursor wait do:[
42edc97b2323 bcopy -> memcpy
Claus Gittinger <cg@exept.de>
parents: 4341
diff changeset
   546
			conn := Socket newTCPclientToHost:dottedName port:port withTimeout:1000.
42edc97b2323 bcopy -> memcpy
Claus Gittinger <cg@exept.de>
parents: 4341
diff changeset
   547
			conn notNil ifTrue:[
42edc97b2323 bcopy -> memcpy
Claus Gittinger <cg@exept.de>
parents: 4341
diff changeset
   548
			    addr := Socket ipAddressOfHost:dottedName.
42edc97b2323 bcopy -> memcpy
Claus Gittinger <cg@exept.de>
parents: 4341
diff changeset
   549
			    hostName := Socket hostWithIpAddress:addr.
42edc97b2323 bcopy -> memcpy
Claus Gittinger <cg@exept.de>
parents: 4341
diff changeset
   550
			    hostName isNil ifTrue:[
42edc97b2323 bcopy -> memcpy
Claus Gittinger <cg@exept.de>
parents: 4341
diff changeset
   551
				hostName :='?'
42edc97b2323 bcopy -> memcpy
Claus Gittinger <cg@exept.de>
parents: 4341
diff changeset
   552
			    ].
42edc97b2323 bcopy -> memcpy
Claus Gittinger <cg@exept.de>
parents: 4341
diff changeset
   553
			    l add:(dottedName paddedTo:15 with:Character space)
42edc97b2323 bcopy -> memcpy
Claus Gittinger <cg@exept.de>
parents: 4341
diff changeset
   554
				   , ' '
42edc97b2323 bcopy -> memcpy
Claus Gittinger <cg@exept.de>
parents: 4341
diff changeset
   555
				   , (hostName paddedTo:15 with:Character space)
42edc97b2323 bcopy -> memcpy
Claus Gittinger <cg@exept.de>
parents: 4341
diff changeset
   556
				   , ' up & reachable'.
42edc97b2323 bcopy -> memcpy
Claus Gittinger <cg@exept.de>
parents: 4341
diff changeset
   557
			    list list:l.
42edc97b2323 bcopy -> memcpy
Claus Gittinger <cg@exept.de>
parents: 4341
diff changeset
   558
			    conn close.
42edc97b2323 bcopy -> memcpy
Claus Gittinger <cg@exept.de>
parents: 4341
diff changeset
   559
			]
42edc97b2323 bcopy -> memcpy
Claus Gittinger <cg@exept.de>
parents: 4341
diff changeset
   560
		    ].
42edc97b2323 bcopy -> memcpy
Claus Gittinger <cg@exept.de>
parents: 4341
diff changeset
   561
		].
42edc97b2323 bcopy -> memcpy
Claus Gittinger <cg@exept.de>
parents: 4341
diff changeset
   562
	    ].
42edc97b2323 bcopy -> memcpy
Claus Gittinger <cg@exept.de>
parents: 4341
diff changeset
   563
	    top label:'PING reachable hosts'.
42edc97b2323 bcopy -> memcpy
Claus Gittinger <cg@exept.de>
parents: 4341
diff changeset
   564
	] forkAt:(Processor userBackgroundPriority).
42edc97b2323 bcopy -> memcpy
Claus Gittinger <cg@exept.de>
parents: 4341
diff changeset
   565
	walkProcess name:'ping net walker'.
42edc97b2323 bcopy -> memcpy
Claus Gittinger <cg@exept.de>
parents: 4341
diff changeset
   566
									[exEnd]
42edc97b2323 bcopy -> memcpy
Claus Gittinger <cg@exept.de>
parents: 4341
diff changeset
   567
42edc97b2323 bcopy -> memcpy
Claus Gittinger <cg@exept.de>
parents: 4341
diff changeset
   568
42edc97b2323 bcopy -> memcpy
Claus Gittinger <cg@exept.de>
parents: 4341
diff changeset
   569
	This example creates a simple UDP server that accepts
42edc97b2323 bcopy -> memcpy
Claus Gittinger <cg@exept.de>
parents: 4341
diff changeset
   570
	single packets from anybody and broadcasts them to all
42edc97b2323 bcopy -> memcpy
Claus Gittinger <cg@exept.de>
parents: 4341
diff changeset
   571
	clients that have connected so far.
42edc97b2323 bcopy -> memcpy
Claus Gittinger <cg@exept.de>
parents: 4341
diff changeset
   572
42edc97b2323 bcopy -> memcpy
Claus Gittinger <cg@exept.de>
parents: 4341
diff changeset
   573
									[exBegin]
42edc97b2323 bcopy -> memcpy
Claus Gittinger <cg@exept.de>
parents: 4341
diff changeset
   574
	| socket address buffer msgSize clients |
42edc97b2323 bcopy -> memcpy
Claus Gittinger <cg@exept.de>
parents: 4341
diff changeset
   575
	clients := Set new.
42edc97b2323 bcopy -> memcpy
Claus Gittinger <cg@exept.de>
parents: 4341
diff changeset
   576
	address := IPSocketAddress new.
42edc97b2323 bcopy -> memcpy
Claus Gittinger <cg@exept.de>
parents: 4341
diff changeset
   577
	buffer := String new: 1024.
42edc97b2323 bcopy -> memcpy
Claus Gittinger <cg@exept.de>
parents: 4341
diff changeset
   578
42edc97b2323 bcopy -> memcpy
Claus Gittinger <cg@exept.de>
parents: 4341
diff changeset
   579
	socket := self newUDPserverAtPort: 6666.
42edc97b2323 bcopy -> memcpy
Claus Gittinger <cg@exept.de>
parents: 4341
diff changeset
   580
42edc97b2323 bcopy -> memcpy
Claus Gittinger <cg@exept.de>
parents: 4341
diff changeset
   581
	Transcript showCR: 'server starting'.
42edc97b2323 bcopy -> memcpy
Claus Gittinger <cg@exept.de>
parents: 4341
diff changeset
   582
42edc97b2323 bcopy -> memcpy
Claus Gittinger <cg@exept.de>
parents: 4341
diff changeset
   583
	[
42edc97b2323 bcopy -> memcpy
Claus Gittinger <cg@exept.de>
parents: 4341
diff changeset
   584
	    [true] whileTrue: [
42edc97b2323 bcopy -> memcpy
Claus Gittinger <cg@exept.de>
parents: 4341
diff changeset
   585
		(socket readWaitWithTimeoutMs: 200) ifFalse: [
42edc97b2323 bcopy -> memcpy
Claus Gittinger <cg@exept.de>
parents: 4341
diff changeset
   586
		    msgSize := socket
42edc97b2323 bcopy -> memcpy
Claus Gittinger <cg@exept.de>
parents: 4341
diff changeset
   587
			    receiveFrom: address
42edc97b2323 bcopy -> memcpy
Claus Gittinger <cg@exept.de>
parents: 4341
diff changeset
   588
			    buffer: buffer
42edc97b2323 bcopy -> memcpy
Claus Gittinger <cg@exept.de>
parents: 4341
diff changeset
   589
			    start: 1
42edc97b2323 bcopy -> memcpy
Claus Gittinger <cg@exept.de>
parents: 4341
diff changeset
   590
			    for: buffer size.
42edc97b2323 bcopy -> memcpy
Claus Gittinger <cg@exept.de>
parents: 4341
diff changeset
   591
42edc97b2323 bcopy -> memcpy
Claus Gittinger <cg@exept.de>
parents: 4341
diff changeset
   592
		    clients add: address copy.
42edc97b2323 bcopy -> memcpy
Claus Gittinger <cg@exept.de>
parents: 4341
diff changeset
   593
		    clients do: [ :clientAddress |
42edc97b2323 bcopy -> memcpy
Claus Gittinger <cg@exept.de>
parents: 4341
diff changeset
   594
			    socket
42edc97b2323 bcopy -> memcpy
Claus Gittinger <cg@exept.de>
parents: 4341
diff changeset
   595
				    sendTo: clientAddress
42edc97b2323 bcopy -> memcpy
Claus Gittinger <cg@exept.de>
parents: 4341
diff changeset
   596
				    buffer: buffer
42edc97b2323 bcopy -> memcpy
Claus Gittinger <cg@exept.de>
parents: 4341
diff changeset
   597
				    start: 1
42edc97b2323 bcopy -> memcpy
Claus Gittinger <cg@exept.de>
parents: 4341
diff changeset
   598
				    for: msgSize]]
42edc97b2323 bcopy -> memcpy
Claus Gittinger <cg@exept.de>
parents: 4341
diff changeset
   599
	    ]
42edc97b2323 bcopy -> memcpy
Claus Gittinger <cg@exept.de>
parents: 4341
diff changeset
   600
	] ensure:[
42edc97b2323 bcopy -> memcpy
Claus Gittinger <cg@exept.de>
parents: 4341
diff changeset
   601
	    Transcript showCR: 'server shutting down'.
42edc97b2323 bcopy -> memcpy
Claus Gittinger <cg@exept.de>
parents: 4341
diff changeset
   602
	    socket close
42edc97b2323 bcopy -> memcpy
Claus Gittinger <cg@exept.de>
parents: 4341
diff changeset
   603
	]
42edc97b2323 bcopy -> memcpy
Claus Gittinger <cg@exept.de>
parents: 4341
diff changeset
   604
									[exEnd]
817
eda0065cbd47 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 814
diff changeset
   605
eda0065cbd47 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 814
diff changeset
   606
   send a datagram to above server:
4414
42edc97b2323 bcopy -> memcpy
Claus Gittinger <cg@exept.de>
parents: 4341
diff changeset
   607
									[exBegin]
42edc97b2323 bcopy -> memcpy
Claus Gittinger <cg@exept.de>
parents: 4341
diff changeset
   608
42edc97b2323 bcopy -> memcpy
Claus Gittinger <cg@exept.de>
parents: 4341
diff changeset
   609
	| socket address buffer host msg |
42edc97b2323 bcopy -> memcpy
Claus Gittinger <cg@exept.de>
parents: 4341
diff changeset
   610
42edc97b2323 bcopy -> memcpy
Claus Gittinger <cg@exept.de>
parents: 4341
diff changeset
   611
	host := Dialog
42edc97b2323 bcopy -> memcpy
Claus Gittinger <cg@exept.de>
parents: 4341
diff changeset
   612
		request: 'What is the name of the server''s host?'
42edc97b2323 bcopy -> memcpy
Claus Gittinger <cg@exept.de>
parents: 4341
diff changeset
   613
		initialAnswer: 'localhost'.
42edc97b2323 bcopy -> memcpy
Claus Gittinger <cg@exept.de>
parents: 4341
diff changeset
   614
42edc97b2323 bcopy -> memcpy
Claus Gittinger <cg@exept.de>
parents: 4341
diff changeset
   615
	socket := self newUDP.
42edc97b2323 bcopy -> memcpy
Claus Gittinger <cg@exept.de>
parents: 4341
diff changeset
   616
42edc97b2323 bcopy -> memcpy
Claus Gittinger <cg@exept.de>
parents: 4341
diff changeset
   617
	address := IPSocketAddress hostName: host port: 6666.
42edc97b2323 bcopy -> memcpy
Claus Gittinger <cg@exept.de>
parents: 4341
diff changeset
   618
42edc97b2323 bcopy -> memcpy
Claus Gittinger <cg@exept.de>
parents: 4341
diff changeset
   619
	buffer := ByteArray new: 1000.
42edc97b2323 bcopy -> memcpy
Claus Gittinger <cg@exept.de>
parents: 4341
diff changeset
   620
	[
42edc97b2323 bcopy -> memcpy
Claus Gittinger <cg@exept.de>
parents: 4341
diff changeset
   621
	    [(msg := Dialog request: 'Say something') isEmpty] whileFalse:[
42edc97b2323 bcopy -> memcpy
Claus Gittinger <cg@exept.de>
parents: 4341
diff changeset
   622
		| replySize stream |
42edc97b2323 bcopy -> memcpy
Claus Gittinger <cg@exept.de>
parents: 4341
diff changeset
   623
42edc97b2323 bcopy -> memcpy
Claus Gittinger <cg@exept.de>
parents: 4341
diff changeset
   624
		socket writeWait.
42edc97b2323 bcopy -> memcpy
Claus Gittinger <cg@exept.de>
parents: 4341
diff changeset
   625
		stream := buffer writeStream.
42edc97b2323 bcopy -> memcpy
Claus Gittinger <cg@exept.de>
parents: 4341
diff changeset
   626
		stream nextPutAll: msg.
42edc97b2323 bcopy -> memcpy
Claus Gittinger <cg@exept.de>
parents: 4341
diff changeset
   627
		socket sendTo:address buffer:buffer start:1 for:stream position.
42edc97b2323 bcopy -> memcpy
Claus Gittinger <cg@exept.de>
parents: 4341
diff changeset
   628
		socket readWait.
42edc97b2323 bcopy -> memcpy
Claus Gittinger <cg@exept.de>
parents: 4341
diff changeset
   629
42edc97b2323 bcopy -> memcpy
Claus Gittinger <cg@exept.de>
parents: 4341
diff changeset
   630
		replySize := socket receiveFrom:address buffer:buffer.
42edc97b2323 bcopy -> memcpy
Claus Gittinger <cg@exept.de>
parents: 4341
diff changeset
   631
		replySize > 0 ifTrue: [
42edc97b2323 bcopy -> memcpy
Claus Gittinger <cg@exept.de>
parents: 4341
diff changeset
   632
		    Transcript cr; nextPutAll: 'Server acknowledged: '.
42edc97b2323 bcopy -> memcpy
Claus Gittinger <cg@exept.de>
parents: 4341
diff changeset
   633
		    Transcript show: ((buffer copyFrom: 1 to: replySize) asString)
42edc97b2323 bcopy -> memcpy
Claus Gittinger <cg@exept.de>
parents: 4341
diff changeset
   634
		]
42edc97b2323 bcopy -> memcpy
Claus Gittinger <cg@exept.de>
parents: 4341
diff changeset
   635
	    ]
42edc97b2323 bcopy -> memcpy
Claus Gittinger <cg@exept.de>
parents: 4341
diff changeset
   636
	] ensure: [socket close].
42edc97b2323 bcopy -> memcpy
Claus Gittinger <cg@exept.de>
parents: 4341
diff changeset
   637
	Transcript cr
42edc97b2323 bcopy -> memcpy
Claus Gittinger <cg@exept.de>
parents: 4341
diff changeset
   638
									[exEnd]
1316
ffe05bfee9b5 example
Claus Gittinger <cg@exept.de>
parents: 1313
diff changeset
   639
ffe05bfee9b5 example
Claus Gittinger <cg@exept.de>
parents: 1313
diff changeset
   640
ffe05bfee9b5 example
Claus Gittinger <cg@exept.de>
parents: 1313
diff changeset
   641
   loopBack:
4414
42edc97b2323 bcopy -> memcpy
Claus Gittinger <cg@exept.de>
parents: 4341
diff changeset
   642
									[exBegin]
42edc97b2323 bcopy -> memcpy
Claus Gittinger <cg@exept.de>
parents: 4341
diff changeset
   643
42edc97b2323 bcopy -> memcpy
Claus Gittinger <cg@exept.de>
parents: 4341
diff changeset
   644
	|readerTask readingSocket writingSocket|
42edc97b2323 bcopy -> memcpy
Claus Gittinger <cg@exept.de>
parents: 4341
diff changeset
   645
42edc97b2323 bcopy -> memcpy
Claus Gittinger <cg@exept.de>
parents: 4341
diff changeset
   646
	readingSocket := self newTCPserverAtPort:9999.
42edc97b2323 bcopy -> memcpy
Claus Gittinger <cg@exept.de>
parents: 4341
diff changeset
   647
	readerTask :=
42edc97b2323 bcopy -> memcpy
Claus Gittinger <cg@exept.de>
parents: 4341
diff changeset
   648
	    [
42edc97b2323 bcopy -> memcpy
Claus Gittinger <cg@exept.de>
parents: 4341
diff changeset
   649
		|connection|
42edc97b2323 bcopy -> memcpy
Claus Gittinger <cg@exept.de>
parents: 4341
diff changeset
   650
42edc97b2323 bcopy -> memcpy
Claus Gittinger <cg@exept.de>
parents: 4341
diff changeset
   651
		readingSocket listenFor:1.
42edc97b2323 bcopy -> memcpy
Claus Gittinger <cg@exept.de>
parents: 4341
diff changeset
   652
		connection := readingSocket accept.
42edc97b2323 bcopy -> memcpy
Claus Gittinger <cg@exept.de>
parents: 4341
diff changeset
   653
		readingSocket close.
42edc97b2323 bcopy -> memcpy
Claus Gittinger <cg@exept.de>
parents: 4341
diff changeset
   654
		[connection atEnd] whileFalse:[
42edc97b2323 bcopy -> memcpy
Claus Gittinger <cg@exept.de>
parents: 4341
diff changeset
   655
		    Transcript showCR:(connection nextLine).
42edc97b2323 bcopy -> memcpy
Claus Gittinger <cg@exept.de>
parents: 4341
diff changeset
   656
		].
42edc97b2323 bcopy -> memcpy
Claus Gittinger <cg@exept.de>
parents: 4341
diff changeset
   657
		connection close.
42edc97b2323 bcopy -> memcpy
Claus Gittinger <cg@exept.de>
parents: 4341
diff changeset
   658
	    ] fork.
42edc97b2323 bcopy -> memcpy
Claus Gittinger <cg@exept.de>
parents: 4341
diff changeset
   659
42edc97b2323 bcopy -> memcpy
Claus Gittinger <cg@exept.de>
parents: 4341
diff changeset
   660
	Delay waitForSeconds:1.
42edc97b2323 bcopy -> memcpy
Claus Gittinger <cg@exept.de>
parents: 4341
diff changeset
   661
	writingSocket := self newTCPclientToHost:'localhost' port:9999.
42edc97b2323 bcopy -> memcpy
Claus Gittinger <cg@exept.de>
parents: 4341
diff changeset
   662
	writingSocket nextPutLine:'Hello'.
42edc97b2323 bcopy -> memcpy
Claus Gittinger <cg@exept.de>
parents: 4341
diff changeset
   663
	writingSocket nextPutLine:'World'.
42edc97b2323 bcopy -> memcpy
Claus Gittinger <cg@exept.de>
parents: 4341
diff changeset
   664
	writingSocket close.
42edc97b2323 bcopy -> memcpy
Claus Gittinger <cg@exept.de>
parents: 4341
diff changeset
   665
									[exEnd]
25
996051271ce9 *** empty log message ***
claus
parents: 21
diff changeset
   666
"
996051271ce9 *** empty log message ***
claus
parents: 21
diff changeset
   667
! !
996051271ce9 *** empty log message ***
claus
parents: 21
diff changeset
   668
1462
5602fce52b42 squeak stuff
Claus Gittinger <cg@exept.de>
parents: 1413
diff changeset
   669
!Socket class methodsFor:'instance creation'!
126
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
   670
3059
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
   671
bindTo:aSocketAddress type:aTypeSymbol
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
   672
    "create a socket for a specific type
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
   673
     and bind it to aSocketAddress.
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
   674
     Type must be:
3217
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
   675
	#stream, #datagram or #raw
3059
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
   676
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
   677
     Neither connect nor connect-wait is done."
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
   678
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
   679
    |newSock|
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
   680
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
   681
    newSock := self domain:aSocketAddress domain type:aTypeSymbol.
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
   682
    [
3217
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
   683
	newSock bindTo:aSocketAddress reuseAddress:true.
3059
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
   684
    ] ifCurtailed:[
3217
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
   685
	newSock close.
3059
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
   686
    ].
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
   687
    ^ newSock
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
   688
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
   689
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
   690
    "
3217
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
   691
	Socket bindTo:(IPSocketAddress anyHost port:8081) type:#stream.
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
   692
	Socket bindTo:(IPv6SocketAddress anyHost port:8081) type:#datagram.
3059
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
126
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
   696
domain:domainSymbol type:type
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
   697
    "create a socket for domain and type -
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
   698
     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
   699
     Domain must be one of the symbols:
3217
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
   700
	#inet, #unix, #appletalk, #decnet, #xns, ...;
819
4cc15700d123 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 817
diff changeset
   701
     Type must be:
3217
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
   702
	#stream, #datagram or #raw
3059
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
   703
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
   704
     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
   705
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
   706
    ^ self new domain:domainSymbol type:type
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
   707
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
   708
    "
3059
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
   709
     Socket domain:#AF_INET type:#stream
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
   710
     Socket domain:#AF_INET type:#datagram
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
   711
     Socket domain:#AF_INET6 type:#stream
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
   712
     Socket domain:#AF_INET6 type:#datagram
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
   713
     Socket domain:#AF_UNIX type:#stream
126
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
   714
    "
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
   715
!
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
   716
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
   717
newTCP
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
   718
    "create a TCP socket - no binding or other setup is done,
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
   719
     neither connect nor connect-wait is done."
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
   720
3059
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
   721
    ^ self new domain:#'AF_INET' type:#stream
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
   722
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
   723
    "
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
   724
      Socket newTCP
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
   725
    "
126
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
   726
!
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
   727
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
   728
newTCP:aServiceOrNil
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
   729
    "create a TCP socket for a service -
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
   730
     neither connect nor connect-wait is done."
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
   731
3059
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
   732
    |newSock socketAddress socketAddressClass|
126
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
   733
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
   734
    newSock := self newTCP.
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
   735
    (newSock notNil and:[aServiceOrNil notNil]) ifTrue:[
3217
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
   736
	[
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
   737
	    socketAddressClass := newSock socketAddressClass.
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
   738
	    socketAddress := socketAddressClass hostName:nil serviceName:aServiceOrNil type:#stream.
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
   739
	    socketAddress hostAddress:socketAddressClass anyAddress.
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
   740
	    newSock bindTo:socketAddress reuseAddress:true.
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
   741
	] ifCurtailed:[
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
   742
	    newSock close.
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
   743
	]
126
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
   744
    ].
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
   745
    ^ newSock
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
   746
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
   747
1911
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
   748
    "
3217
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
   749
	Socket newTCP:'http-alt'.
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
   750
	Socket newTCP:9996.
1911
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
   751
    "
126
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
   752
!
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
   753
576
13acab81fad0 more ST80 compatibility
ca
parents: 572
diff changeset
   754
newTCPclientToAddress:aHostAddress port:aService
13acab81fad0 more ST80 compatibility
ca
parents: 572
diff changeset
   755
    "create a new TCP client socket connecting to a service.
13acab81fad0 more ST80 compatibility
ca
parents: 572
diff changeset
   756
     Return a socket instance if ok, nil on failure.
13acab81fad0 more ST80 compatibility
ca
parents: 572
diff changeset
   757
     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
   758
     not the whole smalltalk).
576
13acab81fad0 more ST80 compatibility
ca
parents: 572
diff changeset
   759
     See also: #newTCPclientToAddress:port:withTimeout:"
13acab81fad0 more ST80 compatibility
ca
parents: 572
diff changeset
   760
13acab81fad0 more ST80 compatibility
ca
parents: 572
diff changeset
   761
    ^ self newTCPclientToAddress:aHostAddress port:aService withTimeout:nil
13acab81fad0 more ST80 compatibility
ca
parents: 572
diff changeset
   762
!
13acab81fad0 more ST80 compatibility
ca
parents: 572
diff changeset
   763
4570
39e965ca8d06 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4568
diff changeset
   764
newTCPclientToAddress:aSocketAddressOrByteArray port:aService withTimeout:milliSecondsOrTimeDuration
576
13acab81fad0 more ST80 compatibility
ca
parents: 572
diff changeset
   765
    "create a new TCP client socket connecting to a service.
13acab81fad0 more ST80 compatibility
ca
parents: 572
diff changeset
   766
     Return a socket instance if ok, nil on failure.
13acab81fad0 more ST80 compatibility
ca
parents: 572
diff changeset
   767
     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
   768
     and return nil."
576
13acab81fad0 more ST80 compatibility
ca
parents: 572
diff changeset
   769
3059
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
   770
    |port socketAddress|
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
   771
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
   772
    aService isString ifTrue:[
4570
39e965ca8d06 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4568
diff changeset
   773
        port := self portOfService:aService protocol:#tcp.
3059
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
   774
    ] ifFalse:[
4570
39e965ca8d06 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4568
diff changeset
   775
        port := aService.
3059
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
   776
    ].
3217
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
   777
    socketAddress := aSocketAddressOrByteArray isSocketAddress
4570
39e965ca8d06 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4568
diff changeset
   778
                        ifTrue:[aSocketAddressOrByteArray]
39e965ca8d06 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4568
diff changeset
   779
                        ifFalse:[
39e965ca8d06 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4568
diff changeset
   780
                            "Passing ByteArrays is obsolete and only supported for IPv4"
39e965ca8d06 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4568
diff changeset
   781
                            IPSocketAddress hostAddress:aSocketAddressOrByteArray
39e965ca8d06 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4568
diff changeset
   782
                        ].
3059
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
   783
    port notNil ifTrue:[
4570
39e965ca8d06 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4568
diff changeset
   784
        socketAddress port:port.
3059
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
   785
    ].
4570
39e965ca8d06 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4568
diff changeset
   786
    ^ self newTCPclientToAddress:socketAddress withTimeout:milliSecondsOrTimeDuration
39e965ca8d06 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4568
diff changeset
   787
39e965ca8d06 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4568
diff changeset
   788
    "Modified (format): / 19-01-2018 / 18:26:51 / stefan"
576
13acab81fad0 more ST80 compatibility
ca
parents: 572
diff changeset
   789
!
13acab81fad0 more ST80 compatibility
ca
parents: 572
diff changeset
   790
4570
39e965ca8d06 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4568
diff changeset
   791
newTCPclientToAddress:aSocketAddress withTimeout:milliSecondsOrTimeDuration
126
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
   792
    "create a new TCP client socket connecting to a service.
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
   793
     Return a socket instance if ok, nil on failure.
3059
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
   794
     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
   795
     and return nil."
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
   796
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
   797
    |socket|
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
   798
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
   799
    socket := self domain:aSocketAddress domain type:#stream.
4570
39e965ca8d06 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4568
diff changeset
   800
    ^ [
39e965ca8d06 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4568
diff changeset
   801
        (socket connectTo:aSocketAddress withTimeout:milliSecondsOrTimeDuration) 
39e965ca8d06 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4568
diff changeset
   802
        ifTrue:[socket] ifFalse:[socket close. nil]
39e965ca8d06 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4568
diff changeset
   803
    ] ifCurtailed:[
39e965ca8d06 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4568
diff changeset
   804
        socket close.
3059
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
   805
    ].
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
    "
4570
39e965ca8d06 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4568
diff changeset
   808
        self newTCPclientToAddress:(IPv6SocketAddress hostName:'www.exept.de' port:80) withTimeout:nil
3059
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
   809
    "
4570
39e965ca8d06 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4568
diff changeset
   810
39e965ca8d06 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4568
diff changeset
   811
    "Modified (format): / 19-01-2018 / 18:22:30 / stefan"
3059
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.
3985
f4df11cffecf #OTHER by mawalch
mawalch
parents: 3843
diff changeset
   816
     If hostNameOrAddress is a string, try all the resolved addresses regardless
3988
7bf762b79544 #DOCUMENTATION by mawalch
mawalch
parents: 3985
diff changeset
   817
     whether for IPv4 or IPv6.
3059
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
3590
3487165a9cdf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3550
diff changeset
   823
    ^ self
4414
42edc97b2323 bcopy -> memcpy
Claus Gittinger <cg@exept.de>
parents: 4341
diff changeset
   824
	newTCPclientToHost:hostNameOrAddress
42edc97b2323 bcopy -> memcpy
Claus Gittinger <cg@exept.de>
parents: 4341
diff changeset
   825
	port:aPortOrServiceName
42edc97b2323 bcopy -> memcpy
Claus Gittinger <cg@exept.de>
parents: 4341
diff changeset
   826
	domain:self defaultIpDomainForConnect
42edc97b2323 bcopy -> memcpy
Claus Gittinger <cg@exept.de>
parents: 4341
diff changeset
   827
	withTimeout:nil
126
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
    "
4239
827d8755965f #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4234
diff changeset
   830
      Socket newTCPclientToHost:'www.exept.de' port:'https'
126
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
   831
    "
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
   832
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
   833
    "Created: 31.10.1995 / 18:54:11 / cg"
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
   834
!
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
   835
4570
39e965ca8d06 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4568
diff changeset
   836
newTCPclientToHost:hostNameOrAddress port:aPortOrServiceName domain:aDomainSymbolOrNil withTimeout:milliSecondsOrTimeDuration
3059
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
   837
    "create a new TCP client socket connecting to a service on hostNameOrAddress.
3985
f4df11cffecf #OTHER by mawalch
mawalch
parents: 3843
diff changeset
   838
     If hostNameOrAddress is a string, try all the resolved addresses.
126
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
   839
     Return a socket instance if ok, nil on failure.
3059
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
   840
     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
   841
     Set aDomainSymbolOrNil to nil, to try all protocols.
4570
39e965ca8d06 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4568
diff changeset
   842
     If the milliSecondsOrTimeDuration arg is nonNil, stop trying to connect after that many milliSecondsOrTimeDurationeconds
3059
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
   843
     and return nil."
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
   844
4570
39e965ca8d06 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4568
diff changeset
   845
    |socket addressList lastDomainSymbol lastNotification|
3059
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
   846
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
   847
    hostNameOrAddress isString ifFalse:[
4570
39e965ca8d06 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4568
diff changeset
   848
        ^ self newTCPclientToAddress:hostNameOrAddress port:aPortOrServiceName withTimeout:milliSecondsOrTimeDuration.
126
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
   849
    ].
3059
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
   850
4341
2b08cb3ff1a3 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 4320
diff changeset
   851
    addressList := SocketAddress
4570
39e965ca8d06 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4568
diff changeset
   852
                        allForHostName:hostNameOrAddress
39e965ca8d06 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4568
diff changeset
   853
                        serviceName:aPortOrServiceName
39e965ca8d06 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4568
diff changeset
   854
                        domain:aDomainSymbolOrNil
39e965ca8d06 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4568
diff changeset
   855
                        type:#stream.
4341
2b08cb3ff1a3 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 4320
diff changeset
   856
2b08cb3ff1a3 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 4320
diff changeset
   857
    addressList do:[:eachAddress|
4570
39e965ca8d06 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4568
diff changeset
   858
        |domainSymbol|
39e965ca8d06 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4568
diff changeset
   859
39e965ca8d06 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4568
diff changeset
   860
        domainSymbol := eachAddress domain.
39e965ca8d06 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4568
diff changeset
   861
        domainSymbol ~~ lastDomainSymbol ifTrue:[
39e965ca8d06 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4568
diff changeset
   862
            socket notNil ifTrue:[
39e965ca8d06 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4568
diff changeset
   863
                socket close.
39e965ca8d06 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4568
diff changeset
   864
            ].
39e965ca8d06 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4568
diff changeset
   865
            socket := self new domain:domainSymbol type:#stream.
39e965ca8d06 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4568
diff changeset
   866
            lastDomainSymbol := domainSymbol.
39e965ca8d06 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4568
diff changeset
   867
        ].
39e965ca8d06 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4568
diff changeset
   868
        [
39e965ca8d06 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4568
diff changeset
   869
            (socket connectTo:eachAddress withTimeout:milliSecondsOrTimeDuration) ifTrue:[
39e965ca8d06 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4568
diff changeset
   870
                ^ socket.
39e965ca8d06 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4568
diff changeset
   871
            ].
39e965ca8d06 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4568
diff changeset
   872
        ] on:SocketErrorNotification do:[:ex|
39e965ca8d06 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4568
diff changeset
   873
            lastNotification := ex.
39e965ca8d06 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4568
diff changeset
   874
        ].
3059
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
   875
    ].
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
   876
    socket notNil ifTrue:[
4570
39e965ca8d06 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4568
diff changeset
   877
        socket close.
39e965ca8d06 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4568
diff changeset
   878
    ].
39e965ca8d06 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4568
diff changeset
   879
    lastNotification notNil ifTrue:[
39e965ca8d06 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4568
diff changeset
   880
        "if someone is interested in the notification - raise the last one"
39e965ca8d06 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4568
diff changeset
   881
        lastNotification raiseRequest.
3059
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
   882
    ].
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
   883
    ^ nil.
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
   884
126
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
   885
    "
3059
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
   886
      Socket newTCPclientToHost:'www.exept.de' port:80 domain:#'AF_INET' withTimeout:1000.
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
   887
      Socket newTCPclientToHost:'www.exept.de' port:80 domain:#'AF_INET6' withTimeout:1000.
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
   888
      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
   889
      Socket newTCPclientToHost:'localhost' port:'nntp' withTimeout:1000
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
   890
    "
604
b302a21afece Remove redundant code.
Stefan Vogel <sv@exept.de>
parents: 589
diff changeset
   891
4570
39e965ca8d06 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4568
diff changeset
   892
    "Modified: / 19-01-2018 / 18:12:29 / stefan"
126
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
   893
!
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
   894
4570
39e965ca8d06 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4568
diff changeset
   895
newTCPclientToHost:hostNameOrAddress port:aPortOrServiceName withTimeout:milliSecondsOrTimeDuration
3059
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
   896
    "create a new TCP client socket connecting to a service on hostNameOrAddress.
3985
f4df11cffecf #OTHER by mawalch
mawalch
parents: 3843
diff changeset
   897
     If hostNameOrAddress is a string, try all the resolved addresses regardless
3988
7bf762b79544 #DOCUMENTATION by mawalch
mawalch
parents: 3985
diff changeset
   898
     whether for IPv4 or IPv6.
3059
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
   899
     Return a socket instance if ok, nil on failure.
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
   900
     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
   901
     and return nil."
3217
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
   902
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
   903
    ^ self
4570
39e965ca8d06 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4568
diff changeset
   904
        newTCPclientToHost:hostNameOrAddress
39e965ca8d06 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4568
diff changeset
   905
        port:aPortOrServiceName
39e965ca8d06 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4568
diff changeset
   906
        domain:self defaultIpDomainForConnect
39e965ca8d06 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4568
diff changeset
   907
        withTimeout:milliSecondsOrTimeDuration
39e965ca8d06 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4568
diff changeset
   908
39e965ca8d06 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4568
diff changeset
   909
    "Modified (format): / 19-01-2018 / 18:24:57 / stefan"
3059
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
   910
!
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
   911
506
11ef93d12870 support anonymous (OS_specified) ports. (for FTP-protocol)
Claus Gittinger <cg@exept.de>
parents: 486
diff changeset
   912
newTCPserverAtAnonymousPort
11ef93d12870 support anonymous (OS_specified) ports. (for FTP-protocol)
Claus Gittinger <cg@exept.de>
parents: 486
diff changeset
   913
    "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
   914
     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
   915
811
72d9ac1a7f95 comments
Claus Gittinger <cg@exept.de>
parents: 809
diff changeset
   916
    ^ self newTCPserverAtPort:0
506
11ef93d12870 support anonymous (OS_specified) ports. (for FTP-protocol)
Claus Gittinger <cg@exept.de>
parents: 486
diff changeset
   917
11ef93d12870 support anonymous (OS_specified) ports. (for FTP-protocol)
Claus Gittinger <cg@exept.de>
parents: 486
diff changeset
   918
!
11ef93d12870 support anonymous (OS_specified) ports. (for FTP-protocol)
Claus Gittinger <cg@exept.de>
parents: 486
diff changeset
   919
126
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
   920
newTCPserverAtPort:aService
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
   921
    "create a new TCP server socket providing service."
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
   922
1911
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
   923
    ^ self newTCP:aService
126
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
   924
!
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
   925
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
   926
newUDP
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
   927
    "create a UDP socket - no binding or other setup is done,
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
   928
     neither connect nor connect-wait is done."
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
   929
3059
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
   930
    ^ self new domain:#'AF_INET' type:#datagram
126
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
   931
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
   932
    "Socket newUDP"
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
   933
!
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
   934
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
   935
newUDP:aServiceOrNil
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
   936
    "create a UDP socket for a service -
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
   937
     neither connect nor connect-wait is done."
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
   938
3059
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
   939
    |newSock socketAddressClass socketAddress|
126
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
   940
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
   941
    newSock := self newUDP.
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
   942
    (newSock notNil and:[aServiceOrNil notNil]) ifTrue:[
3217
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
   943
	[
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
   944
	    socketAddressClass := newSock socketAddressClass.
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
   945
	    socketAddress := socketAddressClass hostName:nil serviceName:aServiceOrNil type:#stream.
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
   946
	    socketAddress hostAddress:socketAddressClass anyAddress.
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
   947
	    newSock bindTo:socketAddress reuseAddress:true.
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
   948
	] ifCurtailed:[
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
   949
	    newSock close.
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
   950
	]
126
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
   951
    ].
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
   952
    ^ newSock
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
   953
1911
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
   954
    "
3217
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
   955
	Socket newUDP:4444.
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
   956
	Socket newUDP:'activesync'.
1911
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
   957
    "
126
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
   958
!
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
   959
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
   960
newUDPserverAtPort:aService
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
   961
    "create a new UDP server socket providing service."
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
   962
1911
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
   963
    ^ self newUDP:aService
126
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
newUNIX
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
   967
    "create a UNIX domain socket - no binding or other setup is done,
811
72d9ac1a7f95 comments
Claus Gittinger <cg@exept.de>
parents: 809
diff changeset
   968
     neither connect nor connect-wait is done.
72d9ac1a7f95 comments
Claus Gittinger <cg@exept.de>
parents: 809
diff changeset
   969
     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
   970
     return nil."
126
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
   971
3059
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
   972
    ^ self new domain:#'AF_UNIX' type:#stream
126
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
   973
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
   974
    "
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
   975
     Socket newUNIX
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
   976
    "
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
1485
d8578cf3504b gcc3.3.1 insn-scheduler bug workaround
Claus Gittinger <cg@exept.de>
parents: 1474
diff changeset
   979
newUNIXclientTo:pathName
126
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
   980
    "create a new UNIX client socket connecting to a pathname.
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
   981
     Return a socket instance if ok, nil on failure.
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
   982
     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
   983
     not the whole smalltalk).
811
72d9ac1a7f95 comments
Claus Gittinger <cg@exept.de>
parents: 809
diff changeset
   984
     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
   985
     return nil.
126
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
   986
     See also: #newUNIXclientTo:withTimeout:"
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
    ^ self newUNIXclientTo:pathName withTimeout:nil
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
!
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
   991
4570
39e965ca8d06 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4568
diff changeset
   992
newUNIXclientTo:pathName withTimeout:milliSecondsOrTimeDuration
126
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
   993
    "create a new UNIX client socket connecting to a pathname.
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
   994
     Return a socket instance if ok, nil on failure.
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
   995
     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
   996
     and return nil.
72d9ac1a7f95 comments
Claus Gittinger <cg@exept.de>
parents: 809
diff changeset
   997
     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
   998
     return nil."
126
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
   999
4570
39e965ca8d06 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4568
diff changeset
  1000
    |socket|
39e965ca8d06 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4568
diff changeset
  1001
39e965ca8d06 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4568
diff changeset
  1002
    socket := self newUNIX.
39e965ca8d06 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4568
diff changeset
  1003
    socket isNil ifTrue:[
39e965ca8d06 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4568
diff changeset
  1004
        ^ nil.
126
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
  1005
    ].
4570
39e965ca8d06 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4568
diff changeset
  1006
    ^ [
39e965ca8d06 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4568
diff changeset
  1007
        (socket connectTo:(UDSocketAddress name:pathName) withTimeout:milliSecondsOrTimeDuration)
39e965ca8d06 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4568
diff changeset
  1008
        ifTrue:[socket] ifFalse:[socket close. nil]
39e965ca8d06 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4568
diff changeset
  1009
    ] ifCurtailed:[
39e965ca8d06 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4568
diff changeset
  1010
        socket close.
39e965ca8d06 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4568
diff changeset
  1011
    ].
126
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
  1012
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
  1013
    "
4570
39e965ca8d06 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4568
diff changeset
  1014
        Socket newUNIXclientTo:'/tmp/foo'
39e965ca8d06 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4568
diff changeset
  1015
39e965ca8d06 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4568
diff changeset
  1016
        [
39e965ca8d06 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4568
diff changeset
  1017
            Socket newUNIXclientTo:'/tmp/foo'
39e965ca8d06 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4568
diff changeset
  1018
        ] on:SocketErrorNotification do:[:ex|
39e965ca8d06 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4568
diff changeset
  1019
            ex halt.
39e965ca8d06 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4568
diff changeset
  1020
        ]
126
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
  1021
    "
4570
39e965ca8d06 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4568
diff changeset
  1022
39e965ca8d06 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4568
diff changeset
  1023
    "Modified (format): / 19-01-2018 / 18:23:24 / stefan"
126
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
  1024
!
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
  1025
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
  1026
newUNIXserverAt:pathName
811
72d9ac1a7f95 comments
Claus Gittinger <cg@exept.de>
parents: 809
diff changeset
  1027
    "create a new UNIX server socket providing service at a pathname.
72d9ac1a7f95 comments
Claus Gittinger <cg@exept.de>
parents: 809
diff changeset
  1028
     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
  1029
     return nil."
126
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
  1030
3059
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  1031
    ^ self bindTo:(UDSocketAddress name:pathName) type:#stream.
126
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
  1032
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
  1033
    "
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
  1034
     |s s2|
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
  1035
3059
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  1036
    '/tmp/foo' asFilename remove.
126
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
  1037
     s := Socket newUNIXserverAt:'/tmp/foo'.
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
  1038
     s listenFor:5.
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
  1039
     s2 := s accept.
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
  1040
    "
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
  1041
! !
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
  1042
1462
5602fce52b42 squeak stuff
Claus Gittinger <cg@exept.de>
parents: 1413
diff changeset
  1043
!Socket class methodsFor:'Compatibility-ST80'!
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
family:domainSymbol type:typeSymbol
5602fce52b42 squeak stuff
Claus Gittinger <cg@exept.de>
parents: 1413
diff changeset
  1046
    "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
  1047
     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
  1048
     Type must be #stream, #datagram or #raw."
1462
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
    ^ self domain:domainSymbol type:typeSymbol
5602fce52b42 squeak stuff
Claus Gittinger <cg@exept.de>
parents: 1413
diff changeset
  1051
5602fce52b42 squeak stuff
Claus Gittinger <cg@exept.de>
parents: 1413
diff changeset
  1052
    "
3059
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  1053
     Socket family:#AF_INET type:#stream
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  1054
     Socket family:#AF_INET type:#datagram
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  1055
     Socket family:#AF_UNIX type:#stream
1462
5602fce52b42 squeak stuff
Claus Gittinger <cg@exept.de>
parents: 1413
diff changeset
  1056
    "
5602fce52b42 squeak stuff
Claus Gittinger <cg@exept.de>
parents: 1413
diff changeset
  1057
!
5602fce52b42 squeak stuff
Claus Gittinger <cg@exept.de>
parents: 1413
diff changeset
  1058
5602fce52b42 squeak stuff
Claus Gittinger <cg@exept.de>
parents: 1413
diff changeset
  1059
getHostname
3462
cfdc47761d0f class: Socket
Claus Gittinger <cg@exept.de>
parents: 3281
diff changeset
  1060
    "return the computer's hostname string"
1462
5602fce52b42 squeak stuff
Claus Gittinger <cg@exept.de>
parents: 1413
diff changeset
  1061
5602fce52b42 squeak stuff
Claus Gittinger <cg@exept.de>
parents: 1413
diff changeset
  1062
    ^ OperatingSystem getHostName
5602fce52b42 squeak stuff
Claus Gittinger <cg@exept.de>
parents: 1413
diff changeset
  1063
5602fce52b42 squeak stuff
Claus Gittinger <cg@exept.de>
parents: 1413
diff changeset
  1064
    "Created: / 27.2.1998 / 02:32:17 / cg"
5602fce52b42 squeak stuff
Claus Gittinger <cg@exept.de>
parents: 1413
diff changeset
  1065
!
5602fce52b42 squeak stuff
Claus Gittinger <cg@exept.de>
parents: 1413
diff changeset
  1066
5602fce52b42 squeak stuff
Claus Gittinger <cg@exept.de>
parents: 1413
diff changeset
  1067
sockStream
5602fce52b42 squeak stuff
Claus Gittinger <cg@exept.de>
parents: 1413
diff changeset
  1068
    "return the type code for stream sockets"
5602fce52b42 squeak stuff
Claus Gittinger <cg@exept.de>
parents: 1413
diff changeset
  1069
5602fce52b42 squeak stuff
Claus Gittinger <cg@exept.de>
parents: 1413
diff changeset
  1070
    ^ #stream
5602fce52b42 squeak stuff
Claus Gittinger <cg@exept.de>
parents: 1413
diff changeset
  1071
! !
5602fce52b42 squeak stuff
Claus Gittinger <cg@exept.de>
parents: 1413
diff changeset
  1072
1600
f3acd5382fa1 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1584
diff changeset
  1073
!Socket class methodsFor:'Compatibility-Squeak'!
f3acd5382fa1 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1584
diff changeset
  1074
2900
0e8b305e9a98 class: Socket
Claus Gittinger <cg@exept.de>
parents: 2899
diff changeset
  1075
deadlineSecs:seconds
0e8b305e9a98 class: Socket
Claus Gittinger <cg@exept.de>
parents: 2899
diff changeset
  1076
    ^ Timestamp now addSeconds:seconds
0e8b305e9a98 class: Socket
Claus Gittinger <cg@exept.de>
parents: 2899
diff changeset
  1077
!
0e8b305e9a98 class: Socket
Claus Gittinger <cg@exept.de>
parents: 2899
diff changeset
  1078
1600
f3acd5382fa1 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1584
diff changeset
  1079
initializeNetwork
f3acd5382fa1 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1584
diff changeset
  1080
    "/ intentionally left blank here
f3acd5382fa1 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1584
diff changeset
  1081
!
f3acd5382fa1 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1584
diff changeset
  1082
4587
caa262d036d2 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4570
diff changeset
  1083
openConnectionToHostNamed:hostName port:portNr
caa262d036d2 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4570
diff changeset
  1084
    ^ self newTCPclientToHost:hostName port:portNr
caa262d036d2 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4570
diff changeset
  1085
!
caa262d036d2 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4570
diff changeset
  1086
3485
2afd6854bff9 class: Socket
Claus Gittinger <cg@exept.de>
parents: 3484
diff changeset
  1087
standardDeadline
2afd6854bff9 class: Socket
Claus Gittinger <cg@exept.de>
parents: 3484
diff changeset
  1088
    "a standard timeout in seconds for connection setup;
2afd6854bff9 class: Socket
Claus Gittinger <cg@exept.de>
parents: 3484
diff changeset
  1089
     not really used in ST/X code (but by some code ported from squeak)"
2afd6854bff9 class: Socket
Claus Gittinger <cg@exept.de>
parents: 3484
diff changeset
  1090
2afd6854bff9 class: Socket
Claus Gittinger <cg@exept.de>
parents: 3484
diff changeset
  1091
    ^ 30
2afd6854bff9 class: Socket
Claus Gittinger <cg@exept.de>
parents: 3484
diff changeset
  1092
!
2afd6854bff9 class: Socket
Claus Gittinger <cg@exept.de>
parents: 3484
diff changeset
  1093
2292
c4b0b901278e added: #standardTimeout
Claus Gittinger <cg@exept.de>
parents: 1940
diff changeset
  1094
standardTimeout
3485
2afd6854bff9 class: Socket
Claus Gittinger <cg@exept.de>
parents: 3484
diff changeset
  1095
    "a standard timeout in seconds for transfers;
2afd6854bff9 class: Socket
Claus Gittinger <cg@exept.de>
parents: 3484
diff changeset
  1096
     not really used in ST/X code (but by some code ported from squeak)"
2afd6854bff9 class: Socket
Claus Gittinger <cg@exept.de>
parents: 3484
diff changeset
  1097
2292
c4b0b901278e added: #standardTimeout
Claus Gittinger <cg@exept.de>
parents: 1940
diff changeset
  1098
    ^ 30
c4b0b901278e added: #standardTimeout
Claus Gittinger <cg@exept.de>
parents: 1940
diff changeset
  1099
!
c4b0b901278e added: #standardTimeout
Claus Gittinger <cg@exept.de>
parents: 1940
diff changeset
  1100
1600
f3acd5382fa1 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1584
diff changeset
  1101
wildcardPort
f3acd5382fa1 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1584
diff changeset
  1102
    ^ nil
f3acd5382fa1 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1584
diff changeset
  1103
! !
f3acd5382fa1 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1584
diff changeset
  1104
1462
5602fce52b42 squeak stuff
Claus Gittinger <cg@exept.de>
parents: 1413
diff changeset
  1105
!Socket class methodsFor:'Compatibility-VW'!
5602fce52b42 squeak stuff
Claus Gittinger <cg@exept.de>
parents: 1413
diff changeset
  1106
1485
d8578cf3504b gcc3.3.1 insn-scheduler bug workaround
Claus Gittinger <cg@exept.de>
parents: 1474
diff changeset
  1107
AF_INET
1462
5602fce52b42 squeak stuff
Claus Gittinger <cg@exept.de>
parents: 1413
diff changeset
  1108
    ^ #AF_INET
5602fce52b42 squeak stuff
Claus Gittinger <cg@exept.de>
parents: 1413
diff changeset
  1109
!
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
SOCK_STREAM
5602fce52b42 squeak stuff
Claus Gittinger <cg@exept.de>
parents: 1413
diff changeset
  1112
    ^ #SOCK_STREAM
5602fce52b42 squeak stuff
Claus Gittinger <cg@exept.de>
parents: 1413
diff changeset
  1113
! !
5602fce52b42 squeak stuff
Claus Gittinger <cg@exept.de>
parents: 1413
diff changeset
  1114
5602fce52b42 squeak stuff
Claus Gittinger <cg@exept.de>
parents: 1413
diff changeset
  1115
!Socket class methodsFor:'Signal constants'!
5602fce52b42 squeak stuff
Claus Gittinger <cg@exept.de>
parents: 1413
diff changeset
  1116
5602fce52b42 squeak stuff
Claus Gittinger <cg@exept.de>
parents: 1413
diff changeset
  1117
brokenConnectionSignal
5602fce52b42 squeak stuff
Claus Gittinger <cg@exept.de>
parents: 1413
diff changeset
  1118
    "return the signal used to tell broken connections.
5602fce52b42 squeak stuff
Claus Gittinger <cg@exept.de>
parents: 1413
diff changeset
  1119
     Since in unix, this is the same as the broken pipe signal,
5602fce52b42 squeak stuff
Claus Gittinger <cg@exept.de>
parents: 1413
diff changeset
  1120
     return that one.
5602fce52b42 squeak stuff
Claus Gittinger <cg@exept.de>
parents: 1413
diff changeset
  1121
     (for other Operatingsystems, this may change ..)"
5602fce52b42 squeak stuff
Claus Gittinger <cg@exept.de>
parents: 1413
diff changeset
  1122
5602fce52b42 squeak stuff
Claus Gittinger <cg@exept.de>
parents: 1413
diff changeset
  1123
    ^ PipeStream brokenPipeSignal
5602fce52b42 squeak stuff
Claus Gittinger <cg@exept.de>
parents: 1413
diff changeset
  1124
!
5602fce52b42 squeak stuff
Claus Gittinger <cg@exept.de>
parents: 1413
diff changeset
  1125
5602fce52b42 squeak stuff
Claus Gittinger <cg@exept.de>
parents: 1413
diff changeset
  1126
invalidArgumentsSignal
5602fce52b42 squeak stuff
Claus Gittinger <cg@exept.de>
parents: 1413
diff changeset
  1127
    "dummy for compatibility"
5602fce52b42 squeak stuff
Claus Gittinger <cg@exept.de>
parents: 1413
diff changeset
  1128
5602fce52b42 squeak stuff
Claus Gittinger <cg@exept.de>
parents: 1413
diff changeset
  1129
    ^ self errorSignal
5602fce52b42 squeak stuff
Claus Gittinger <cg@exept.de>
parents: 1413
diff changeset
  1130
! !
5602fce52b42 squeak stuff
Claus Gittinger <cg@exept.de>
parents: 1413
diff changeset
  1131
5602fce52b42 squeak stuff
Claus Gittinger <cg@exept.de>
parents: 1413
diff changeset
  1132
!Socket class methodsFor:'debugging'!
5602fce52b42 squeak stuff
Claus Gittinger <cg@exept.de>
parents: 1413
diff changeset
  1133
5602fce52b42 squeak stuff
Claus Gittinger <cg@exept.de>
parents: 1413
diff changeset
  1134
debug:aBoolean
5602fce52b42 squeak stuff
Claus Gittinger <cg@exept.de>
parents: 1413
diff changeset
  1135
    "turn on/off internal debugprints.
5602fce52b42 squeak stuff
Claus Gittinger <cg@exept.de>
parents: 1413
diff changeset
  1136
     This method is for ST/X debugging only and
5602fce52b42 squeak stuff
Claus Gittinger <cg@exept.de>
parents: 1413
diff changeset
  1137
     may  be removed in later versions"
5602fce52b42 squeak stuff
Claus Gittinger <cg@exept.de>
parents: 1413
diff changeset
  1138
5602fce52b42 squeak stuff
Claus Gittinger <cg@exept.de>
parents: 1413
diff changeset
  1139
%{  /* NOCONTEXT */
5602fce52b42 squeak stuff
Claus Gittinger <cg@exept.de>
parents: 1413
diff changeset
  1140
5602fce52b42 squeak stuff
Claus Gittinger <cg@exept.de>
parents: 1413
diff changeset
  1141
    __debugging__ = (aBoolean == true);
5602fce52b42 squeak stuff
Claus Gittinger <cg@exept.de>
parents: 1413
diff changeset
  1142
%}
5602fce52b42 squeak stuff
Claus Gittinger <cg@exept.de>
parents: 1413
diff changeset
  1143
    "
5602fce52b42 squeak stuff
Claus Gittinger <cg@exept.de>
parents: 1413
diff changeset
  1144
     Socket debug:true
5602fce52b42 squeak stuff
Claus Gittinger <cg@exept.de>
parents: 1413
diff changeset
  1145
     Socket debug:false
5602fce52b42 squeak stuff
Claus Gittinger <cg@exept.de>
parents: 1413
diff changeset
  1146
    "
5602fce52b42 squeak stuff
Claus Gittinger <cg@exept.de>
parents: 1413
diff changeset
  1147
! !
5602fce52b42 squeak stuff
Claus Gittinger <cg@exept.de>
parents: 1413
diff changeset
  1148
3059
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  1149
!Socket class methodsFor:'defaults'!
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  1150
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  1151
defaultIpDomainForConnect
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  1152
    "answer the domain used to look up host names for connect:
4414
42edc97b2323 bcopy -> memcpy
Claus Gittinger <cg@exept.de>
parents: 4341
diff changeset
  1153
	#AF_INET    use only IPv4
42edc97b2323 bcopy -> memcpy
Claus Gittinger <cg@exept.de>
parents: 4341
diff changeset
  1154
	#AF_INET6   use only IPv6
42edc97b2323 bcopy -> memcpy
Claus Gittinger <cg@exept.de>
parents: 4341
diff changeset
  1155
	nil         use both IPv4 and IPv6"
4239
827d8755965f #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4234
diff changeset
  1156
827d8755965f #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4234
diff changeset
  1157
    ^ nil
3059
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  1158
! !
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  1159
1911
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
  1160
!Socket class methodsFor:'obsolete'!
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
  1161
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
  1162
connectTo:service on:host
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
  1163
    <resource: #obsolete>
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
  1164
    "standard & easy client setup:
2321
6f4cc7b644db filePointer -> handle migration
Claus Gittinger <cg@exept.de>
parents: 2308
diff changeset
  1165
	create new client tcp socket, bind and connect;
6f4cc7b644db filePointer -> handle migration
Claus Gittinger <cg@exept.de>
parents: 2308
diff changeset
  1166
	return the socket.
1911
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
  1167
     The thread blocks (interruptable), until the connection is established."
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
  1168
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
  1169
    ^ self newTCPclientToHost:host port:(self portOfService:service).
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
  1170
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
  1171
    "
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
  1172
     Socket connectTo:9995 on:'clam'
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
  1173
     Socket connectTo:4711 on:'exept'
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
  1174
     Socket connectTo:'finger' on:'clam'
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
  1175
     Socket connectTo:'ftp' on:'exept'
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
  1176
     Socket connectTo:'nntp' on:(OperatingSystem getEnvironment:'NNTPSERVER')
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
  1177
    "
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
  1178
!
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
  1179
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
  1180
networkLongOrderIsMSB
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
  1181
    "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
  1182
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
  1183
    <resource: #obsolete>
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
  1184
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
  1185
    ^ true
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
  1186
!
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
  1187
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
  1188
networkShortOrderIsMSB
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
  1189
    "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
  1190
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
  1191
    <resource: #obsolete>
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
  1192
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
  1193
    ^ true
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
  1194
!
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
  1195
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
  1196
provide:aService
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
  1197
    "standard & easy server setup:
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
  1198
     create a new TCP server socket providing a service."
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
  1199
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
  1200
    <resource:#obsolete>
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
  1201
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
  1202
    |newSock|
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
  1203
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
  1204
    self obsoleteMethodWarning:'use #newTCPserverAtPort: / #listen'.
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
  1205
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
  1206
    newSock := self newTCPserverAtPort:(self portOfService:aService).
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
  1207
    newSock notNil ifTrue:[
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
  1208
	newSock listenFor:5.
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
  1209
    ].
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
  1210
    ^ newSock
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
  1211
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
  1212
    "
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
  1213
     Socket provide:9995
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
  1214
     (Socket provide:9996) accept
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
  1215
     Socket provide:'nntp'
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
  1216
    "
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
  1217
! !
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
  1218
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
  1219
!Socket class methodsFor:'obsolete host queries'!
525
5891518d17a3 appletalk support - untested
Claus Gittinger <cg@exept.de>
parents: 524
diff changeset
  1220
5891518d17a3 appletalk support - untested
Claus Gittinger <cg@exept.de>
parents: 524
diff changeset
  1221
appletalkAddressOfHost:aHostName
1911
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
  1222
    <resource: #obsolete>
525
5891518d17a3 appletalk support - untested
Claus Gittinger <cg@exept.de>
parents: 524
diff changeset
  1223
    "return the APPLETALK address for a hostname as a byteArray,
819
4cc15700d123 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 817
diff changeset
  1224
     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
  1225
     followed by the node byte.
525
5891518d17a3 appletalk support - untested
Claus Gittinger <cg@exept.de>
parents: 524
diff changeset
  1226
     If the host is unknown, return nil.
812
c8101ea70e6c *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 811
diff changeset
  1227
     This is the reverse operation to #hostWithAppletalkAddress:.
c8101ea70e6c *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 811
diff changeset
  1228
     WARNING: untested code - I have no appletalk to test this."
525
5891518d17a3 appletalk support - untested
Claus Gittinger <cg@exept.de>
parents: 524
diff changeset
  1229
1485
d8578cf3504b gcc3.3.1 insn-scheduler bug workaround
Claus Gittinger <cg@exept.de>
parents: 1474
diff changeset
  1230
    NameLookupError
d8578cf3504b gcc3.3.1 insn-scheduler bug workaround
Claus Gittinger <cg@exept.de>
parents: 1474
diff changeset
  1231
	handle:[:ex |
1343
cc3bed115c0a definitions cleanup with stxOSDefs.h
penk
parents: 1342
diff changeset
  1232
	    ^ nil
cc3bed115c0a definitions cleanup with stxOSDefs.h
penk
parents: 1342
diff changeset
  1233
	]
cc3bed115c0a definitions cleanup with stxOSDefs.h
penk
parents: 1342
diff changeset
  1234
	do:[
cc3bed115c0a definitions cleanup with stxOSDefs.h
penk
parents: 1342
diff changeset
  1235
	    ^ (AppletalkSocketAddress hostName:aHostName) address
cc3bed115c0a definitions cleanup with stxOSDefs.h
penk
parents: 1342
diff changeset
  1236
	]
525
5891518d17a3 appletalk support - untested
Claus Gittinger <cg@exept.de>
parents: 524
diff changeset
  1237
!
5891518d17a3 appletalk support - untested
Claus Gittinger <cg@exept.de>
parents: 524
diff changeset
  1238
1278
7251c65b8d38 use nameLookup from SocketAddress for all addr-families
Claus Gittinger <cg@exept.de>
parents: 1274
diff changeset
  1239
hostWithAppletalkAddress:addrByteArray
1911
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
  1240
    <resource: #obsolete>
525
5891518d17a3 appletalk support - untested
Claus Gittinger <cg@exept.de>
parents: 524
diff changeset
  1241
    "return the hostname for an APPLETALK address.
5891518d17a3 appletalk support - untested
Claus Gittinger <cg@exept.de>
parents: 524
diff changeset
  1242
     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
  1243
     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
  1244
     The last byte is the node number.
4320
5b7848099dea #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 4293
diff changeset
  1245
     Nil is returned for an unknown host or if it's not an appletalk host.
812
c8101ea70e6c *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 811
diff changeset
  1246
     This is is the reverse operation to #appletalkAddressOfHost:.
c8101ea70e6c *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 811
diff changeset
  1247
     WARNING: untested code - I have no appletalk to test this."
525
5891518d17a3 appletalk support - untested
Claus Gittinger <cg@exept.de>
parents: 524
diff changeset
  1248
1485
d8578cf3504b gcc3.3.1 insn-scheduler bug workaround
Claus Gittinger <cg@exept.de>
parents: 1474
diff changeset
  1249
    NameLookupError
4414
42edc97b2323 bcopy -> memcpy
Claus Gittinger <cg@exept.de>
parents: 4341
diff changeset
  1250
	handle:[:ex |
42edc97b2323 bcopy -> memcpy
Claus Gittinger <cg@exept.de>
parents: 4341
diff changeset
  1251
	    ^ nil
42edc97b2323 bcopy -> memcpy
Claus Gittinger <cg@exept.de>
parents: 4341
diff changeset
  1252
	]
42edc97b2323 bcopy -> memcpy
Claus Gittinger <cg@exept.de>
parents: 4341
diff changeset
  1253
	do:[
42edc97b2323 bcopy -> memcpy
Claus Gittinger <cg@exept.de>
parents: 4341
diff changeset
  1254
	    ^ (AppletalkSocketAddress hostAddress:addrByteArray) hostName
42edc97b2323 bcopy -> memcpy
Claus Gittinger <cg@exept.de>
parents: 4341
diff changeset
  1255
	]
1278
7251c65b8d38 use nameLookup from SocketAddress for all addr-families
Claus Gittinger <cg@exept.de>
parents: 1274
diff changeset
  1256
525
5891518d17a3 appletalk support - untested
Claus Gittinger <cg@exept.de>
parents: 524
diff changeset
  1257
    "
1278
7251c65b8d38 use nameLookup from SocketAddress for all addr-families
Claus Gittinger <cg@exept.de>
parents: 1274
diff changeset
  1258
     Socket appletalkAddressOfHost:'yourAppleHere'
1485
d8578cf3504b gcc3.3.1 insn-scheduler bug workaround
Claus Gittinger <cg@exept.de>
parents: 1474
diff changeset
  1259
     Socket hostWithAppletalkAddress:#[1 2 3]
525
5891518d17a3 appletalk support - untested
Claus Gittinger <cg@exept.de>
parents: 524
diff changeset
  1260
     "
4320
5b7848099dea #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 4293
diff changeset
  1261
5b7848099dea #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 4293
diff changeset
  1262
    "Modified (comment): / 13-02-2017 / 20:30:56 / cg"
126
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
  1263
!
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
  1264
1278
7251c65b8d38 use nameLookup from SocketAddress for all addr-families
Claus Gittinger <cg@exept.de>
parents: 1274
diff changeset
  1265
hostWithIpAddress:addrByteArray
1911
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
  1266
    <resource: #obsolete>
126
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
  1267
    "return the hostname for an IP (internet-) address.
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
  1268
     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
  1269
     the network bytes come first (no matter what the local byteorder is).
4320
5b7848099dea #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 4293
diff changeset
  1270
     Nil is returned for an unknown host or if it's not an internet host.
126
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
  1271
     This is the reverse operation to #ipAddressOfHost:."
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
  1272
1485
d8578cf3504b gcc3.3.1 insn-scheduler bug workaround
Claus Gittinger <cg@exept.de>
parents: 1474
diff changeset
  1273
    NameLookupError
4414
42edc97b2323 bcopy -> memcpy
Claus Gittinger <cg@exept.de>
parents: 4341
diff changeset
  1274
	handle:[:ex |
42edc97b2323 bcopy -> memcpy
Claus Gittinger <cg@exept.de>
parents: 4341
diff changeset
  1275
	    ^ nil
42edc97b2323 bcopy -> memcpy
Claus Gittinger <cg@exept.de>
parents: 4341
diff changeset
  1276
	]
42edc97b2323 bcopy -> memcpy
Claus Gittinger <cg@exept.de>
parents: 4341
diff changeset
  1277
	do:[
42edc97b2323 bcopy -> memcpy
Claus Gittinger <cg@exept.de>
parents: 4341
diff changeset
  1278
	    ^ (IPSocketAddress hostAddress:addrByteArray) hostName
42edc97b2323 bcopy -> memcpy
Claus Gittinger <cg@exept.de>
parents: 4341
diff changeset
  1279
	]
126
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
  1280
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
  1281
    "
1485
d8578cf3504b gcc3.3.1 insn-scheduler bug workaround
Claus Gittinger <cg@exept.de>
parents: 1474
diff changeset
  1282
     Socket ipAddressOfHost:'clam'
d8578cf3504b gcc3.3.1 insn-scheduler bug workaround
Claus Gittinger <cg@exept.de>
parents: 1474
diff changeset
  1283
     Socket hostWithIpAddress:(Socket ipAddressOfHost:'clam')
d8578cf3504b gcc3.3.1 insn-scheduler bug workaround
Claus Gittinger <cg@exept.de>
parents: 1474
diff changeset
  1284
     Socket ipAddressOfHost:'porty'
1278
7251c65b8d38 use nameLookup from SocketAddress for all addr-families
Claus Gittinger <cg@exept.de>
parents: 1274
diff changeset
  1285
     Socket hostWithIpAddress:(Socket ipAddressOfHost:'porty')
1485
d8578cf3504b gcc3.3.1 insn-scheduler bug workaround
Claus Gittinger <cg@exept.de>
parents: 1474
diff changeset
  1286
     Socket hostWithIpAddress:#[1 2 3 4]
d8578cf3504b gcc3.3.1 insn-scheduler bug workaround
Claus Gittinger <cg@exept.de>
parents: 1474
diff changeset
  1287
     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
  1288
     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
  1289
     Socket hostWithIpAddress:(Socket ipAddressOfHost:'www.altavista.com')
126
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
  1290
     "
4320
5b7848099dea #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 4293
diff changeset
  1291
5b7848099dea #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 4293
diff changeset
  1292
    "Modified (comment): / 13-02-2017 / 20:31:01 / cg"
126
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
  1293
!
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
  1294
1278
7251c65b8d38 use nameLookup from SocketAddress for all addr-families
Claus Gittinger <cg@exept.de>
parents: 1274
diff changeset
  1295
hostWithIpV6Address:addrByteArray
1911
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
  1296
    <resource: #obsolete>
820
b6860c3660c8 Fix address sizes when calling gethostbyaddr
Stefan Vogel <sv@exept.de>
parents: 819
diff changeset
  1297
    "return the hostname for an IPv6 (internet-) address.
b6860c3660c8 Fix address sizes when calling gethostbyaddr
Stefan Vogel <sv@exept.de>
parents: 819
diff changeset
  1298
     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
  1299
     the network bytes come first (no matter what the local byteorder is).
4320
5b7848099dea #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 4293
diff changeset
  1300
     Nil is returned for an unknown host or if it's not an internet host.
820
b6860c3660c8 Fix address sizes when calling gethostbyaddr
Stefan Vogel <sv@exept.de>
parents: 819
diff changeset
  1301
     This is the reverse operation to #ipV6AddressOfHost:."
b6860c3660c8 Fix address sizes when calling gethostbyaddr
Stefan Vogel <sv@exept.de>
parents: 819
diff changeset
  1302
1485
d8578cf3504b gcc3.3.1 insn-scheduler bug workaround
Claus Gittinger <cg@exept.de>
parents: 1474
diff changeset
  1303
    NameLookupError
4414
42edc97b2323 bcopy -> memcpy
Claus Gittinger <cg@exept.de>
parents: 4341
diff changeset
  1304
	handle:[:ex |
42edc97b2323 bcopy -> memcpy
Claus Gittinger <cg@exept.de>
parents: 4341
diff changeset
  1305
	    ^ nil
42edc97b2323 bcopy -> memcpy
Claus Gittinger <cg@exept.de>
parents: 4341
diff changeset
  1306
	]
42edc97b2323 bcopy -> memcpy
Claus Gittinger <cg@exept.de>
parents: 4341
diff changeset
  1307
	do:[
42edc97b2323 bcopy -> memcpy
Claus Gittinger <cg@exept.de>
parents: 4341
diff changeset
  1308
	    ^ (IPv6SocketAddress hostAddress:addrByteArray) hostName
42edc97b2323 bcopy -> memcpy
Claus Gittinger <cg@exept.de>
parents: 4341
diff changeset
  1309
	]
820
b6860c3660c8 Fix address sizes when calling gethostbyaddr
Stefan Vogel <sv@exept.de>
parents: 819
diff changeset
  1310
b6860c3660c8 Fix address sizes when calling gethostbyaddr
Stefan Vogel <sv@exept.de>
parents: 819
diff changeset
  1311
    "
1485
d8578cf3504b gcc3.3.1 insn-scheduler bug workaround
Claus Gittinger <cg@exept.de>
parents: 1474
diff changeset
  1312
     Socket ipV6AddressOfHost:'clam'
d8578cf3504b gcc3.3.1 insn-scheduler bug workaround
Claus Gittinger <cg@exept.de>
parents: 1474
diff changeset
  1313
     Socket hostWithIpV6Address:(Socket ipAddressOfHost:'clam')
d8578cf3504b gcc3.3.1 insn-scheduler bug workaround
Claus Gittinger <cg@exept.de>
parents: 1474
diff changeset
  1314
     Socket ipV6AddressOfHost:'porty'
d8578cf3504b gcc3.3.1 insn-scheduler bug workaround
Claus Gittinger <cg@exept.de>
parents: 1474
diff changeset
  1315
     Socket hostWithIpV6Address:(Socket ipAddressOfHost:'porty')
d8578cf3504b gcc3.3.1 insn-scheduler bug workaround
Claus Gittinger <cg@exept.de>
parents: 1474
diff changeset
  1316
     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
  1317
     Socket ipV6AddressOfHost:'www.exept.de'
820
b6860c3660c8 Fix address sizes when calling gethostbyaddr
Stefan Vogel <sv@exept.de>
parents: 819
diff changeset
  1318
     "
4320
5b7848099dea #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 4293
diff changeset
  1319
5b7848099dea #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 4293
diff changeset
  1320
    "Modified (comment): / 13-02-2017 / 20:31:08 / cg"
820
b6860c3660c8 Fix address sizes when calling gethostbyaddr
Stefan Vogel <sv@exept.de>
parents: 819
diff changeset
  1321
!
b6860c3660c8 Fix address sizes when calling gethostbyaddr
Stefan Vogel <sv@exept.de>
parents: 819
diff changeset
  1322
6
claus
parents: 4
diff changeset
  1323
ipAddressOfHost:aHostName
1911
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
  1324
    <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
  1325
    "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
  1326
     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
  1327
     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
  1328
     This is the reverse operation to #hostWithIpAddress:."
6
claus
parents: 4
diff changeset
  1329
1485
d8578cf3504b gcc3.3.1 insn-scheduler bug workaround
Claus Gittinger <cg@exept.de>
parents: 1474
diff changeset
  1330
    NameLookupError
d8578cf3504b gcc3.3.1 insn-scheduler bug workaround
Claus Gittinger <cg@exept.de>
parents: 1474
diff changeset
  1331
	handle:[:ex |
1343
cc3bed115c0a definitions cleanup with stxOSDefs.h
penk
parents: 1342
diff changeset
  1332
	    ^ nil
cc3bed115c0a definitions cleanup with stxOSDefs.h
penk
parents: 1342
diff changeset
  1333
	]
cc3bed115c0a definitions cleanup with stxOSDefs.h
penk
parents: 1342
diff changeset
  1334
	do:[
cc3bed115c0a definitions cleanup with stxOSDefs.h
penk
parents: 1342
diff changeset
  1335
	    ^ (IPSocketAddress hostName:aHostName) address
cc3bed115c0a definitions cleanup with stxOSDefs.h
penk
parents: 1342
diff changeset
  1336
	]
21
33eb5ffad09d *** empty log message ***
claus
parents: 8
diff changeset
  1337
71
claus
parents: 63
diff changeset
  1338
    "
1485
d8578cf3504b gcc3.3.1 insn-scheduler bug workaround
Claus Gittinger <cg@exept.de>
parents: 1474
diff changeset
  1339
     Socket ipAddressOfHost:'localhost'
d8578cf3504b gcc3.3.1 insn-scheduler bug workaround
Claus Gittinger <cg@exept.de>
parents: 1474
diff changeset
  1340
     Socket ipAddressOfHost:'exept'
d8578cf3504b gcc3.3.1 insn-scheduler bug workaround
Claus Gittinger <cg@exept.de>
parents: 1474
diff changeset
  1341
     Socket ipAddressOfHost:'1.2.3.4'
1274
f257a1b16b4d use naemLookup from SocketAddress for ipv6
Claus Gittinger <cg@exept.de>
parents: 1263
diff changeset
  1342
     Socket ipAddressOfHost:'193.15.16.17'
1485
d8578cf3504b gcc3.3.1 insn-scheduler bug workaround
Claus Gittinger <cg@exept.de>
parents: 1474
diff changeset
  1343
     Socket ipAddressOfHost:'josef'
d8578cf3504b gcc3.3.1 insn-scheduler bug workaround
Claus Gittinger <cg@exept.de>
parents: 1474
diff changeset
  1344
     Socket ipAddressOfHost:'styx.com'
d8578cf3504b gcc3.3.1 insn-scheduler bug workaround
Claus Gittinger <cg@exept.de>
parents: 1474
diff changeset
  1345
     Socket hostWithIpAddress:(Socket ipAddressOfHost:'localhost')
d8578cf3504b gcc3.3.1 insn-scheduler bug workaround
Claus Gittinger <cg@exept.de>
parents: 1474
diff changeset
  1346
     Socket ipAddressOfHost:(Socket hostWithIpAddress:'127.0.0.1')
71
claus
parents: 63
diff changeset
  1347
    "
819
4cc15700d123 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 817
diff changeset
  1348
!
4cc15700d123 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 817
diff changeset
  1349
4cc15700d123 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 817
diff changeset
  1350
ipV6AddressOfHost:aHostName
1911
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
  1351
    <resource: #obsolete>
819
4cc15700d123 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 817
diff changeset
  1352
    "return the IPv6 (internet-) number for a hostname as a byteArray,
4cc15700d123 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 817
diff changeset
  1353
     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
  1354
     If the host is unknown, return nil.
4cc15700d123 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 817
diff changeset
  1355
     This is the reverse operation to #hostWithIpV6Address:."
4cc15700d123 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 817
diff changeset
  1356
1485
d8578cf3504b gcc3.3.1 insn-scheduler bug workaround
Claus Gittinger <cg@exept.de>
parents: 1474
diff changeset
  1357
    NameLookupError
d8578cf3504b gcc3.3.1 insn-scheduler bug workaround
Claus Gittinger <cg@exept.de>
parents: 1474
diff changeset
  1358
	handle:[:ex |
1343
cc3bed115c0a definitions cleanup with stxOSDefs.h
penk
parents: 1342
diff changeset
  1359
	    ^ nil
cc3bed115c0a definitions cleanup with stxOSDefs.h
penk
parents: 1342
diff changeset
  1360
	]
cc3bed115c0a definitions cleanup with stxOSDefs.h
penk
parents: 1342
diff changeset
  1361
	do:[
cc3bed115c0a definitions cleanup with stxOSDefs.h
penk
parents: 1342
diff changeset
  1362
	    ^ (IPv6SocketAddress hostName:aHostName) address
cc3bed115c0a definitions cleanup with stxOSDefs.h
penk
parents: 1342
diff changeset
  1363
	]
819
4cc15700d123 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 817
diff changeset
  1364
4cc15700d123 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 817
diff changeset
  1365
    "
1485
d8578cf3504b gcc3.3.1 insn-scheduler bug workaround
Claus Gittinger <cg@exept.de>
parents: 1474
diff changeset
  1366
     Socket ipV6AddressOfHost:'localhost'
d8578cf3504b gcc3.3.1 insn-scheduler bug workaround
Claus Gittinger <cg@exept.de>
parents: 1474
diff changeset
  1367
     Socket ipV6AddressOfHost:'exept'
d8578cf3504b gcc3.3.1 insn-scheduler bug workaround
Claus Gittinger <cg@exept.de>
parents: 1474
diff changeset
  1368
     Socket ipV6AddressOfHost:'exept.exept.de'
d8578cf3504b gcc3.3.1 insn-scheduler bug workaround
Claus Gittinger <cg@exept.de>
parents: 1474
diff changeset
  1369
     Socket ipV6AddressOfHost:'www.google.de'
d8578cf3504b gcc3.3.1 insn-scheduler bug workaround
Claus Gittinger <cg@exept.de>
parents: 1474
diff changeset
  1370
     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
  1371
     Socket ipV6AddressOfHost:'josef'
d8578cf3504b gcc3.3.1 insn-scheduler bug workaround
Claus Gittinger <cg@exept.de>
parents: 1474
diff changeset
  1372
     Socket ipV6AddressOfHost:'styx.com'
d8578cf3504b gcc3.3.1 insn-scheduler bug workaround
Claus Gittinger <cg@exept.de>
parents: 1474
diff changeset
  1373
     Socket hostWithIpV6Address:(Socket ipV6AddressOfHost:'localhost')
d8578cf3504b gcc3.3.1 insn-scheduler bug workaround
Claus Gittinger <cg@exept.de>
parents: 1474
diff changeset
  1374
     Socket ipV6AddressOfHost:(Socket hostV6WithIpAddress:'127.0.0.1')
819
4cc15700d123 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 817
diff changeset
  1375
    "
531
ca4c73813531 category changes
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
  1376
! !
ca4c73813531 category changes
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
  1377
ca4c73813531 category changes
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
  1378
!Socket class methodsFor:'queries'!
ca4c73813531 category changes
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
  1379
1260
9a8fb2391174 instance creation of peer refactored
Claus Gittinger <cg@exept.de>
parents: 1235
diff changeset
  1380
peerFromDomain:domain name:peerName port:port
9a8fb2391174 instance creation of peer refactored
Claus Gittinger <cg@exept.de>
parents: 1235
diff changeset
  1381
    |addrClass|
9a8fb2391174 instance creation of peer refactored
Claus Gittinger <cg@exept.de>
parents: 1235
diff changeset
  1382
9a8fb2391174 instance creation of peer refactored
Claus Gittinger <cg@exept.de>
parents: 1235
diff changeset
  1383
    addrClass := self socketAddressClassForDomain:domain.
1263
23161346a162 no longer callBack into sockets getHostName/getAddress code.
Claus Gittinger <cg@exept.de>
parents: 1260
diff changeset
  1384
    ^ 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
  1385
!
7e5f2f6b177d getHostByAddr - call is now done lazy, when the socket is asked for the peer
Claus Gittinger <cg@exept.de>
parents: 1186
diff changeset
  1386
7e5f2f6b177d getHostByAddr - call is now done lazy, when the socket is asked for the peer
Claus Gittinger <cg@exept.de>
parents: 1186
diff changeset
  1387
peerNameFromDomain:domain peer:peer
1260
9a8fb2391174 instance creation of peer refactored
Claus Gittinger <cg@exept.de>
parents: 1235
diff changeset
  1388
    |addrClass|
9a8fb2391174 instance creation of peer refactored
Claus Gittinger <cg@exept.de>
parents: 1235
diff changeset
  1389
9a8fb2391174 instance creation of peer refactored
Claus Gittinger <cg@exept.de>
parents: 1235
diff changeset
  1390
    addrClass := self socketAddressClassForDomain:domain.
9a8fb2391174 instance creation of peer refactored
Claus Gittinger <cg@exept.de>
parents: 1235
diff changeset
  1391
    ^ 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
  1392
!
7e5f2f6b177d getHostByAddr - call is now done lazy, when the socket is asked for the peer
Claus Gittinger <cg@exept.de>
parents: 1186
diff changeset
  1393
0
1cf8d1747859 Initial revision
claus
parents:
diff changeset
  1394
portOfService:aNameOrNumber
819
4cc15700d123 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 817
diff changeset
  1395
    "returns the port-number for a given IP-service
0
1cf8d1747859 Initial revision
claus
parents:
diff changeset
  1396
     or nil if no such service exists;
1cf8d1747859 Initial revision
claus
parents:
diff changeset
  1397
     - used to convert service names to portNumbers"
1cf8d1747859 Initial revision
claus
parents:
diff changeset
  1398
91
Claus Gittinger <cg@exept.de>
parents: 85
diff changeset
  1399
    ^ self portOfService:aNameOrNumber protocol:nil
Claus Gittinger <cg@exept.de>
parents: 85
diff changeset
  1400
28
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1401
    "
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1402
     Socket portOfService:'finger'
1485
d8578cf3504b gcc3.3.1 insn-scheduler bug workaround
Claus Gittinger <cg@exept.de>
parents: 1474
diff changeset
  1403
     Socket portOfService:'nntp'
d8578cf3504b gcc3.3.1 insn-scheduler bug workaround
Claus Gittinger <cg@exept.de>
parents: 1474
diff changeset
  1404
     Socket portOfService:'echo'
d8578cf3504b gcc3.3.1 insn-scheduler bug workaround
Claus Gittinger <cg@exept.de>
parents: 1474
diff changeset
  1405
     Socket portOfService:'snmp'
28
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1406
    "
0
1cf8d1747859 Initial revision
claus
parents:
diff changeset
  1407
!
1cf8d1747859 Initial revision
claus
parents:
diff changeset
  1408
91
Claus Gittinger <cg@exept.de>
parents: 85
diff changeset
  1409
portOfService:aNameOrNumber protocol:aProtocol
819
4cc15700d123 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 817
diff changeset
  1410
    "returns the port-number for a given IP-service
91
Claus Gittinger <cg@exept.de>
parents: 85
diff changeset
  1411
     or nil if no such service exists;
Claus Gittinger <cg@exept.de>
parents: 85
diff changeset
  1412
     - used to convert service names to portNumbers"
Claus Gittinger <cg@exept.de>
parents: 85
diff changeset
  1413
2909
aacef77a1697 64bit fixes
Claus Gittinger <cg@exept.de>
parents: 2904
diff changeset
  1414
%{ /* UNLIMITEDSTACK(noWIN32) */
418
317e55c6c281 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 403
diff changeset
  1415
#ifndef NO_SOCKET
91
Claus Gittinger <cg@exept.de>
parents: 85
diff changeset
  1416
    struct servent *servent = NULL;
Claus Gittinger <cg@exept.de>
parents: 85
diff changeset
  1417
    char *protocol;
Claus Gittinger <cg@exept.de>
parents: 85
diff changeset
  1418
    int tryBoth = 0;
524
8287da54eccf more empty code for other domains;
Claus Gittinger <cg@exept.de>
parents: 513
diff changeset
  1419
    short portNo;
91
Claus Gittinger <cg@exept.de>
parents: 85
diff changeset
  1420
604
b302a21afece Remove redundant code.
Stefan Vogel <sv@exept.de>
parents: 589
diff changeset
  1421
    if (__isSmallInteger(aNameOrNumber)) {
2340
2dc6e31f0142 handleType
Claus Gittinger <cg@exept.de>
parents: 2331
diff changeset
  1422
	RETURN ( aNameOrNumber );
92
Claus Gittinger <cg@exept.de>
parents: 91
diff changeset
  1423
    }
Claus Gittinger <cg@exept.de>
parents: 91
diff changeset
  1424
2331
b5280e1b3b9f changed:
Stefan Vogel <sv@exept.de>
parents: 2327
diff changeset
  1425
    if (__isStringLike(aProtocol)) {
2340
2dc6e31f0142 handleType
Claus Gittinger <cg@exept.de>
parents: 2331
diff changeset
  1426
	protocol = (char *)__stringVal(aProtocol);
604
b302a21afece Remove redundant code.
Stefan Vogel <sv@exept.de>
parents: 589
diff changeset
  1427
    } else {
2340
2dc6e31f0142 handleType
Claus Gittinger <cg@exept.de>
parents: 2331
diff changeset
  1428
	protocol = "tcp";
2dc6e31f0142 handleType
Claus Gittinger <cg@exept.de>
parents: 2331
diff changeset
  1429
	tryBoth = 1;
91
Claus Gittinger <cg@exept.de>
parents: 85
diff changeset
  1430
    }
524
8287da54eccf more empty code for other domains;
Claus Gittinger <cg@exept.de>
parents: 513
diff changeset
  1431
2331
b5280e1b3b9f changed:
Stefan Vogel <sv@exept.de>
parents: 2327
diff changeset
  1432
    if (__isStringLike(aNameOrNumber)) {
2340
2dc6e31f0142 handleType
Claus Gittinger <cg@exept.de>
parents: 2331
diff changeset
  1433
	servent = getservbyname((char *) __stringVal(aNameOrNumber), protocol);
2dc6e31f0142 handleType
Claus Gittinger <cg@exept.de>
parents: 2331
diff changeset
  1434
	if (servent != NULL) {
2dc6e31f0142 handleType
Claus Gittinger <cg@exept.de>
parents: 2331
diff changeset
  1435
	    RETURN ( __MKSMALLINT(ntohs(servent->s_port)) );
2dc6e31f0142 handleType
Claus Gittinger <cg@exept.de>
parents: 2331
diff changeset
  1436
	}
2dc6e31f0142 handleType
Claus Gittinger <cg@exept.de>
parents: 2331
diff changeset
  1437
	if (tryBoth) {
2dc6e31f0142 handleType
Claus Gittinger <cg@exept.de>
parents: 2331
diff changeset
  1438
	    servent = getservbyname((char *) __stringVal(aNameOrNumber), "udp");
2dc6e31f0142 handleType
Claus Gittinger <cg@exept.de>
parents: 2331
diff changeset
  1439
	    if (servent != NULL) {
2dc6e31f0142 handleType
Claus Gittinger <cg@exept.de>
parents: 2331
diff changeset
  1440
		RETURN ( __MKSMALLINT(ntohs(servent->s_port)) );
2dc6e31f0142 handleType
Claus Gittinger <cg@exept.de>
parents: 2331
diff changeset
  1441
	    }
2dc6e31f0142 handleType
Claus Gittinger <cg@exept.de>
parents: 2331
diff changeset
  1442
	}
2dc6e31f0142 handleType
Claus Gittinger <cg@exept.de>
parents: 2331
diff changeset
  1443
	RETURN ( nil );
91
Claus Gittinger <cg@exept.de>
parents: 85
diff changeset
  1444
    }
418
317e55c6c281 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 403
diff changeset
  1445
#endif
91
Claus Gittinger <cg@exept.de>
parents: 85
diff changeset
  1446
    RETURN ( nil );
Claus Gittinger <cg@exept.de>
parents: 85
diff changeset
  1447
%}
Claus Gittinger <cg@exept.de>
parents: 85
diff changeset
  1448
    "
Claus Gittinger <cg@exept.de>
parents: 85
diff changeset
  1449
     Socket portOfService:'echo' protocol:'udp'
Claus Gittinger <cg@exept.de>
parents: 85
diff changeset
  1450
     Socket portOfService:'echo' protocol:'tcp'
Claus Gittinger <cg@exept.de>
parents: 85
diff changeset
  1451
    "
Claus Gittinger <cg@exept.de>
parents: 85
diff changeset
  1452
!
Claus Gittinger <cg@exept.de>
parents: 85
diff changeset
  1453
0
1cf8d1747859 Initial revision
claus
parents:
diff changeset
  1454
protocolOfService:aNameOrNumber
819
4cc15700d123 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 817
diff changeset
  1455
    "returns the protocol (as string) for a given IP-service
28
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1456
     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
  1457
92005eec5c9d fixed moving-object-when-interrupted-with-scavenge bugs;
Claus Gittinger <cg@exept.de>
parents: 1503
diff changeset
  1458
%{  /* UNLIMITEDSTACK(noWIN32) */
418
317e55c6c281 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 403
diff changeset
  1459
#ifndef NO_SOCKET
0
1cf8d1747859 Initial revision
claus
parents:
diff changeset
  1460
    struct servent *servent = NULL;
524
8287da54eccf more empty code for other domains;
Claus Gittinger <cg@exept.de>
parents: 513
diff changeset
  1461
    short portNo;
0
1cf8d1747859 Initial revision
claus
parents:
diff changeset
  1462
58
bd6753bf0401 *** empty log message ***
claus
parents: 51
diff changeset
  1463
    if (__isSmallInteger(aNameOrNumber)) {
2340
2dc6e31f0142 handleType
Claus Gittinger <cg@exept.de>
parents: 2331
diff changeset
  1464
	portNo = __intVal(aNameOrNumber);
2dc6e31f0142 handleType
Claus Gittinger <cg@exept.de>
parents: 2331
diff changeset
  1465
	servent = getservbyport(htons(portNo), "tcp") ;
2dc6e31f0142 handleType
Claus Gittinger <cg@exept.de>
parents: 2331
diff changeset
  1466
	if (servent == NULL) {
2dc6e31f0142 handleType
Claus Gittinger <cg@exept.de>
parents: 2331
diff changeset
  1467
	    servent = getservbyport(htons(portNo), "udp") ;
2dc6e31f0142 handleType
Claus Gittinger <cg@exept.de>
parents: 2331
diff changeset
  1468
	    if (servent == NULL) {
2dc6e31f0142 handleType
Claus Gittinger <cg@exept.de>
parents: 2331
diff changeset
  1469
		RETURN ( nil );
2dc6e31f0142 handleType
Claus Gittinger <cg@exept.de>
parents: 2331
diff changeset
  1470
	    }
2dc6e31f0142 handleType
Claus Gittinger <cg@exept.de>
parents: 2331
diff changeset
  1471
	}
0
1cf8d1747859 Initial revision
claus
parents:
diff changeset
  1472
    } else {
2340
2dc6e31f0142 handleType
Claus Gittinger <cg@exept.de>
parents: 2331
diff changeset
  1473
	if (__isStringLike(aNameOrNumber)) {
2dc6e31f0142 handleType
Claus Gittinger <cg@exept.de>
parents: 2331
diff changeset
  1474
	    servent = getservbyname((char *) __stringVal(aNameOrNumber), "tcp");
2dc6e31f0142 handleType
Claus Gittinger <cg@exept.de>
parents: 2331
diff changeset
  1475
	    if (servent == NULL) {
2dc6e31f0142 handleType
Claus Gittinger <cg@exept.de>
parents: 2331
diff changeset
  1476
		servent = getservbyname((char *) __stringVal(aNameOrNumber), "udp");
2dc6e31f0142 handleType
Claus Gittinger <cg@exept.de>
parents: 2331
diff changeset
  1477
		if (servent == NULL) {
2dc6e31f0142 handleType
Claus Gittinger <cg@exept.de>
parents: 2331
diff changeset
  1478
		    RETURN ( nil );
2dc6e31f0142 handleType
Claus Gittinger <cg@exept.de>
parents: 2331
diff changeset
  1479
		}
2dc6e31f0142 handleType
Claus Gittinger <cg@exept.de>
parents: 2331
diff changeset
  1480
	    }
2dc6e31f0142 handleType
Claus Gittinger <cg@exept.de>
parents: 2331
diff changeset
  1481
	}
0
1cf8d1747859 Initial revision
claus
parents:
diff changeset
  1482
    }
1cf8d1747859 Initial revision
claus
parents:
diff changeset
  1483
    if (servent) {
2340
2dc6e31f0142 handleType
Claus Gittinger <cg@exept.de>
parents: 2331
diff changeset
  1484
	RETURN ( __MKSTRING(servent->s_proto) );
0
1cf8d1747859 Initial revision
claus
parents:
diff changeset
  1485
    }
1504
92005eec5c9d fixed moving-object-when-interrupted-with-scavenge bugs;
Claus Gittinger <cg@exept.de>
parents: 1503
diff changeset
  1486
#endif /* !NO_SOCKET */
0
1cf8d1747859 Initial revision
claus
parents:
diff changeset
  1487
    RETURN ( nil );
1cf8d1747859 Initial revision
claus
parents:
diff changeset
  1488
%}
28
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1489
    "
1485
d8578cf3504b gcc3.3.1 insn-scheduler bug workaround
Claus Gittinger <cg@exept.de>
parents: 1474
diff changeset
  1490
     Socket protocolOfService:'finger'
d8578cf3504b gcc3.3.1 insn-scheduler bug workaround
Claus Gittinger <cg@exept.de>
parents: 1474
diff changeset
  1491
     Socket protocolOfService:'nntp'
28
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1492
     Socket protocolOfService:'xxx'
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1493
     Socket protocolOfService:79
1485
d8578cf3504b gcc3.3.1 insn-scheduler bug workaround
Claus Gittinger <cg@exept.de>
parents: 1474
diff changeset
  1494
     Socket protocolOfService:'snmp'
28
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1495
    "
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1496
!
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1497
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
  1498
socketAddressClassForDomain:domain
1230
2cfb8c270cb5 more functionality moved to SocketAccessor
Claus Gittinger <cg@exept.de>
parents: 1224
diff changeset
  1499
    ^ SocketAddress knownClassFromCode:domain
2cfb8c270cb5 more functionality moved to SocketAccessor
Claus Gittinger <cg@exept.de>
parents: 1224
diff changeset
  1500
2cfb8c270cb5 more functionality moved to SocketAccessor
Claus Gittinger <cg@exept.de>
parents: 1224
diff changeset
  1501
    "
3059
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  1502
     self socketAddressClassForDomain:#AF_INET
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  1503
     self socketAddressClassForDomain:#AF_UNIX
1230
2cfb8c270cb5 more functionality moved to SocketAccessor
Claus Gittinger <cg@exept.de>
parents: 1224
diff changeset
  1504
    "
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
  1505
!
7e5f2f6b177d getHostByAddr - call is now done lazy, when the socket is asked for the peer
Claus Gittinger <cg@exept.de>
parents: 1186
diff changeset
  1506
532
f997c3873602 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 531
diff changeset
  1507
supportedProtocolFamilies
f997c3873602 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 531
diff changeset
  1508
    "return a collection of supported protocol families.
f997c3873602 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 531
diff changeset
  1509
     This list specifies what the Socket class supports -
f997c3873602 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 531
diff changeset
  1510
     socket creation may still fail, if your system was built
f997c3873602 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 531
diff changeset
  1511
     without it."
f997c3873602 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 531
diff changeset
  1512
1280
b973855bfe74 moved all socket constant queries from SocketHandle
Claus Gittinger <cg@exept.de>
parents: 1278
diff changeset
  1513
    ^ OperatingSystem supportedProtocolFamilies
532
f997c3873602 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 531
diff changeset
  1514
f997c3873602 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 531
diff changeset
  1515
    "
f997c3873602 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 531
diff changeset
  1516
     Socket supportedProtocolFamilies
f997c3873602 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 531
diff changeset
  1517
    "
559
61012867ebed cleanup if #connect is interrupted
Claus Gittinger <cg@exept.de>
parents: 551
diff changeset
  1518
!
61012867ebed cleanup if #connect is interrupted
Claus Gittinger <cg@exept.de>
parents: 551
diff changeset
  1519
61012867ebed cleanup if #connect is interrupted
Claus Gittinger <cg@exept.de>
parents: 551
diff changeset
  1520
typeOfProtocol:aProtocol
61012867ebed cleanup if #connect is interrupted
Claus Gittinger <cg@exept.de>
parents: 551
diff changeset
  1521
    "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
  1522
     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
  1523
61012867ebed cleanup if #connect is interrupted
Claus Gittinger <cg@exept.de>
parents: 551
diff changeset
  1524
    (aProtocol = 'tcp') ifTrue:[^ #stream].
61012867ebed cleanup if #connect is interrupted
Claus Gittinger <cg@exept.de>
parents: 551
diff changeset
  1525
    (aProtocol = 'udp') ifTrue:[^ #datagram].
61012867ebed cleanup if #connect is interrupted
Claus Gittinger <cg@exept.de>
parents: 551
diff changeset
  1526
    (aProtocol = 'ip')  ifTrue:[^ #raw].
61012867ebed cleanup if #connect is interrupted
Claus Gittinger <cg@exept.de>
parents: 551
diff changeset
  1527
    "
61012867ebed cleanup if #connect is interrupted
Claus Gittinger <cg@exept.de>
parents: 551
diff changeset
  1528
     unix domain
61012867ebed cleanup if #connect is interrupted
Claus Gittinger <cg@exept.de>
parents: 551
diff changeset
  1529
    "
61012867ebed cleanup if #connect is interrupted
Claus Gittinger <cg@exept.de>
parents: 551
diff changeset
  1530
    (aProtocol = 'ud')  ifTrue:[^ #stream].
61012867ebed cleanup if #connect is interrupted
Claus Gittinger <cg@exept.de>
parents: 551
diff changeset
  1531
    "
61012867ebed cleanup if #connect is interrupted
Claus Gittinger <cg@exept.de>
parents: 551
diff changeset
  1532
     add x25 stuff (if any) here ...
61012867ebed cleanup if #connect is interrupted
Claus Gittinger <cg@exept.de>
parents: 551
diff changeset
  1533
    "
61012867ebed cleanup if #connect is interrupted
Claus Gittinger <cg@exept.de>
parents: 551
diff changeset
  1534
    "
61012867ebed cleanup if #connect is interrupted
Claus Gittinger <cg@exept.de>
parents: 551
diff changeset
  1535
     add appletalk stuff (if any) here ...
61012867ebed cleanup if #connect is interrupted
Claus Gittinger <cg@exept.de>
parents: 551
diff changeset
  1536
    "
61012867ebed cleanup if #connect is interrupted
Claus Gittinger <cg@exept.de>
parents: 551
diff changeset
  1537
    "
61012867ebed cleanup if #connect is interrupted
Claus Gittinger <cg@exept.de>
parents: 551
diff changeset
  1538
     add other stuff (if any) here ...
61012867ebed cleanup if #connect is interrupted
Claus Gittinger <cg@exept.de>
parents: 551
diff changeset
  1539
    "
61012867ebed cleanup if #connect is interrupted
Claus Gittinger <cg@exept.de>
parents: 551
diff changeset
  1540
    ^ nil
61012867ebed cleanup if #connect is interrupted
Claus Gittinger <cg@exept.de>
parents: 551
diff changeset
  1541
61012867ebed cleanup if #connect is interrupted
Claus Gittinger <cg@exept.de>
parents: 551
diff changeset
  1542
    "
61012867ebed cleanup if #connect is interrupted
Claus Gittinger <cg@exept.de>
parents: 551
diff changeset
  1543
     Socket typeOfProtocol:'tcp'
61012867ebed cleanup if #connect is interrupted
Claus Gittinger <cg@exept.de>
parents: 551
diff changeset
  1544
     Socket typeOfProtocol:'ucp'
61012867ebed cleanup if #connect is interrupted
Claus Gittinger <cg@exept.de>
parents: 551
diff changeset
  1545
     Socket typeOfProtocol:(Socket protocolOfService:'nntp')
61012867ebed cleanup if #connect is interrupted
Claus Gittinger <cg@exept.de>
parents: 551
diff changeset
  1546
     Socket typeOfProtocol:(Socket protocolOfService:'echo')
61012867ebed cleanup if #connect is interrupted
Claus Gittinger <cg@exept.de>
parents: 551
diff changeset
  1547
    "
28
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1548
! !
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1549
1202
c52279df60d8 method category rename
Claus Gittinger <cg@exept.de>
parents: 1187
diff changeset
  1550
!Socket methodsFor:'Compatibility-Dolphin'!
1110
0876a3d30fd2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1035
diff changeset
  1551
0876a3d30fd2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1035
diff changeset
  1552
setReceiveTimeout: milliseconds
0876a3d30fd2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1035
diff changeset
  1553
    self receiveTimeout:(milliseconds / 1000)
0876a3d30fd2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1035
diff changeset
  1554
!
0876a3d30fd2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1035
diff changeset
  1555
0876a3d30fd2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1035
diff changeset
  1556
setSendTimeout: milliseconds
0876a3d30fd2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1035
diff changeset
  1557
    self sendTimeout:(milliseconds / 1000)
0876a3d30fd2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1035
diff changeset
  1558
! !
0876a3d30fd2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1035
diff changeset
  1559
1202
c52279df60d8 method category rename
Claus Gittinger <cg@exept.de>
parents: 1187
diff changeset
  1560
!Socket methodsFor:'Compatibility-ST80'!
28
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1561
887
2b2dc6b59b5a more VW compatibility
Claus Gittinger <cg@exept.de>
parents: 876
diff changeset
  1562
acceptNonBlock
2b2dc6b59b5a more VW compatibility
Claus Gittinger <cg@exept.de>
parents: 876
diff changeset
  1563
    ^ self accept
2b2dc6b59b5a more VW compatibility
Claus Gittinger <cg@exept.de>
parents: 876
diff changeset
  1564
!
2b2dc6b59b5a more VW compatibility
Claus Gittinger <cg@exept.de>
parents: 876
diff changeset
  1565
1485
d8578cf3504b gcc3.3.1 insn-scheduler bug workaround
Claus Gittinger <cg@exept.de>
parents: 1474
diff changeset
  1566
ioConnection
887
2b2dc6b59b5a more VW compatibility
Claus Gittinger <cg@exept.de>
parents: 876
diff changeset
  1567
    ^ self
2b2dc6b59b5a more VW compatibility
Claus Gittinger <cg@exept.de>
parents: 876
diff changeset
  1568
!
2b2dc6b59b5a more VW compatibility
Claus Gittinger <cg@exept.de>
parents: 876
diff changeset
  1569
126
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
  1570
notReadySignal
781
4d61e7588ff3 added #waitForNewConnectionOrDataOnAny:timeout:
Claus Gittinger <cg@exept.de>
parents: 776
diff changeset
  1571
    "ST-80 mimicry.
4d61e7588ff3 added #waitForNewConnectionOrDataOnAny:timeout:
Claus Gittinger <cg@exept.de>
parents: 776
diff changeset
  1572
     for now - this is not yet raised"
71
claus
parents: 63
diff changeset
  1573
126
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
  1574
    ^ Signal new
486
ed4e215e83ef ST-80 mimicry
Claus Gittinger <cg@exept.de>
parents: 470
diff changeset
  1575
!
ed4e215e83ef ST-80 mimicry
Claus Gittinger <cg@exept.de>
parents: 470
diff changeset
  1576
576
13acab81fad0 more ST80 compatibility
ca
parents: 572
diff changeset
  1577
readAppendStream
781
4d61e7588ff3 added #waitForNewConnectionOrDataOnAny:timeout:
Claus Gittinger <cg@exept.de>
parents: 776
diff changeset
  1578
    "ST-80 mimicry.
4293
82b9928ddcae #OTHER by mawalch
mawalch
parents: 4288
diff changeset
  1579
     In ST-80, socket is not a stream, but refers to one.
781
4d61e7588ff3 added #waitForNewConnectionOrDataOnAny:timeout:
Claus Gittinger <cg@exept.de>
parents: 776
diff changeset
  1580
     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
  1581
     the actual stream.
781
4d61e7588ff3 added #waitForNewConnectionOrDataOnAny:timeout:
Claus Gittinger <cg@exept.de>
parents: 776
diff changeset
  1582
     In ST/X, sockets inherit from stream, so
4d61e7588ff3 added #waitForNewConnectionOrDataOnAny:timeout:
Claus Gittinger <cg@exept.de>
parents: 776
diff changeset
  1583
     this method returns the receiver, for transparency"
4d61e7588ff3 added #waitForNewConnectionOrDataOnAny:timeout:
Claus Gittinger <cg@exept.de>
parents: 776
diff changeset
  1584
576
13acab81fad0 more ST80 compatibility
ca
parents: 572
diff changeset
  1585
    ^ self
13acab81fad0 more ST80 compatibility
ca
parents: 572
diff changeset
  1586
!
13acab81fad0 more ST80 compatibility
ca
parents: 572
diff changeset
  1587
486
ed4e215e83ef ST-80 mimicry
Claus Gittinger <cg@exept.de>
parents: 470
diff changeset
  1588
readStream
ed4e215e83ef ST-80 mimicry
Claus Gittinger <cg@exept.de>
parents: 470
diff changeset
  1589
    "ST-80 mimicry.
4293
82b9928ddcae #OTHER by mawalch
mawalch
parents: 4288
diff changeset
  1590
     In ST-80, socket is not a stream, but refers to one.
486
ed4e215e83ef ST-80 mimicry
Claus Gittinger <cg@exept.de>
parents: 470
diff changeset
  1591
     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
  1592
     the actual stream.
781
4d61e7588ff3 added #waitForNewConnectionOrDataOnAny:timeout:
Claus Gittinger <cg@exept.de>
parents: 776
diff changeset
  1593
     In ST/X, sockets inherit from stream, so
4d61e7588ff3 added #waitForNewConnectionOrDataOnAny:timeout:
Claus Gittinger <cg@exept.de>
parents: 776
diff changeset
  1594
     this method returns the receiver, for transparency"
486
ed4e215e83ef ST-80 mimicry
Claus Gittinger <cg@exept.de>
parents: 470
diff changeset
  1595
ed4e215e83ef ST-80 mimicry
Claus Gittinger <cg@exept.de>
parents: 470
diff changeset
  1596
    ^ self
ed4e215e83ef ST-80 mimicry
Claus Gittinger <cg@exept.de>
parents: 470
diff changeset
  1597
ed4e215e83ef ST-80 mimicry
Claus Gittinger <cg@exept.de>
parents: 470
diff changeset
  1598
    "Created: 24.1.1997 / 23:52:57 / cg"
ed4e215e83ef ST-80 mimicry
Claus Gittinger <cg@exept.de>
parents: 470
diff changeset
  1599
!
ed4e215e83ef ST-80 mimicry
Claus Gittinger <cg@exept.de>
parents: 470
diff changeset
  1600
ed4e215e83ef ST-80 mimicry
Claus Gittinger <cg@exept.de>
parents: 470
diff changeset
  1601
writeStream
ed4e215e83ef ST-80 mimicry
Claus Gittinger <cg@exept.de>
parents: 470
diff changeset
  1602
    "ST-80 mimicry.
4293
82b9928ddcae #OTHER by mawalch
mawalch
parents: 4288
diff changeset
  1603
     In ST-80, socket is not a stream, but refers to one.
486
ed4e215e83ef ST-80 mimicry
Claus Gittinger <cg@exept.de>
parents: 470
diff changeset
  1604
     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
  1605
     the actual stream.
781
4d61e7588ff3 added #waitForNewConnectionOrDataOnAny:timeout:
Claus Gittinger <cg@exept.de>
parents: 776
diff changeset
  1606
     In ST/X, sockets inherit from stream, so
4d61e7588ff3 added #waitForNewConnectionOrDataOnAny:timeout:
Claus Gittinger <cg@exept.de>
parents: 776
diff changeset
  1607
     this method returns the receiver, for transparency"
486
ed4e215e83ef ST-80 mimicry
Claus Gittinger <cg@exept.de>
parents: 470
diff changeset
  1608
ed4e215e83ef ST-80 mimicry
Claus Gittinger <cg@exept.de>
parents: 470
diff changeset
  1609
    ^ self
ed4e215e83ef ST-80 mimicry
Claus Gittinger <cg@exept.de>
parents: 470
diff changeset
  1610
ed4e215e83ef ST-80 mimicry
Claus Gittinger <cg@exept.de>
parents: 470
diff changeset
  1611
    "Created: 24.1.1997 / 10:34:35 / cg"
ed4e215e83ef ST-80 mimicry
Claus Gittinger <cg@exept.de>
parents: 470
diff changeset
  1612
    "Modified: 24.1.1997 / 23:52:52 / cg"
71
claus
parents: 63
diff changeset
  1613
! !
claus
parents: 63
diff changeset
  1614
1202
c52279df60d8 method category rename
Claus Gittinger <cg@exept.de>
parents: 1187
diff changeset
  1615
!Socket methodsFor:'Compatibility-Squeak'!
771
74abb04ef57c checkin from browser
Claus Gittinger <cg@exept.de>
parents: 752
diff changeset
  1616
1462
5602fce52b42 squeak stuff
Claus Gittinger <cg@exept.de>
parents: 1413
diff changeset
  1617
address
5602fce52b42 squeak stuff
Claus Gittinger <cg@exept.de>
parents: 1413
diff changeset
  1618
    ^ self getSocketAddress
5602fce52b42 squeak stuff
Claus Gittinger <cg@exept.de>
parents: 1413
diff changeset
  1619
!
5602fce52b42 squeak stuff
Claus Gittinger <cg@exept.de>
parents: 1413
diff changeset
  1620
2308
d8b410a4f38b added: #connectToHostNamed:port:
Claus Gittinger <cg@exept.de>
parents: 2292
diff changeset
  1621
connectToHostNamed:hostName port:portNr
d8b410a4f38b added: #connectToHostNamed:port:
Claus Gittinger <cg@exept.de>
parents: 2292
diff changeset
  1622
    self connectTo:hostName port:portNr
d8b410a4f38b added: #connectToHostNamed:port:
Claus Gittinger <cg@exept.de>
parents: 2292
diff changeset
  1623
!
d8b410a4f38b added: #connectToHostNamed:port:
Claus Gittinger <cg@exept.de>
parents: 2292
diff changeset
  1624
1462
5602fce52b42 squeak stuff
Claus Gittinger <cg@exept.de>
parents: 1413
diff changeset
  1625
dataAvailable
5602fce52b42 squeak stuff
Claus Gittinger <cg@exept.de>
parents: 1413
diff changeset
  1626
    ^ self canReadWithoutBlocking
5602fce52b42 squeak stuff
Claus Gittinger <cg@exept.de>
parents: 1413
diff changeset
  1627
!
5602fce52b42 squeak stuff
Claus Gittinger <cg@exept.de>
parents: 1413
diff changeset
  1628
1886
e0d23764c809 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1885
diff changeset
  1629
destroy
e0d23764c809 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1885
diff changeset
  1630
    self close
e0d23764c809 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1885
diff changeset
  1631
e0d23764c809 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1885
diff changeset
  1632
    "Created: / 04-06-2007 / 21:29:03 / cg"
e0d23764c809 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1885
diff changeset
  1633
!
e0d23764c809 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1885
diff changeset
  1634
1462
5602fce52b42 squeak stuff
Claus Gittinger <cg@exept.de>
parents: 1413
diff changeset
  1635
listenOn:aPortNr
1882
6f818f33c85a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1863
diff changeset
  1636
    self listenOn:aPortNr backlogSize:5
6f818f33c85a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1863
diff changeset
  1637
6f818f33c85a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1863
diff changeset
  1638
    "Modified: / 31-05-2007 / 17:59:53 / cg"
6f818f33c85a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1863
diff changeset
  1639
!
6f818f33c85a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1863
diff changeset
  1640
6f818f33c85a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1863
diff changeset
  1641
listenOn:aPortNr backlogSize:aNumber
1462
5602fce52b42 squeak stuff
Claus Gittinger <cg@exept.de>
parents: 1413
diff changeset
  1642
    self bindTo:aPortNr address:nil.
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  1643
    self listenFor:aNumber
1882
6f818f33c85a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1863
diff changeset
  1644
6f818f33c85a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1863
diff changeset
  1645
    "Created: / 31-05-2007 / 17:59:47 / cg"
1462
5602fce52b42 squeak stuff
Claus Gittinger <cg@exept.de>
parents: 1413
diff changeset
  1646
!
5602fce52b42 squeak stuff
Claus Gittinger <cg@exept.de>
parents: 1413
diff changeset
  1647
4587
caa262d036d2 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4570
diff changeset
  1648
noTimeout
caa262d036d2 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4570
diff changeset
  1649
    "disable timeouts - dummy for now"
caa262d036d2 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4570
diff changeset
  1650
caa262d036d2 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4570
diff changeset
  1651
    ^ self 
caa262d036d2 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4570
diff changeset
  1652
!
caa262d036d2 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4570
diff changeset
  1653
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  1654
peerName
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  1655
    "return my peer (i.e. ipAddr + port);
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  1656
     May return nil if not yet setup completely."
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  1657
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  1658
    ^ self getPeer
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  1659
!
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  1660
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  1661
sendData: aStringOrByteArray
3155
d1884a37375c Initialize in instance initialize method insted in #new
Stefan Vogel <sv@exept.de>
parents: 3152
diff changeset
  1662
    "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
  1663
     Return the number of bytes sent."
d1884a37375c Initialize in instance initialize method insted in #new
Stefan Vogel <sv@exept.de>
parents: 3152
diff changeset
  1664
d1884a37375c Initialize in instance initialize method insted in #new
Stefan Vogel <sv@exept.de>
parents: 3152
diff changeset
  1665
    ^ self nextPutBytes:aStringOrByteArray size from:aStringOrByteArray startingAt:1.
1600
f3acd5382fa1 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1584
diff changeset
  1666
!
f3acd5382fa1 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1584
diff changeset
  1667
2904
d2e1eead2bfb class: Socket
Claus Gittinger <cg@exept.de>
parents: 2900
diff changeset
  1668
waitForConnectionUntil:aTimestamp
d2e1eead2bfb class: Socket
Claus Gittinger <cg@exept.de>
parents: 2900
diff changeset
  1669
    "return true if connected"
d2e1eead2bfb class: Socket
Claus Gittinger <cg@exept.de>
parents: 2900
diff changeset
  1670
d2e1eead2bfb class: Socket
Claus Gittinger <cg@exept.de>
parents: 2900
diff changeset
  1671
    self readWaitWithTimeoutMs: (aTimestamp millisecondDeltaFrom:Timestamp now).
d2e1eead2bfb class: Socket
Claus Gittinger <cg@exept.de>
parents: 2900
diff changeset
  1672
    ^ self isConnected
771
74abb04ef57c checkin from browser
Claus Gittinger <cg@exept.de>
parents: 752
diff changeset
  1673
! !
74abb04ef57c checkin from browser
Claus Gittinger <cg@exept.de>
parents: 752
diff changeset
  1674
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  1675
!Socket methodsFor:'accepting connections'!
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
accept
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  1678
    "create a new TCP socket from accepting on the receiver.
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  1679
     This method will suspend the current process if no connection is waiting.
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  1680
     For ST-80 compatibility"
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  1681
3633
3a21f142432e #REFACTORING
Stefan Vogel <sv@exept.de>
parents: 3620
diff changeset
  1682
    ^ self waitForNewConnectionWithTimeout:nil
1935
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
    "
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  1685
     |sock newSock|
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  1686
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  1687
     sock := Socket provide:8004.
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  1688
     sock listenFor:5.
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  1689
     newSock := sock accept.
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
!
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
blockingAccept
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  1694
    "create a new TCP socket from accepting on the receiver.
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  1695
     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
  1696
     For ST-80 compatibility"
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  1697
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  1698
    |newSock|
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  1699
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  1700
    newSock := self class new.
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  1701
    (newSock primAcceptOn:self blocking:true) ifFalse:[
4568
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  1702
        "should raise an error here - primitive code raises a notification"
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  1703
        ^ nil
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  1704
    ].
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  1705
    ^ newSock
4568
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  1706
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  1707
    "Modified (format): / 19-01-2018 / 13:32:25 / stefan"
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  1708
! !
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  1709
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  1710
!Socket methodsFor:'binding'!
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
bindAnonymously
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  1713
    "bind to any address. A free port will be allocated.
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  1714
     Our own socket address will be determined after conection set up.
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  1715
     This is the default after the socket has been created"
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  1716
3059
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  1717
    ^ self bindTo:nil reuseAddress:false
2321
6f4cc7b644db filePointer -> handle migration
Claus Gittinger <cg@exept.de>
parents: 2308
diff changeset
  1718
6f4cc7b644db filePointer -> handle migration
Claus Gittinger <cg@exept.de>
parents: 2308
diff changeset
  1719
    "
1938
831af28cc848 comments
Stefan Vogel <sv@exept.de>
parents: 1935
diff changeset
  1720
      self newTCP bindAnonymously; listenFor:1; yourself
4206
ac9a6e096796 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4203
diff changeset
  1721
      self newTCP bindAnonymously; port
1938
831af28cc848 comments
Stefan Vogel <sv@exept.de>
parents: 1935
diff changeset
  1722
    "
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  1723
!
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  1724
3059
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  1725
bindAnonymouslyToAddress:aSocketAddress
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  1726
    "bind to address addressString.
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  1727
     A free port will be allocated"
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
    ^ self
3217
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  1730
	bindTo:0
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  1731
	address:aSocketAddress
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  1732
	reuseAddress:false
2321
6f4cc7b644db filePointer -> handle migration
Claus Gittinger <cg@exept.de>
parents: 2308
diff changeset
  1733
6f4cc7b644db filePointer -> handle migration
Claus Gittinger <cg@exept.de>
parents: 2308
diff changeset
  1734
    "
3059
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  1735
      self newTCP bindAnonymouslyToAddress:IPSocketAddress localHost; listenFor:1; yourself
1938
831af28cc848 comments
Stefan Vogel <sv@exept.de>
parents: 1935
diff changeset
  1736
    "
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  1737
!
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  1738
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  1739
bindTo:aSocketAddress
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  1740
    "ST80 compatible bind, expecting a socketAddress argument.
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  1741
     The socketAddress object (an instance of SocketAddress)
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  1742
     is supposed to respond to #portOrName and #address requests."
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  1743
3059
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  1744
    ^ self bindTo:aSocketAddress reuseAddress:true
1935
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
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  1747
bindTo:portNrOrNameString address:addressString
3059
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  1748
    "Old interface: bind the socket to an address
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  1749
     - returns true if ok, false otherwise.
4568
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  1750
     Notify with a SocketErrorNotification on error.
3059
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  1751
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  1752
     The interpretation of hostOrPathNameOrSocketAddrOrNil portNrOrName depends on the domain:
4568
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  1753
        Best use a SocketAddress
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  1754
        For backward compatibility:
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  1755
            AF_INET domain can also use (4byte) byteArray like internet numbers,
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  1756
            AF_UNIX domain cab use pathname strings."
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  1757
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  1758
    ^ self
4568
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  1759
        bindTo:portNrOrNameString
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  1760
        address:addressString
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  1761
        reuseAddress:true
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  1762
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  1763
    "Modified (comment): / 19-01-2018 / 13:36:54 / stefan"
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
bindTo:portNrOrNameOrNil address:hostOrPathNameOrSocketAddrOrNil reuseAddress:reuse
3059
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  1767
    "Old interface: bind the socket to an address
4568
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  1768
     Notify with a SocketErrorNotification on error.
3059
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  1769
     - returns true if ok, false otherwise.
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  1770
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  1771
     The interpretation of hostOrPathNameOrSocketAddrOrNil portNrOrName depends on the domain:
4568
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  1772
        Best use a SocketAddress
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  1773
        For backward compatibility:
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  1774
            AF_INET domain can also use (4byte) byteArray like internet numbers,
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  1775
            AF_UNIX domain can use pathname strings.
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  1776
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  1777
     The reuse boolean argument controls if the SO_REUSEADDR socket option
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  1778
     is to be set (to avoid the 'bind: address in use' error).
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  1779
    "
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  1780
3059
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  1781
    |socketAddress|
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  1782
2321
6f4cc7b644db filePointer -> handle migration
Claus Gittinger <cg@exept.de>
parents: 2308
diff changeset
  1783
    handle isNil ifTrue:[
4568
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  1784
        ^ self errorNotOpen
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  1785
    ].
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  1786
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  1787
    hostOrPathNameOrSocketAddrOrNil isNil ifTrue:[
4568
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  1788
        socketAddress := self socketAddressClass anyHost.
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  1789
    ] ifFalse:[
4568
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  1790
        (hostOrPathNameOrSocketAddrOrNil isSocketAddress) ifTrue:[
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  1791
            socketAddress := hostOrPathNameOrSocketAddrOrNil.
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  1792
        ] ifFalse:[
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  1793
            "backward compatibility: support for byteArray and string arg"
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  1794
            hostOrPathNameOrSocketAddrOrNil isString ifTrue:[
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  1795
                socketAddress := self socketAddressClass hostName:hostOrPathNameOrSocketAddrOrNil.
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  1796
            ] ifFalse:[
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  1797
                hostOrPathNameOrSocketAddrOrNil isByteCollection ifFalse:[
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  1798
                    ^ self error:'bindTo: bad host (socketAddress) argument'
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  1799
                ].
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  1800
                socketAddress := self socketAddressClass hostAddress:hostOrPathNameOrSocketAddrOrNil.
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  1801
            ].
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  1802
        ].
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  1803
    ].
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  1804
    portNrOrNameOrNil notNil ifTrue:[
4568
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  1805
        socketAddress port:portNrOrNameOrNil.
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  1806
    ].
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
    ^ self bindTo:socketAddress reuseAddress:reuse.
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  1809
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  1810
    "
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  1811
     (Socket domain:#'AF_INET' type:#stream)
4568
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  1812
         bindTo:2144 address:nil; yourself
3059
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  1813
    "
4568
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  1814
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  1815
    "Modified (comment): / 19-01-2018 / 13:37:13 / stefan"
3059
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  1816
!
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  1817
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  1818
bindTo:aSocketAddress reuseAddress:reuse
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  1819
    "Bind the socket to aSocketAddress - returns true if ok, false otherwise.
4568
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  1820
     Notify with a SocketErrorNotification on error.
3059
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  1821
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  1822
     The reuse boolean argument controls if the SO_REUSEADDR socket option
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  1823
     is to be set (to avoid the 'bind: address in use' error).
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  1824
3137
df3e9cebf52c class: Socket
Stefan Vogel <sv@exept.de>
parents: 3127
diff changeset
  1825
     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
  1826
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  1827
    |ok error socketAddress|
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
    handle isNil ifTrue:[
4568
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  1830
        ^ self errorNotOpen
3059
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  1831
    ].
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  1832
    socketAddress := aSocketAddress.
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  1833
    socketAddress isNil ifTrue:[
4568
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  1834
        "ok, get a all zero socket address, so it is for anyHost
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  1835
         and the port will be assigned"
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  1836
        socketAddress := self socketAddressClass new.
3513
8105bf370769 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3485
diff changeset
  1837
    ].
8105bf370769 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3485
diff changeset
  1838
    domain == #'AF_INET6' ifTrue:[
4568
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  1839
        "accept also IPv4 connections on IPv6 sockets (this is off by default for windows"
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  1840
        self setSocketOption:#'IPV6_V6ONLY' argument:false argument:nil.
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  1841
    ].
2321
6f4cc7b644db filePointer -> handle migration
Claus Gittinger <cg@exept.de>
parents: 2308
diff changeset
  1842
    ok := false.
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  1843
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  1844
%{  /* STACK: 100000 */
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  1845
#ifndef NO_SOCKET
2321
6f4cc7b644db filePointer -> handle migration
Claus Gittinger <cg@exept.de>
parents: 2308
diff changeset
  1846
    OBJ fp = __INST(handle);
6f4cc7b644db filePointer -> handle migration
Claus Gittinger <cg@exept.de>
parents: 2308
diff changeset
  1847
    SOCKET sock;
6f4cc7b644db filePointer -> handle migration
Claus Gittinger <cg@exept.de>
parents: 2308
diff changeset
  1848
    union sockaddr_u sa;
6f4cc7b644db filePointer -> handle migration
Claus Gittinger <cg@exept.de>
parents: 2308
diff changeset
  1849
    int sockaddr_size;
2909
aacef77a1697 64bit fixes
Claus Gittinger <cg@exept.de>
parents: 2904
diff changeset
  1850
    INT ret;
2321
6f4cc7b644db filePointer -> handle migration
Claus Gittinger <cg@exept.de>
parents: 2308
diff changeset
  1851
    int sockAddrOffs;
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  1852
3059
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  1853
    if (fp == nil) {
4568
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  1854
        goto getOutOfHere;
2321
6f4cc7b644db filePointer -> handle migration
Claus Gittinger <cg@exept.de>
parents: 2308
diff changeset
  1855
    }
3059
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  1856
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  1857
    if (! __isBytes(socketAddress)) {
4568
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  1858
        error = __mkSmallInteger(-1);
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  1859
        goto getOutOfHere;
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  1860
    }
2321
6f4cc7b644db filePointer -> handle migration
Claus Gittinger <cg@exept.de>
parents: 2308
diff changeset
  1861
    /* get the socket-address */
3059
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  1862
    if (__isNonNilObject(socketAddress)){
4568
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  1863
        int nIndex;
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  1864
        OBJ cls = __qClass(socketAddress);
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  1865
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  1866
        sockAddrOffs = __OBJS2BYTES__(__intVal(__ClassInstPtr(cls)->c_ninstvars));
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  1867
        nIndex = __qSize(socketAddress) - OHDR_SIZE;
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  1868
        sockaddr_size = nIndex - sockAddrOffs;
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  1869
        if (sockaddr_size > sizeof(sa)) {
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  1870
            error=__mkSmallInteger(-2);
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  1871
            goto getOutOfHere;
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  1872
        }
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  1873
        memcpy(&sa, __byteArrayVal(socketAddress) + sockAddrOffs, sockaddr_size);
2321
6f4cc7b644db filePointer -> handle migration
Claus Gittinger <cg@exept.de>
parents: 2308
diff changeset
  1874
    }
6f4cc7b644db filePointer -> handle migration
Claus Gittinger <cg@exept.de>
parents: 2308
diff changeset
  1875
6f4cc7b644db filePointer -> handle migration
Claus Gittinger <cg@exept.de>
parents: 2308
diff changeset
  1876
    sock = SOCKET_FROM_FILE_OBJECT(fp);
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  1877
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  1878
# ifdef SO_REUSEADDR
2321
6f4cc7b644db filePointer -> handle migration
Claus Gittinger <cg@exept.de>
parents: 2308
diff changeset
  1879
    if (reuse == true) {
4568
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  1880
        int on = 1;
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  1881
        if (setsockopt(sock, SOL_SOCKET, SO_REUSEADDR, (char *) &on, sizeof (on)) < 0) {
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  1882
            DBGPRINTF(("SOCKET: setsockopt - SO_REUSEADDR failed\n"));
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  1883
        }
2321
6f4cc7b644db filePointer -> handle migration
Claus Gittinger <cg@exept.de>
parents: 2308
diff changeset
  1884
    }
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  1885
# endif /* SO_REUSEADDR */
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  1886
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  1887
# ifdef BIND_BLOCKS
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  1888
#  ifdef DO_WRAP_CALLS
2321
6f4cc7b644db filePointer -> handle migration
Claus Gittinger <cg@exept.de>
parents: 2308
diff changeset
  1889
    do {
4568
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  1890
        __threadErrno = 0;
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  1891
        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
  1892
    } while ((ret < 0) && (__threadErrno == EINTR));
3126
d95cc55a4fb5 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3123
diff changeset
  1893
    if (ret < 0) {
4568
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  1894
        errno = __threadErrno;
3126
d95cc55a4fb5 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3123
diff changeset
  1895
    }
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  1896
#  else
2321
6f4cc7b644db filePointer -> handle migration
Claus Gittinger <cg@exept.de>
parents: 2308
diff changeset
  1897
    __BEGIN_INTERRUPTABLE__
6f4cc7b644db filePointer -> handle migration
Claus Gittinger <cg@exept.de>
parents: 2308
diff changeset
  1898
    do {
4568
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  1899
        ret = bind(sock, (struct sockaddr *)&sa, sockaddr_size);
2321
6f4cc7b644db filePointer -> handle migration
Claus Gittinger <cg@exept.de>
parents: 2308
diff changeset
  1900
    } while ((ret < 0) && (errno == EINTR));
6f4cc7b644db filePointer -> handle migration
Claus Gittinger <cg@exept.de>
parents: 2308
diff changeset
  1901
    __END_INTERRUPTABLE__
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  1902
#  endif
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  1903
# else
3126
d95cc55a4fb5 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3123
diff changeset
  1904
    errno = 0;
2321
6f4cc7b644db filePointer -> handle migration
Claus Gittinger <cg@exept.de>
parents: 2308
diff changeset
  1905
    ret = bind(sock, (struct sockaddr *)&sa, sockaddr_size);
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  1906
# endif
2321
6f4cc7b644db filePointer -> handle migration
Claus Gittinger <cg@exept.de>
parents: 2308
diff changeset
  1907
    if (ret < 0) {
3843
fbced69597a7 oops - error check was disabled
Claus Gittinger <cg@exept.de>
parents: 3742
diff changeset
  1908
# ifdef __win32__
4568
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  1909
        if (errno == 0) {
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  1910
            errno = WSAGetLastError();
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  1911
        }
3126
d95cc55a4fb5 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3123
diff changeset
  1912
# endif
4568
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  1913
        DBGPRINTF(("SOCKET: bind failed errno=%d\n", errno));
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  1914
        error = __INST(lastErrorNumber) = __MKSMALLINT(errno);
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  1915
        goto getOutOfHere;
2321
6f4cc7b644db filePointer -> handle migration
Claus Gittinger <cg@exept.de>
parents: 2308
diff changeset
  1916
    } else {
4568
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  1917
        ok = true;
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  1918
    }
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  1919
#endif /* NO_SOCKET */
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  1920
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  1921
getOutOfHere: ;
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  1922
%}.
4234
eb1b470a27ee #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 4206
diff changeset
  1923
    ok ifFalse:[
4568
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  1924
        |errorHolder errorString|
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  1925
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  1926
        error isInteger ifTrue:[
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  1927
            errorHolder := OperatingSystem errorHolderForNumber:error.
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  1928
            errorString := errorHolder errorString.
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  1929
        ] ifFalse:[
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  1930
            errorString := error.
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  1931
        ].
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  1932
        OpenError newException
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  1933
            errorString:('cannot bind socket to address: %1 (%2)'
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  1934
                            bindWith:socketAddress
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  1935
                            with:errorString);
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  1936
            errorCode:error;
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  1937
            osErrorHolder:errorHolder;
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  1938
            parameter:self;
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  1939
            raiseRequest.
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  1940
        "maybe someone catches the error and binds to some other port..."
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  1941
        ^ true.
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  1942
    ].
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  1943
3059
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  1944
    port := socketAddress port.
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  1945
    port == 0 ifTrue:[
4568
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  1946
        "this is a bind to a random port, now we can get the real port"
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  1947
        port := self getFullSocketAddress port.
3059
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  1948
    ].
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  1949
    ^ true
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  1950
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  1951
    "
3059
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  1952
     (Socket domain:#'AF_INET' type:#stream)
4568
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  1953
        bindTo:(IPSocketAddress anyHost port:445) reuseAddress:false;
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  1954
        yourself.
3059
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  1955
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  1956
     (Socket domain:#'AF_INET' type:#stream)
4568
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  1957
        bindTo:139 reuseAddress:false;
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  1958
        yourself.
3059
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  1959
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  1960
     (Socket domain:#'AF_INET6' type:#stream)
4568
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  1961
        bindTo:nil reuseAddress:false;
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  1962
        yourself.
3059
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  1963
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  1964
     (Socket domain:#'AF_INET' type:#stream)
4568
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  1965
        bindTo:(IPSocketAddress localHost port:2122) reuseAddress:false;
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  1966
        yourself.
3059
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  1967
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  1968
     (Socket domain:#'AF_UNIX' type:#stream)
4568
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  1969
        bindTo:nil reuseAddress:false;
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  1970
        yourself.
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  1971
    "
4568
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  1972
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  1973
    "Modified: / 19-01-2018 / 13:37:21 / stefan"
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  1974
!
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  1975
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  1976
listenFor:aNumber
4568
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  1977
    "start listening; return true if ok, false on error.
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  1978
     Notify with a SocketErrorNotification on error.
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  1979
     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
  1980
4568
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  1981
    |err|
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  1982
2321
6f4cc7b644db filePointer -> handle migration
Claus Gittinger <cg@exept.de>
parents: 2308
diff changeset
  1983
    handle isNil ifTrue:[
4568
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  1984
        ^ self errorNotOpen
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  1985
    ].
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
#ifndef NO_SOCKET
2321
6f4cc7b644db filePointer -> handle migration
Claus Gittinger <cg@exept.de>
parents: 2308
diff changeset
  1988
    OBJ fp = __INST(handle);
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  1989
    SOCKET sock;
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  1990
    int ret;
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  1991
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  1992
    if (! __isSmallInteger(aNumber)) {
4568
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  1993
        DBGPRINTF(("SOCKET: invalid arg\n"));
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  1994
        err = @symbol(badArgument);
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  1995
        goto out;
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
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  1998
    sock = SOCKET_FROM_FILE_OBJECT(fp);
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  1999
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2000
#ifdef LISTEN_BLOCKS
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2001
# ifdef DO_WRAP_CALLS
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2002
    do {
4568
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  2003
        __threadErrno = 0;
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  2004
        ret = STX_WSA_NOINT_CALL2("listen", listen, sock, __intVal(aNumber));
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2005
    } while ((ret < 0) && (__threadErrno == EINTR));
3126
d95cc55a4fb5 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3123
diff changeset
  2006
    if (ret < 0) {
4568
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  2007
        errno = __threadErrno;
3126
d95cc55a4fb5 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3123
diff changeset
  2008
    }
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2009
# else
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2010
    __BEGIN_INTERRUPTABLE__
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2011
    do {
4568
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  2012
        ret = listen(sock, __intVal(aNumber));
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2013
    } while ((ret < 0) && (errno == EINTR));
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2014
    __END_INTERRUPTABLE__
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2015
# endif
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2016
#else
3126
d95cc55a4fb5 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3123
diff changeset
  2017
    errno = 0;
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2018
    ret = listen(sock, __intVal(aNumber));
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2019
#endif
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2020
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2021
    if (ret < 0) {
3843
fbced69597a7 oops - error check was disabled
Claus Gittinger <cg@exept.de>
parents: 3742
diff changeset
  2022
# ifdef __win32__
4568
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  2023
        if (errno == 0) {
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  2024
            errno = WSAGetLastError();
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  2025
        }
3126
d95cc55a4fb5 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3123
diff changeset
  2026
# endif
4568
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  2027
        err = __MKSMALLINT(errno);
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  2028
        DBGPRINTF(("SOCKET: listen call failed errno=%d\n", errno));
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  2029
        goto out;
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2030
    }
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2031
#else
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2032
    RETURN (false);
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2033
#endif
4568
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  2034
out:;
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2035
%}.
4568
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  2036
    err notNil ifTrue:[
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  2037
        err isSymbol ifTrue:[
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  2038
            self error:err.
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  2039
        ].
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  2040
        ^ self reportError:err.
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  2041
    ].
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  2042
3157
44f5f9f79256 initialize methods
Stefan Vogel <sv@exept.de>
parents: 3155
diff changeset
  2043
    listening := aNumber.
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2044
    ^ true
4568
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  2045
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  2046
    "
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  2047
       [
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  2048
           |sock|
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  2049
           sock := Socket newTCP.
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  2050
           sock listenFor:1.
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  2051
           sock
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  2052
       ] on:SocketErrorNotification do:[:ex|
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  2053
           ex halt.
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  2054
       ].
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  2055
    "
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  2056
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  2057
    "Modified (comment): / 19-01-2018 / 13:50:09 / stefan"
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2058
! !
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2059
1576
a2ffb22c5f5e New: #shutDownInput #shutDownOutput
Stefan Vogel <sv@exept.de>
parents: 1568
diff changeset
  2060
!Socket methodsFor:'closing'!
a2ffb22c5f5e New: #shutDownInput #shutDownOutput
Stefan Vogel <sv@exept.de>
parents: 1568
diff changeset
  2061
4172
2a6544c030fc #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 4091
diff changeset
  2062
abortAndClose
2a6544c030fc #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 4091
diff changeset
  2063
    "immediately abort the connection:
4414
42edc97b2323 bcopy -> memcpy
Claus Gittinger <cg@exept.de>
parents: 4341
diff changeset
  2064
	discard buffered data and close the stream"
42edc97b2323 bcopy -> memcpy
Claus Gittinger <cg@exept.de>
parents: 4341
diff changeset
  2065
42edc97b2323 bcopy -> memcpy
Claus Gittinger <cg@exept.de>
parents: 4341
diff changeset
  2066
    self linger:0.
42edc97b2323 bcopy -> memcpy
Claus Gittinger <cg@exept.de>
parents: 4341
diff changeset
  2067
    self close.
3224
bad706c50347 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3223
diff changeset
  2068
!
bad706c50347 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3223
diff changeset
  2069
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2070
shutDown
4414
42edc97b2323 bcopy -> memcpy
Claus Gittinger <cg@exept.de>
parents: 4341
diff changeset
  2071
    "shutDown (initiate a graceful close)
4172
2a6544c030fc #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 4091
diff changeset
  2072
     and close (free the filedescriptor) the socket.
4414
42edc97b2323 bcopy -> memcpy
Claus Gittinger <cg@exept.de>
parents: 4341
diff changeset
  2073
     The close will return immediately and buffered data will be sent in the
4172
2a6544c030fc #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 4091
diff changeset
  2074
     background, unless you set linger"
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2075
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2076
    self shutdown:2.
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2077
    self close
1576
a2ffb22c5f5e New: #shutDownInput #shutDownOutput
Stefan Vogel <sv@exept.de>
parents: 1568
diff changeset
  2078
!
a2ffb22c5f5e New: #shutDownInput #shutDownOutput
Stefan Vogel <sv@exept.de>
parents: 1568
diff changeset
  2079
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2080
shutDownInput
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2081
    "shutDown the input side of the socket.
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2082
     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
  2083
     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
  2084
     (e.g. setting the TCP-Windowsize to 0)"
a2ffb22c5f5e New: #shutDownInput #shutDownOutput
Stefan Vogel <sv@exept.de>
parents: 1568
diff changeset
  2085
a2ffb22c5f5e New: #shutDownInput #shutDownOutput
Stefan Vogel <sv@exept.de>
parents: 1568
diff changeset
  2086
    self shutdown:0.
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2087
!
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2088
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2089
shutDownOutput
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2090
    "shutDown the output side of the socket.
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2091
     Any write to the socket will signal end-of-file from now on.
4172
2a6544c030fc #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 4091
diff changeset
  2092
     An orderly release (TCP FIN) will be initiated after the last buffered data
2a6544c030fc #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 4091
diff changeset
  2093
     has been sent, so the other side will get a end-of-file condition eventually.
4414
42edc97b2323 bcopy -> memcpy
Claus Gittinger <cg@exept.de>
parents: 4341
diff changeset
  2094
     If you set linger > 0, the operation will wait until buffered data
4172
2a6544c030fc #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 4091
diff changeset
  2095
     has been delivered to the peer.
2a6544c030fc #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 4091
diff changeset
  2096
     Otherwise the operation returns immediately."
1343
cc3bed115c0a definitions cleanup with stxOSDefs.h
penk
parents: 1342
diff changeset
  2097
1884
ee0d640a25a7 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1882
diff changeset
  2098
    self shutdown:1.
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2099
! !
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2100
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2101
!Socket methodsFor:'connecting'!
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2102
3059
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  2103
connectTo:aSocketAddress
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  2104
    ^ self connectTo:aSocketAddress withTimeout:nil
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  2105
!
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  2106
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2107
connectTo:hostOrPathName port:portNrOrName
3655
eb81fa3d8407 #REFACTORING
Stefan Vogel <sv@exept.de>
parents: 3633
diff changeset
  2108
    <resource: #obsolete>
3059
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  2109
    "Backward compatibility connect; connect to port, portNrOrNameOrNil on host, hostOrPathNameOrSocketAddr.
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  2110
     For backward compatibility, hostOrPathNameOrSocketAddr may be also a string or a byteArray,
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  2111
     but it is recommended to pass SocketAddress instances.
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2112
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2113
     Return true if ok, false otherwise.
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2114
     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
  2115
     See also: #connectTo:port:withTimeout: for a somewhat nicer interface."
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
    ^ self connectTo:hostOrPathName port:portNrOrName withTimeout:nil
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2118
!
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2119
4570
39e965ca8d06 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4568
diff changeset
  2120
connectTo:hostOrPathNameOrSocketAddr port:portNrOrNameOrNil withTimeout:milliSecondsOrTimeDuration
3655
eb81fa3d8407 #REFACTORING
Stefan Vogel <sv@exept.de>
parents: 3633
diff changeset
  2121
    <resource: #obsolete>
3059
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  2122
    "Backward compatibility connect; connect to port, portNrOrNameOrNil on host, hostOrPathNameOrSocketAddr.
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  2123
     For backward compatibility, hostOrPathNameOrSocketAddr may be also a string or a byteArray,
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  2124
     but it is recommended to pass SocketAddress instances.
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2125
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2126
     Return true if ok, false otherwise.
4568
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  2127
     Notify with a SocketErrorNotification on error.
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  2128
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2129
     The current process will block (but not the whole Smalltalk) until the connection is established,
4570
39e965ca8d06 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4568
diff changeset
  2130
     or milliSecondsOrTimeDuration milliseconds have passed."
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2131
3059
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  2132
    |domainClass socketAddress|
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  2133
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  2134
    (hostOrPathNameOrSocketAddr isSocketAddress) ifTrue:[
4568
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  2135
        socketAddress := hostOrPathNameOrSocketAddr.
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  2136
        portNrOrNameOrNil notNil ifTrue:[
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  2137
            socketAddress port:portNrOrNameOrNil.
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  2138
        ].
3059
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  2139
    ] ifFalse:[
4568
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  2140
        "backward compatibility: support for byteArray and string arg"
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  2141
        domainClass := self class socketAddressClassForDomain:domain.
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  2142
        domainClass isNil ifTrue:[
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  2143
            ^ self error:'invalid (unsupported) domain'.
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  2144
        ].
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  2145
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  2146
        hostOrPathNameOrSocketAddr isString ifTrue:[
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  2147
            socketAddress := domainClass hostName:hostOrPathNameOrSocketAddr serviceName:portNrOrNameOrNil type:#SOCK_STREAM.
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  2148
            peerName := hostOrPathNameOrSocketAddr.
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  2149
        ] ifFalse:[
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  2150
            hostOrPathNameOrSocketAddr isByteCollection ifFalse:[
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  2151
                ^ self error:'connectTo: bad host (socketAddress) argument'
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  2152
            ].
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  2153
            socketAddress := domainClass hostAddress:hostOrPathNameOrSocketAddr port:portNrOrNameOrNil.
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  2154
        ].
3059
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  2155
    ].
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  2156
4570
39e965ca8d06 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4568
diff changeset
  2157
    ^ self connectTo:socketAddress withTimeout:milliSecondsOrTimeDuration.
3059
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  2158
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  2159
    "
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  2160
       |sock|
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  2161
       sock := Socket newTCP.
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  2162
       sock connectTo:'localhost' port:21 withTimeout:1000.
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  2163
       sock
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  2164
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  2165
       |sock|
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  2166
       sock := Socket newTCP.
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  2167
       sock connectTo:'localhost' port:9876 withTimeout:2000.
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  2168
       sock
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  2169
    "
4568
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  2170
4570
39e965ca8d06 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4568
diff changeset
  2171
    "Modified (comment): / 19-01-2018 / 17:48:08 / stefan"
3059
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  2172
!
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  2173
4570
39e965ca8d06 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4568
diff changeset
  2174
connectTo:aSocketAddress withTimeout:milliSecondsOrTimeDuration
3059
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  2175
    "Connect to a SocketAddress.
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  2176
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  2177
     Return true if ok, false otherwise.
4568
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  2178
     Notify with a SocketErrorNotification on error.
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  2179
3059
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  2180
     The current process will block (but not the whole Smalltalk) until the connection is established,
4038
3ff1884f5acd #OTHER by mawalch
mawalch
parents: 4032
diff changeset
  2181
     or timeout milliseconds have passed."
3059
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  2182
4570
39e965ca8d06 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4568
diff changeset
  2183
    |isAsync err timeoutMs milliSeconds|
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2184
2321
6f4cc7b644db filePointer -> handle migration
Claus Gittinger <cg@exept.de>
parents: 2308
diff changeset
  2185
    handle isNil ifTrue:[
4568
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  2186
        ^ self errorNotOpen
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2187
    ].
4234
eb1b470a27ee #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 4206
diff changeset
  2188
    isAsync := false.
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2189
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2190
%{  /* STACK: 100000 */
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2191
#ifndef NO_SOCKET
3123
55ef9ca4f09f class: Socket
Stefan Vogel <sv@exept.de>
parents: 3077
diff changeset
  2192
//#define DUMP_ADDRESS 1
2321
6f4cc7b644db filePointer -> handle migration
Claus Gittinger <cg@exept.de>
parents: 2308
diff changeset
  2193
    OBJ fp = __INST(handle);
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2194
    union sockaddr_u sa;
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2195
    SOCKET sock;
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2196
    int a;
2909
aacef77a1697 64bit fixes
Claus Gittinger <cg@exept.de>
parents: 2904
diff changeset
  2197
    INT ret;
aacef77a1697 64bit fixes
Claus Gittinger <cg@exept.de>
parents: 2904
diff changeset
  2198
    int oldFlags;
3741
2a39a558012f mingw change
Claus Gittinger <cg@exept.de>
parents: 3657
diff changeset
  2199
# ifdef __MINGW64__
2a39a558012f mingw change
Claus Gittinger <cg@exept.de>
parents: 3657
diff changeset
  2200
    unsigned long on = 1;
2a39a558012f mingw change
Claus Gittinger <cg@exept.de>
parents: 3657
diff changeset
  2201
# else
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2202
    int on = 1;
3741
2a39a558012f mingw change
Claus Gittinger <cg@exept.de>
parents: 3657
diff changeset
  2203
#endif
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2204
    int sockaddr_size;
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2205
3059
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  2206
    if (!__isNonNilObject(aSocketAddress) || !__isBytes(aSocketAddress)) {
4568
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  2207
        DBGPRINTF(("SOCKET: invalid socketAddress\n"));
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  2208
        err = @symbol(argumentError);
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  2209
        goto out;
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2210
    }
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2211
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2212
    {
4568
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  2213
        int sockAddrOffs = 0;
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  2214
        int nIndex =__byteArraySize(aSocketAddress);
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  2215
        OBJ cls = __qClass(aSocketAddress);
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  2216
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  2217
        //if (cls != @global(ByteArray))
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  2218
        //    sockAddrOffs = __OBJS2BYTES__(__intVal(__ClassInstPtr(cls)->c_ninstvars));
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  2219
        sockaddr_size = nIndex - sockAddrOffs;
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  2220
        if (sockaddr_size > sizeof(sa)) {
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  2221
            DBGPRINTF(("SOCKET: invalid (short) socketAddress\n"));
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  2222
            err = @symbol(argumentError);
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  2223
            goto out;
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  2224
        }
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  2225
        memcpy(&sa, __byteArrayVal(aSocketAddress) + sockAddrOffs, sockaddr_size);
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2226
    }
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2227
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2228
    sock = SOCKET_FROM_FILE_OBJECT(fp);
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2229
3843
fbced69597a7 oops - error check was disabled
Claus Gittinger <cg@exept.de>
parents: 3742
diff changeset
  2230
#ifdef __win32__
3657
Stefan Vogel <sv@exept.de>
parents: 3655
diff changeset
  2231
     ioctlsocket(sock, FIONBIO, &on);
Stefan Vogel <sv@exept.de>
parents: 3655
diff changeset
  2232
#elif defined(O_NONBLOCK)
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2233
    /*
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2234
     * set to non-blocking and wait later
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2235
     */
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2236
    oldFlags = fcntl(sock, F_GETFL, 0);
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2237
    /* on SUNOS4.x, would use fcntl(osfd, F_SETFL, flags | FNDELAY); */
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2238
    fcntl(sock, F_SETFL, oldFlags | O_NONBLOCK);
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2239
# endif
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2240
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2241
    /*
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2242
     * connect
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2243
     */
3123
55ef9ca4f09f class: Socket
Stefan Vogel <sv@exept.de>
parents: 3077
diff changeset
  2244
4039
87f0dc2e89d8 #OTHER by mawalch
mawalch
parents: 4038
diff changeset
  2245
// we do not use wrap calls any longer, because they have problems with aborting.
3657
Stefan Vogel <sv@exept.de>
parents: 3655
diff changeset
  2246
// we use nonblocking accept() instead.
Stefan Vogel <sv@exept.de>
parents: 3655
diff changeset
  2247
# if 0 && defined(DO_WRAP_CALLS)
3217
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  2248
    // __setWrapCallDebugging(1,1);
2414
886ecf4b36cd changed:
ab
parents: 2340
diff changeset
  2249
3123
55ef9ca4f09f class: Socket
Stefan Vogel <sv@exept.de>
parents: 3077
diff changeset
  2250
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2251
    do {
4568
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  2252
        DBGFPRINTF((stderr, "SOCKET: (sock=%d) connect...\n", sock));
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  2253
        ret = STX_WSA_NOINT_CALL3("connect", connect, sock, &sa, (INT)sockaddr_size);
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  2254
        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
  2255
    } while ((ret < 0) && (__threadErrno == EINTR));
3123
55ef9ca4f09f class: Socket
Stefan Vogel <sv@exept.de>
parents: 3077
diff changeset
  2256
3077
032905ddd57a class: Socket
Claus Gittinger <cg@exept.de>
parents: 3072
diff changeset
  2257
    if (ret < 0) {
4568
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  2258
        int optLen = sizeof(errno);
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  2259
        errno = __threadErrno;
3123
55ef9ca4f09f class: Socket
Stefan Vogel <sv@exept.de>
parents: 3077
diff changeset
  2260
#if 0
4568
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  2261
        if (getsockopt(sock, SOL_SOCKET, SO_ERROR, &errno, &optLen) == SOCKET_ERROR) {
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  2262
            DBGFPRINTF((stderr, "SOCKET: getsockopt(SO_ERROR) failed: %d\n", WSAGetLastError()));
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  2263
        }
3657
Stefan Vogel <sv@exept.de>
parents: 3655
diff changeset
  2264
#endif // 0
3077
032905ddd57a class: Socket
Claus Gittinger <cg@exept.de>
parents: 3072
diff changeset
  2265
    }
032905ddd57a class: Socket
Claus Gittinger <cg@exept.de>
parents: 3072
diff changeset
  2266
032905ddd57a class: Socket
Claus Gittinger <cg@exept.de>
parents: 3072
diff changeset
  2267
    // __setWrapCallDebugging(1,0);
3657
Stefan Vogel <sv@exept.de>
parents: 3655
diff changeset
  2268
# else // !DO_WRAP_CALLS
Stefan Vogel <sv@exept.de>
parents: 3655
diff changeset
  2269
3843
fbced69597a7 oops - error check was disabled
Claus Gittinger <cg@exept.de>
parents: 3742
diff changeset
  2270
#  if !defined(__win32__) && !defined(O_NONBLOCK)
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2271
    __BEGIN_INTERRUPTABLE__
3657
Stefan Vogel <sv@exept.de>
parents: 3655
diff changeset
  2272
#  endif
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2273
    do {
4568
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  2274
        ret = connect(sock, (struct sockaddr *)&sa, sockaddr_size);
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2275
    } while ((ret < 0)
3843
fbced69597a7 oops - error check was disabled
Claus Gittinger <cg@exept.de>
parents: 3742
diff changeset
  2276
#  ifdef __win32__
4568
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  2277
             && (errno = WSAGetLastError())
3657
Stefan Vogel <sv@exept.de>
parents: 3655
diff changeset
  2278
#  endif
4568
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  2279
             && ((errno == EINTR)
3657
Stefan Vogel <sv@exept.de>
parents: 3655
diff changeset
  2280
#  ifdef EAGAIN
4568
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  2281
                 || (errno == EAGAIN)
3657
Stefan Vogel <sv@exept.de>
parents: 3655
diff changeset
  2282
#  endif
4568
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  2283
                ));
3843
fbced69597a7 oops - error check was disabled
Claus Gittinger <cg@exept.de>
parents: 3742
diff changeset
  2284
#  if !defined(__win32__) && !defined(O_NONBLOCK)
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2285
    __END_INTERRUPTABLE__
3657
Stefan Vogel <sv@exept.de>
parents: 3655
diff changeset
  2286
#  endif
Stefan Vogel <sv@exept.de>
parents: 3655
diff changeset
  2287
#endif
Stefan Vogel <sv@exept.de>
parents: 3655
diff changeset
  2288
3843
fbced69597a7 oops - error check was disabled
Claus Gittinger <cg@exept.de>
parents: 3742
diff changeset
  2289
#if defined(__win32__) && !defined(EINPROGRESS)
3657
Stefan Vogel <sv@exept.de>
parents: 3655
diff changeset
  2290
# define EINPROGRESSS WSAEINPROGRESSS
Stefan Vogel <sv@exept.de>
parents: 3655
diff changeset
  2291
# define EALREADY WSAEALREADY
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2292
#endif
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2293
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2294
    if (ret < 0) {
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2295
# if defined(EINPROGRESS) || defined(EALREADY)
4568
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  2296
        if (0
3843
fbced69597a7 oops - error check was disabled
Claus Gittinger <cg@exept.de>
parents: 3742
diff changeset
  2297
#  ifdef __win32__
4568
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  2298
            || (errno == WSAEWOULDBLOCK)
3657
Stefan Vogel <sv@exept.de>
parents: 3655
diff changeset
  2299
#  endif
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2300
#  ifdef EINPROGRESS
4568
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  2301
            || (errno == EINPROGRESS)
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2302
#  endif
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2303
#  ifdef EALREADY
4568
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  2304
            || (errno == EALREADY)
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2305
#  endif
4568
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  2306
        ) {
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  2307
            /*
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  2308
             * This was a nonblocking operation that will take some time.
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  2309
             * Do a select on read to get informed when the operation is ready.
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  2310
             */
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  2311
            DBGFPRINTF((stderr, "SOCKET: isAsync is true\n"));
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  2312
            isAsync = true;
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  2313
        } else
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2314
# endif /* EINPROGRESS or EALREADY */
4568
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  2315
        {
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  2316
            DBGFPRINTF((stderr, "SOCKET: connect failed ret=%"_ld_" errno=%d __threadErrno=%d\n",
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  2317
                        (INT)ret, errno, __threadErrno ));
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2318
# ifdef DUMP_ADDRESS
4568
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  2319
            {
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  2320
                unsigned char *cp = (unsigned char *)(&sa);
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  2321
                int i;
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  2322
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  2323
                console_printf("address data:\n");
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  2324
                for (i=0; i<sockaddr_size; i++) {
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  2325
                    console_printf(" %02x\n", *cp++);
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  2326
                }
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  2327
            }
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2328
# endif
4568
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  2329
            err = __MKSMALLINT(errno);
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  2330
        }
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2331
    }
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2332
3843
fbced69597a7 oops - error check was disabled
Claus Gittinger <cg@exept.de>
parents: 3742
diff changeset
  2333
# ifdef __win32__
3657
Stefan Vogel <sv@exept.de>
parents: 3655
diff changeset
  2334
    {
4568
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  2335
        int off = 0;
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  2336
        ioctlsocket(sock, FIONBIO, &off);
3657
Stefan Vogel <sv@exept.de>
parents: 3655
diff changeset
  2337
    }
Stefan Vogel <sv@exept.de>
parents: 3655
diff changeset
  2338
# elif defined(O_NONBLOCK) // Linux / Unix
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2339
    fcntl(sock, F_SETFL, oldFlags);
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2340
# endif
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2341
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2342
# else /* NO_SOCKET */
3077
032905ddd57a class: Socket
Claus Gittinger <cg@exept.de>
parents: 3072
diff changeset
  2343
    err = @symbol(notSupported);
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2344
# endif /* NO_SOCKET */
3077
032905ddd57a class: Socket
Claus Gittinger <cg@exept.de>
parents: 3072
diff changeset
  2345
out:;
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2346
%}.
3217
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  2347
3077
032905ddd57a class: Socket
Claus Gittinger <cg@exept.de>
parents: 3072
diff changeset
  2348
    err notNil ifTrue:[
4568
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  2349
        err isSymbol ifTrue:[
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  2350
            self primitiveFailed:err.
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  2351
        ].
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  2352
        ^ self reportError:err.
3077
032905ddd57a class: Socket
Claus Gittinger <cg@exept.de>
parents: 3072
diff changeset
  2353
    ].
4234
eb1b470a27ee #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 4206
diff changeset
  2354
    isAsync ifTrue:[
4570
39e965ca8d06 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4568
diff changeset
  2355
        milliSeconds := milliSecondsOrTimeDuration.
39e965ca8d06 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4568
diff changeset
  2356
        milliSecondsOrTimeDuration isTimeDuration ifTrue:[
39e965ca8d06 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4568
diff changeset
  2357
            milliSeconds := milliSecondsOrTimeDuration asMilliseconds.
39e965ca8d06 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4568
diff changeset
  2358
        ].
39e965ca8d06 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4568
diff changeset
  2359
        (self writeExceptionWaitWithTimeoutMs:milliSeconds) ifTrue:[
4568
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  2360
            "/ a timeout occurred
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  2361
            "/ should I cancel the connect?
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  2362
            ^ self reportError:(OperatingSystem errorNumberFor:#ETIMEDOUT).
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  2363
        ].
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  2364
        err := self getSocketError.
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  2365
        err ~~ 0 ifTrue:[
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  2366
            ^ self reportError:err.
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  2367
        ].
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2368
    ].
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2369
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
  2370
3059
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  2371
    peer := aSocketAddress.
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2372
    port isNil ifTrue:[
4568
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  2373
        "socket has not been explicitly bound,
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  2374
         after connect it has been bound implicitly - fetch the port"
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  2375
        port := self getFullSocketAddress port.
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2376
    ].
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2377
    ^ true
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2378
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2379
    "
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2380
       |sock|
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2381
       sock := Socket newTCP.
3059
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  2382
       sock connectTo:(IPSocketAddress localHost port:21) withTimeout:1000.
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2383
       sock
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2384
4568
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  2385
       [
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  2386
           |sock|
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  2387
           sock := Socket newTCP.
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  2388
           sock connectTo:(IPSocketAddress localHost port:21) withTimeout:1000.
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  2389
           sock
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  2390
       ] on:SocketErrorNotification do:[:ex|
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  2391
           ex halt.
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  2392
       ].
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  2393
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2394
       |sock|
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2395
       sock := Socket newTCP.
3059
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  2396
       sock connectTo:(IPSocketAddress localHost port:9876) withTimeout:2000.
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2397
       sock
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2398
    "
4568
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  2399
4570
39e965ca8d06 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4568
diff changeset
  2400
    "Modified: / 19-01-2018 / 17:57:36 / stefan"
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2401
! !
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2402
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2403
!Socket methodsFor:'datagram transmission'!
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2404
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2405
receiveBuffer:aDataBuffer start:startIndex for:nBytes
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2406
    "receive data
4626
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2407
     Return the number of bytes received.
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2408
     The thread blocks until data arrives - you may want to wait before
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2409
     receiving, using #readWait or #readWaitWithTimeout:."
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2410
3126
d95cc55a4fb5 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3123
diff changeset
  2411
    |nReceived error|
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2412
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2413
%{
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2414
#ifndef NO_SOCKET
2321
6f4cc7b644db filePointer -> handle migration
Claus Gittinger <cg@exept.de>
parents: 2308
diff changeset
  2415
    OBJ fp = __INST(handle);
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2416
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2417
    if (fp != nil) {
4626
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2418
        SOCKET sock;
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2419
        INT objSize, offs;
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2420
        INT n;
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2421
        char *extPtr;
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2422
        unsigned char *buffer;
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2423
        unsigned char *allocatedBuffer = NULL;
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2424
        INT flags = 0;
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2425
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2426
        sock = SOCKET_FROM_FILE_OBJECT(fp);
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2427
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2428
        if (! setupBufferParameters(aDataBuffer, startIndex, &extPtr, &offs, &objSize)) goto bad;
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2429
        if (__isSmallInteger(nBytes)) {
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2430
            if (__intVal(nBytes) < objSize) {
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2431
                objSize = __intVal(nBytes);
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2432
            }
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2433
        }
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2434
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2435
# ifdef DO_WRAP_CALLS
4626
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2436
        if (extPtr) {
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2437
            buffer = extPtr + offs;
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2438
        } else {
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2439
            allocatedBuffer = buffer = (char *)malloc(objSize);
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2440
        }
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2441
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2442
        do {
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2443
            __threadErrno = 0;
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2444
            n = (INT)STX_WSA_NOINT_CALL4("recv", recv, sock, buffer, objSize, flags);
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2445
        } while ((n < 0) && (__threadErrno == EINTR));
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2446
        if (n < 0) {
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2447
            errno = __threadErrno;
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2448
        }
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2449
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2450
        if (allocatedBuffer) {
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2451
            if (n > 0) {
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2452
                memcpy((char *)__InstPtr(aDataBuffer) + offs, allocatedBuffer, n);
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2453
            }
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2454
            free(allocatedBuffer);
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2455
        }
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2456
# else
4626
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2457
        __BEGIN_INTERRUPTABLE__
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2458
        do {
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2459
            if (extPtr) {
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2460
                n = recv(sock, extPtr + offs, objSize, flags);
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2461
            } else {
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2462
                n = recv(sock, (char *)__InstPtr(aDataBuffer) + offs, objSize, flags);
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2463
            }
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2464
        } while ((n < 0) && (errno == EINTR));
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2465
        __END_INTERRUPTABLE__
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2466
# endif
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2467
4626
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2468
        if (n < 0) {
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2469
            error = __INST(lastErrorNumber) = __MKSMALLINT(errno);
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2470
        } else {
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2471
            RETURN(__MKSMALLINT(n));
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2472
        }
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2473
    }
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2474
#endif
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2475
bad: ;
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2476
%}.
3126
d95cc55a4fb5 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3123
diff changeset
  2477
    error notNil ifTrue:[
4626
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2478
        ^ self readError:error.
915
3dc0e3cd838a added interface to send() and recv()
Claus Gittinger <cg@exept.de>
parents: 898
diff changeset
  2479
    ].
3dc0e3cd838a added interface to send() and recv()
Claus Gittinger <cg@exept.de>
parents: 898
diff changeset
  2480
    "
1282
7e4ffdfd19f6 remove historic leftover
Claus Gittinger <cg@exept.de>
parents: 1280
diff changeset
  2481
     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
  2482
    "
3dc0e3cd838a added interface to send() and recv()
Claus Gittinger <cg@exept.de>
parents: 898
diff changeset
  2483
    self primitiveFailed
4626
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2484
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2485
    "Modified: / 21-03-2018 / 19:35:09 / stefan"
99
7d016cc30052 fixed & moved pingWalk from SNMPSession to here;
Claus Gittinger <cg@exept.de>
parents: 98
diff changeset
  2486
!
7d016cc30052 fixed & moved pingWalk from SNMPSession to here;
Claus Gittinger <cg@exept.de>
parents: 98
diff changeset
  2487
4626
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2488
receiveFrom:aSocketAddress buffer:aDataBuffer
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2489
    "receive datagramm data - put address of originating host into
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2490
     aSocketAddress, data into aDataBuffer.
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2491
     aDataBuffer must be ByteArray-like.
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2492
     For backward compatibility, aSocketAddress may be a non-SocketAddress;
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2493
     then, it must be a byteArray with appropriate size for the addressBytes.
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2494
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2495
     Return the number of bytes received.
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2496
     The thread blocks until data arrives - you may want to wait before
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2497
     receiving, using #readWait or #readWaitWithTimeout:."
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2498
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2499
    ^ self receiveFrom:aSocketAddress buffer:aDataBuffer start:1 for:(aDataBuffer size) flags:0
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2500
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2501
    "Modified (comment): / 21-03-2018 / 19:33:59 / stefan"
3615
ffe86e1b14ed #BUGFIX
Stefan Vogel <sv@exept.de>
parents: 3614
diff changeset
  2502
!
ffe86e1b14ed #BUGFIX
Stefan Vogel <sv@exept.de>
parents: 3614
diff changeset
  2503
4626
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2504
receiveFrom:aSocketAddress buffer:aDataBuffer start:startIndex for:nBytes
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2505
    ^ self receiveFrom:aSocketAddress buffer:aDataBuffer start:startIndex for:nBytes flags:0
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2506
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2507
    "Modified (format): / 21-03-2018 / 19:32:27 / stefan"
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2508
!
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2509
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2510
receiveFrom:aSocketAddress buffer:aDataBuffer start:startIndex for:nBytes flags:flags
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2511
    "receive datagramm data
4626
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2512
     - put address of originating host into aSocketAddress, data into aDataBuffer.
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2513
     aDataBuffer must be ByteArray-like.
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2514
     For backward compatibility, aSocketAddress may be a non-SocketAddress;
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2515
     then, it must be a byteArray with appropriate size for the addressBytes.
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2516
4626
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2517
     Return the number of bytes received.
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2518
     The thread blocks until data arrives - you may want to wait before
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2519
     receiving, using #readWait or #readWaitWithTimeout:."
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2520
3126
d95cc55a4fb5 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3123
diff changeset
  2521
    |domainClass addr addrLen nReceived error|
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2522
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2523
    domainClass := self class socketAddressClassForDomain:domain.
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2524
    domainClass isNil ifTrue:[
4626
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2525
        ^ self error:'invalid (unsupported) domain'.
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2526
    ].
4626
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2527
    aSocketAddress isSocketAddress ifTrue:[
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2528
        aSocketAddress class == domainClass ifFalse:[
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2529
            ^ self error:'addressBuffer class mismatch (domain)'.
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2530
        ].
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2531
        addr := aSocketAddress.
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2532
    ] ifFalse:[
4626
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2533
        aSocketAddress notNil ifTrue:[
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2534
            addr := domainClass new.
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2535
        ].
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2536
    ].
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2537
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2538
%{
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2539
#ifndef NO_SOCKET
2321
6f4cc7b644db filePointer -> handle migration
Claus Gittinger <cg@exept.de>
parents: 2308
diff changeset
  2540
    OBJ fp = __INST(handle);
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2541
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2542
    if (fp != nil) {
4626
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2543
        SOCKET sock;
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2544
        size_t objSize;
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2545
        union sockaddr_u sa;
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2546
        socklen_t alen = 0;
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2547
        INT n, offs;
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2548
        int _flags = __longIntVal(flags);
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2549
        char *extPtr;
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2550
        unsigned char *allocatedBuffer = NULL, *buffer = NULL;
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2551
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2552
        sock = SOCKET_FROM_FILE_OBJECT(fp);
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2553
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2554
        if (! setupBufferParameters(aDataBuffer, startIndex, &extPtr, &offs, &objSize)) goto bad;
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2555
        if (__isSmallInteger(nBytes)) {
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2556
            if (__intVal(nBytes) < objSize) {
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2557
                objSize = __intVal(nBytes);
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2558
            }
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2559
        }
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2560
# ifdef DO_WRAP_CALLS
4626
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2561
        if (extPtr) {
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2562
            buffer = extPtr + offs;
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2563
        } else {
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2564
            allocatedBuffer = buffer = (char *)malloc(objSize);
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2565
        }
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2566
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2567
        do {
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2568
            __threadErrno = 0;
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2569
            alen = sizeof(sa);
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2570
            n = (INT)STX_WSA_NOINT_CALL6("recvfrom", recvfrom, sock, buffer, objSize, _flags, (struct sockaddr *)&sa, &alen);
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2571
        } while ((n < 0) && (__threadErrno == EINTR));
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2572
        if (n < 0) {
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2573
            errno = __threadErrno;
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2574
        }
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2575
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2576
        if (allocatedBuffer) {
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2577
            if (n > 0) {
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2578
                memcpy((char *)__InstPtr(aDataBuffer) + offs, allocatedBuffer, n);
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2579
            }
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2580
            free(allocatedBuffer);
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2581
        }
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2582
# else
4626
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2583
        __BEGIN_INTERRUPTABLE__
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2584
        do {
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2585
            alen = sizeof(sa);
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2586
            if (extPtr) {
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2587
                n = recvfrom(sock, extPtr + offs, objSize, _flags, (struct sockaddr *) &sa, &alen);
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2588
            } else {
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2589
                n = recvfrom(sock, (char *)__InstPtr(aDataBuffer) + offs, objSize, _flags, (struct sockaddr *) &sa, &alen);
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2590
            }
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2591
        } while ((n < 0) && (errno == EINTR));
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2592
        __END_INTERRUPTABLE__
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2593
# endif
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2594
4626
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2595
        if (n >= 0) {
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2596
            if (__isNonNilObject(addr)) {
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2597
                char *addrPtr;
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2598
                OBJ oClass;
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2599
                int nInstVars, nInstBytes, objSize;
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2600
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2601
                oClass = __qClass(addr);
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2602
                if (! __isBytes(addr) )
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2603
                    goto bad;
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2604
                nInstVars = __intVal(__ClassInstPtr(oClass)->c_ninstvars);
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2605
                nInstBytes = OHDR_SIZE + (nInstVars * sizeof(OBJ));
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2606
                objSize = __qSize(addr) - nInstBytes;
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2607
                addrPtr = (char *)__InstPtr(addr) + nInstBytes;
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2608
                if (objSize < alen)
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2609
                    goto bad;
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2610
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2611
                /*
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2612
                 * extract the datagrams address
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2613
                 */
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2614
                memcpy(addrPtr, (char *)&sa, alen);
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2615
                addrLen = __MKSMALLINT(alen);
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2616
            }
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2617
        }
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2618
        if (n < 0) {
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2619
            error = __INST(lastErrorNumber) = __MKSMALLINT(errno);
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2620
        }
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2621
        nReceived = __MKSMALLINT(n);
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2622
    }
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2623
#endif
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2624
bad: ;
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2625
%}.
3126
d95cc55a4fb5 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3123
diff changeset
  2626
    error notNil ifTrue:[
4626
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2627
        ^ self readError:error.
3126
d95cc55a4fb5 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3123
diff changeset
  2628
    ].
d95cc55a4fb5 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3123
diff changeset
  2629
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2630
    nReceived notNil ifTrue:[
4626
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2631
        addrLen notNil ifTrue:[
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2632
            (addr == aSocketAddress) ifFalse:[
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2633
                self obsoleteFeatureWarning:'please use a socketAddress argument'.
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2634
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2635
                "can be a ByteArray for backward compatibility"
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2636
                aSocketAddress replaceFrom:1 to:addrLen with:(addr hostAddress).
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2637
            ].
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2638
        ].
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2639
        ^ nReceived
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2640
    ].
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2641
    "
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2642
     arrive here if you try to receive into an invalid buffer
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2643
     (i.e. not ByteArray-like),
1485
d8578cf3504b gcc3.3.1 insn-scheduler bug workaround
Claus Gittinger <cg@exept.de>
parents: 1474
diff changeset
  2644
     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
  2645
     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
  2646
    "
126
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
  2647
    self primitiveFailed
4626
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2648
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2649
    "Modified (comment): / 21-03-2018 / 19:33:49 / stefan"
116
7789fb1c9fa2 more UD socket fixes (at least client side seems to work now)
Claus Gittinger <cg@exept.de>
parents: 115
diff changeset
  2650
!
7789fb1c9fa2 more UD socket fixes (at least client side seems to work now)
Claus Gittinger <cg@exept.de>
parents: 115
diff changeset
  2651
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2652
sendBuffer:aDataBuffer start:startIndex for:nBytes flags:flags
4626
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2653
    "send data. aDataBuffer be ByteArray-like.
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2654
     Return the number of bytes transmitted, or a negative number on error."
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2655
3126
d95cc55a4fb5 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3123
diff changeset
  2656
    |error|
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2657
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2658
%{
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2659
#ifndef NO_SOCKET
2321
6f4cc7b644db filePointer -> handle migration
Claus Gittinger <cg@exept.de>
parents: 2308
diff changeset
  2660
    OBJ fp = __INST(handle);
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2661
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2662
    if ((fp != nil)
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2663
     && __isSmallInteger(startIndex)
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2664
     && __isSmallInteger(nBytes)) {
4626
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2665
        SOCKET sock;
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2666
        INT objSize, n, offs;
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2667
        char *extPtr;
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2668
        int _flags = __longIntVal(flags);
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2669
        unsigned long norder;
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2670
        unsigned char *buffer, *allocatedBuffer = NULL;
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2671
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2672
        sock = SOCKET_FROM_FILE_OBJECT(fp);
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2673
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2674
        if (! setupBufferParameters(aDataBuffer, startIndex, &extPtr, &offs, &objSize)) goto bad;
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2675
        if (__isSmallInteger(nBytes)) {
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2676
            if (__intVal(nBytes) < objSize) {
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2677
                objSize = __intVal(nBytes);
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2678
            }
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2679
        }
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2680
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2681
# ifdef DGRAM_DEBUG
4626
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2682
        console_printf("sending %d bytes ...\n", nBytes);
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2683
# endif
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2684
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2685
#ifdef DO_WRAP_CALLS
4626
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2686
        if (extPtr) {
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2687
            buffer = extPtr + offs;
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2688
        } else {
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2689
            allocatedBuffer = buffer = (char *)malloc(objSize);
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2690
            memcpy(allocatedBuffer, (char *)__InstPtr(aDataBuffer) + offs, objSize);
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2691
        }
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2692
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2693
        do {
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2694
            __threadErrno = 0;
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2695
            n = (INT)STX_WSA_NOINT_CALL4("send", send, sock, buffer, objSize, _flags);
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2696
        } while ((n < 0) && (__threadErrno == EINTR));
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2697
        if (n < 0) {
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2698
            errno = __threadErrno;
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2699
        }
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2700
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2701
        if (allocatedBuffer) {
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2702
            free(allocatedBuffer);
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2703
        }
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2704
#else
4626
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2705
        __BEGIN_INTERRUPTABLE__
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2706
        do {
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2707
            if (extPtr) {
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2708
                n = send(sock, extPtr + offs, objSize, _flags);
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2709
            } else {
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2710
                n = send(sock, (char *)__InstPtr(aDataBuffer) + offs, objSize, _flags);
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2711
            }
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2712
        } while ((n < 0) && (errno == EINTR));
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2713
        __END_INTERRUPTABLE__
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2714
#endif
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2715
4626
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2716
        if (n < 0) {
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2717
            error = __INST(lastErrorNumber) = __MKSMALLINT(errno);
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2718
        } else {
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2719
            RETURN (__MKSMALLINT(n));
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2720
        }
915
3dc0e3cd838a added interface to send() and recv()
Claus Gittinger <cg@exept.de>
parents: 898
diff changeset
  2721
    }
3dc0e3cd838a added interface to send() and recv()
Claus Gittinger <cg@exept.de>
parents: 898
diff changeset
  2722
#endif
3dc0e3cd838a added interface to send() and recv()
Claus Gittinger <cg@exept.de>
parents: 898
diff changeset
  2723
bad: ;
3dc0e3cd838a added interface to send() and recv()
Claus Gittinger <cg@exept.de>
parents: 898
diff changeset
  2724
%}.
3126
d95cc55a4fb5 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3123
diff changeset
  2725
    error notNil ifTrue:[
4626
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2726
        self writeError:error.
3126
d95cc55a4fb5 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3123
diff changeset
  2727
    ].
d95cc55a4fb5 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3123
diff changeset
  2728
915
3dc0e3cd838a added interface to send() and recv()
Claus Gittinger <cg@exept.de>
parents: 898
diff changeset
  2729
    "
1485
d8578cf3504b gcc3.3.1 insn-scheduler bug workaround
Claus Gittinger <cg@exept.de>
parents: 1474
diff changeset
  2730
     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
  2731
    "
3dc0e3cd838a added interface to send() and recv()
Claus Gittinger <cg@exept.de>
parents: 898
diff changeset
  2732
    self primitiveFailed
4626
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2733
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2734
    "Modified: / 21-03-2018 / 19:22:52 / stefan"
915
3dc0e3cd838a added interface to send() and recv()
Claus Gittinger <cg@exept.de>
parents: 898
diff changeset
  2735
!
3dc0e3cd838a added interface to send() and recv()
Claus Gittinger <cg@exept.de>
parents: 898
diff changeset
  2736
4626
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2737
sendTo:aSocketAddress buffer:buffer
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2738
    "send datagramm data - fetch address of destination host from
4626
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2739
     aSocketAddress, data from aDataBuffer.
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2740
     aDataBuffer must be ByteArray-like. 
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2741
     aSocketAddress must be a valid SocketAddress for my domain 
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2742
     (i.e. for IPv4, an IPSocketAddress).
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2743
     For backward compatibility, a ByteArray is still supported in aSocketAddress
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2744
     (i.e. for IPv4, a 4-byte byteArray).
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2745
     Return the number of bytes transmitted."
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2746
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2747
    ^ self sendTo:aSocketAddress buffer:buffer start:1 for:buffer size flags:0
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2748
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2749
    "Modified (comment): / 21-03-2018 / 19:30:20 / stefan"
116
7789fb1c9fa2 more UD socket fixes (at least client side seems to work now)
Claus Gittinger <cg@exept.de>
parents: 115
diff changeset
  2750
!
7789fb1c9fa2 more UD socket fixes (at least client side seems to work now)
Claus Gittinger <cg@exept.de>
parents: 115
diff changeset
  2751
4626
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2752
sendTo:aSocketAddress buffer:buffer start:startIndex for:count
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2753
    "send datagramm data - fetch address of destination host from
4626
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2754
     aSocketAddress, data from aDataBuffer.
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2755
     aDataBuffer must be ByteArray-like. 
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2756
     aSocketAddress must be a valid SocketAddress for my domain 
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2757
     (i.e. for IPv4, an IPSocketAddress).
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2758
     For backward compatibility, a ByteArray is still supported in aSocketAddress
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2759
     (i.e. for IPv4, a 4-byte byteArray).
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2760
     Return the number of bytes transmitted."
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2761
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2762
    ^ self sendTo:aSocketAddress buffer:buffer start:startIndex for:count flags:0
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2763
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2764
    "Modified (comment): / 21-03-2018 / 19:29:07 / stefan"
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2765
!
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2766
4626
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2767
sendTo:aSocketAddress buffer:aDataBuffer start:startIndex for:nBytes flags:flags
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2768
    "send datagramm data - fetch address of destination host from
4626
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2769
     aSocketAddress, data from aDataBuffer starting at startIndex,
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2770
     sending count bytes.
4626
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2771
     aDataBuffer must be ByteArray-like. 
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2772
     aSocketAddress must be a valid SocketAddress for my domain 
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2773
     (i.e. for IPv4, an IPSocketAddress).
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2774
     For backward compatibility, a ByteArray is still supported in aSocketAddress
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2775
     (i.e. for IPv4, a 4-byte byteArray).
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2776
     Return the number of bytes transmitted."
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2777
3126
d95cc55a4fb5 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3123
diff changeset
  2778
    |domainClass addr error|
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2779
4626
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2780
    aSocketAddress isSocketAddress ifTrue:[
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2781
        addr := aSocketAddress.
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2782
    ] ifFalse:[
4626
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2783
        aSocketAddress isByteArray ifFalse:[
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2784
            ^ self error:'bad socketAddress argument'
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2785
        ].
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2786
        domainClass := self class socketAddressClassForDomain:domain.
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2787
        domainClass isNil ifTrue:[
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2788
            ^ self error:'invalid (unsupported) domain'.
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2789
        ].
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2790
        addr := domainClass hostAddress:aSocketAddress.
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2791
    ].
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2792
%{
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2793
#ifndef NO_SOCKET
2321
6f4cc7b644db filePointer -> handle migration
Claus Gittinger <cg@exept.de>
parents: 2308
diff changeset
  2794
    OBJ fp = __INST(handle);
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2795
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2796
    if ((fp != nil)
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2797
     && __isSmallInteger(startIndex)
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2798
     && __isSmallInteger(nBytes)) {
4626
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2799
        SOCKET sock;
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2800
        INT objSize;
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2801
        struct sockaddr *sockaddr_ptr;
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2802
        union sockaddr_u sa;
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2803
        socklen_t sockaddr_size, alen = 0;
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2804
        INT sockAddrOffs;
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2805
        INT n, offs;
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2806
        char *extPtr;
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2807
        int _flags = __longIntVal(flags);
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2808
        unsigned long norder;
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2809
        unsigned char *buffer;
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2810
        unsigned char *allocatedBuffer = NULL;
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2811
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2812
        sock = SOCKET_FROM_FILE_OBJECT(fp);
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2813
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2814
        if (! __isBytes(addr)) {
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2815
            sockaddr_size = 0;
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2816
            sockaddr_ptr = (struct sockaddr *)0;
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2817
        } else {
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2818
            int nIndex;
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2819
            OBJ cls;
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2820
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2821
            sockAddrOffs = 0;
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2822
            if ((cls = __qClass(addr)) != @global(ByteArray))
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2823
                sockAddrOffs += __OBJS2BYTES__(__intVal(__ClassInstPtr(cls)->c_ninstvars));
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2824
            nIndex = __qSize(addr) - OHDR_SIZE;
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2825
            sockaddr_size = nIndex - sockAddrOffs;
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2826
            if (sockaddr_size > sizeof(sa)) {
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2827
                console_fprintf(stderr, "Socket [warning]: bad socketAddr\n");
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2828
                goto bad;
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2829
            }
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2830
            memcpy(&sa, (__byteArrayVal(addr) + sockAddrOffs), sockaddr_size);
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2831
            sockaddr_ptr = (struct sockaddr *)(&sa);
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2832
        }
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2833
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2834
        if (! setupBufferParameters(aDataBuffer, startIndex, &extPtr, &offs, &objSize)) goto bad;
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2835
        if (__isSmallInteger(nBytes)) {
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2836
            if (__intVal(nBytes) < objSize) {
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2837
                objSize = __intVal(nBytes);
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2838
            }
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2839
        }
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2840
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2841
#ifdef DO_WRAP_CALLS
4626
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2842
        if (extPtr) {
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2843
            buffer = extPtr + offs;
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2844
        } else {
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2845
            allocatedBuffer = buffer = (char *)malloc(objSize);
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2846
            memcpy(allocatedBuffer, (char *)__InstPtr(aDataBuffer) + offs, objSize);
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2847
        }
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2848
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2849
        do {
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2850
            __threadErrno = 0;
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2851
            n = (INT)STX_WSA_NOINT_CALL6("sendto", sendto, sock, buffer, objSize, _flags, sockaddr_ptr, sockaddr_size);
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2852
        } while ((n < 0) && (__threadErrno == EINTR));
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2853
        if (n < 0) {
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2854
            errno = __threadErrno;
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2855
        }
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2856
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2857
        if (allocatedBuffer) {
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2858
            free(allocatedBuffer);
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2859
        }
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2860
#else
4626
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2861
        __BEGIN_INTERRUPTABLE__
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2862
        do {
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2863
            if (extPtr) {
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2864
                n = sendto(sock, extPtr + offs, objSize, _flags, sockaddr_ptr, sockaddr_size);
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2865
            } else {
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2866
                n = sendto(sock, (char *)__InstPtr(aDataBuffer) + offs, objSize, _flags, sockaddr_ptr, sockaddr_size);
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2867
            }
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2868
        } while ((n < 0) && (errno == EINTR));
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2869
        __END_INTERRUPTABLE__
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2870
#endif
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2871
4626
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2872
        if (n < 0) {
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2873
            error = __INST(lastErrorNumber) = __MKSMALLINT(errno);
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2874
        } else {
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2875
            RETURN (__MKSMALLINT(n));
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2876
        }
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2877
    }
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2878
#endif
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2879
bad: ;
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2880
%}.
3126
d95cc55a4fb5 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3123
diff changeset
  2881
    error notNil ifTrue:[
4626
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2882
        self writeError:error.
3126
d95cc55a4fb5 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3123
diff changeset
  2883
    ].
d95cc55a4fb5 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3123
diff changeset
  2884
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2885
    "
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2886
     arrive here if you try to send from an invalid buffer
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2887
     (i.e. not ByteArray-like),
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2888
     or if the addressBuffer is nonNil AND not a ByteArray/String
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2889
     or if the addressBuffer is nonNil AND too small.
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2890
    "
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2891
    self primitiveFailed
4626
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2892
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2893
    "Modified: / 21-03-2018 / 19:27:51 / stefan"
0
1cf8d1747859 Initial revision
claus
parents:
diff changeset
  2894
! !
1cf8d1747859 Initial revision
claus
parents:
diff changeset
  2895
4568
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  2896
!Socket methodsFor:'error reporting'!
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  2897
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  2898
reportError:osErrorNumber
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  2899
    "report an error to the initiator of a Socket operation.
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  2900
     We raise a notification for newer code, and also
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  2901
     return false for old code not catching the notification."
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  2902
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  2903
    |errorHolder|
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  2904
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  2905
    lastErrorNumber := osErrorNumber.
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  2906
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  2907
    errorHolder := OperatingSystem errorHolderForNumber:osErrorNumber.
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  2908
    SocketErrorNotification raiseRequestWith:errorHolder.
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  2909
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  2910
    ^ false.
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  2911
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  2912
    "Created: / 19-01-2018 / 12:50:00 / stefan"
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  2913
! !
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  2914
4172
2a6544c030fc #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 4091
diff changeset
  2915
!Socket methodsFor:'finalization'!
2a6544c030fc #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 4091
diff changeset
  2916
2a6544c030fc #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 4091
diff changeset
  2917
finalize
2a6544c030fc #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 4091
diff changeset
  2918
    self linger:0.      "/ do an abortive release - discard buffered data
2a6544c030fc #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 4091
diff changeset
  2919
    self closeFile.     "/ does not wait due to abortive release.
2a6544c030fc #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 4091
diff changeset
  2920
! !
2a6544c030fc #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 4091
diff changeset
  2921
3484
ccd8683e4e7e class: Socket
Claus Gittinger <cg@exept.de>
parents: 3481
diff changeset
  2922
!Socket methodsFor:'initialization'!
ccd8683e4e7e class: Socket
Claus Gittinger <cg@exept.de>
parents: 3481
diff changeset
  2923
ccd8683e4e7e class: Socket
Claus Gittinger <cg@exept.de>
parents: 3481
diff changeset
  2924
initialize
ccd8683e4e7e class: Socket
Claus Gittinger <cg@exept.de>
parents: 3481
diff changeset
  2925
    super initialize.
ccd8683e4e7e class: Socket
Claus Gittinger <cg@exept.de>
parents: 3481
diff changeset
  2926
    "/ transparent
ccd8683e4e7e class: Socket
Claus Gittinger <cg@exept.de>
parents: 3481
diff changeset
  2927
    eolMode := nil.
ccd8683e4e7e class: Socket
Claus Gittinger <cg@exept.de>
parents: 3481
diff changeset
  2928
! !
ccd8683e4e7e class: Socket
Claus Gittinger <cg@exept.de>
parents: 3481
diff changeset
  2929
3123
55ef9ca4f09f class: Socket
Stefan Vogel <sv@exept.de>
parents: 3077
diff changeset
  2930
!Socket methodsFor:'low level'!
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2931
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2932
getSocketAdress
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2933
    "BAD SPELLING, of #getSocketAddress, kept for compatibility with swazoo"
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
    <resource: #obsolete>
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2936
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2937
    ^ self getSocketAddress
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2938
!
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2939
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2940
getSocketError
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2941
    "get the SO_ERROR form the socket, which indicates the
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2942
     result of an asynchronous operation"
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2943
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2944
%{
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2945
#ifndef NO_SOCKET
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2946
    OBJ fp;
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2947
    int err;
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2948
2321
6f4cc7b644db filePointer -> handle migration
Claus Gittinger <cg@exept.de>
parents: 2308
diff changeset
  2949
    fp = __INST(handle);
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2950
    if (fp == nil) {
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2951
	err = EBADF;
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2952
    } else {
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2953
	unsigned int sz;
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2954
	SOCKET sock;
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2955
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2956
	sock = SOCKET_FROM_FILE_OBJECT(fp);
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2957
	sz = sizeof(err);
2909
aacef77a1697 64bit fixes
Claus Gittinger <cg@exept.de>
parents: 2904
diff changeset
  2958
	if (getsockopt(sock, SOL_SOCKET, SO_ERROR, (char *)(&err), &sz) < 0) {
3843
fbced69597a7 oops - error check was disabled
Claus Gittinger <cg@exept.de>
parents: 3742
diff changeset
  2959
# ifdef __win32__
1568
3bca500e0c7a send and receiveTimeout fixed
Claus Gittinger <cg@exept.de>
parents: 1561
diff changeset
  2960
	    errno = WSAGetLastError();
1558
a563aac90660 No need to ask Socket>>#networkXXXOrderIsMSB, because the return value is
Stefan Vogel <sv@exept.de>
parents: 1542
diff changeset
  2961
# endif
1568
3bca500e0c7a send and receiveTimeout fixed
Claus Gittinger <cg@exept.de>
parents: 1561
diff changeset
  2962
	    err = errno;
3bca500e0c7a send and receiveTimeout fixed
Claus Gittinger <cg@exept.de>
parents: 1561
diff changeset
  2963
	}
1558
a563aac90660 No need to ask Socket>>#networkXXXOrderIsMSB, because the return value is
Stefan Vogel <sv@exept.de>
parents: 1542
diff changeset
  2964
    }
a563aac90660 No need to ask Socket>>#networkXXXOrderIsMSB, because the return value is
Stefan Vogel <sv@exept.de>
parents: 1542
diff changeset
  2965
a563aac90660 No need to ask Socket>>#networkXXXOrderIsMSB, because the return value is
Stefan Vogel <sv@exept.de>
parents: 1542
diff changeset
  2966
    RETURN(__MKSMALLINT(err));
a563aac90660 No need to ask Socket>>#networkXXXOrderIsMSB, because the return value is
Stefan Vogel <sv@exept.de>
parents: 1542
diff changeset
  2967
#endif
a563aac90660 No need to ask Socket>>#networkXXXOrderIsMSB, because the return value is
Stefan Vogel <sv@exept.de>
parents: 1542
diff changeset
  2968
%}
a563aac90660 No need to ask Socket>>#networkXXXOrderIsMSB, because the return value is
Stefan Vogel <sv@exept.de>
parents: 1542
diff changeset
  2969
!
a563aac90660 No need to ask Socket>>#networkXXXOrderIsMSB, because the return value is
Stefan Vogel <sv@exept.de>
parents: 1542
diff changeset
  2970
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2971
listenWithBacklog:aNumber
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2972
    <resource: #obsolete>
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2973
    "same as listenFor: - backward compatibility with old ST/X"
3059
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  2974
    self obsoleteMethodWarning.
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2975
    ^ self listenFor:aNumber
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2976
!
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2977
3246
c75a006f9a7a Win32 sockets use handles instead of file pointers
Stefan Vogel <sv@exept.de>
parents: 3224
diff changeset
  2978
primAcceptOn:aServerSocket blocking:blocking
3059
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  2979
    "accept a connection on a server port (created with:'Socket>>newTCP:')
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  2980
     usage is: (Socket basicNew acceptOn:(Socket newTCP:9999)).
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2981
     Return the true if ok; false if not.
4568
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  2982
     Notify with a SocketErrorNotification on error.
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  2983
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2984
     If blocking is true, the accept() syscall (and the whole smalltalk image)
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2985
     will block, until a connection is accepted.
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2986
     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
  2987
4568
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  2988
    |serverSocketHandle addr domainClass newHandle err|
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2989
2321
6f4cc7b644db filePointer -> handle migration
Claus Gittinger <cg@exept.de>
parents: 2308
diff changeset
  2990
    handle notNil ifTrue:[
4568
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  2991
        ^ self errorAlreadyOpen.
4180
f2539f82b744 #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4172
diff changeset
  2992
    ].
f2539f82b744 #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4172
diff changeset
  2993
    serverSocketHandle := aServerSocket fileHandle.
f2539f82b744 #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4172
diff changeset
  2994
    serverSocketHandle isNil ifTrue:[
4568
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  2995
        "socket is not open"
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  2996
        ^ self errorNotOpen
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2997
    ].
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2998
3246
c75a006f9a7a Win32 sockets use handles instead of file pointers
Stefan Vogel <sv@exept.de>
parents: 3224
diff changeset
  2999
    domain := aServerSocket domain.
c75a006f9a7a Win32 sockets use handles instead of file pointers
Stefan Vogel <sv@exept.de>
parents: 3224
diff changeset
  3000
    socketType := aServerSocket type.
c75a006f9a7a Win32 sockets use handles instead of file pointers
Stefan Vogel <sv@exept.de>
parents: 3224
diff changeset
  3001
    handleType := aServerSocket handleType.
3059
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  3002
    "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
  3003
    domainClass := self class socketAddressClassForDomain:domain.
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  3004
    domainClass isNil ifTrue:[
4568
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  3005
        ^ self error:'invalid (unsupported) domain'.
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  3006
    ].
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  3007
    addr := domainClass new.
3246
c75a006f9a7a Win32 sockets use handles instead of file pointers
Stefan Vogel <sv@exept.de>
parents: 3224
diff changeset
  3008
    newHandle := OperatingSystem socketAccessor new.
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  3009
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  3010
%{  /* STACK: 100000 */
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3011
#ifndef NO_SOCKET
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  3012
    FILE *fp;
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  3013
    int flags;
3246
c75a006f9a7a Win32 sockets use handles instead of file pointers
Stefan Vogel <sv@exept.de>
parents: 3224
diff changeset
  3014
    SOCKET serverSocket, newSock;
c75a006f9a7a Win32 sockets use handles instead of file pointers
Stefan Vogel <sv@exept.de>
parents: 3224
diff changeset
  3015
    int _fd;
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  3016
    union sockaddr_u sa;
3059
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  3017
    unsigned int alen;
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  3018
3843
fbced69597a7 oops - error check was disabled
Claus Gittinger <cg@exept.de>
parents: 3742
diff changeset
  3019
# ifdef __win32__
3246
c75a006f9a7a Win32 sockets use handles instead of file pointers
Stefan Vogel <sv@exept.de>
parents: 3224
diff changeset
  3020
    serverSocket = SOCKET_FROM_FILE_OBJECT(serverSocketHandle);
3843
fbced69597a7 oops - error check was disabled
Claus Gittinger <cg@exept.de>
parents: 3742
diff changeset
  3021
# else
3247
259f71b89b6e class: Socket
Stefan Vogel <sv@exept.de>
parents: 3246
diff changeset
  3022
    serverSocket = __intVal(serverSocketHandle);
3843
fbced69597a7 oops - error check was disabled
Claus Gittinger <cg@exept.de>
parents: 3742
diff changeset
  3023
# endif
3246
c75a006f9a7a Win32 sockets use handles instead of file pointers
Stefan Vogel <sv@exept.de>
parents: 3224
diff changeset
  3024
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  3025
# if defined(O_NONBLOCK) && defined(SET_NDELAY)
3246
c75a006f9a7a Win32 sockets use handles instead of file pointers
Stefan Vogel <sv@exept.de>
parents: 3224
diff changeset
  3026
    if (blocking == false) {
4568
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  3027
        flags = fcntl(serverSocket, F_GETFL);
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  3028
        fcntl(serverSocket, F_SETFL, flags | O_NONBLOCK);
3246
c75a006f9a7a Win32 sockets use handles instead of file pointers
Stefan Vogel <sv@exept.de>
parents: 3224
diff changeset
  3029
    }
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  3030
# endif
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  3031
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3032
# ifdef DO_WRAP_CALLS
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3033
    do {
4568
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  3034
        __threadErrno = 0;
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  3035
        alen = sizeof(sa);
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  3036
        newSock = (SOCKET)STX_WSA_CALL3("accept", accept, serverSocket, &sa, &alen);
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  3037
    } while ((newSock < 0) && (__threadErrno == EINTR));
4568
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  3038
    if (newSock == -1) {
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  3039
        err = __MKSMALLINT(__threadErrno);
3126
d95cc55a4fb5 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3123
diff changeset
  3040
    }
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3041
# else
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3042
    __BEGIN_INTERRUPTABLE__
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3043
    do {
4568
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  3044
        alen = sizeof(sa);
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  3045
        newSock = accept(serverSocket, (struct sockaddr *) &sa, &alen);
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  3046
    } while ((newSock < 0) && (errno == EINTR));
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3047
    __END_INTERRUPTABLE__
4568
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  3048
    if (newSock == -1) {
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  3049
        err = __MKSMALLINT(errno);
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  3050
    }
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3051
# endif
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  3052
    DBGFPRINTF((stderr, "SOCKET: accept newSock=%d\n", newSock));
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  3053
3246
c75a006f9a7a Win32 sockets use handles instead of file pointers
Stefan Vogel <sv@exept.de>
parents: 3224
diff changeset
  3054
# if defined(O_NDELAY) && defined(SET_NDELAY)
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  3055
    if (blocking == false) {
4568
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  3056
        fcntl(serverSocket, F_SETFL, flags);
3246
c75a006f9a7a Win32 sockets use handles instead of file pointers
Stefan Vogel <sv@exept.de>
parents: 3224
diff changeset
  3057
    }
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  3058
# endif
3246
c75a006f9a7a Win32 sockets use handles instead of file pointers
Stefan Vogel <sv@exept.de>
parents: 3224
diff changeset
  3059
    if (newSock == -1) {
4568
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  3060
        DBGPRINTF(("SOCKET: accept call failed errno=%d\n", err));
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  3061
        goto out;
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  3062
    }
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  3063
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  3064
    if (__isNonNilObject(addr)) {
4568
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  3065
        OBJ oClass = __qClass(addr);
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  3066
        int nInstVars, nInstBytes, objSize;
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  3067
        char *addrP;
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  3068
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  3069
        if (! __isBytes(addr)) {
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  3070
            DBGPRINTF(("SOCKET: bad addr\n"));
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  3071
            closesocket(newSock);
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  3072
            err = @symbol(badAddressArg);
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  3073
            goto out;
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  3074
        }
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  3075
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  3076
        nInstVars = __intVal(__ClassInstPtr(oClass)->c_ninstvars);
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  3077
        nInstBytes = OHDR_SIZE + (nInstVars * sizeof(OBJ));
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  3078
        objSize = __qSize(addr) - nInstBytes;
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  3079
        addrP = (char *)__InstPtr(addr) + nInstBytes;
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  3080
        if (objSize < alen) {
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  3081
            DBGPRINTF(("SOCKET: bad addr\n"));
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  3082
            closesocket(newSock);
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  3083
            err = @symbol(badAddressArgLen);
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  3084
            goto out;
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  3085
        }
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  3086
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  3087
        /*
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  3088
         * extract the partners address
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  3089
         */
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  3090
        memcpy(addrP, (char *)&sa, alen);
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  3091
    }
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  3092
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  3093
    /*
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  3094
     * make it a FILE *
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  3095
     */
3843
fbced69597a7 oops - error check was disabled
Claus Gittinger <cg@exept.de>
parents: 3742
diff changeset
  3096
# ifdef __win32__
3246
c75a006f9a7a Win32 sockets use handles instead of file pointers
Stefan Vogel <sv@exept.de>
parents: 3224
diff changeset
  3097
#  if 0 && (defined( __BORLANDC__ ) || defined( __MINGW__ ))
c75a006f9a7a Win32 sockets use handles instead of file pointers
Stefan Vogel <sv@exept.de>
parents: 3224
diff changeset
  3098
    __stxWrapApiEnterCritical();
c75a006f9a7a Win32 sockets use handles instead of file pointers
Stefan Vogel <sv@exept.de>
parents: 3224
diff changeset
  3099
    _fd = _open_osfhandle((long)newSock, 0);
c75a006f9a7a Win32 sockets use handles instead of file pointers
Stefan Vogel <sv@exept.de>
parents: 3224
diff changeset
  3100
    __stxWrapApiLeaveCritical();
c75a006f9a7a Win32 sockets use handles instead of file pointers
Stefan Vogel <sv@exept.de>
parents: 3224
diff changeset
  3101
    DBGPRINTF(("SOCKET: sock=%d fd=%d\n", newSock, _fd));
2773
ab3049f4a351 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2748
diff changeset
  3102
#  else
3246
c75a006f9a7a Win32 sockets use handles instead of file pointers
Stefan Vogel <sv@exept.de>
parents: 3224
diff changeset
  3103
    _fd = (int)newSock;
2773
ab3049f4a351 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2748
diff changeset
  3104
#  endif
3843
fbced69597a7 oops - error check was disabled
Claus Gittinger <cg@exept.de>
parents: 3742
diff changeset
  3105
# else // ! __win32__
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  3106
    fp = fdopen(newSock, "r+");
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  3107
    if (! fp) {
4568
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  3108
        DBGPRINTF(("SOCKET: fdopen call failed\n"));
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  3109
        err = __MKSMALLINT(errno);
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  3110
        closesocket(newSock);
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  3111
        DBGFPRINTF((stderr, "SOCKET: close (fdopen failed) (%d)\n", newSock));
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  3112
        goto out;
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  3113
    }
3843
fbced69597a7 oops - error check was disabled
Claus Gittinger <cg@exept.de>
parents: 3742
diff changeset
  3114
# endif // ! __win32__
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  3115
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  3116
    if ((@global(FileOpenTrace) == true) || __debugging__) {
3843
fbced69597a7 oops - error check was disabled
Claus Gittinger <cg@exept.de>
parents: 3742
diff changeset
  3117
# ifdef __win32__
4568
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  3118
        console_fprintf(stderr, "fdopen [Socket accept] -> fd: %d (H: %"_lx_")\n", _fd, (INT)newSock);
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  3119
# else
4568
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  3120
        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
  3121
# endif
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  3122
    }
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  3123
3843
fbced69597a7 oops - error check was disabled
Claus Gittinger <cg@exept.de>
parents: 3742
diff changeset
  3124
# ifdef __win32__
3246
c75a006f9a7a Win32 sockets use handles instead of file pointers
Stefan Vogel <sv@exept.de>
parents: 3224
diff changeset
  3125
    __externalAddressVal(newHandle) = _fd;
c75a006f9a7a Win32 sockets use handles instead of file pointers
Stefan Vogel <sv@exept.de>
parents: 3224
diff changeset
  3126
    __INST(handleType) = @symbol(socketHandle);
c75a006f9a7a Win32 sockets use handles instead of file pointers
Stefan Vogel <sv@exept.de>
parents: 3224
diff changeset
  3127
# else
c75a006f9a7a Win32 sockets use handles instead of file pointers
Stefan Vogel <sv@exept.de>
parents: 3224
diff changeset
  3128
    __externalAddressVal(newHandle) = fp;
c75a006f9a7a Win32 sockets use handles instead of file pointers
Stefan Vogel <sv@exept.de>
parents: 3224
diff changeset
  3129
    __INST(handleType) = @symbol(socketFilePointer);
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  3130
# endif
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  3131
#endif /* not NO_SOCKET */
4568
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  3132
out:;
1558
a563aac90660 No need to ask Socket>>#networkXXXOrderIsMSB, because the return value is
Stefan Vogel <sv@exept.de>
parents: 1542
diff changeset
  3133
%}.
3246
c75a006f9a7a Win32 sockets use handles instead of file pointers
Stefan Vogel <sv@exept.de>
parents: 3224
diff changeset
  3134
4568
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  3135
    err notNil ifTrue:[
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  3136
        err isSymbol ifTrue:[
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  3137
            self error:err.
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  3138
        ].
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  3139
        ^ self reportError:err.
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  3140
    ].
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  3141
3246
c75a006f9a7a Win32 sockets use handles instead of file pointers
Stefan Vogel <sv@exept.de>
parents: 3224
diff changeset
  3142
    handle := newHandle.
c75a006f9a7a Win32 sockets use handles instead of file pointers
Stefan Vogel <sv@exept.de>
parents: 3224
diff changeset
  3143
    buffered := false.
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  3144
    mode := #readwrite.
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  3145
    binary := false.
3620
c648d063bccc #REFACTORING
Stefan Vogel <sv@exept.de>
parents: 3617
diff changeset
  3146
    self registerForFinalization.
3059
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  3147
    peer := addr.
3246
c75a006f9a7a Win32 sockets use handles instead of file pointers
Stefan Vogel <sv@exept.de>
parents: 3224
diff changeset
  3148
    port := aServerSocket port.
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  3149
1558
a563aac90660 No need to ask Socket>>#networkXXXOrderIsMSB, because the return value is
Stefan Vogel <sv@exept.de>
parents: 1542
diff changeset
  3150
    ^ true
4568
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  3151
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  3152
    "Modified (comment): / 19-01-2018 / 13:35:57 / stefan"
2551
6da1bc89b74a changed:
Stefan Vogel <sv@exept.de>
parents: 2516
diff changeset
  3153
!
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3154
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3155
setSocketOption:option argument:arg1 argument:arg2
3513
8105bf370769 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3485
diff changeset
  3156
    |ok error|
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3157
2551
6da1bc89b74a changed:
Stefan Vogel <sv@exept.de>
parents: 2516
diff changeset
  3158
    handle isNil ifTrue:[
3590
3487165a9cdf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3550
diff changeset
  3159
	^ self errorNotOpen
2551
6da1bc89b74a changed:
Stefan Vogel <sv@exept.de>
parents: 2516
diff changeset
  3160
    ].
6da1bc89b74a changed:
Stefan Vogel <sv@exept.de>
parents: 2516
diff changeset
  3161
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3162
%{  /* STACK: 32000 */
2818
94d67df5c00d compilable with tcc
Claus Gittinger <cg@exept.de>
parents: 2773
diff changeset
  3163
#ifndef NO_SOCKET
2321
6f4cc7b644db filePointer -> handle migration
Claus Gittinger <cg@exept.de>
parents: 2308
diff changeset
  3164
    OBJ fp = __INST(handle);
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3165
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3166
    if (fp != nil) {
3590
3487165a9cdf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3550
diff changeset
  3167
	SOCKET sock = SOCKET_FROM_FILE_OBJECT(fp);
3487165a9cdf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3550
diff changeset
  3168
	int opt = -1;
3487165a9cdf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3550
diff changeset
  3169
	int level = -1;
3487165a9cdf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3550
diff changeset
  3170
	int usize = -1;
3487165a9cdf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3550
diff changeset
  3171
	int ret;
3487165a9cdf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3550
diff changeset
  3172
	union u {
3487165a9cdf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3550
diff changeset
  3173
	    BOOL        u_bool;
3487165a9cdf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3550
diff changeset
  3174
	    int         u_int;
3487165a9cdf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3550
diff changeset
  3175
	    struct linger  u_linger;
2516
592619f82885 Add setsockopt for Multicast stuff
Stefan Vogel <sv@exept.de>
parents: 2465
diff changeset
  3176
# ifdef IP_ADD_MEMBERSHIP
3590
3487165a9cdf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3550
diff changeset
  3177
	    struct ip_mreq u_ip_mreq;
2516
592619f82885 Add setsockopt for Multicast stuff
Stefan Vogel <sv@exept.de>
parents: 2465
diff changeset
  3178
# endif
3467
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
  3179
# if defined(SO_RCVTIMEO) || defined(SO_SNDTIMEO)
3590
3487165a9cdf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3550
diff changeset
  3180
	    struct timeval u_tv;
3467
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
  3181
# endif
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
  3182
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
  3183
3590
3487165a9cdf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3550
diff changeset
  3184
	} u;
2516
592619f82885 Add setsockopt for Multicast stuff
Stefan Vogel <sv@exept.de>
parents: 2465
diff changeset
  3185
592619f82885 Add setsockopt for Multicast stuff
Stefan Vogel <sv@exept.de>
parents: 2465
diff changeset
  3186
# ifdef IP_ADD_MEMBERSHIP
3590
3487165a9cdf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3550
diff changeset
  3187
	if (option == @symbol(IP_DROP_MEMBERSHIP)) {
3487165a9cdf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3550
diff changeset
  3188
	    opt = IP_DROP_MEMBERSHIP;
3487165a9cdf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3550
diff changeset
  3189
	    goto dropOrAdd;
3487165a9cdf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3550
diff changeset
  3190
	}
3487165a9cdf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3550
diff changeset
  3191
	if (option == @symbol(IP_ADD_MEMBERSHIP)) {
3487165a9cdf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3550
diff changeset
  3192
	    /* add membership to a multicast group */
3487165a9cdf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3550
diff changeset
  3193
	    opt = IP_ADD_MEMBERSHIP;
2516
592619f82885 Add setsockopt for Multicast stuff
Stefan Vogel <sv@exept.de>
parents: 2465
diff changeset
  3194
dropOrAdd:
3590
3487165a9cdf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3550
diff changeset
  3195
	    level = IPPROTO_IP;
3487165a9cdf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3550
diff changeset
  3196
	    usize = sizeof(u.u_ip_mreq);
3487165a9cdf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3550
diff changeset
  3197
	    if (__isByteArrayLike(arg1) && __isByteArrayLike(arg2)) {
3487165a9cdf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3550
diff changeset
  3198
		memcpy(&u.u_ip_mreq.imr_multiaddr, __byteArrayVal(arg1), sizeof(u.u_ip_mreq.imr_multiaddr));
3487165a9cdf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3550
diff changeset
  3199
		memcpy(&u.u_ip_mreq.imr_interface, __byteArrayVal(arg2), sizeof(u.u_ip_mreq.imr_interface));
3487165a9cdf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3550
diff changeset
  3200
	    }
3487165a9cdf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3550
diff changeset
  3201
	    else
3487165a9cdf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3550
diff changeset
  3202
		goto argError;
3487165a9cdf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3550
diff changeset
  3203
	}
2516
592619f82885 Add setsockopt for Multicast stuff
Stefan Vogel <sv@exept.de>
parents: 2465
diff changeset
  3204
# endif /* IP_ADD_MEMBERSHIP */
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3205
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3206
# ifdef SO_BROADCAST
3590
3487165a9cdf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3550
diff changeset
  3207
	if (option == @symbol(SO_BROADCAST)) {
3487165a9cdf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3550
diff changeset
  3208
	    /* Enables transmission and receipt of broadcast messages on the socket. */
3487165a9cdf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3550
diff changeset
  3209
	    opt = SO_BROADCAST;
3487165a9cdf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3550
diff changeset
  3210
	    level = SOL_SOCKET;
3487165a9cdf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3550
diff changeset
  3211
	    usize = sizeof(u.u_bool);
3487165a9cdf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3550
diff changeset
  3212
	    if (arg1 == true) u.u_bool = TRUE;
3487165a9cdf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3550
diff changeset
  3213
	    else if (arg1 == false) u.u_bool = FALSE;
3487165a9cdf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3550
diff changeset
  3214
	    else goto argError;
3487165a9cdf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3550
diff changeset
  3215
	}
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3216
# endif /* SO_BROADCAST */
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3217
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3218
# ifdef SO_CONDITIONAL
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3219
#  if 0
3590
3487165a9cdf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3550
diff changeset
  3220
	if (option == @symbol(SO_CONDITIONAL)) {
3487165a9cdf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3550
diff changeset
  3221
	    /* Enables sockets to delay the acknowledgment of a connection until after the WSAAccept condition function is called. */
3487165a9cdf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3550
diff changeset
  3222
	    opt = SO_CONDITIONAL;
3487165a9cdf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3550
diff changeset
  3223
	    level = SOL_SOCKET;
3487165a9cdf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3550
diff changeset
  3224
	    usize = sizeof(u.u_bool);
3487165a9cdf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3550
diff changeset
  3225
	    if (arg1 == true) u.u_bool = TRUE;
3487165a9cdf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3550
diff changeset
  3226
	    else if (arg1 == false) u.u_bool = FALSE;
3487165a9cdf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3550
diff changeset
  3227
	    else goto argError;
3487165a9cdf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3550
diff changeset
  3228
	}
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3229
#  endif
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3230
# endif /* SO_CONDITIONAL */
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3231
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3232
# ifdef SO_DEBUG
3590
3487165a9cdf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3550
diff changeset
  3233
	if (option == @symbol(SO_DEBUG)) {
3487165a9cdf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3550
diff changeset
  3234
	    /* Records debugging information. */
3487165a9cdf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3550
diff changeset
  3235
	    opt = SO_DEBUG;
3487165a9cdf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3550
diff changeset
  3236
	    level = SOL_SOCKET;
3487165a9cdf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3550
diff changeset
  3237
	    usize = sizeof(u.u_bool);
3487165a9cdf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3550
diff changeset
  3238
	    if (arg1 == true) u.u_bool = TRUE;
3487165a9cdf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3550
diff changeset
  3239
	    else if (arg1 == false) u.u_bool = FALSE;
3487165a9cdf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3550
diff changeset
  3240
	    else goto argError;
3487165a9cdf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3550
diff changeset
  3241
	}
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3242
# endif /* SO_DEBUG */
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3243
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3244
# ifdef SO_DONTLINGER
3590
3487165a9cdf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3550
diff changeset
  3245
	if (option == @symbol(SO_DONTLINGER)) {
3487165a9cdf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3550
diff changeset
  3246
	    /* Does not block close waiting for unsent data to be sent.
3487165a9cdf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3550
diff changeset
  3247
	       Setting this option is equivalent to setting SO_LINGER with l_onoff set to zero. */
3487165a9cdf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3550
diff changeset
  3248
	    opt = SO_DONTLINGER;
3487165a9cdf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3550
diff changeset
  3249
	    level = SOL_SOCKET;
3487165a9cdf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3550
diff changeset
  3250
	    usize = sizeof(u.u_bool);
3487165a9cdf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3550
diff changeset
  3251
	    if (arg1 == true) u.u_bool = TRUE;
3487165a9cdf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3550
diff changeset
  3252
	    else if (arg1 == false) u.u_bool = FALSE;
3487165a9cdf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3550
diff changeset
  3253
	    else goto argError;
3487165a9cdf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3550
diff changeset
  3254
	}
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3255
# endif /* SO_DONTLINGER */
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3256
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3257
# ifdef SO_DONTROUTE
3590
3487165a9cdf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3550
diff changeset
  3258
	if (option == @symbol(SO_DONTROUTE)) {
3487165a9cdf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3550
diff changeset
  3259
	    /* Does not route: sends directly to interface.
3487165a9cdf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3550
diff changeset
  3260
	       Succeeds but is ignored on AF_INET sockets;
3487165a9cdf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3550
diff changeset
  3261
	       fails on AF_INET6 sockets with WSAENOPROTOOPT.
3487165a9cdf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3550
diff changeset
  3262
	       Not supported on ATM sockets (results in an error). */
3487165a9cdf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3550
diff changeset
  3263
	    opt = SO_DONTROUTE;
3487165a9cdf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3550
diff changeset
  3264
	    level = SOL_SOCKET;
3487165a9cdf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3550
diff changeset
  3265
	    usize = sizeof(u.u_bool);
3487165a9cdf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3550
diff changeset
  3266
	    if (arg1 == true) u.u_bool = TRUE;
3487165a9cdf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3550
diff changeset
  3267
	    else if (arg1 == false) u.u_bool = FALSE;
3487165a9cdf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3550
diff changeset
  3268
	    else goto argError;
3487165a9cdf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3550
diff changeset
  3269
	}
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3270
# endif /* SO_DONTROUTE */
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3271
2516
592619f82885 Add setsockopt for Multicast stuff
Stefan Vogel <sv@exept.de>
parents: 2465
diff changeset
  3272
#if defined(IPPROTO_TCP) && defined(TCP_NODELAY)
3590
3487165a9cdf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3550
diff changeset
  3273
	if (option == @symbol(TCP_NODELAY)) {
3487165a9cdf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3550
diff changeset
  3274
	    /* enable/disable TCP_NODELAY (i.e. disable/enable the Nagle algorithm) */
3487165a9cdf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3550
diff changeset
  3275
	    opt = TCP_NODELAY;
3487165a9cdf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3550
diff changeset
  3276
	    level = IPPROTO_TCP;
3487165a9cdf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3550
diff changeset
  3277
	    usize = sizeof(u.u_bool);
3487165a9cdf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3550
diff changeset
  3278
	    if (arg1 == true) u.u_bool = TRUE;
3487165a9cdf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3550
diff changeset
  3279
	    else if (arg1 == false) u.u_bool = FALSE;
3487165a9cdf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3550
diff changeset
  3280
	    else goto argError;
3487165a9cdf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3550
diff changeset
  3281
	}
2516
592619f82885 Add setsockopt for Multicast stuff
Stefan Vogel <sv@exept.de>
parents: 2465
diff changeset
  3282
# endif /* TCP_NODELAY */
592619f82885 Add setsockopt for Multicast stuff
Stefan Vogel <sv@exept.de>
parents: 2465
diff changeset
  3283
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3284
# ifdef SO_KEEPALIVE
3590
3487165a9cdf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3550
diff changeset
  3285
	if (option == @symbol(SO_KEEPALIVE)) {
3487165a9cdf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3550
diff changeset
  3286
	    /* Sends keep-alives. Not supported on ATM sockets (results in an error). */
3487165a9cdf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3550
diff changeset
  3287
	    opt = SO_KEEPALIVE;
3487165a9cdf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3550
diff changeset
  3288
	    level = SOL_SOCKET;
3487165a9cdf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3550
diff changeset
  3289
	    usize = sizeof(u.u_bool);
3487165a9cdf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3550
diff changeset
  3290
	    if (arg1 == true) u.u_bool = TRUE;
3487165a9cdf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3550
diff changeset
  3291
	    else if (arg1 == false) u.u_bool = FALSE;
3487165a9cdf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3550
diff changeset
  3292
	    else goto argError;
3487165a9cdf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3550
diff changeset
  3293
	}
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3294
# endif /* SO_KEEPALIVE */
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3295
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3296
# ifdef SO_LINGER
3590
3487165a9cdf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3550
diff changeset
  3297
	if (option == @symbol(SO_LINGER)) {
3487165a9cdf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3550
diff changeset
  3298
	    /* Lingers on close if unsent data is present. */
3487165a9cdf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3550
diff changeset
  3299
	    opt = SO_LINGER;
3487165a9cdf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3550
diff changeset
  3300
	    level = SOL_SOCKET;
3487165a9cdf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3550
diff changeset
  3301
	    usize = sizeof(u.u_linger);
3487165a9cdf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3550
diff changeset
  3302
	    if (arg1 == true) u.u_linger.l_onoff = TRUE;
3487165a9cdf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3550
diff changeset
  3303
	    else if (arg1 == false) u.u_linger.l_onoff = FALSE;
3487165a9cdf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3550
diff changeset
  3304
	    else goto argError;
3487165a9cdf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3550
diff changeset
  3305
	    if (arg2 == nil) u.u_linger.l_linger = 0;
3487165a9cdf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3550
diff changeset
  3306
	    else if (__isSmallInteger(arg2))u.u_linger.l_linger = __intVal(arg2);
3487165a9cdf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3550
diff changeset
  3307
	    else goto argError;
3487165a9cdf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3550
diff changeset
  3308
	    DBGPRINTF(("SOCKET: SO_LINGER %d %d\n", u.u_linger.l_onoff, u.u_linger.l_linger));
3487165a9cdf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3550
diff changeset
  3309
	}
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3310
# endif /* SO_LINGER */
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3311
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3312
# ifdef SO_OOBINLINE
3590
3487165a9cdf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3550
diff changeset
  3313
	if (option == @symbol(SO_OOBINLINE)) {
3487165a9cdf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3550
diff changeset
  3314
	    /* Receives OOB data in the normal data stream. */
3487165a9cdf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3550
diff changeset
  3315
	    opt = SO_OOBINLINE;
3487165a9cdf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3550
diff changeset
  3316
	    level = SOL_SOCKET;
3487165a9cdf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3550
diff changeset
  3317
	    usize = sizeof(u.u_bool);
3487165a9cdf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3550
diff changeset
  3318
	    if (arg1 == true) u.u_bool = TRUE;
3487165a9cdf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3550
diff changeset
  3319
	    else if (arg1 == false) u.u_bool = FALSE;
3487165a9cdf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3550
diff changeset
  3320
	    else goto argError;
3487165a9cdf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3550
diff changeset
  3321
	}
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3322
# endif /* SO_OOBINLINE */
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3323
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3324
# ifdef SO_RCVBUF
3590
3487165a9cdf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3550
diff changeset
  3325
	if (option == @symbol(SO_RCVBUF)) {
3487165a9cdf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3550
diff changeset
  3326
	    /* Specifies the total per-socket buffer space reserved for receives.
3487165a9cdf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3550
diff changeset
  3327
	       This is unrelated to SO_MAX_MSG_SIZE or the size of a TCP window. */
3487165a9cdf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3550
diff changeset
  3328
	    opt = SO_RCVBUF;
3487165a9cdf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3550
diff changeset
  3329
	    level = SOL_SOCKET;
3487165a9cdf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3550
diff changeset
  3330
	    usize = sizeof(u.u_int);
3487165a9cdf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3550
diff changeset
  3331
	    if (__isSmallInteger(arg1))u.u_int = __intVal(arg1);
3487165a9cdf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3550
diff changeset
  3332
	    else goto argError;
3487165a9cdf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3550
diff changeset
  3333
	}
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3334
# endif /* SO_RCVBUF */
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3335
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3336
# ifdef SO_SNDBUF
3590
3487165a9cdf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3550
diff changeset
  3337
	if (option == @symbol(SO_SNDBUF)) {
3487165a9cdf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3550
diff changeset
  3338
	    /* Specifies the total per-socket buffer space reserved for sends.
3487165a9cdf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3550
diff changeset
  3339
	       This is unrelated to SO_MAX_MSG_SIZE or the size of a TCP window. */
3487165a9cdf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3550
diff changeset
  3340
	    opt = SO_SNDBUF;
3487165a9cdf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3550
diff changeset
  3341
	    level = SOL_SOCKET;
3487165a9cdf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3550
diff changeset
  3342
	    usize = sizeof(u.u_int);
3487165a9cdf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3550
diff changeset
  3343
	    if (__isSmallInteger(arg1))u.u_int = __intVal(arg1);
3487165a9cdf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3550
diff changeset
  3344
	    else goto argError;
3487165a9cdf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3550
diff changeset
  3345
	}
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3346
# endif /* SO_SNDBUF */
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3347
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3348
# ifdef SO_REUSEADDR
3590
3487165a9cdf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3550
diff changeset
  3349
	if (option == @symbol(SO_REUSEADDR)) {
3487165a9cdf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3550
diff changeset
  3350
	    /* Allows the socket to be bound to an address that is already in use.  */
3487165a9cdf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3550
diff changeset
  3351
	    opt = SO_REUSEADDR;
3487165a9cdf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3550
diff changeset
  3352
	    level = SOL_SOCKET;
3487165a9cdf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3550
diff changeset
  3353
	    usize = sizeof(u.u_bool);
3487165a9cdf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3550
diff changeset
  3354
	    if (arg1 == true) u.u_bool = TRUE;
3487165a9cdf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3550
diff changeset
  3355
	    else if (arg1 == false) u.u_bool = FALSE;
3487165a9cdf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3550
diff changeset
  3356
	    else goto argError;
3487165a9cdf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3550
diff changeset
  3357
	}
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3358
# endif /* SO_OOBINLINE */
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3359
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3360
# ifdef SO_EXCLUSIVEADDRUSE
3590
3487165a9cdf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3550
diff changeset
  3361
	if (option == @symbol(SO_EXCLUSIVEADDRUSE)) {
3487165a9cdf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3550
diff changeset
  3362
	    /* Enables a socket to be bound for exclusive access.
3487165a9cdf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3550
diff changeset
  3363
	       Does not require administrative privilege.  */
3487165a9cdf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3550
diff changeset
  3364
	    opt = SO_EXCLUSIVEADDRUSE;
3487165a9cdf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3550
diff changeset
  3365
	    level = SOL_SOCKET;
3487165a9cdf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3550
diff changeset
  3366
	    usize = sizeof(u.u_bool);
3487165a9cdf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3550
diff changeset
  3367
	    if (arg1 == true) u.u_bool = TRUE;
3487165a9cdf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3550
diff changeset
  3368
	    else if (arg1 == false) u.u_bool = FALSE;
3487165a9cdf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3550
diff changeset
  3369
	    else goto argError;
3487165a9cdf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3550
diff changeset
  3370
	}
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3371
# endif /* SO_OOBINLINE */
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3372
3467
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
  3373
# ifdef SO_RCVTIMEO
3590
3487165a9cdf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3550
diff changeset
  3374
	if ((option == @symbol(SO_RCVTIMEO))
3487165a9cdf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3550
diff changeset
  3375
	 && __isSmallInteger(arg1)
3487165a9cdf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3550
diff changeset
  3376
	 && __isSmallInteger(arg2)) {
3487165a9cdf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3550
diff changeset
  3377
	    opt = SO_RCVTIMEO;
3487165a9cdf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3550
diff changeset
  3378
	    level = SOL_SOCKET;
3487165a9cdf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3550
diff changeset
  3379
	    u.u_tv.tv_sec = __intVal(arg1);
3487165a9cdf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3550
diff changeset
  3380
	    u.u_tv.tv_usec = __intVal(arg2);
3487165a9cdf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3550
diff changeset
  3381
	    usize = sizeof(u.u_tv);
3487165a9cdf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3550
diff changeset
  3382
	}
3467
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
  3383
# endif /* SO_RCVTIMEO */
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
  3384
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
  3385
# ifdef SO_SNDTIMEO
3590
3487165a9cdf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3550
diff changeset
  3386
	if ((option == @symbol(SO_SNDTIMEO))
3487165a9cdf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3550
diff changeset
  3387
	 && __isSmallInteger(arg1)
3487165a9cdf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3550
diff changeset
  3388
	 && __isSmallInteger(arg2)) {
3487165a9cdf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3550
diff changeset
  3389
	    opt = SO_SNDTIMEO;
3487165a9cdf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3550
diff changeset
  3390
	    level = SOL_SOCKET;
3487165a9cdf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3550
diff changeset
  3391
	    u.u_tv.tv_sec = __intVal(arg1);
3487165a9cdf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3550
diff changeset
  3392
	    u.u_tv.tv_usec = __intVal(arg2);
3487165a9cdf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3550
diff changeset
  3393
	    usize = sizeof(u.u_tv);
3487165a9cdf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3550
diff changeset
  3394
	}
3467
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
  3395
# endif /* SO_SNDTIMEO */
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
  3396
3843
fbced69597a7 oops - error check was disabled
Claus Gittinger <cg@exept.de>
parents: 3742
diff changeset
  3397
# if !defined(IPV6_V6ONLY) && defined(__win32__)
3513
8105bf370769 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3485
diff changeset
  3398
#  define IPPROTO_IPV6 41
8105bf370769 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3485
diff changeset
  3399
#  define IPV6_V6ONLY 27
8105bf370769 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3485
diff changeset
  3400
# endif
8105bf370769 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3485
diff changeset
  3401
8105bf370769 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3485
diff changeset
  3402
# if defined(IPV6_V6ONLY)
3590
3487165a9cdf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3550
diff changeset
  3403
	if (option == @symbol(IPV6_V6ONLY)) {
3487165a9cdf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3550
diff changeset
  3404
	    opt = IPV6_V6ONLY;
3487165a9cdf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3550
diff changeset
  3405
	    level = IPPROTO_IPV6;
3487165a9cdf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3550
diff changeset
  3406
	    usize = sizeof(u.u_bool);
3487165a9cdf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3550
diff changeset
  3407
	    if (arg1 == true) u.u_bool = TRUE;
3487165a9cdf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3550
diff changeset
  3408
	    else if (arg1 == false) u.u_bool = FALSE;
3487165a9cdf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3550
diff changeset
  3409
	    else goto argError;
3843
fbced69597a7 oops - error check was disabled
Claus Gittinger <cg@exept.de>
parents: 3742
diff changeset
  3410
#  ifdef __win32__
3591
71ce2d98b99d *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3590
diff changeset
  3411
	    console_fprintf(stderr, "%d %d %d %d\n", level, opt, usize, u.u_int);
3514
2d81c5ffa475 win32_printf is only avail in: guess what
Claus Gittinger <cg@exept.de>
parents: 3513
diff changeset
  3412
#  endif
3590
3487165a9cdf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3550
diff changeset
  3413
	}
3513
8105bf370769 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3485
diff changeset
  3414
# endif /* IPV6_V6ONLY */
8105bf370769 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3485
diff changeset
  3415
3590
3487165a9cdf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3550
diff changeset
  3416
	if (usize == -1) goto argError;
3487165a9cdf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3550
diff changeset
  3417
3487165a9cdf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3550
diff changeset
  3418
	ok = (setsockopt(sock, level, opt, (char *)&u, usize) >= 0) ? true : false;
3487165a9cdf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3550
diff changeset
  3419
	if (ok == false) {
3843
fbced69597a7 oops - error check was disabled
Claus Gittinger <cg@exept.de>
parents: 3742
diff changeset
  3420
# ifdef __win32__
3590
3487165a9cdf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3550
diff changeset
  3421
	    error = __mkSmallInteger(WSAGetLastError());
3843
fbced69597a7 oops - error check was disabled
Claus Gittinger <cg@exept.de>
parents: 3742
diff changeset
  3422
# else
3590
3487165a9cdf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3550
diff changeset
  3423
	    error = __mkSmallInteger(errno);
3843
fbced69597a7 oops - error check was disabled
Claus Gittinger <cg@exept.de>
parents: 3742
diff changeset
  3424
# endif
3590
3487165a9cdf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3550
diff changeset
  3425
	}
3513
8105bf370769 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3485
diff changeset
  3426
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3427
    }
1529
911273d090c1 Re-unified Win32 and Unix code into single Socket.st.
Claus Gittinger <cg@exept.de>
parents: 1505
diff changeset
  3428
argError: ;
2818
94d67df5c00d compilable with tcc
Claus Gittinger <cg@exept.de>
parents: 2773
diff changeset
  3429
#endif /* NO_SOCKET */
1529
911273d090c1 Re-unified Win32 and Unix code into single Socket.st.
Claus Gittinger <cg@exept.de>
parents: 1505
diff changeset
  3430
%}.
911273d090c1 Re-unified Win32 and Unix code into single Socket.st.
Claus Gittinger <cg@exept.de>
parents: 1505
diff changeset
  3431
    ok isNil ifTrue:[
3590
3487165a9cdf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3550
diff changeset
  3432
	self primitiveFailed
1529
911273d090c1 Re-unified Win32 and Unix code into single Socket.st.
Claus Gittinger <cg@exept.de>
parents: 1505
diff changeset
  3433
    ].
911273d090c1 Re-unified Win32 and Unix code into single Socket.st.
Claus Gittinger <cg@exept.de>
parents: 1505
diff changeset
  3434
    ok ifFalse:[
3590
3487165a9cdf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3550
diff changeset
  3435
	'++++ Info: Socket>>#setSocketOption:... failed. error: ' infoPrint. error infoPrintCR.
1529
911273d090c1 Re-unified Win32 and Unix code into single Socket.st.
Claus Gittinger <cg@exept.de>
parents: 1505
diff changeset
  3436
    ].
2551
6da1bc89b74a changed:
Stefan Vogel <sv@exept.de>
parents: 2516
diff changeset
  3437
!
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3438
2823
10179ccfae5d Default for close - linger in background instead 30s in foreground
Stefan Vogel <sv@exept.de>
parents: 2818
diff changeset
  3439
shutdown:howNum
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3440
    "shutDown the socket - inform it that no more I/O will be performed.
3467
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
  3441
	 0 - read side   (no further reads)
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
  3442
	     the tcp receive window is closed, so the peer cannot send more data.
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
  3443
	 1 - write side  (no further writes)
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
  3444
	     first, all queued data will be delivered to the peer.
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
  3445
	     Then, an orderly release (TCP FIN) is sent to signal the peer,
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
  3446
	     that we will not send more data.
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
  3447
	 2 - both read side and write side."
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3448
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3449
%{
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3450
#ifndef NO_SOCKET
2823
10179ccfae5d Default for close - linger in background instead 30s in foreground
Stefan Vogel <sv@exept.de>
parents: 2818
diff changeset
  3451
    OBJ __handle = __INST(handle);
3246
c75a006f9a7a Win32 sockets use handles instead of file pointers
Stefan Vogel <sv@exept.de>
parents: 3224
diff changeset
  3452
2823
10179ccfae5d Default for close - linger in background instead 30s in foreground
Stefan Vogel <sv@exept.de>
parents: 2818
diff changeset
  3453
    if ((__handle != nil) && __isSmallInteger(howNum)) {
3467
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
  3454
	SOCKET sock = SOCKET_FROM_FILE_OBJECT(__handle);
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
  3455
	INT how = __intVal(howNum);
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
  3456
	INT ret;
2823
10179ccfae5d Default for close - linger in background instead 30s in foreground
Stefan Vogel <sv@exept.de>
parents: 2818
diff changeset
  3457
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3458
# ifdef DO_WRAP_CALLS
3467
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
  3459
	do {
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
  3460
	    __threadErrno = 0;
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
  3461
	    DBGFPRINTF((stderr, "SOCKET: shutDown...\n"));
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
  3462
	    ret = (INT)STX_WSA_NOINT_CALL2("shutdown", shutdown, sock, how);
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
  3463
	    DBGFPRINTF((stderr, "SOCKET: shutDown -> %d (%d)\n", ret, __threadErrno));
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
  3464
	} 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
  3465
# else
3467
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
  3466
	__BEGIN_INTERRUPTABLE__
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
  3467
	shutdown(sock, how);
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
  3468
	__END_INTERRUPTABLE__
1529
911273d090c1 Re-unified Win32 and Unix code into single Socket.st.
Claus Gittinger <cg@exept.de>
parents: 1505
diff changeset
  3469
# endif
781
4d61e7588ff3 added #waitForNewConnectionOrDataOnAny:timeout:
Claus Gittinger <cg@exept.de>
parents: 776
diff changeset
  3470
    }
4d61e7588ff3 added #waitForNewConnectionOrDataOnAny:timeout:
Claus Gittinger <cg@exept.de>
parents: 776
diff changeset
  3471
#endif
1339
cc973a42aa54 shutdown: added
Claus Gittinger <cg@exept.de>
parents: 1338
diff changeset
  3472
%}.
781
4d61e7588ff3 added #waitForNewConnectionOrDataOnAny:timeout:
Claus Gittinger <cg@exept.de>
parents: 776
diff changeset
  3473
! !
4d61e7588ff3 added #waitForNewConnectionOrDataOnAny:timeout:
Claus Gittinger <cg@exept.de>
parents: 776
diff changeset
  3474
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3475
!Socket methodsFor:'printing & storing'!
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3476
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3477
printOn:aStream
3530
ce2171c0fe57 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3514
diff changeset
  3478
    aStream nextPutAll:self className; nextPutAll:'('.
ce2171c0fe57 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3514
diff changeset
  3479
    domain printOn:aStream.
ce2171c0fe57 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3514
diff changeset
  3480
    aStream nextPutAll:' protocol='.
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3481
    protocol printOn:aStream.
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3482
    aStream nextPutAll:' port='.
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  3483
    self port printOn:aStream.
4636
7e1e0ce3e0b4 #QUALITY by stefan
Stefan Vogel <sv@exept.de>
parents: 4630
diff changeset
  3484
    peer notNil ifTrue:[
7e1e0ce3e0b4 #QUALITY by stefan
Stefan Vogel <sv@exept.de>
parents: 4630
diff changeset
  3485
        aStream nextPutAll:' peer='.
7e1e0ce3e0b4 #QUALITY by stefan
Stefan Vogel <sv@exept.de>
parents: 4630
diff changeset
  3486
        peer printOn:aStream.
7e1e0ce3e0b4 #QUALITY by stefan
Stefan Vogel <sv@exept.de>
parents: 4630
diff changeset
  3487
    ].
7e1e0ce3e0b4 #QUALITY by stefan
Stefan Vogel <sv@exept.de>
parents: 4630
diff changeset
  3488
    listening notNil ifTrue:[
7e1e0ce3e0b4 #QUALITY by stefan
Stefan Vogel <sv@exept.de>
parents: 4630
diff changeset
  3489
        aStream nextPutAll:' *listening('.
7e1e0ce3e0b4 #QUALITY by stefan
Stefan Vogel <sv@exept.de>
parents: 4630
diff changeset
  3490
        listening printOn:aStream.
7e1e0ce3e0b4 #QUALITY by stefan
Stefan Vogel <sv@exept.de>
parents: 4630
diff changeset
  3491
        aStream nextPutAll:')*'.
7e1e0ce3e0b4 #QUALITY by stefan
Stefan Vogel <sv@exept.de>
parents: 4630
diff changeset
  3492
    ].
1842
88c04d1e9e6b changed #printOn:
Stefan Vogel <sv@exept.de>
parents: 1839
diff changeset
  3493
    aStream nextPut:$).
4636
7e1e0ce3e0b4 #QUALITY by stefan
Stefan Vogel <sv@exept.de>
parents: 4630
diff changeset
  3494
7e1e0ce3e0b4 #QUALITY by stefan
Stefan Vogel <sv@exept.de>
parents: 4630
diff changeset
  3495
    "Modified: / 23-04-2018 / 19:44:24 / stefan"
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3496
! !
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3497
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3498
!Socket methodsFor:'queries'!
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3499
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3500
domain
3059
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  3501
    "return the sockets addressing domain (i.e. #AF_INET, #AF_INET6, #AF_UNIX, ...)"
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3502
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3503
    ^ domain
126
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
  3504
!
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
  3505
3059
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  3506
getFullPeerAddress
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  3507
    "implemented for swazoo project (primitive code can't be loaded as extension)
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3508
     Answer my own address (I am bound to this address).
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3509
     Note that this address may change after a connect or accept."
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3510
3059
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  3511
    |error domainClass addr|
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3512
2321
6f4cc7b644db filePointer -> handle migration
Claus Gittinger <cg@exept.de>
parents: 2308
diff changeset
  3513
    handle isNil ifTrue:[
3217
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  3514
	^ self errorNotOpen
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3515
    ].
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3516
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3517
    domainClass := self class socketAddressClassForDomain:domain.
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3518
    domainClass isNil ifTrue:[
3217
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  3519
	^ self error:'invalid (unsupported) domain'.
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3520
    ].
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3521
    addr := domainClass new.
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3522
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3523
%{
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3524
#ifndef NO_SOCKET
2321
6f4cc7b644db filePointer -> handle migration
Claus Gittinger <cg@exept.de>
parents: 2308
diff changeset
  3525
    OBJ fp = __INST(handle);
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3526
    SOCKET sock;
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3527
    int ret;
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3528
    union sockaddr_u sa;
3059
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  3529
    unsigned int alen = sizeof(sa);
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3530
    char *addrP;
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3531
    int addrObjSize, nAddrInstBytes;
3059
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  3532
    OBJ addrClass;
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  3533
    int nAddrInstVars;
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3534
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3535
    if (!__isNonNilObject(addr) || !__isBytes(addr)) {
3217
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  3536
	DBGPRINTF(("SOCKET: bad addr\n"));
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  3537
	error = @symbol(badArgument);
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  3538
	goto err;
3059
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  3539
    }
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  3540
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  3541
    addrClass = __qClass(addr);
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  3542
    nAddrInstVars = __intVal(__ClassInstPtr(addrClass)->c_ninstvars);
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  3543
    nAddrInstBytes = OHDR_SIZE + (nAddrInstVars * sizeof(OBJ));
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  3544
    addrObjSize = __qSize(addr) - nAddrInstBytes;
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  3545
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  3546
    sock = SOCKET_FROM_FILE_OBJECT(fp);
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  3547
    ret = getpeername(sock, (struct sockaddr *)&sa, &alen);
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  3548
    if (ret < 0) {
3843
fbced69597a7 oops - error check was disabled
Claus Gittinger <cg@exept.de>
parents: 3742
diff changeset
  3549
# ifdef __win32__
3217
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  3550
	errno = WSAGetLastError();
3059
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  3551
# endif
3217
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  3552
	DBGPRINTF(("SOCKET: getsocketname failed ret=%d errno=%d\n", ret, errno));
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  3553
	error = __MKSMALLINT(errno);
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  3554
	goto err;
3059
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  3555
    }
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  3556
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  3557
    if (addrObjSize < alen) {
3217
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  3558
	DBGPRINTF(("SOCKET: bad addr\n"));
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  3559
	error = @symbol(badArgument);
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  3560
	goto err;
3059
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  3561
    }
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  3562
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  3563
    addrP = (char *)__InstPtr(addr) + nAddrInstBytes;
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  3564
    memcpy(addrP, (char *)&sa, alen);
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  3565
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  3566
err:;
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  3567
#else /* NO_SOCKET */
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  3568
    error = @symbol(notImplemented);
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  3569
#endif /* NO_SOCKET */
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  3570
%}.
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  3571
    error notNil ifTrue:[
3217
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  3572
	^ self errorReporter reportOn:error
3059
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  3573
    ].
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  3574
    ^ addr
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  3575
!
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  3576
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  3577
getFullSocketAddress
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  3578
    "implemented for swazoo project (primitive code can't be loaded as extension)
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  3579
     Answer my own address (I am bound to this address).
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  3580
     Note that this address may change after a connect or accept."
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  3581
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  3582
    |error domainClass addr|
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  3583
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  3584
    handle isNil ifTrue:[
3217
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  3585
	^ self errorNotOpen
3059
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  3586
    ].
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  3587
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  3588
    domainClass := self class socketAddressClassForDomain:domain.
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  3589
    domainClass isNil ifTrue:[
3217
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  3590
	^ self error:'invalid (unsupported) domain'.
3059
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  3591
    ].
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  3592
    addr := domainClass new.
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  3593
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  3594
%{
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  3595
#ifndef NO_SOCKET
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  3596
    OBJ fp = __INST(handle);
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  3597
    SOCKET sock;
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  3598
    int ret;
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  3599
    union sockaddr_u sa;
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  3600
    unsigned int alen = sizeof(sa);
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  3601
    char *addrP;
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  3602
    int addrObjSize, nAddrInstBytes;
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  3603
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  3604
    if (!__isNonNilObject(addr) || !__isBytes(addr)) {
3217
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  3605
	DBGPRINTF(("SOCKET: bad addr\n"));
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  3606
	error = @symbol(badArgument);
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  3607
	goto err;
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3608
    }
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3609
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3610
    {
3217
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  3611
	OBJ addrClass;
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  3612
	int nAddrInstVars;
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  3613
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  3614
	addrClass = __qClass(addr);
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  3615
	nAddrInstVars = __intVal(__ClassInstPtr(addrClass)->c_ninstvars);
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  3616
	nAddrInstBytes = OHDR_SIZE + (nAddrInstVars * sizeof(OBJ));
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  3617
	addrObjSize = __qSize(addr) - nAddrInstBytes;
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3618
    }
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3619
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3620
    sock = SOCKET_FROM_FILE_OBJECT(fp);
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3621
    ret = getsockname(sock, (struct sockaddr *)&sa, &alen);
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3622
    if (ret < 0) {
3843
fbced69597a7 oops - error check was disabled
Claus Gittinger <cg@exept.de>
parents: 3742
diff changeset
  3623
# ifdef __win32__
3217
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  3624
	errno = WSAGetLastError();
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3625
# endif
3217
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  3626
	DBGPRINTF(("SOCKET: getsocketname failed ret=%d errno=%d\n", ret, errno));
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  3627
	error = __MKSMALLINT(errno);
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  3628
	goto err;
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3629
    }
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3630
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3631
    if (addrObjSize < alen) {
3217
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  3632
	DBGPRINTF(("SOCKET: bad addr\n"));
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  3633
	error = @symbol(badArgument);
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  3634
	goto err;
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3635
    }
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3636
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3637
    addrP = (char *)__InstPtr(addr) + nAddrInstBytes;
3059
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  3638
    memcpy(addrP, (char *)&sa, alen);
1535
f6aa0fc8c3cc getSocketAddress
Claus Gittinger <cg@exept.de>
parents: 1533
diff changeset
  3639
f6aa0fc8c3cc getSocketAddress
Claus Gittinger <cg@exept.de>
parents: 1533
diff changeset
  3640
err:;
f6aa0fc8c3cc getSocketAddress
Claus Gittinger <cg@exept.de>
parents: 1533
diff changeset
  3641
#else /* NO_SOCKET */
f6aa0fc8c3cc getSocketAddress
Claus Gittinger <cg@exept.de>
parents: 1533
diff changeset
  3642
    error = @symbol(notImplemented);
f6aa0fc8c3cc getSocketAddress
Claus Gittinger <cg@exept.de>
parents: 1533
diff changeset
  3643
#endif /* NO_SOCKET */
f6aa0fc8c3cc getSocketAddress
Claus Gittinger <cg@exept.de>
parents: 1533
diff changeset
  3644
%}.
f6aa0fc8c3cc getSocketAddress
Claus Gittinger <cg@exept.de>
parents: 1533
diff changeset
  3645
    error notNil ifTrue:[
3217
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  3646
	^ self errorReporter reportOn:error
1535
f6aa0fc8c3cc getSocketAddress
Claus Gittinger <cg@exept.de>
parents: 1533
diff changeset
  3647
    ].
f6aa0fc8c3cc getSocketAddress
Claus Gittinger <cg@exept.de>
parents: 1533
diff changeset
  3648
    ^ addr
f6aa0fc8c3cc getSocketAddress
Claus Gittinger <cg@exept.de>
parents: 1533
diff changeset
  3649
!
f6aa0fc8c3cc getSocketAddress
Claus Gittinger <cg@exept.de>
parents: 1533
diff changeset
  3650
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3651
getName
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3652
    "return the name; here, we return the ports name"
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3653
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  3654
    ^ self port printString
126
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
  3655
!
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
  3656
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3657
getPeer
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3658
    "ST-80 compatibility: return an IPSocketAddress instance representing
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3659
     my hostname/port combination.
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3660
     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
  3661
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
  3662
    ^ peer
102
5dc264007513 added getPeer for ST-80 compatibility
Claus Gittinger <cg@exept.de>
parents: 99
diff changeset
  3663
!
5dc264007513 added getPeer for ST-80 compatibility
Claus Gittinger <cg@exept.de>
parents: 99
diff changeset
  3664
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3665
getPeerName
4091
ff4070ceffad #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 4039
diff changeset
  3666
    "return the peer name; that's the hostname (or dotted name) of the
25
996051271ce9 *** empty log message ***
claus
parents: 21
diff changeset
  3667
     partners host after an accept."
996051271ce9 *** empty log message ***
claus
parents: 21
diff changeset
  3668
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
  3669
    peerName isNil ifTrue:[
4414
42edc97b2323 bcopy -> memcpy
Claus Gittinger <cg@exept.de>
parents: 4341
diff changeset
  3670
	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
  3671
    ].
25
996051271ce9 *** empty log message ***
claus
parents: 21
diff changeset
  3672
    ^ peerName
28
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  3673
!
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  3674
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3675
getSocketAddress
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3676
    "implemented for swazoo project primitive code cant load as extension
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3677
     answer my own address (I am bound to this address).
1146
71a9df78ba9e bad spelling
Stefan Vogel <sv@exept.de>
parents: 1136
diff changeset
  3678
     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
  3679
1535
f6aa0fc8c3cc getSocketAddress
Claus Gittinger <cg@exept.de>
parents: 1533
diff changeset
  3680
    ^ self getFullSocketAddress hostAddress
1146
71a9df78ba9e bad spelling
Stefan Vogel <sv@exept.de>
parents: 1136
diff changeset
  3681
!
71a9df78ba9e bad spelling
Stefan Vogel <sv@exept.de>
parents: 1136
diff changeset
  3682
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3683
isActive
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3684
    "return true, if the receiver has a connection"
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3685
2321
6f4cc7b644db filePointer -> handle migration
Claus Gittinger <cg@exept.de>
parents: 2308
diff changeset
  3686
    ^ handle notNil
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3687
!
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3688
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3689
isConnected
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3690
    "return true, if the receiver has a connection"
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3691
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3692
    ^ self isActive
2321
6f4cc7b644db filePointer -> handle migration
Claus Gittinger <cg@exept.de>
parents: 2308
diff changeset
  3693
	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
  3694
!
a563aac90660 No need to ask Socket>>#networkXXXOrderIsMSB, because the return value is
Stefan Vogel <sv@exept.de>
parents: 1542
diff changeset
  3695
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3696
port
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  3697
    "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
  3698
     - so this is the local port."
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  3699
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  3700
"/    port isNil ifTrue:[
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  3701
"/        port := self getFullSocketAddress port.
1505
Stefan Vogel <sv@exept.de>
parents: 1504
diff changeset
  3702
"/    ].
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  3703
71
claus
parents: 63
diff changeset
  3704
    ^ port
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3705
!
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3706
3059
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  3707
socketAddressClass
4288
00e575acf898 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 4261
diff changeset
  3708
    "get the matching SocketAddress class for this socket"
3059
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  3709
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  3710
    |domainClass|
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  3711
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  3712
    domainClass := self class socketAddressClassForDomain:domain.
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  3713
    domainClass isNil ifTrue:[
4414
42edc97b2323 bcopy -> memcpy
Claus Gittinger <cg@exept.de>
parents: 4341
diff changeset
  3714
	^ self error:'invalid (unsupported) domain'.
3059
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  3715
    ].
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  3716
    ^ domainClass.
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  3717
!
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  3718
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3719
type
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3720
    "return the sockets connection type (i.e. #datagram, #stream etc)"
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3721
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3722
    ^ socketType
81
claus
parents: 79
diff changeset
  3723
! !
claus
parents: 79
diff changeset
  3724
126
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
  3725
!Socket methodsFor:'socket setup'!
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
  3726
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3727
domain:domainArg type:typeArg
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3728
    "set up socket with domain and type.
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3729
     This is a low level entry; no binding, listening or connect
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3730
     is done. Both arguments must be symbols from one of
3059
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  3731
      #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
  3732
3137
df3e9cebf52c class: Socket
Stefan Vogel <sv@exept.de>
parents: 3127
diff changeset
  3733
    ^ self domain:domainArg type:typeArg protocol:nil
126
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
  3734
!
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
  3735
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3736
domain:domainArg type:typeArg protocol:protocolNumber
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3737
    "set up socket with domain, type and protocol number.
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3738
     This is a low level entry; no binding, listening or connect
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3739
     is done. Both arguments must be symbols from one of
3059
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  3740
     #AF_INET, #AF_INET6, #AF_UNIX ... and #stream, #datagram, #raw resp."
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3741
3246
c75a006f9a7a Win32 sockets use handles instead of file pointers
Stefan Vogel <sv@exept.de>
parents: 3224
diff changeset
  3742
    |domainName domainCode typeCode error newHandle|
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3743
2321
6f4cc7b644db filePointer -> handle migration
Claus Gittinger <cg@exept.de>
parents: 2308
diff changeset
  3744
    handle notNil ifTrue:[
4414
42edc97b2323 bcopy -> memcpy
Claus Gittinger <cg@exept.de>
parents: 4341
diff changeset
  3745
	^ self errorAlreadyOpen
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3746
    ].
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3747
    domainName := SocketAddress domainCodeFromName:domainArg.
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3748
    domainCode := OperatingSystem domainCodeOf:domainName.
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3749
    typeCode := OperatingSystem socketTypeCodeOf:typeArg.
3246
c75a006f9a7a Win32 sockets use handles instead of file pointers
Stefan Vogel <sv@exept.de>
parents: 3224
diff changeset
  3750
    newHandle := OperatingSystem socketAccessor new.
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3751
%{
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3752
#ifndef NO_SOCKET
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3753
    FILE *fp;
3137
df3e9cebf52c class: Socket
Stefan Vogel <sv@exept.de>
parents: 3127
diff changeset
  3754
    int dom, typ, proto = 0;
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3755
    int on = 1;
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3756
    SOCKET sock;
3246
c75a006f9a7a Win32 sockets use handles instead of file pointers
Stefan Vogel <sv@exept.de>
parents: 3224
diff changeset
  3757
    int _fd;
c75a006f9a7a Win32 sockets use handles instead of file pointers
Stefan Vogel <sv@exept.de>
parents: 3224
diff changeset
  3758
3843
fbced69597a7 oops - error check was disabled
Claus Gittinger <cg@exept.de>
parents: 3742
diff changeset
  3759
# ifdef __win32__
3123
55ef9ca4f09f class: Socket
Stefan Vogel <sv@exept.de>
parents: 3077
diff changeset
  3760
#  ifndef WSA_FLAG_NO_HANDLE_INHERIT
55ef9ca4f09f class: Socket
Stefan Vogel <sv@exept.de>
parents: 3077
diff changeset
  3761
#   define WSA_FLAG_NO_HANDLE_INHERIT 0x80
55ef9ca4f09f class: Socket
Stefan Vogel <sv@exept.de>
parents: 3077
diff changeset
  3762
#  endif
55ef9ca4f09f class: Socket
Stefan Vogel <sv@exept.de>
parents: 3077
diff changeset
  3763
    static int noInheritFlag = WSA_FLAG_NO_HANDLE_INHERIT;
55ef9ca4f09f class: Socket
Stefan Vogel <sv@exept.de>
parents: 3077
diff changeset
  3764
# endif
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3765
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3766
    if (! __isSmallInteger(domainCode)) {
4414
42edc97b2323 bcopy -> memcpy
Claus Gittinger <cg@exept.de>
parents: 4341
diff changeset
  3767
	error = @symbol(badArgument1);
42edc97b2323 bcopy -> memcpy
Claus Gittinger <cg@exept.de>
parents: 4341
diff changeset
  3768
	goto out;
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3769
    }
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3770
    if (! __isSmallInteger(typeCode)) {
4414
42edc97b2323 bcopy -> memcpy
Claus Gittinger <cg@exept.de>
parents: 4341
diff changeset
  3771
	error = @symbol(badArgument2);
42edc97b2323 bcopy -> memcpy
Claus Gittinger <cg@exept.de>
parents: 4341
diff changeset
  3772
	goto out;
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3773
    }
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3774
    if (protocolNumber != nil) {
4414
42edc97b2323 bcopy -> memcpy
Claus Gittinger <cg@exept.de>
parents: 4341
diff changeset
  3775
	if (!__isSmallInteger(protocolNumber)) {
42edc97b2323 bcopy -> memcpy
Claus Gittinger <cg@exept.de>
parents: 4341
diff changeset
  3776
	    error = @symbol(badArgument3);
42edc97b2323 bcopy -> memcpy
Claus Gittinger <cg@exept.de>
parents: 4341
diff changeset
  3777
	    goto out;
42edc97b2323 bcopy -> memcpy
Claus Gittinger <cg@exept.de>
parents: 4341
diff changeset
  3778
	}
42edc97b2323 bcopy -> memcpy
Claus Gittinger <cg@exept.de>
parents: 4341
diff changeset
  3779
	proto = __intVal(protocolNumber);
1885
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
    /*
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3783
     * get address and protocol-family
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3784
     */
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3785
    dom = __intVal(domainCode);
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3786
    typ = __intVal(typeCode);
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3787
3843
fbced69597a7 oops - error check was disabled
Claus Gittinger <cg@exept.de>
parents: 3742
diff changeset
  3788
# ifdef __win32__
3123
55ef9ca4f09f class: Socket
Stefan Vogel <sv@exept.de>
parents: 3077
diff changeset
  3789
    sock = WSASocket(dom, typ, proto, 0, 0, noInheritFlag);
55ef9ca4f09f class: Socket
Stefan Vogel <sv@exept.de>
parents: 3077
diff changeset
  3790
    if (sock == INVALID_SOCKET && noInheritFlag) {
4414
42edc97b2323 bcopy -> memcpy
Claus Gittinger <cg@exept.de>
parents: 4341
diff changeset
  3791
	// tried to open socket with WSA_FLAG_NO_HANDLE_INHERIT
42edc97b2323 bcopy -> memcpy
Claus Gittinger <cg@exept.de>
parents: 4341
diff changeset
  3792
	// This fails on older windows versions, e.g. Windows XP
42edc97b2323 bcopy -> memcpy
Claus Gittinger <cg@exept.de>
parents: 4341
diff changeset
  3793
	sock = WSASocket(dom, typ, proto, 0, 0, 0);
42edc97b2323 bcopy -> memcpy
Claus Gittinger <cg@exept.de>
parents: 4341
diff changeset
  3794
	if (sock != INVALID_SOCKET) {
42edc97b2323 bcopy -> memcpy
Claus Gittinger <cg@exept.de>
parents: 4341
diff changeset
  3795
	    // no error without WSA_FLAG_NO_HANDLE_INHERIT,
42edc97b2323 bcopy -> memcpy
Claus Gittinger <cg@exept.de>
parents: 4341
diff changeset
  3796
	    // never use this flag again!
42edc97b2323 bcopy -> memcpy
Claus Gittinger <cg@exept.de>
parents: 4341
diff changeset
  3797
	    noInheritFlag = 0;
42edc97b2323 bcopy -> memcpy
Claus Gittinger <cg@exept.de>
parents: 4341
diff changeset
  3798
	}
3123
55ef9ca4f09f class: Socket
Stefan Vogel <sv@exept.de>
parents: 3077
diff changeset
  3799
    }
55ef9ca4f09f class: Socket
Stefan Vogel <sv@exept.de>
parents: 3077
diff changeset
  3800
    if (sock == INVALID_SOCKET) {
4414
42edc97b2323 bcopy -> memcpy
Claus Gittinger <cg@exept.de>
parents: 4341
diff changeset
  3801
	errno = WSAGetLastError();
3123
55ef9ca4f09f class: Socket
Stefan Vogel <sv@exept.de>
parents: 3077
diff changeset
  3802
3843
fbced69597a7 oops - error check was disabled
Claus Gittinger <cg@exept.de>
parents: 3742
diff changeset
  3803
# else  // !__win32__
3123
55ef9ca4f09f class: Socket
Stefan Vogel <sv@exept.de>
parents: 3077
diff changeset
  3804
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3805
    sock = socket(dom, typ, proto);
3123
55ef9ca4f09f class: Socket
Stefan Vogel <sv@exept.de>
parents: 3077
diff changeset
  3806
# if defined(EPROTONOSUPPORT) /* for SGI */
55ef9ca4f09f class: Socket
Stefan Vogel <sv@exept.de>
parents: 3077
diff changeset
  3807
    if ((sock < 0) && (proto != 0) && (errno == EPROTONOSUPPORT)) {
4414
42edc97b2323 bcopy -> memcpy
Claus Gittinger <cg@exept.de>
parents: 4341
diff changeset
  3808
	DBGPRINTF(("SOCKET: retry with UNSPEC protocol\n"));
42edc97b2323 bcopy -> memcpy
Claus Gittinger <cg@exept.de>
parents: 4341
diff changeset
  3809
	proto = 0;
42edc97b2323 bcopy -> memcpy
Claus Gittinger <cg@exept.de>
parents: 4341
diff changeset
  3810
	sock = socket(dom, typ, 0);
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3811
    }
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3812
# endif
3123
55ef9ca4f09f class: Socket
Stefan Vogel <sv@exept.de>
parents: 3077
diff changeset
  3813
    if (sock < 0) {
3843
fbced69597a7 oops - error check was disabled
Claus Gittinger <cg@exept.de>
parents: 3742
diff changeset
  3814
# endif // !__win32__
3123
55ef9ca4f09f class: Socket
Stefan Vogel <sv@exept.de>
parents: 3077
diff changeset
  3815
4414
42edc97b2323 bcopy -> memcpy
Claus Gittinger <cg@exept.de>
parents: 4341
diff changeset
  3816
	DBGPRINTF(("SOCKET: socket(dom=%d typ=%d proto=%d) call failed errno=%d\n", dom, typ, proto, errno));
42edc97b2323 bcopy -> memcpy
Claus Gittinger <cg@exept.de>
parents: 4341
diff changeset
  3817
	error = __MKSMALLINT(errno);
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3818
    } else {
3123
55ef9ca4f09f class: Socket
Stefan Vogel <sv@exept.de>
parents: 3077
diff changeset
  3819
# if defined(SET_LINGER_WHEN_CREATING_SOCKET) && defined(SO_LINGER)
4414
42edc97b2323 bcopy -> memcpy
Claus Gittinger <cg@exept.de>
parents: 4341
diff changeset
  3820
	{
42edc97b2323 bcopy -> memcpy
Claus Gittinger <cg@exept.de>
parents: 4341
diff changeset
  3821
	    struct linger l;
42edc97b2323 bcopy -> memcpy
Claus Gittinger <cg@exept.de>
parents: 4341
diff changeset
  3822
42edc97b2323 bcopy -> memcpy
Claus Gittinger <cg@exept.de>
parents: 4341
diff changeset
  3823
	    l.l_onoff = 1;
42edc97b2323 bcopy -> memcpy
Claus Gittinger <cg@exept.de>
parents: 4341
diff changeset
  3824
	    l.l_linger = 30;
42edc97b2323 bcopy -> memcpy
Claus Gittinger <cg@exept.de>
parents: 4341
diff changeset
  3825
	    setsockopt(sock, SOL_SOCKET, SO_LINGER, &l, sizeof(l));
42edc97b2323 bcopy -> memcpy
Claus Gittinger <cg@exept.de>
parents: 4341
diff changeset
  3826
	}
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3827
# endif
3843
fbced69597a7 oops - error check was disabled
Claus Gittinger <cg@exept.de>
parents: 3742
diff changeset
  3828
# ifdef __win32__
4414
42edc97b2323 bcopy -> memcpy
Claus Gittinger <cg@exept.de>
parents: 4341
diff changeset
  3829
	/*
42edc97b2323 bcopy -> memcpy
Claus Gittinger <cg@exept.de>
parents: 4341
diff changeset
  3830
	 * make it blocking
42edc97b2323 bcopy -> memcpy
Claus Gittinger <cg@exept.de>
parents: 4341
diff changeset
  3831
	 */
42edc97b2323 bcopy -> memcpy
Claus Gittinger <cg@exept.de>
parents: 4341
diff changeset
  3832
	{
42edc97b2323 bcopy -> memcpy
Claus Gittinger <cg@exept.de>
parents: 4341
diff changeset
  3833
	    unsigned long zero = 0;
42edc97b2323 bcopy -> memcpy
Claus Gittinger <cg@exept.de>
parents: 4341
diff changeset
  3834
	    ioctlsocket(sock, FIONBIO, &zero);
42edc97b2323 bcopy -> memcpy
Claus Gittinger <cg@exept.de>
parents: 4341
diff changeset
  3835
	}
42edc97b2323 bcopy -> memcpy
Claus Gittinger <cg@exept.de>
parents: 4341
diff changeset
  3836
	{
3246
c75a006f9a7a Win32 sockets use handles instead of file pointers
Stefan Vogel <sv@exept.de>
parents: 3224
diff changeset
  3837
#  if 0 && (defined( __BORLANDC__ ) || defined( __MINGW__ ))
4414
42edc97b2323 bcopy -> memcpy
Claus Gittinger <cg@exept.de>
parents: 4341
diff changeset
  3838
	    /*
42edc97b2323 bcopy -> memcpy
Claus Gittinger <cg@exept.de>
parents: 4341
diff changeset
  3839
	     * make it a FILE *
42edc97b2323 bcopy -> memcpy
Claus Gittinger <cg@exept.de>
parents: 4341
diff changeset
  3840
	     */
42edc97b2323 bcopy -> memcpy
Claus Gittinger <cg@exept.de>
parents: 4341
diff changeset
  3841
	    __stxWrapApiEnterCritical();
42edc97b2323 bcopy -> memcpy
Claus Gittinger <cg@exept.de>
parents: 4341
diff changeset
  3842
	    _fd = _open_osfhandle((long)sock, 0);
42edc97b2323 bcopy -> memcpy
Claus Gittinger <cg@exept.de>
parents: 4341
diff changeset
  3843
	    __stxWrapApiLeaveCritical();
2773
ab3049f4a351 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2748
diff changeset
  3844
#  else
4414
42edc97b2323 bcopy -> memcpy
Claus Gittinger <cg@exept.de>
parents: 4341
diff changeset
  3845
	    _fd = (int)sock;
2773
ab3049f4a351 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2748
diff changeset
  3846
#  endif
4414
42edc97b2323 bcopy -> memcpy
Claus Gittinger <cg@exept.de>
parents: 4341
diff changeset
  3847
	    DBGPRINTF(("SOCKET: sock=%d fd=%d\n", sock, _fd));
42edc97b2323 bcopy -> memcpy
Claus Gittinger <cg@exept.de>
parents: 4341
diff changeset
  3848
	}
3843
fbced69597a7 oops - error check was disabled
Claus Gittinger <cg@exept.de>
parents: 3742
diff changeset
  3849
# else  // !__win32__
4414
42edc97b2323 bcopy -> memcpy
Claus Gittinger <cg@exept.de>
parents: 4341
diff changeset
  3850
	fp = fdopen(sock, "r+");
42edc97b2323 bcopy -> memcpy
Claus Gittinger <cg@exept.de>
parents: 4341
diff changeset
  3851
	if (! fp) {
42edc97b2323 bcopy -> memcpy
Claus Gittinger <cg@exept.de>
parents: 4341
diff changeset
  3852
	    DBGPRINTF(("SOCKET: fdopen call failed\n"));
42edc97b2323 bcopy -> memcpy
Claus Gittinger <cg@exept.de>
parents: 4341
diff changeset
  3853
	    error = __MKSMALLINT(errno);
42edc97b2323 bcopy -> memcpy
Claus Gittinger <cg@exept.de>
parents: 4341
diff changeset
  3854
	    __BEGIN_INTERRUPTABLE__
42edc97b2323 bcopy -> memcpy
Claus Gittinger <cg@exept.de>
parents: 4341
diff changeset
  3855
	    closesocket(sock);
42edc97b2323 bcopy -> memcpy
Claus Gittinger <cg@exept.de>
parents: 4341
diff changeset
  3856
	    DBGFPRINTF((stderr, "SOCKET: fdopen failed (%d)\n", sock));
42edc97b2323 bcopy -> memcpy
Claus Gittinger <cg@exept.de>
parents: 4341
diff changeset
  3857
	    __END_INTERRUPTABLE__
42edc97b2323 bcopy -> memcpy
Claus Gittinger <cg@exept.de>
parents: 4341
diff changeset
  3858
	    goto out;
42edc97b2323 bcopy -> memcpy
Claus Gittinger <cg@exept.de>
parents: 4341
diff changeset
  3859
	}
3843
fbced69597a7 oops - error check was disabled
Claus Gittinger <cg@exept.de>
parents: 3742
diff changeset
  3860
# endif // !__win32__
3246
c75a006f9a7a Win32 sockets use handles instead of file pointers
Stefan Vogel <sv@exept.de>
parents: 3224
diff changeset
  3861
4414
42edc97b2323 bcopy -> memcpy
Claus Gittinger <cg@exept.de>
parents: 4341
diff changeset
  3862
	if (@global(FileOpenTrace) == true) {
3843
fbced69597a7 oops - error check was disabled
Claus Gittinger <cg@exept.de>
parents: 3742
diff changeset
  3863
# ifdef __win32__
4414
42edc97b2323 bcopy -> memcpy
Claus Gittinger <cg@exept.de>
parents: 4341
diff changeset
  3864
	    console_fprintf(stderr, "fdopen [Socket create] -> fd: %d (H: %"_lx_")\n", (INT)_fd, (INT)sock);
3223
b126729a904b class: Socket
Stefan Vogel <sv@exept.de>
parents: 3218
diff changeset
  3865
# else
4414
42edc97b2323 bcopy -> memcpy
Claus Gittinger <cg@exept.de>
parents: 4341
diff changeset
  3866
	    console_fprintf(stderr, "fdopen [Socket] -> %"_lx_" (fd: %d)\n", (INT)fp, sock);
3223
b126729a904b class: Socket
Stefan Vogel <sv@exept.de>
parents: 3218
diff changeset
  3867
# endif
4414
42edc97b2323 bcopy -> memcpy
Claus Gittinger <cg@exept.de>
parents: 4341
diff changeset
  3868
	}
3246
c75a006f9a7a Win32 sockets use handles instead of file pointers
Stefan Vogel <sv@exept.de>
parents: 3224
diff changeset
  3869
3843
fbced69597a7 oops - error check was disabled
Claus Gittinger <cg@exept.de>
parents: 3742
diff changeset
  3870
# ifdef __win32__
4414
42edc97b2323 bcopy -> memcpy
Claus Gittinger <cg@exept.de>
parents: 4341
diff changeset
  3871
	__externalAddressVal(newHandle) = _fd;
42edc97b2323 bcopy -> memcpy
Claus Gittinger <cg@exept.de>
parents: 4341
diff changeset
  3872
	__INST(handleType) = @symbol(socketHandle);
3246
c75a006f9a7a Win32 sockets use handles instead of file pointers
Stefan Vogel <sv@exept.de>
parents: 3224
diff changeset
  3873
# else
4414
42edc97b2323 bcopy -> memcpy
Claus Gittinger <cg@exept.de>
parents: 4341
diff changeset
  3874
	__externalAddressVal(newHandle) = fp;
42edc97b2323 bcopy -> memcpy
Claus Gittinger <cg@exept.de>
parents: 4341
diff changeset
  3875
	__INST(handleType) = @symbol(socketFilePointer);
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3876
# endif
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3877
    }
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3878
#endif
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3879
out:;
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3880
%}.
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3881
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3882
    "all ok?"
3246
c75a006f9a7a Win32 sockets use handles instead of file pointers
Stefan Vogel <sv@exept.de>
parents: 3224
diff changeset
  3883
    handleType notNil ifTrue:[
4414
42edc97b2323 bcopy -> memcpy
Claus Gittinger <cg@exept.de>
parents: 4341
diff changeset
  3884
	handle := newHandle.
42edc97b2323 bcopy -> memcpy
Claus Gittinger <cg@exept.de>
parents: 4341
diff changeset
  3885
	domain := domainArg.
42edc97b2323 bcopy -> memcpy
Claus Gittinger <cg@exept.de>
parents: 4341
diff changeset
  3886
	socketType := typeArg.
42edc97b2323 bcopy -> memcpy
Claus Gittinger <cg@exept.de>
parents: 4341
diff changeset
  3887
	self registerForFinalization.
42edc97b2323 bcopy -> memcpy
Claus Gittinger <cg@exept.de>
parents: 4341
diff changeset
  3888
	^ self.
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3889
    ].
3217
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  3890
    error isInteger ifTrue:[
4414
42edc97b2323 bcopy -> memcpy
Claus Gittinger <cg@exept.de>
parents: 4341
diff changeset
  3891
	lastErrorNumber := error.
42edc97b2323 bcopy -> memcpy
Claus Gittinger <cg@exept.de>
parents: 4341
diff changeset
  3892
	^ self openError:error.
3217
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  3893
    ].
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  3894
    ^ self primitiveFailed:error.
126
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
  3895
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
  3896
    "
3059
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  3897
     Socket new domain:#AF_INET type:#stream
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  3898
     Socket new domain:#AF_UNIX type:#stream
126
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
  3899
    "
28
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  3900
! !
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  3901
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  3902
!Socket methodsFor:'specials'!
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  3903
3467
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
  3904
linger:anIntegerOrNil
3224
bad706c50347 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3223
diff changeset
  3905
    "set the linger behavior on close:
bad706c50347 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3223
diff changeset
  3906
      anIntegerOrNil == nil: close returns immediately, socket tries
4414
42edc97b2323 bcopy -> memcpy
Claus Gittinger <cg@exept.de>
parents: 4341
diff changeset
  3907
			     to send buffered data in background.
3224
bad706c50347 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3223
diff changeset
  3908
      anIntegerOrNil == 0:   close returns immediately, bufferd data is discarded.
bad706c50347 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3223
diff changeset
  3909
      anIntegerOrNil > 0:    close waits this many seconds for buffered data
4414
42edc97b2323 bcopy -> memcpy
Claus Gittinger <cg@exept.de>
parents: 4341
diff changeset
  3910
			     to be delivered, after this time buffered data is
42edc97b2323 bcopy -> memcpy
Claus Gittinger <cg@exept.de>
parents: 4341
diff changeset
  3911
			     discarded and close returns with an error"
3467
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
  3912
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
  3913
    ^ self
4414
42edc97b2323 bcopy -> memcpy
Claus Gittinger <cg@exept.de>
parents: 4341
diff changeset
  3914
	setSocketOption:#'SO_LINGER'
42edc97b2323 bcopy -> memcpy
Claus Gittinger <cg@exept.de>
parents: 4341
diff changeset
  3915
	argument:anIntegerOrNil notNil
42edc97b2323 bcopy -> memcpy
Claus Gittinger <cg@exept.de>
parents: 4341
diff changeset
  3916
	argument:anIntegerOrNil.
3224
bad706c50347 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3223
diff changeset
  3917
!
bad706c50347 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3223
diff changeset
  3918
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3919
receiveBufferSize
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3920
    "get the send buffer size - for special applications only.
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3921
     Not all operatingSystems offer this functionality
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3922
     (returns nil, if unsupported)"
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3923
2321
6f4cc7b644db filePointer -> handle migration
Claus Gittinger <cg@exept.de>
parents: 2308
diff changeset
  3924
    handle isNil ifTrue:[
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3925
	^ self errorNotOpen
1335
0fafb78d7a80 sockopt utilities added
Claus Gittinger <cg@exept.de>
parents: 1316
diff changeset
  3926
    ].
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3927
%{
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3928
#if defined(SO_RCVBUF) && defined(SOL_SOCKET)
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
	OBJ fp = __INST(handle);
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3931
	SOCKET sock;
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3932
	int opt;
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3933
	unsigned int size;
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3934
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3935
	sock = SOCKET_FROM_FILE_OBJECT(fp);
1568
3bca500e0c7a send and receiveTimeout fixed
Claus Gittinger <cg@exept.de>
parents: 1561
diff changeset
  3936
	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
  3937
	    RETURN( __MKSMALLINT(opt) );
3bca500e0c7a send and receiveTimeout fixed
Claus Gittinger <cg@exept.de>
parents: 1561
diff changeset
  3938
	}
1335
0fafb78d7a80 sockopt utilities added
Claus Gittinger <cg@exept.de>
parents: 1316
diff changeset
  3939
    }
0fafb78d7a80 sockopt utilities added
Claus Gittinger <cg@exept.de>
parents: 1316
diff changeset
  3940
#endif
0fafb78d7a80 sockopt utilities added
Claus Gittinger <cg@exept.de>
parents: 1316
diff changeset
  3941
%}.
0fafb78d7a80 sockopt utilities added
Claus Gittinger <cg@exept.de>
parents: 1316
diff changeset
  3942
    ^ nil
0fafb78d7a80 sockopt utilities added
Claus Gittinger <cg@exept.de>
parents: 1316
diff changeset
  3943
!
0fafb78d7a80 sockopt utilities added
Claus Gittinger <cg@exept.de>
parents: 1316
diff changeset
  3944
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3945
receiveBufferSize:size
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3946
    "set the receive buffer size - for special applications only.
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3947
     Not all operatingSystems offer this functionality
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3948
     (returns false, if unsupported)"
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3949
2321
6f4cc7b644db filePointer -> handle migration
Claus Gittinger <cg@exept.de>
parents: 2308
diff changeset
  3950
    handle isNil ifTrue:[
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3951
	^ self errorNotOpen
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3952
    ].
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3953
%{
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3954
#if defined(SO_RCVBUF) && defined(SOL_SOCKET)
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3955
    if (__isSmallInteger(size)) {
2321
6f4cc7b644db filePointer -> handle migration
Claus Gittinger <cg@exept.de>
parents: 2308
diff changeset
  3956
	OBJ fp = __INST(handle);
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3957
	SOCKET sock;
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3958
	int opt;
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3959
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3960
	sock = SOCKET_FROM_FILE_OBJECT(fp);
1343
cc3bed115c0a definitions cleanup with stxOSDefs.h
penk
parents: 1342
diff changeset
  3961
	opt = __intVal(size);
1529
911273d090c1 Re-unified Win32 and Unix code into single Socket.st.
Claus Gittinger <cg@exept.de>
parents: 1505
diff changeset
  3962
	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
  3963
	    RETURN(true);
911273d090c1 Re-unified Win32 and Unix code into single Socket.st.
Claus Gittinger <cg@exept.de>
parents: 1505
diff changeset
  3964
	}
1335
0fafb78d7a80 sockopt utilities added
Claus Gittinger <cg@exept.de>
parents: 1316
diff changeset
  3965
    }
0fafb78d7a80 sockopt utilities added
Claus Gittinger <cg@exept.de>
parents: 1316
diff changeset
  3966
#endif
0fafb78d7a80 sockopt utilities added
Claus Gittinger <cg@exept.de>
parents: 1316
diff changeset
  3967
%}.
0fafb78d7a80 sockopt utilities added
Claus Gittinger <cg@exept.de>
parents: 1316
diff changeset
  3968
    ^ false
0fafb78d7a80 sockopt utilities added
Claus Gittinger <cg@exept.de>
parents: 1316
diff changeset
  3969
!
0fafb78d7a80 sockopt utilities added
Claus Gittinger <cg@exept.de>
parents: 1316
diff changeset
  3970
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3971
receiveTimeout
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3972
    "get the receive timeout in millis - for special applications only.
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3973
     Not all operatingSystems offer this functionality
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3974
     (returns nil, if unsupported)"
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3975
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3976
    |millis|
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3977
2321
6f4cc7b644db filePointer -> handle migration
Claus Gittinger <cg@exept.de>
parents: 2308
diff changeset
  3978
    handle isNil ifTrue:[
4570
39e965ca8d06 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4568
diff changeset
  3979
        ^ self errorNotOpen
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3980
    ].
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3981
%{
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3982
#if defined(SO_RCVTIMEO) && defined(SOL_SOCKET)
3246
c75a006f9a7a Win32 sockets use handles instead of file pointers
Stefan Vogel <sv@exept.de>
parents: 3224
diff changeset
  3983
    OBJ fp = __INST(handle);
c75a006f9a7a Win32 sockets use handles instead of file pointers
Stefan Vogel <sv@exept.de>
parents: 3224
diff changeset
  3984
    SOCKET sock = SOCKET_FROM_FILE_OBJECT(fp);
c75a006f9a7a Win32 sockets use handles instead of file pointers
Stefan Vogel <sv@exept.de>
parents: 3224
diff changeset
  3985
    int len;
c75a006f9a7a Win32 sockets use handles instead of file pointers
Stefan Vogel <sv@exept.de>
parents: 3224
diff changeset
  3986
    int __millis;
c75a006f9a7a Win32 sockets use handles instead of file pointers
Stefan Vogel <sv@exept.de>
parents: 3224
diff changeset
  3987
    struct timeval tv = {0, 0};
c75a006f9a7a Win32 sockets use handles instead of file pointers
Stefan Vogel <sv@exept.de>
parents: 3224
diff changeset
  3988
c75a006f9a7a Win32 sockets use handles instead of file pointers
Stefan Vogel <sv@exept.de>
parents: 3224
diff changeset
  3989
    len = sizeof(struct timeval);
c75a006f9a7a Win32 sockets use handles instead of file pointers
Stefan Vogel <sv@exept.de>
parents: 3224
diff changeset
  3990
    if (getsockopt(sock, SOL_SOCKET, SO_RCVTIMEO, (void *)&tv, &len) == 0) {
4570
39e965ca8d06 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4568
diff changeset
  3991
        __millis = (tv.tv_sec * 1000) + (tv.tv_usec / 1000);
39e965ca8d06 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4568
diff changeset
  3992
        millis = __mkSmallInteger(__millis);
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3993
# if 0
4570
39e965ca8d06 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4568
diff changeset
  3994
        console_fprintf(stderr, "getsockopt -> s:%d us:%d -> millis:%d\n", tv.tv_sec, tv.tv_usec, __millis);
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3995
# endif
3246
c75a006f9a7a Win32 sockets use handles instead of file pointers
Stefan Vogel <sv@exept.de>
parents: 3224
diff changeset
  3996
    } else {
4570
39e965ca8d06 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4568
diff changeset
  3997
        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
  3998
    }
3bca500e0c7a send and receiveTimeout fixed
Claus Gittinger <cg@exept.de>
parents: 1561
diff changeset
  3999
#endif
3bca500e0c7a send and receiveTimeout fixed
Claus Gittinger <cg@exept.de>
parents: 1561
diff changeset
  4000
%}.
4570
39e965ca8d06 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4568
diff changeset
  4001
    ^ millis
39e965ca8d06 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4568
diff changeset
  4002
39e965ca8d06 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4568
diff changeset
  4003
    "
39e965ca8d06 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4568
diff changeset
  4004
        Socket newTCP receiveTimeout
39e965ca8d06 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4568
diff changeset
  4005
    "
39e965ca8d06 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4568
diff changeset
  4006
39e965ca8d06 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4568
diff changeset
  4007
    "Modified: / 19-01-2018 / 19:15:17 / stefan"
1568
3bca500e0c7a send and receiveTimeout fixed
Claus Gittinger <cg@exept.de>
parents: 1561
diff changeset
  4008
!
3bca500e0c7a send and receiveTimeout fixed
Claus Gittinger <cg@exept.de>
parents: 1561
diff changeset
  4009
4570
39e965ca8d06 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4568
diff changeset
  4010
receiveTimeout:secondsOrTimeDuration
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  4011
    "set the receive timeout - for special applications only.
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  4012
     Not all operatingSystems offer this functionality
4570
39e965ca8d06 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4568
diff changeset
  4013
     (returns false, if unsupported).
39e965ca8d06 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4568
diff changeset
  4014
39e965ca8d06 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4568
diff changeset
  4015
     From linux manpage:
39e965ca8d06 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4568
diff changeset
  4016
          SO_RCVTIMEO and SO_SNDTIMEO
39e965ca8d06 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4568
diff changeset
  4017
              Specify  the  receiving  or  sending  timeouts  until reporting an error.  The argument is a
39e965ca8d06 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4568
diff changeset
  4018
              struct timeval.  If an input or output function blocks for this period of time, and data has
39e965ca8d06 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4568
diff changeset
  4019
              been  sent  or received, the return value of that function will be the amount of data trans-
39e965ca8d06 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4568
diff changeset
  4020
              ferred; if no data has been transferred and  the  timeout  has  been  reached,  then  -1  is
39e965ca8d06 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4568
diff changeset
  4021
              returned with errno set to EAGAIN or EWOULDBLOCK, or EINPROGRESS (for connect(2)) just as if
39e965ca8d06 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4568
diff changeset
  4022
              the socket was specified to be nonblocking.  If the timeout is set to  zero  (the  default),
39e965ca8d06 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4568
diff changeset
  4023
              then the operation will never timeout.  Timeouts only have effect for system calls that per-
39e965ca8d06 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4568
diff changeset
  4024
              form socket I/O (e.g., read(2), recvmsg(2), send(2), sendmsg(2)); timeouts  have  no  effect
39e965ca8d06 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4568
diff changeset
  4025
              for select(2), poll(2), epoll_wait(2), and so on."
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  4026
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  4027
    |millis|
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  4028
2321
6f4cc7b644db filePointer -> handle migration
Claus Gittinger <cg@exept.de>
parents: 2308
diff changeset
  4029
    handle isNil ifTrue:[
4570
39e965ca8d06 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4568
diff changeset
  4030
        ^ self errorNotOpen
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  4031
    ].
4570
39e965ca8d06 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4568
diff changeset
  4032
    secondsOrTimeDuration isTimeDuration ifTrue:[
39e965ca8d06 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4568
diff changeset
  4033
        millis := secondsOrTimeDuration getMilliseconds.
39e965ca8d06 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4568
diff changeset
  4034
    ] ifFalse:[
39e965ca8d06 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4568
diff changeset
  4035
        millis := (secondsOrTimeDuration * 1000) rounded.
39e965ca8d06 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4568
diff changeset
  4036
    ].
39e965ca8d06 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4568
diff changeset
  4037
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  4038
%{
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  4039
#if defined(SO_RCVTIMEO) && defined(SOL_SOCKET)
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  4040
    if (__isSmallInteger(millis)) {
4570
39e965ca8d06 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4568
diff changeset
  4041
        OBJ fp = __INST(handle);
39e965ca8d06 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4568
diff changeset
  4042
        SOCKET sock = SOCKET_FROM_FILE_OBJECT(fp);
39e965ca8d06 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4568
diff changeset
  4043
        int __millis = __intVal(millis);
39e965ca8d06 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4568
diff changeset
  4044
        struct timeval tv = {0, 0};
39e965ca8d06 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4568
diff changeset
  4045
39e965ca8d06 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4568
diff changeset
  4046
        tv.tv_sec = __millis / 1000;
39e965ca8d06 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4568
diff changeset
  4047
        tv.tv_usec = (__millis % 1000) * 1000;
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  4048
# if 0
4570
39e965ca8d06 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4568
diff changeset
  4049
        console_fprintf(stderr, "setsockopt -> millis:%d -> s:%d us:%d \n", __millis, tv.tv_sec, tv.tv_usec);
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  4050
# endif
4570
39e965ca8d06 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4568
diff changeset
  4051
        if (setsockopt(sock, SOL_SOCKET, SO_RCVTIMEO, (void *)&tv, sizeof(struct timeval)) == 0) {
39e965ca8d06 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4568
diff changeset
  4052
            RETURN(true);
39e965ca8d06 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4568
diff changeset
  4053
        }
39e965ca8d06 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4568
diff changeset
  4054
        console_fprintf(stderr, "Socket [warning]: setsockopt %d failed; errno=%d\n", sock, errno);
28
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  4055
    }
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  4056
#endif
71
claus
parents: 63
diff changeset
  4057
%}.
28
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  4058
    ^ false
4570
39e965ca8d06 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4568
diff changeset
  4059
39e965ca8d06 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4568
diff changeset
  4060
    "
39e965ca8d06 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4568
diff changeset
  4061
        Socket newTCP 
39e965ca8d06 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4568
diff changeset
  4062
            receiveTimeout:5s;
39e965ca8d06 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4568
diff changeset
  4063
            receiveTimeout
39e965ca8d06 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4568
diff changeset
  4064
    "
39e965ca8d06 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4568
diff changeset
  4065
39e965ca8d06 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4568
diff changeset
  4066
    "Modified (comment): / 19-01-2018 / 19:14:49 / stefan"
81
claus
parents: 79
diff changeset
  4067
!
claus
parents: 79
diff changeset
  4068
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  4069
sendBufferSize
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  4070
    "get the send buffer size - for special applications only.
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  4071
     Not all operatingSystems offer this functionality
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  4072
     (returns nil, if unsupported)"
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  4073
2321
6f4cc7b644db filePointer -> handle migration
Claus Gittinger <cg@exept.de>
parents: 2308
diff changeset
  4074
    handle isNil ifTrue:[
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  4075
	^ self errorNotOpen
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  4076
    ].
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  4077
%{
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  4078
#if defined(SO_SNDBUF) && defined(SOL_SOCKET)
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  4079
    {
2321
6f4cc7b644db filePointer -> handle migration
Claus Gittinger <cg@exept.de>
parents: 2308
diff changeset
  4080
	OBJ fp = __INST(handle);
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  4081
	SOCKET sock;
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  4082
	int opt;
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  4083
	unsigned int size;
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  4084
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  4085
	sock = SOCKET_FROM_FILE_OBJECT(fp);
1568
3bca500e0c7a send and receiveTimeout fixed
Claus Gittinger <cg@exept.de>
parents: 1561
diff changeset
  4086
	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
  4087
	    RETURN( __MKSMALLINT(opt) );
3bca500e0c7a send and receiveTimeout fixed
Claus Gittinger <cg@exept.de>
parents: 1561
diff changeset
  4088
	}
1335
0fafb78d7a80 sockopt utilities added
Claus Gittinger <cg@exept.de>
parents: 1316
diff changeset
  4089
    }
0fafb78d7a80 sockopt utilities added
Claus Gittinger <cg@exept.de>
parents: 1316
diff changeset
  4090
#endif
0fafb78d7a80 sockopt utilities added
Claus Gittinger <cg@exept.de>
parents: 1316
diff changeset
  4091
%}.
0fafb78d7a80 sockopt utilities added
Claus Gittinger <cg@exept.de>
parents: 1316
diff changeset
  4092
    ^ nil
0fafb78d7a80 sockopt utilities added
Claus Gittinger <cg@exept.de>
parents: 1316
diff changeset
  4093
!
0fafb78d7a80 sockopt utilities added
Claus Gittinger <cg@exept.de>
parents: 1316
diff changeset
  4094
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  4095
sendBufferSize:size
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  4096
    "set the send buffer size - for special applications only.
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  4097
     Not all operatingSystems offer this functionality
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  4098
     (returns false, if unsupported)"
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  4099
2321
6f4cc7b644db filePointer -> handle migration
Claus Gittinger <cg@exept.de>
parents: 2308
diff changeset
  4100
    handle isNil ifTrue:[
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  4101
	^ self errorNotOpen
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  4102
    ].
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  4103
%{
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  4104
#if defined(SO_SNDBUF) && defined(SOL_SOCKET)
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  4105
    if (__isSmallInteger(size)) {
2321
6f4cc7b644db filePointer -> handle migration
Claus Gittinger <cg@exept.de>
parents: 2308
diff changeset
  4106
	OBJ fp = __INST(handle);
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  4107
	SOCKET sock;
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  4108
	int opt;
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  4109
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  4110
	sock = SOCKET_FROM_FILE_OBJECT(fp);
1343
cc3bed115c0a definitions cleanup with stxOSDefs.h
penk
parents: 1342
diff changeset
  4111
	opt = __intVal(size);
1529
911273d090c1 Re-unified Win32 and Unix code into single Socket.st.
Claus Gittinger <cg@exept.de>
parents: 1505
diff changeset
  4112
	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
  4113
	    RETURN(true);
911273d090c1 Re-unified Win32 and Unix code into single Socket.st.
Claus Gittinger <cg@exept.de>
parents: 1505
diff changeset
  4114
	}
1335
0fafb78d7a80 sockopt utilities added
Claus Gittinger <cg@exept.de>
parents: 1316
diff changeset
  4115
    }
0fafb78d7a80 sockopt utilities added
Claus Gittinger <cg@exept.de>
parents: 1316
diff changeset
  4116
#endif
0fafb78d7a80 sockopt utilities added
Claus Gittinger <cg@exept.de>
parents: 1316
diff changeset
  4117
%}.
0fafb78d7a80 sockopt utilities added
Claus Gittinger <cg@exept.de>
parents: 1316
diff changeset
  4118
    ^ false
0fafb78d7a80 sockopt utilities added
Claus Gittinger <cg@exept.de>
parents: 1316
diff changeset
  4119
!
0fafb78d7a80 sockopt utilities added
Claus Gittinger <cg@exept.de>
parents: 1316
diff changeset
  4120
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  4121
sendTimeout
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  4122
    "get the send timeout in millis - for special applications only.
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  4123
     Not all operatingSystems offer this functionality
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  4124
     (returns nil, if unsupported)"
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  4125
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  4126
    |millis|
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  4127
2321
6f4cc7b644db filePointer -> handle migration
Claus Gittinger <cg@exept.de>
parents: 2308
diff changeset
  4128
    handle isNil ifTrue:[
4570
39e965ca8d06 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4568
diff changeset
  4129
        ^ self errorNotOpen
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  4130
    ].
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  4131
%{
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  4132
#if defined(SO_SNDTIMEO) && defined(SOL_SOCKET)
3246
c75a006f9a7a Win32 sockets use handles instead of file pointers
Stefan Vogel <sv@exept.de>
parents: 3224
diff changeset
  4133
    OBJ fp = __INST(handle);
c75a006f9a7a Win32 sockets use handles instead of file pointers
Stefan Vogel <sv@exept.de>
parents: 3224
diff changeset
  4134
    SOCKET sock = SOCKET_FROM_FILE_OBJECT(fp);
c75a006f9a7a Win32 sockets use handles instead of file pointers
Stefan Vogel <sv@exept.de>
parents: 3224
diff changeset
  4135
    int len;
c75a006f9a7a Win32 sockets use handles instead of file pointers
Stefan Vogel <sv@exept.de>
parents: 3224
diff changeset
  4136
    int __millis;
c75a006f9a7a Win32 sockets use handles instead of file pointers
Stefan Vogel <sv@exept.de>
parents: 3224
diff changeset
  4137
    struct timeval tv = {0, 0};
c75a006f9a7a Win32 sockets use handles instead of file pointers
Stefan Vogel <sv@exept.de>
parents: 3224
diff changeset
  4138
c75a006f9a7a Win32 sockets use handles instead of file pointers
Stefan Vogel <sv@exept.de>
parents: 3224
diff changeset
  4139
    len = sizeof(struct timeval);
c75a006f9a7a Win32 sockets use handles instead of file pointers
Stefan Vogel <sv@exept.de>
parents: 3224
diff changeset
  4140
    if (getsockopt(sock, SOL_SOCKET, SO_SNDTIMEO, (void *)&tv, &len) == 0) {
4570
39e965ca8d06 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4568
diff changeset
  4141
        __millis = (tv.tv_sec * 1000) + (tv.tv_usec / 1000);
39e965ca8d06 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4568
diff changeset
  4142
        millis = __mkSmallInteger(__millis);
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  4143
# if 0
4570
39e965ca8d06 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4568
diff changeset
  4144
        console_fprintf(stderr, "getsockopt -> s:%d us:%d -> millis:%d\n", tv.tv_sec, tv.tv_usec, __millis);
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  4145
# endif
3246
c75a006f9a7a Win32 sockets use handles instead of file pointers
Stefan Vogel <sv@exept.de>
parents: 3224
diff changeset
  4146
    } else {
4570
39e965ca8d06 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4568
diff changeset
  4147
        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
  4148
    }
3bca500e0c7a send and receiveTimeout fixed
Claus Gittinger <cg@exept.de>
parents: 1561
diff changeset
  4149
#endif
3bca500e0c7a send and receiveTimeout fixed
Claus Gittinger <cg@exept.de>
parents: 1561
diff changeset
  4150
%}.
4570
39e965ca8d06 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4568
diff changeset
  4151
    ^ millis
39e965ca8d06 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4568
diff changeset
  4152
39e965ca8d06 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4568
diff changeset
  4153
    "
39e965ca8d06 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4568
diff changeset
  4154
        Socket newTCP sendTimeout
39e965ca8d06 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4568
diff changeset
  4155
    "
39e965ca8d06 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4568
diff changeset
  4156
39e965ca8d06 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4568
diff changeset
  4157
    "Modified (comment): / 19-01-2018 / 19:16:23 / stefan"
1568
3bca500e0c7a send and receiveTimeout fixed
Claus Gittinger <cg@exept.de>
parents: 1561
diff changeset
  4158
!
3bca500e0c7a send and receiveTimeout fixed
Claus Gittinger <cg@exept.de>
parents: 1561
diff changeset
  4159
4570
39e965ca8d06 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4568
diff changeset
  4160
sendTimeout:secondsOrTimeDuration
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  4161
    "set the send timeout - for special applications only.
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  4162
     Not all operatingSystems offer this functionality
4570
39e965ca8d06 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4568
diff changeset
  4163
     (returns false, if unsupported).
39e965ca8d06 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4568
diff changeset
  4164
     From linux manpage:
39e965ca8d06 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4568
diff changeset
  4165
          SO_RCVTIMEO and SO_SNDTIMEO
39e965ca8d06 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4568
diff changeset
  4166
              Specify  the  receiving  or  sending  timeouts  until reporting an error.  The argument is a
39e965ca8d06 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4568
diff changeset
  4167
              struct timeval.  If an input or output function blocks for this period of time, and data has
39e965ca8d06 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4568
diff changeset
  4168
              been  sent  or received, the return value of that function will be the amount of data trans-
39e965ca8d06 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4568
diff changeset
  4169
              ferred; if no data has been transferred and  the  timeout  has  been  reached,  then  -1  is
39e965ca8d06 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4568
diff changeset
  4170
              returned with errno set to EAGAIN or EWOULDBLOCK, or EINPROGRESS (for connect(2)) just as if
39e965ca8d06 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4568
diff changeset
  4171
              the socket was specified to be nonblocking.  If the timeout is set to  zero  (the  default),
39e965ca8d06 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4568
diff changeset
  4172
              then the operation will never timeout.  Timeouts only have effect for system calls that per-
39e965ca8d06 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4568
diff changeset
  4173
              form socket I/O (e.g., read(2), recvmsg(2), send(2), sendmsg(2)); timeouts  have  no  effect
39e965ca8d06 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4568
diff changeset
  4174
              for select(2), poll(2), epoll_wait(2), and so on."
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  4175
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  4176
    |millis|
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  4177
2321
6f4cc7b644db filePointer -> handle migration
Claus Gittinger <cg@exept.de>
parents: 2308
diff changeset
  4178
    handle isNil ifTrue:[
4570
39e965ca8d06 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4568
diff changeset
  4179
        ^ self errorNotOpen
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  4180
    ].
4570
39e965ca8d06 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4568
diff changeset
  4181
    secondsOrTimeDuration isTimeDuration ifTrue:[
39e965ca8d06 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4568
diff changeset
  4182
        millis := secondsOrTimeDuration getMilliseconds.
39e965ca8d06 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4568
diff changeset
  4183
    ] ifFalse:[
39e965ca8d06 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4568
diff changeset
  4184
        millis := (secondsOrTimeDuration * 1000) rounded.
39e965ca8d06 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4568
diff changeset
  4185
    ].
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  4186
%{
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  4187
#if defined(SO_SNDTIMEO) && defined(SOL_SOCKET)
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  4188
    if (__isSmallInteger(millis)) {
4570
39e965ca8d06 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4568
diff changeset
  4189
        OBJ fp = __INST(handle);
39e965ca8d06 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4568
diff changeset
  4190
        SOCKET sock = SOCKET_FROM_FILE_OBJECT(fp);
39e965ca8d06 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4568
diff changeset
  4191
        int __millis = __intVal(millis);
39e965ca8d06 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4568
diff changeset
  4192
        struct timeval tv = {0, 0};
39e965ca8d06 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4568
diff changeset
  4193
39e965ca8d06 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4568
diff changeset
  4194
        tv.tv_sec = __millis / 1000;
39e965ca8d06 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4568
diff changeset
  4195
        tv.tv_usec = (__millis % 1000) * 1000;
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  4196
# if 0
4570
39e965ca8d06 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4568
diff changeset
  4197
        console_fprintf(stderr, "setsockopt -> millis:%d -> s:%d us:%d \n", __millis, tv.tv_sec, tv.tv_usec);
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  4198
# endif
4570
39e965ca8d06 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4568
diff changeset
  4199
        if (setsockopt(sock, SOL_SOCKET, SO_SNDTIMEO, (void *)&tv, sizeof(struct timeval)) == 0) {
39e965ca8d06 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4568
diff changeset
  4200
            RETURN(true);
39e965ca8d06 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4568
diff changeset
  4201
        }
39e965ca8d06 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4568
diff changeset
  4202
        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
  4203
    }
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
  4204
#endif
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
  4205
%}.
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
  4206
    ^ false
4570
39e965ca8d06 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4568
diff changeset
  4207
39e965ca8d06 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4568
diff changeset
  4208
    "
39e965ca8d06 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4568
diff changeset
  4209
        Socket newTCP 
39e965ca8d06 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4568
diff changeset
  4210
            sendTimeout:5s;
39e965ca8d06 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4568
diff changeset
  4211
            sendTimeout
39e965ca8d06 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4568
diff changeset
  4212
    "
39e965ca8d06 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4568
diff changeset
  4213
39e965ca8d06 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4568
diff changeset
  4214
    "Modified (comment): / 19-01-2018 / 19:12:51 / stefan"
1340
eb9b1f1340e5 setTCP_NODELAY
Claus Gittinger <cg@exept.de>
parents: 1339
diff changeset
  4215
!
eb9b1f1340e5 setTCP_NODELAY
Claus Gittinger <cg@exept.de>
parents: 1339
diff changeset
  4216
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  4217
setTCPCork:aBoolean
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  4218
    "enable/disable TCP_CORK (do-not-send-partial-frames)
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  4219
     For special applications only.
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  4220
     Not all OperatingSystems offer this functionality
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  4221
     (returns false, if unsupported)"
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  4222
2551
6da1bc89b74a changed:
Stefan Vogel <sv@exept.de>
parents: 2516
diff changeset
  4223
    ^ self setSocketOption:#'TCP_CORK' argument:aBoolean argument:nil.
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  4224
!
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  4225
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  4226
setTCPNoDelay:aBoolean
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  4227
    "enable/disable TCP_NODELAY (i.e. disable/enable the Nagle algorithm)
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  4228
     For special applications only.
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  4229
     Not all OperatingSystems offer this functionality
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  4230
     (returns false, if unsupported)"
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  4231
2551
6da1bc89b74a changed:
Stefan Vogel <sv@exept.de>
parents: 2516
diff changeset
  4232
    ^ self setSocketOption:#'TCP_NODELAY' argument:aBoolean argument:nil.
126
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
  4233
! !
82
claus
parents: 81
diff changeset
  4234
4638
4d145bdadcf8 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 4636
diff changeset
  4235
!Socket methodsFor:'testing'!
4d145bdadcf8 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 4636
diff changeset
  4236
4d145bdadcf8 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 4636
diff changeset
  4237
isSocket
4d145bdadcf8 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 4636
diff changeset
  4238
    ^ true
4d145bdadcf8 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 4636
diff changeset
  4239
! !
4626
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  4240
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  4241
!Socket methodsFor:'waiting'!
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  4242
4570
39e965ca8d06 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4568
diff changeset
  4243
waitForNewConnectionOrDataOnAny:otherConnections timeout:secondsOrTimeDurationOrNil
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  4244
    "suspend the current process, until either a new connection comes
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  4245
     in at the receiver, or data arrives on any of the otherConnections.
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  4246
     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
  4247
     For an old connection, that socket is returned.
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  4248
     In any case, the caller gets a socket to operate on as return value,
4032
24df60dcd5f4 #OTHER by mawalch
mawalch
parents: 3989
diff changeset
  4249
     or nil, if a timeout occurred.
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  4250
     This method implements the inner wait-primitive of a multi-connection
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  4251
     server application."
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  4252
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  4253
4570
39e965ca8d06 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4568
diff changeset
  4254
    |wasBlocked sema  timeoutMs|
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  4255
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  4256
    "first, a quick check if data is already available"
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  4257
    self canReadWithoutBlocking ifTrue:[
4497
bf5e9d5ec532 #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 4414
diff changeset
  4258
        ^ self accept.
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  4259
    ].
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  4260
    otherConnections do:[:aConnection |
4497
bf5e9d5ec532 #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 4414
diff changeset
  4261
        aConnection canReadWithoutBlocking ifTrue:[
bf5e9d5ec532 #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 4414
diff changeset
  4262
            ^ aConnection
bf5e9d5ec532 #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 4414
diff changeset
  4263
        ]
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  4264
    ].
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  4265
3281
bd9392932db1 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3247
diff changeset
  4266
    "check again - prevent incoming interrupts from disturbing our setup"
4570
39e965ca8d06 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4568
diff changeset
  4267
39e965ca8d06 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4568
diff changeset
  4268
    secondsOrTimeDurationOrNil notNil ifTrue:[
39e965ca8d06 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4568
diff changeset
  4269
        secondsOrTimeDurationOrNil isTimeDuration ifTrue:[
39e965ca8d06 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4568
diff changeset
  4270
            timeoutMs := secondsOrTimeDurationOrNil getMilliseconds.
39e965ca8d06 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4568
diff changeset
  4271
        ] ifFalse:[
39e965ca8d06 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4568
diff changeset
  4272
            timeoutMs := secondsOrTimeDurationOrNil * 1000.
39e965ca8d06 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4568
diff changeset
  4273
        ]
39e965ca8d06 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4568
diff changeset
  4274
    ].
39e965ca8d06 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4568
diff changeset
  4275
3281
bd9392932db1 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3247
diff changeset
  4276
    wasBlocked := OperatingSystem blockInterrupts.
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  4277
    [
4497
bf5e9d5ec532 #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 4414
diff changeset
  4278
        sema := Semaphore name:'multiReadWait'.
bf5e9d5ec532 #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 4414
diff changeset
  4279
        otherConnections do:[:aConnection |
bf5e9d5ec532 #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 4414
diff changeset
  4280
            Processor signal:sema onInput:(aConnection fileDescriptor).
bf5e9d5ec532 #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 4414
diff changeset
  4281
        ].
bf5e9d5ec532 #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 4414
diff changeset
  4282
        Processor signal:sema onInput:(self fileDescriptor).
4570
39e965ca8d06 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4568
diff changeset
  4283
        timeoutMs notNil ifTrue:[
39e965ca8d06 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4568
diff changeset
  4284
            Processor signal:sema afterMilliseconds:timeoutMs
4497
bf5e9d5ec532 #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 4414
diff changeset
  4285
        ].
bf5e9d5ec532 #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 4414
diff changeset
  4286
        Processor activeProcess state:#ioWait.
bf5e9d5ec532 #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 4414
diff changeset
  4287
        sema wait.
3281
bd9392932db1 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3247
diff changeset
  4288
    ] ifCurtailed:[
4497
bf5e9d5ec532 #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 4414
diff changeset
  4289
        sema notNil ifTrue:[Processor disableSemaphore:sema].
bf5e9d5ec532 #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 4414
diff changeset
  4290
        wasBlocked ifFalse:[OperatingSystem unblockInterrupts].
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  4291
    ].
3281
bd9392932db1 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3247
diff changeset
  4292
    wasBlocked ifFalse:[OperatingSystem unblockInterrupts].
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  4293
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  4294
    "see who it was ..."
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  4295
    self canReadWithoutBlocking ifTrue:[
4497
bf5e9d5ec532 #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 4414
diff changeset
  4296
        ^ self accept.
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  4297
    ].
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  4298
    otherConnections do:[:aConnection |
4497
bf5e9d5ec532 #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 4414
diff changeset
  4299
        aConnection canReadWithoutBlocking ifTrue:[
bf5e9d5ec532 #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 4414
diff changeset
  4300
            ^ aConnection
bf5e9d5ec532 #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 4414
diff changeset
  4301
        ]
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  4302
    ].
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  4303
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  4304
    "none - a timeout"
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  4305
    ^ nil
4497
bf5e9d5ec532 #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 4414
diff changeset
  4306
bf5e9d5ec532 #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 4414
diff changeset
  4307
    "Modified: / 09-08-2017 / 11:59:50 / cg"
4570
39e965ca8d06 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4568
diff changeset
  4308
    "Modified: / 19-01-2018 / 18:59:17 / stefan"
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  4309
!
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  4310
4570
39e965ca8d06 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4568
diff changeset
  4311
waitForNewConnectionWithTimeout:secondsOrTimeDurationOrNil
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  4312
    "suspend the current process, until a new connection comes
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  4313
     in at the receiver or a timeout occurs.
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  4314
     For a new connection, an accept is performed and the new socket is returned.
4032
24df60dcd5f4 #OTHER by mawalch
mawalch
parents: 3989
diff changeset
  4315
     Returns nil, if a timeout occurred.
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  4316
     This method implements the inner wait-primitive of a single-connection
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  4317
     server application."
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  4318
3633
3a21f142432e #REFACTORING
Stefan Vogel <sv@exept.de>
parents: 3620
diff changeset
  4319
    |newSock|
3a21f142432e #REFACTORING
Stefan Vogel <sv@exept.de>
parents: 3620
diff changeset
  4320
4570
39e965ca8d06 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4568
diff changeset
  4321
    (self readWaitWithTimeout:secondsOrTimeDurationOrNil) ifTrue:[
4568
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  4322
        "a timeout occurred - no connection within timeout"
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  4323
        self reportError:(OperatingSystem errorNumberFor:#ETIMEDOUT).
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  4324
        ^ nil.
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  4325
    ].
4180
f2539f82b744 #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4172
diff changeset
  4326
    self isOpen ifFalse:[
4568
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  4327
        "I have been closed while waiting"
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  4328
        ^ self errorNotOpen.
4180
f2539f82b744 #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4172
diff changeset
  4329
    ].
4568
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  4330
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  4331
    "ok, a connection is present - accept it"
3633
3a21f142432e #REFACTORING
Stefan Vogel <sv@exept.de>
parents: 3620
diff changeset
  4332
    newSock := self class new.
3a21f142432e #REFACTORING
Stefan Vogel <sv@exept.de>
parents: 3620
diff changeset
  4333
    (newSock primAcceptOn:self blocking:false) ifFalse:[
4568
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  4334
        "should raise an error here - primitive code raises a notification"
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  4335
        ^ nil
3633
3a21f142432e #REFACTORING
Stefan Vogel <sv@exept.de>
parents: 3620
diff changeset
  4336
    ].
3a21f142432e #REFACTORING
Stefan Vogel <sv@exept.de>
parents: 3620
diff changeset
  4337
    ^ newSock
4568
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  4338
4570
39e965ca8d06 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4568
diff changeset
  4339
    "Modified (format): / 19-01-2018 / 18:53:15 / stefan"
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  4340
! !
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  4341
464
600b101a7035 alen in accept
Claus Gittinger <cg@exept.de>
parents: 463
diff changeset
  4342
!Socket class methodsFor:'documentation'!
206
77166a6b3ee6 For ST80 style socket creation: register socket in Lobby.
Stefan Vogel <sv@exept.de>
parents: 203
diff changeset
  4343
77166a6b3ee6 For ST80 style socket creation: register socket in Lobby.
Stefan Vogel <sv@exept.de>
parents: 203
diff changeset
  4344
version
3590
3487165a9cdf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3550
diff changeset
  4345
    ^ '$Header$'
2292
c4b0b901278e added: #standardTimeout
Claus Gittinger <cg@exept.de>
parents: 1940
diff changeset
  4346
!
c4b0b901278e added: #standardTimeout
Claus Gittinger <cg@exept.de>
parents: 1940
diff changeset
  4347
c4b0b901278e added: #standardTimeout
Claus Gittinger <cg@exept.de>
parents: 1940
diff changeset
  4348
version_CVS
3590
3487165a9cdf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3550
diff changeset
  4349
    ^ '$Header$'
206
77166a6b3ee6 For ST80 style socket creation: register socket in Lobby.
Stefan Vogel <sv@exept.de>
parents: 203
diff changeset
  4350
! !
4497
bf5e9d5ec532 #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 4414
diff changeset
  4351