Socket.st
author Stefan Vogel <sv@exept.de>
Wed, 08 Apr 2020 18:18:58 +0200
changeset 5472 b1822258a4be
parent 5467 914f6955a10a
child 5473 de911f462862
permissions -rw-r--r--
#REFACTORING by stefan class: Socket class definition changed: #receiveFrom:buffer:start:for:flags:
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
5452
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
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
5467
914f6955a10a #REFACTORING by Stefan Reise
sr
parents: 5466
diff changeset
    17
	instanceVariableNames:'domain socketType protocol port peer peerName listening'
914f6955a10a #REFACTORING by Stefan Reise
sr
parents: 5466
diff changeset
    18
	classVariableNames:''
914f6955a10a #REFACTORING by Stefan Reise
sr
parents: 5466
diff changeset
    19
	poolDictionaries:''
914f6955a10a #REFACTORING by Stefan Reise
sr
parents: 5466
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)))
5001
11cbbbcbc87e warnings
Claus Gittinger <cg@exept.de>
parents: 4961
diff changeset
    72
#define SOCKET_FROM_FILE_OBJECT(f)      (__INST(handleType) == @symbol(socketHandle) ? SOCKET_FROM_FD((INT)(__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
{
5452
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
   143
        char *extPtr = 0;
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
   144
        int sIdx = 0, objSize = 0, offs = 0;
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
   145
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
   146
        if (__isSmallInteger(startIndex)) {
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
   147
            sIdx = __intVal(startIndex) - 1;
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
   148
        }
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
   149
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
   150
        if (__isExternalBytesLike(aDataBuffer)) {
5472
b1822258a4be #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 5467
diff changeset
   151
            OBJ sz = __externalBytesSize(aDataBuffer);
5452
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
   152
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
   153
            extPtr = (char *)(__externalBytesAddress(aDataBuffer));
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
   154
            if (__isSmallInteger(sz)) {
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
   155
                objSize = __intVal(sz);
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
   156
            } else {
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
   157
                objSize = 0; /* unknown */
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
   158
            }
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
   159
            offs = sIdx;
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
   160
        } else {
5472
b1822258a4be #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 5467
diff changeset
   161
            OBJ oClass __Class(aDataBuffer);
5452
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
   162
            int nInstVars, nInstBytes;
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
   163
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
   164
            switch (__intVal(__ClassInstPtr(oClass)->c_flags) & ARRAYMASK) {
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
   165
                case BYTEARRAY:
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
   166
                    offs = sIdx;
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
   167
                    break;
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
   168
                case WORDARRAY:
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
   169
                case SWORDARRAY:
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
   170
                    offs = sIdx * 2;
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
   171
                    break;
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
   172
                case LONGARRAY:
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
   173
                case SLONGARRAY:
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
   174
                    offs = sIdx * 4;
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
   175
                    break;
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
   176
                case LONGLONGARRAY:
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
   177
                case SLONGLONGARRAY:
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
   178
                    offs = sIdx * 8;
1504
92005eec5c9d fixed moving-object-when-interrupted-with-scavenge bugs;
Claus Gittinger <cg@exept.de>
parents: 1503
diff changeset
   179
# ifdef __NEED_LONGLONG_ALIGN
5452
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
   180
                    offs += 4;
1504
92005eec5c9d fixed moving-object-when-interrupted-with-scavenge bugs;
Claus Gittinger <cg@exept.de>
parents: 1503
diff changeset
   181
# endif
5452
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
   182
                    break;
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
   183
                case FLOATARRAY:
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
   184
                    offs = sIdx * sizeof(float);
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
   185
                    break;
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
   186
                case DOUBLEARRAY:
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
   187
                    offs = sIdx * sizeof(double);
1504
92005eec5c9d fixed moving-object-when-interrupted-with-scavenge bugs;
Claus Gittinger <cg@exept.de>
parents: 1503
diff changeset
   188
# ifdef __NEED_DOUBLE_ALIGN
5452
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
   189
                    offs += 4;
1504
92005eec5c9d fixed moving-object-when-interrupted-with-scavenge bugs;
Claus Gittinger <cg@exept.de>
parents: 1503
diff changeset
   190
# endif
5452
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
   191
                    break;
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
   192
                default:
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
   193
                    *p_objSize = -1;
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
   194
                    return 0;
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
   195
            }
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
   196
            nInstVars = __intVal(__ClassInstPtr(oClass)->c_ninstvars);
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
   197
            nInstBytes = OHDR_SIZE + nInstVars * sizeof(OBJ);
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
   198
            offs = offs + nInstBytes;
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
   199
            objSize = __Size(aDataBuffer) - offs;
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
   200
        }
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
   201
        *p_extPtr = extPtr;
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
   202
        *p_objSize = objSize;
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
   203
        *p_offs = offs;
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
   204
        return 1;
1504
92005eec5c9d fixed moving-object-when-interrupted-with-scavenge bugs;
Claus Gittinger <cg@exept.de>
parents: 1503
diff changeset
   205
}
92005eec5c9d fixed moving-object-when-interrupted-with-scavenge bugs;
Claus Gittinger <cg@exept.de>
parents: 1503
diff changeset
   206
%}
92005eec5c9d fixed moving-object-when-interrupted-with-scavenge bugs;
Claus Gittinger <cg@exept.de>
parents: 1503
diff changeset
   207
! !
92005eec5c9d fixed moving-object-when-interrupted-with-scavenge bugs;
Claus Gittinger <cg@exept.de>
parents: 1503
diff changeset
   208
464
600b101a7035 alen in accept
Claus Gittinger <cg@exept.de>
parents: 463
diff changeset
   209
!Socket class methodsFor:'documentation'!
25
996051271ce9 *** empty log message ***
claus
parents: 21
diff changeset
   210
31
e223f3cf2995 *** empty log message ***
claus
parents: 28
diff changeset
   211
copyright
e223f3cf2995 *** empty log message ***
claus
parents: 28
diff changeset
   212
"
e223f3cf2995 *** empty log message ***
claus
parents: 28
diff changeset
   213
 COPYRIGHT (c) 1992 by Claus Gittinger
5452
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
   214
              All Rights Reserved
31
e223f3cf2995 *** empty log message ***
claus
parents: 28
diff changeset
   215
e223f3cf2995 *** empty log message ***
claus
parents: 28
diff changeset
   216
 This software is furnished under a license and may be used
e223f3cf2995 *** empty log message ***
claus
parents: 28
diff changeset
   217
 only in accordance with the terms of that license and with the
e223f3cf2995 *** empty log message ***
claus
parents: 28
diff changeset
   218
 inclusion of the above copyright notice.   This software may not
e223f3cf2995 *** empty log message ***
claus
parents: 28
diff changeset
   219
 be provided or otherwise made available to, or used by, any
e223f3cf2995 *** empty log message ***
claus
parents: 28
diff changeset
   220
 other person.  No title to or ownership of the software is
e223f3cf2995 *** empty log message ***
claus
parents: 28
diff changeset
   221
 hereby transferred.
e223f3cf2995 *** empty log message ***
claus
parents: 28
diff changeset
   222
"
e223f3cf2995 *** empty log message ***
claus
parents: 28
diff changeset
   223
!
e223f3cf2995 *** empty log message ***
claus
parents: 28
diff changeset
   224
25
996051271ce9 *** empty log message ***
claus
parents: 21
diff changeset
   225
documentation
996051271ce9 *** empty log message ***
claus
parents: 21
diff changeset
   226
"
524
8287da54eccf more empty code for other domains;
Claus Gittinger <cg@exept.de>
parents: 513
diff changeset
   227
    This class provides access to sockets for interprocess communication.
25
996051271ce9 *** empty log message ***
claus
parents: 21
diff changeset
   228
1529
911273d090c1 Re-unified Win32 and Unix code into single Socket.st.
Claus Gittinger <cg@exept.de>
parents: 1505
diff changeset
   229
    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
   230
    tested and supported.
525
5891518d17a3 appletalk support - untested
Claus Gittinger <cg@exept.de>
parents: 524
diff changeset
   231
    Code for appletalk is included, but was never tested ...
5891518d17a3 appletalk support - untested
Claus Gittinger <cg@exept.de>
parents: 524
diff changeset
   232
    More may be added in the future.
5891518d17a3 appletalk support - untested
Claus Gittinger <cg@exept.de>
parents: 524
diff changeset
   233
    (the code is prepared for things like SNA or decNet;
5891518d17a3 appletalk support - untested
Claus Gittinger <cg@exept.de>
parents: 524
diff changeset
   234
     however, right now, this code is empty and needs a little work.
3989
d99b5df54e27 #DOCUMENTATION by mawalch
mawalch
parents: 3988
diff changeset
   235
     Implementing those is pretty straightforward, once the address
525
5891518d17a3 appletalk support - untested
Claus Gittinger <cg@exept.de>
parents: 524
diff changeset
   236
     data structures are known.)
524
8287da54eccf more empty code for other domains;
Claus Gittinger <cg@exept.de>
parents: 513
diff changeset
   237
28
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   238
    Due to historic reasons (I started this class, before I got hold of some
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   239
    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
   240
    which is still supported.
b28077459fde class: Socket
Claus Gittinger <cg@exept.de>
parents: 3467
diff changeset
   241
    This may vanish; use the #family:type: or #newTCPxxx and #newUDPxxx interfaces,
71
claus
parents: 63
diff changeset
   242
    together with the bind/listen and accept calls,
claus
parents: 63
diff changeset
   243
    which are meant to be compatible to ST-80's UnixSocketAccessor interface.
claus
parents: 63
diff changeset
   244
3481
b28077459fde class: Socket
Claus Gittinger <cg@exept.de>
parents: 3467
diff changeset
   245
    TODO: cleanup historic leftovers,
5452
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
   246
          change to raise more signals on errors.
259
6d36f3ac42a2 documentation
Claus Gittinger <cg@exept.de>
parents: 220
diff changeset
   247
6d36f3ac42a2 documentation
Claus Gittinger <cg@exept.de>
parents: 220
diff changeset
   248
    [author:]
5452
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
   249
        Claus Gittinger
48
18b9353c9d07 *** empty log message ***
claus
parents: 44
diff changeset
   250
"
18b9353c9d07 *** empty log message ***
claus
parents: 44
diff changeset
   251
!
28
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   252
48
18b9353c9d07 *** empty log message ***
claus
parents: 44
diff changeset
   253
examples
18b9353c9d07 *** empty log message ***
claus
parents: 44
diff changeset
   254
"
28
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   255
    example (get help info from an nntp server):
5452
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
   256
                                                                        [exBegin]
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
   257
        |sock|
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
   258
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
   259
        sock := Socket newTCPclientToHost:'smtp.exept.de' port:'smtp'.
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
   260
        sock isNil ifTrue:[
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
   261
            self warn:'no smtp daemon is running'.
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
   262
            ^ self
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
   263
        ].
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
   264
        Transcript showCR:sock nextLine.
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
   265
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
   266
        sock nextPutAll:'HELO STX socket test'; cr.
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
   267
        Transcript showCR:sock nextLine.
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
   268
        sock close
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
   269
                                                                        [exEnd]
209
2152fceba563 finger example
Claus Gittinger <cg@exept.de>
parents: 208
diff changeset
   270
28
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   271
209
2152fceba563 finger example
Claus Gittinger <cg@exept.de>
parents: 208
diff changeset
   272
    example (connect to finger daemon, get users entry):
5452
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
   273
                                                                        [exBegin]
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
   274
        |sock entry|
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
   275
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
   276
        sock := Socket newTCPclientToHost:'localhost' port:'finger'.
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
   277
        sock isNil ifTrue:[
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
   278
            self warn:'no finger daemon is running'.
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
   279
            ^ self
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
   280
        ].
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
   281
        sock useCRLF:true.
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
   282
        sock buffered:false.
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
   283
        sock isNil ifTrue:[
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
   284
            Transcript showCR:'cannot connect to local finger daemon'
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
   285
        ] ifFalse:[
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
   286
            sock nextPutAll:(OperatingSystem getLoginName).
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
   287
            sock cr.
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
   288
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
   289
            entry := sock nextLine.
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
   290
            Transcript showCR:entry.
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
   291
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
   292
            sock close
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
   293
        ]
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
   294
                                                                        [exEnd]
99
7d016cc30052 fixed & moved pingWalk from SNMPSession to here;
Claus Gittinger <cg@exept.de>
parents: 98
diff changeset
   295
28
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   296
    example (connect to an ftp server):
5452
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
   297
                                                                        [exBegin]
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
   298
        |sock|
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
   299
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
   300
        sock := Socket newTCPclientToHost:'www.exept.de' port:'ftp'.
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
   301
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
   302
        sock buffered:false.
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
   303
        Transcript showCR:sock nextLine.
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
   304
        sock nextPutAll:('USER ' , 'anonymous'); cr.
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
   305
        Transcript showCR:sock nextLine.
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
   306
        sock nextPutAll:('PASS ' , 'fooBar'); cr.
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
   307
        Transcript showCR:sock nextLine.
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
   308
        sock nextPutAll:'HELP'; cr.
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
   309
        [
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
   310
            |line|
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
   311
            line := sock nextLine.
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
   312
            Transcript showCR:line.
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
   313
            (line at:4) = $-
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
   314
        ] whileTrue.
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
   315
        sock close.
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
   316
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
   317
        'don't know enough of the ftp protocol to continue here ...'
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
   318
                                                                        [exEnd]
28
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   319
99
7d016cc30052 fixed & moved pingWalk from SNMPSession to here;
Claus Gittinger <cg@exept.de>
parents: 98
diff changeset
   320
93
Claus Gittinger <cg@exept.de>
parents: 92
diff changeset
   321
    example (connect to an snmp server [UDP]):
3985
f4df11cffecf #OTHER by mawalch
mawalch
parents: 3843
diff changeset
   322
    Note: this is not a real connection, only the destination address is
5452
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
   323
          being fixed.
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
   324
                                                                        [exBegin]
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
   325
        |sock port|
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
   326
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
   327
        sock := Socket newUDP.
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
   328
        port := Socket portOfService:'snmp'.
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
   329
        sock connectTo:'224.1.2.3' port:port.
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
   330
        sock buffered:false.
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
   331
        Transcript showCR:'got it'.
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
   332
        sock close.
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
   333
                                                                        [exEnd]
42
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   334
99
7d016cc30052 fixed & moved pingWalk from SNMPSession to here;
Claus Gittinger <cg@exept.de>
parents: 98
diff changeset
   335
42
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   336
    example (await connection from a client and read some data):
5452
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
   337
                                                                        [exBegin]
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
   338
        |connectSock sock|
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
   339
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
   340
        connectSock := Socket newTCPserverAtPort:9998.
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
   341
        connectSock isNil ifTrue:[
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
   342
            Transcript showCR:'socket setup failed.'.
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
   343
        ] ifFalse:[
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
   344
            Transcript showCR:'listen ..'.
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
   345
            (connectSock listenFor:5) ifFalse:[
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
   346
                Transcript showCR:'listen failed.'.
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
   347
            ] ifTrue:[
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
   348
                Transcript showCR:'wait'.
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
   349
                connectSock readWait.
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
   350
                Transcript showCR:'accept'.
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
   351
                sock := connectSock accept.
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
   352
                sock isNil ifTrue:[
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
   353
                    Transcript showCR:'accept failed.'.
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
   354
                ] ifFalse:[
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
   355
                    sock buffered:false.
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
   356
                    Transcript showCR:'server: got it'.
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
   357
                    'can now do transfer via sock'.
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
   358
                    Transcript showCR:'read'.
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
   359
                    Transcript showCR:('got: ' , sock nextLine).
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
   360
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
   361
                    Transcript showCR:'close'.
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
   362
                    sock close
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
   363
                ].
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
   364
                connectSock close.
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
   365
            ]
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
   366
        ]
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
   367
                                                                        [exEnd]
42
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   368
99
7d016cc30052 fixed & moved pingWalk from SNMPSession to here;
Claus Gittinger <cg@exept.de>
parents: 98
diff changeset
   369
42
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   370
    example (connect to above server and send some data):
5452
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
   371
                                                                        [exBegin]
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
   372
        |sock|
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
   373
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
   374
        sock := Socket newTCPclientToHost:'localhost' port:9998.
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
   375
        sock isNil ifTrue:[
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
   376
            Transcript showCR:'nope'
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
   377
        ] ifFalse:[
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
   378
            sock buffered:false.
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
   379
            Transcript showCR:'client: got it'.
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
   380
            'can now do transfer via sock'.
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
   381
            Transcript showCR:'sending <hello>'.
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
   382
            sock nextPutLine:'hello'.
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
   383
            sock close
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
   384
        ]
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
   385
                                                                        [exEnd]
117
03cefad7e40b UD socket example & interruptable bind
Claus Gittinger <cg@exept.de>
parents: 116
diff changeset
   386
03cefad7e40b UD socket example & interruptable bind
Claus Gittinger <cg@exept.de>
parents: 116
diff changeset
   387
    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
   388
5452
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
   389
        |connectSock sock|
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
   390
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
   391
        '/tmp/ud_socket' asFilename remove.
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
   392
        connectSock := Socket newUNIXserverAt:'/tmp/ud_socket'.
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
   393
        connectSock isNil ifTrue:[
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
   394
            Transcript showCR:'socket setup failed.'.
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
   395
        ] ifFalse:[
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
   396
            Transcript showCR:'listen ..'.
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
   397
            (connectSock listenFor:5) ifFalse:[
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
   398
                Transcript showCR:'listen failed.'.
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
   399
            ] ifTrue:[
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
   400
                Transcript showCR:'wait'.
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
   401
                connectSock buffered:false.
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
   402
                connectSock readWait.
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
   403
                Transcript showCR:'accept'.
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
   404
                sock := connectSock accept.
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
   405
                sock isNil ifTrue:[
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
   406
                    Transcript showCR:'accept failed.'.
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
   407
                ] ifFalse:[
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
   408
                    sock buffered:false.
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
   409
                    Transcript showCR:'server: got it'.
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
   410
                    'can now do transfer via sock'.
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
   411
                    Transcript showCR:'read'.
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
   412
                    Transcript showCR:('got: ' , sock nextLine).
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
   413
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
   414
                    Transcript showCR:'close'.
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
   415
                    sock close
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
   416
                ].
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
   417
                connectSock close.
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
   418
            ]
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
   419
        ]
117
03cefad7e40b UD socket example & interruptable bind
Claus Gittinger <cg@exept.de>
parents: 116
diff changeset
   420
03cefad7e40b UD socket example & interruptable bind
Claus Gittinger <cg@exept.de>
parents: 116
diff changeset
   421
118
142d5c273454 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 117
diff changeset
   422
    example (connect to above server and send some data;
5452
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
   423
             Notice, this fails, if above server code is executed in the same ST/X image
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
   424
                     (at least on LINUX), since the OS does not correctly handle
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
   425
                     a connect from within an interrupted accept system call
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
   426
                     On SGI's SVR4, this works ok
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
   427
                                                                        [exBegin]
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
   428
        |sock|
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
   429
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
   430
        sock := Socket newUNIXclientTo:'/tmp/ud_socket'.
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
   431
        sock isNil ifTrue:[
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
   432
            Transcript showCR:'nope'
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
   433
        ] ifFalse:[
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
   434
            sock buffered:false.
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
   435
            Transcript showCR:'client: got it'.
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
   436
            'can now do transfer via sock'.
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
   437
            Transcript showCR:'sending <hello>'.
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
   438
            sock nextPutLine:'hello'.
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
   439
            sock close
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
   440
        ]
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
   441
                                                                        [exEnd]
1007
5267b5738779 UDP examples
Claus Gittinger <cg@exept.de>
parents: 1004
diff changeset
   442
5267b5738779 UDP examples
Claus Gittinger <cg@exept.de>
parents: 1004
diff changeset
   443
5267b5738779 UDP examples
Claus Gittinger <cg@exept.de>
parents: 1004
diff changeset
   444
    example (UDP await packet from a client and read some data):
5452
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
   445
                                                                        [exBegin]
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
   446
        |udpSock sock addr n dataBuffer|
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
   447
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
   448
        udpSock := Socket newUDPserverAtPort:9999.
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
   449
        udpSock isNil ifTrue:[
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
   450
            Transcript showCR:'socket setup failed.'.
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
   451
        ] ifFalse:[
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
   452
            Transcript showCR:'wait'.
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
   453
            udpSock readWait.
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
   454
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
   455
            addr := IPSocketAddress new.
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
   456
            dataBuffer := ByteArray new:1000.
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
   457
            n := udpSock receiveFrom:addr buffer:dataBuffer start:1 for:dataBuffer size.
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
   458
            n > 0 ifTrue:[
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
   459
                Transcript showCR:('got: ' , n printString , 'bytes  from ' , addr printString).
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
   460
                Transcript showCR:('data: ' , (dataBuffer copyTo:n) printString).
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
   461
            ] ifFalse:[
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
   462
                Transcript showCR:'read failed'.
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
   463
            ].
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
   464
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
   465
            Transcript showCR:'close'.
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
   466
            udpSock close
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
   467
        ]
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
   468
                                                                        [exEnd]
4738
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
   469
1007
5267b5738779 UDP examples
Claus Gittinger <cg@exept.de>
parents: 1004
diff changeset
   470
    example (connect to above UDP server and send some data;
5452
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
   471
                                                                        [exBegin]
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
   472
        |sock|
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
   473
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
   474
        sock := Socket newUDP.
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
   475
        sock isNil ifTrue:[
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
   476
            Transcript showCR:'nope'
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
   477
        ] ifFalse:[
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
   478
            sock
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
   479
                sendTo:(IPSocketAddress hostName:'127.0.0.1' port:9999) buffer:'hello world'.
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
   480
            sock close
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
   481
        ]
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
   482
                                                                        [exEnd]
4738
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
   483
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
   484
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
   485
    example (UDP await packet from a client and read some multicast data):
5452
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
   486
                                                                        [exBegin]
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
   487
        |udpSock sock addr n dataBuffer|
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
   488
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
   489
        udpSock := Socket newUDPserverAtPort:9999.
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
   490
        udpSock isNil ifTrue:[
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
   491
            Transcript showCR:'socket setup failed.'.
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
   492
        ] ifFalse:[
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
   493
            udpSock setSocketOption:#'IP_ADD_MEMBERSHIP' argument:#[224 1 2 3] argument:#[0 0 0 0].
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
   494
            Transcript showCR:'wait'.
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
   495
            udpSock readWait.
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
   496
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
   497
            addr := IPSocketAddress new.
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
   498
            dataBuffer := ByteArray new:1000.
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
   499
            n := udpSock receiveFrom:addr buffer:dataBuffer start:1 for:dataBuffer size.
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
   500
            n > 0 ifTrue:[
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
   501
                Transcript showCR:('got: ' , n printString , 'bytes  from ' , addr printString).
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
   502
                Transcript showCR:('data: ' , (dataBuffer copyTo:n) printString).
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
   503
            ] ifFalse:[
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
   504
                Transcript showCR:'read failed'.
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
   505
            ].
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
   506
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
   507
            Transcript showCR:'close'.
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
   508
            udpSock close
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
   509
        ]
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
   510
                                                                        [exEnd]
4738
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
   511
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
   512
    example (connect to above UDP server and send some multicast data):
5452
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
   513
                                                                        [exBegin]
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
   514
        |sock|
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
   515
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
   516
        sock := Socket newUDP.
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
   517
        sock isNil ifTrue:[
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
   518
            Transcript showCR:'nope'
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
   519
        ] ifFalse:[
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
   520
            sock
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
   521
                setSocketOption:#'IP_MULTICAST_TTL' argument:3 argument:nil;
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
   522
                sendTo:(IPSocketAddress hostName:'224.1.2.3' port:9999) buffer:'hello world'.
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
   523
            sock close
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
   524
        ]
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
   525
                                                                        [exEnd]
99
7d016cc30052 fixed & moved pingWalk from SNMPSession to here;
Claus Gittinger <cg@exept.de>
parents: 98
diff changeset
   526
7d016cc30052 fixed & moved pingWalk from SNMPSession to here;
Claus Gittinger <cg@exept.de>
parents: 98
diff changeset
   527
    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
   528
    Note: it dosen't use ICMP ping, but tries to reache the echo service,
5452
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
   529
          which is disabled on most OS.
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
   530
                                                                        [exBegin]
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
   531
        |myAddress list top hosts walkProcess port|
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
   532
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
   533
        myAddress := OperatingSystem getNetworkAddresses
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
   534
                        keysAndValuesSelect:[:eachIFName :eachAddress|
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
   535
                            eachAddress isLocal not
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
   536
                            and:[eachIFName = 'wlan0']
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
   537
                        ].
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
   538
        myAddress := myAddress first hostAddress.
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
   539
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
   540
        port := Socket portOfService:'echo'.
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
   541
        port isNil ifTrue:[
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
   542
            self error:'dont know echo port'.
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
   543
            ^ self
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
   544
        ].
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
   545
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
   546
        top := StandardSystemView new.
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
   547
        top label:'PING net walk'.
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
   548
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
   549
        list := ScrollableView for:ListView in:top.
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
   550
        list origin:0.0@0.0 corner:1.0@1.0.
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
   551
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
   552
        top openAndWait.
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
   553
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
   554
        walkProcess := [
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
   555
            |l low hi direction tryHostID dottedName hostName conn addr|
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
   556
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
   557
            l := SortedCollection new.
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
   558
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
   559
            ' only works with type C-net
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
   560
              the code below could simply do 1 to:254 do:[:hostID }
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
   561
              but, to probe likely hosts earlier, the probing is done
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
   562
              ping-pong like around my ip-address (assuming, that other machines
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
   563
              have numbers around my own)'.
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
   564
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
   565
            low := hi := (myAddress at:4).
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
   566
            direction := 1.
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
   567
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
   568
            [low > 0 or:[hi < 255]] whileTrue:[
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
   569
                direction > 0 ifTrue:[
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
   570
                    hi := hi + 1.
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
   571
                    tryHostID := hi.
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
   572
                    direction := -1.
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
   573
                ] ifFalse:[
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
   574
                    low := low - 1.
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
   575
                    tryHostID := low.
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
   576
                    direction := 1.
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
   577
                ].
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
   578
                (tryHostID between:1 and:254) ifTrue:[
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
   579
                    dottedName := (myAddress at:1) printString
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
   580
                                  , '.' , (myAddress at:2) printString
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
   581
                                  , '.' , (myAddress at:3) printString
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
   582
                                  , '.' , tryHostID printString.
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
   583
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
   584
                    top label:'PING net walk - trying ' , dottedName.
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
   585
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
   586
                    top windowGroup withCursor:Cursor wait do:[
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
   587
                        conn := Socket newTCPclientToHost:dottedName port:port withTimeout:1000.
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
   588
                        conn notNil ifTrue:[
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
   589
                            addr := Socket ipAddressOfHost:dottedName.
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
   590
                            hostName := Socket hostWithIpAddress:addr.
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
   591
                            hostName isNil ifTrue:[
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
   592
                                hostName :='?'
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
   593
                            ].
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
   594
                            l add:(dottedName paddedTo:15 with:Character space)
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
   595
                                   , ' '
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
   596
                                   , (hostName paddedTo:15 with:Character space)
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
   597
                                   , ' up & reachable'.
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
   598
                            list list:l.
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
   599
                            conn close.
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
   600
                        ]
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
   601
                    ].
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
   602
                ].
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
   603
            ].
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
   604
            top label:'PING reachable hosts'.
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
   605
        ] forkAt:(Processor userBackgroundPriority).
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
   606
        walkProcess name:'ping net walker'.
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
   607
                                                                        [exEnd]
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
   608
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
   609
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
   610
        This example creates a simple UDP server that accepts
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
   611
        single packets from anybody and broadcasts them to all
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
   612
        clients that have connected so far.
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
   613
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
   614
                                                                        [exBegin]
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
   615
        | socket address buffer msgSize clients |
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
   616
        clients := Set new.
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
   617
        address := IPSocketAddress new.
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
   618
        buffer := String new: 1024.
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
   619
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
   620
        socket := self newUDPserverAtPort: 6666.
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
   621
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
   622
        Transcript showCR: 'server starting'.
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
   623
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
   624
        [
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
   625
            [true] whileTrue: [
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
   626
                (socket readWaitWithTimeoutMs: 200) ifFalse: [
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
   627
                    msgSize := socket
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
   628
                            receiveFrom: address
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
   629
                            buffer: buffer
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
   630
                            start: 1
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
   631
                            for: buffer size.
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
   632
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
   633
                    clients add: address copy.
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
   634
                    clients do: [ :clientAddress |
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
   635
                            socket
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
   636
                                    sendTo: clientAddress
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
   637
                                    buffer: buffer
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
   638
                                    start: 1
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
   639
                                    for: msgSize]]
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
   640
            ]
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
   641
        ] ensure:[
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
   642
            Transcript showCR: 'server shutting down'.
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
   643
            socket close
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
   644
        ]
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
   645
                                                                        [exEnd]
817
eda0065cbd47 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 814
diff changeset
   646
eda0065cbd47 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 814
diff changeset
   647
   send a datagram to above server:
5452
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
   648
                                                                        [exBegin]
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
   649
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
   650
        | socket address buffer host msg |
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
   651
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
   652
        host := Dialog
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
   653
                request: 'What is the name of the server''s host?'
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
   654
                initialAnswer: 'localhost'.
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
   655
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
   656
        socket := self newUDP.
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
   657
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
   658
        address := IPSocketAddress hostName: host port: 6666.
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
   659
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
   660
        buffer := ByteArray new: 1000.
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
   661
        [
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
   662
            [(msg := Dialog request: 'Say something') isEmpty] whileFalse:[
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
   663
                | replySize stream |
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
   664
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
   665
                socket writeWait.
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
   666
                stream := buffer writeStream.
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
   667
                stream nextPutAll: msg.
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
   668
                socket sendTo:address buffer:buffer start:1 for:stream position.
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
   669
                socket readWait.
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
   670
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
   671
                replySize := socket receiveFrom:address buffer:buffer.
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
   672
                replySize > 0 ifTrue: [
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
   673
                    Transcript cr; nextPutAll: 'Server acknowledged: '.
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
   674
                    Transcript show: ((buffer copyFrom: 1 to: replySize) asString)
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
   675
                ]
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
   676
            ]
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
   677
        ] ensure: [socket close].
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
   678
        Transcript cr
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
   679
                                                                        [exEnd]
1316
ffe05bfee9b5 example
Claus Gittinger <cg@exept.de>
parents: 1313
diff changeset
   680
ffe05bfee9b5 example
Claus Gittinger <cg@exept.de>
parents: 1313
diff changeset
   681
ffe05bfee9b5 example
Claus Gittinger <cg@exept.de>
parents: 1313
diff changeset
   682
   loopBack:
5452
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
   683
                                                                        [exBegin]
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
   684
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
   685
        |readerTask readingSocket writingSocket|
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
   686
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
   687
        readingSocket := self newTCPserverAtPort:9999.
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
   688
        readerTask :=
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
   689
            [
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
   690
                |connection|
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
   691
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
   692
                readingSocket listenFor:1.
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
   693
                connection := readingSocket accept.
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
   694
                readingSocket close.
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
   695
                [connection atEnd] whileFalse:[
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
   696
                    Transcript showCR:(connection nextLine).
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
   697
                ].
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
   698
                connection close.
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
   699
            ] fork.
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
   700
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
   701
        Delay waitForSeconds:1.
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
   702
        writingSocket := self newTCPclientToHost:'localhost' port:9999.
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
   703
        writingSocket nextPutLine:'Hello'.
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
   704
        writingSocket nextPutLine:'World'.
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
   705
        writingSocket close.
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
   706
                                                                        [exEnd]
25
996051271ce9 *** empty log message ***
claus
parents: 21
diff changeset
   707
"
996051271ce9 *** empty log message ***
claus
parents: 21
diff changeset
   708
! !
996051271ce9 *** empty log message ***
claus
parents: 21
diff changeset
   709
1462
5602fce52b42 squeak stuff
Claus Gittinger <cg@exept.de>
parents: 1413
diff changeset
   710
!Socket class methodsFor:'instance creation'!
126
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
   711
3059
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
   712
bindTo:aSocketAddress type:aTypeSymbol
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
   713
    "create a socket for a specific type
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
   714
     and bind it to aSocketAddress.
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
   715
     Type must be:
5452
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
   716
        #stream, #datagram or #raw
3059
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
   717
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
   718
     Neither connect nor connect-wait is done."
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
   719
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
   720
    |newSock|
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
   721
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
   722
    newSock := self domain:aSocketAddress domain type:aTypeSymbol.
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
   723
    [
5452
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
   724
        newSock bindTo:aSocketAddress reuseAddress:true.
3059
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
   725
    ] ifCurtailed:[
5452
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
   726
        newSock close.
3059
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
   727
    ].
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
   728
    ^ newSock
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
   729
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
   730
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
   731
    "
5452
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
   732
        Socket bindTo:(IPSocketAddress anyHost port:8081) type:#stream.
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
   733
        Socket bindTo:(IPv6SocketAddress anyHost port:8081) type:#datagram.
3059
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
   734
    "
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
   735
!
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
   736
126
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
   737
domain:domainSymbol type:type
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
   738
    "create a socket for domain and type -
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
   739
     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
   740
     Domain must be one of the symbols:
5452
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
   741
        #inet, #unix, #appletalk, #decnet, #xns, ...;
819
4cc15700d123 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 817
diff changeset
   742
     Type must be:
5452
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
   743
        #stream, #datagram or #raw
3059
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
   744
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
   745
     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
   746
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
   747
    ^ self new domain:domainSymbol type:type
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
   748
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
   749
    "
3059
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
   750
     Socket domain:#AF_INET type:#stream
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
   751
     Socket domain:#AF_INET type:#datagram
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
   752
     Socket domain:#AF_INET6 type:#stream
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
   753
     Socket domain:#AF_INET6 type:#datagram
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
   754
     Socket domain:#AF_UNIX type:#stream
126
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
   755
    "
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
   756
!
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
   757
4955
a5b7af921f9e #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4944
diff changeset
   758
newIPv6
a5b7af921f9e #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4944
diff changeset
   759
    "create an IPv6 socket - no binding or other setup is done,
a5b7af921f9e #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4944
diff changeset
   760
     neither connect nor connect-wait is done."
a5b7af921f9e #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4944
diff changeset
   761
a5b7af921f9e #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4944
diff changeset
   762
    ^ self new domain:#'AF_INET6' type:#stream
a5b7af921f9e #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4944
diff changeset
   763
a5b7af921f9e #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4944
diff changeset
   764
    "
a5b7af921f9e #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4944
diff changeset
   765
      Socket newIPv6
a5b7af921f9e #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4944
diff changeset
   766
    "
a5b7af921f9e #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4944
diff changeset
   767
a5b7af921f9e #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4944
diff changeset
   768
    "Created: / 27-05-2019 / 14:06:23 / Claus Gittinger"
a5b7af921f9e #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4944
diff changeset
   769
!
a5b7af921f9e #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4944
diff changeset
   770
a5b7af921f9e #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4944
diff changeset
   771
newIPv6:portNrOrServiceName
a5b7af921f9e #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4944
diff changeset
   772
    "create an IPv6 socket for a service -
a5b7af921f9e #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4944
diff changeset
   773
     neither connect nor connect-wait is done."
a5b7af921f9e #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4944
diff changeset
   774
a5b7af921f9e #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4944
diff changeset
   775
    |newSock socketAddress socketAddressClass|
a5b7af921f9e #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4944
diff changeset
   776
a5b7af921f9e #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4944
diff changeset
   777
    newSock := self newIPv6.
a5b7af921f9e #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4944
diff changeset
   778
    (newSock notNil and:[portNrOrServiceName notNil]) ifTrue:[
5452
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
   779
        [
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
   780
            socketAddressClass := newSock socketAddressClass.
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
   781
            socketAddress := socketAddressClass hostName:nil serviceName:portNrOrServiceName type:#stream.
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
   782
            socketAddress hostAddress:socketAddressClass anyAddress.
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
   783
            newSock bindTo:socketAddress reuseAddress:true.
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
   784
        ] ifCurtailed:[
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
   785
            newSock close.
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
   786
        ]
4955
a5b7af921f9e #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4944
diff changeset
   787
    ].
a5b7af921f9e #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4944
diff changeset
   788
    ^ newSock
a5b7af921f9e #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4944
diff changeset
   789
a5b7af921f9e #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4944
diff changeset
   790
a5b7af921f9e #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4944
diff changeset
   791
    "
a5b7af921f9e #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4944
diff changeset
   792
     (Socket newIPv6:9996).
a5b7af921f9e #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4944
diff changeset
   793
4961
a1c49a18e83d #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 4955
diff changeset
   794
     test (eval the code below, then open a browser on (replace by your own IPv6 address)
5452
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
   795
        http://[2003:a:e4d:bb01:a17f:9312:54cb:fed7]:9997/
5001
11cbbbcbc87e warnings
Claus Gittinger <cg@exept.de>
parents: 4961
diff changeset
   796
11cbbbcbc87e warnings
Claus Gittinger <cg@exept.de>
parents: 4961
diff changeset
   797
     (Socket newIPv6:9997)
5452
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
   798
        listenFor:1;
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
   799
        readWait;
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
   800
        accept.
5001
11cbbbcbc87e warnings
Claus Gittinger <cg@exept.de>
parents: 4961
diff changeset
   801
4955
a5b7af921f9e #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4944
diff changeset
   802
    "
a5b7af921f9e #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4944
diff changeset
   803
a5b7af921f9e #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4944
diff changeset
   804
    "Created: / 27-05-2019 / 14:06:49 / Claus Gittinger"
a5b7af921f9e #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4944
diff changeset
   805
!
a5b7af921f9e #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4944
diff changeset
   806
126
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
   807
newTCP
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
   808
    "create a TCP socket - no binding or other setup is done,
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
   809
     neither connect nor connect-wait is done."
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
   810
3059
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
   811
    ^ self new domain:#'AF_INET' type:#stream
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
      Socket newTCP
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
   815
    "
126
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
   816
!
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
   817
4944
f4f8254bfb3b #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 4942
diff changeset
   818
newTCP:portNrOrServiceName
126
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
   819
    "create a TCP socket for a service -
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
   820
     neither connect nor connect-wait is done."
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
   821
3059
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
   822
    |newSock socketAddress socketAddressClass|
126
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
   823
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
   824
    newSock := self newTCP.
4944
f4f8254bfb3b #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 4942
diff changeset
   825
    (newSock notNil and:[portNrOrServiceName notNil]) ifTrue:[
5452
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
   826
        [
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
   827
            socketAddressClass := newSock socketAddressClass.
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
   828
            socketAddress := socketAddressClass hostName:nil serviceName:portNrOrServiceName type:#stream.
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
   829
            socketAddress hostAddress:socketAddressClass anyAddress.
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
   830
            newSock bindTo:socketAddress reuseAddress:true.
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
   831
        ] ifCurtailed:[
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
   832
            newSock close.
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
   833
        ]
126
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
    ^ newSock
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
   836
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
   837
1911
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
   838
    "
5452
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
   839
        Socket newTCP:'http-alt'.
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
   840
        Socket newTCP:9996.
1911
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
   841
    "
4944
f4f8254bfb3b #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 4942
diff changeset
   842
f4f8254bfb3b #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 4942
diff changeset
   843
    "Modified (comment): / 17-05-2019 / 13:10:18 / Claus Gittinger"
126
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
   844
!
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
   845
576
13acab81fad0 more ST80 compatibility
ca
parents: 572
diff changeset
   846
newTCPclientToAddress:aHostAddress port:aService
13acab81fad0 more ST80 compatibility
ca
parents: 572
diff changeset
   847
    "create a new TCP client socket connecting to a service.
13acab81fad0 more ST80 compatibility
ca
parents: 572
diff changeset
   848
     Return a socket instance if ok, nil on failure.
13acab81fad0 more ST80 compatibility
ca
parents: 572
diff changeset
   849
     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
   850
     not the whole smalltalk).
576
13acab81fad0 more ST80 compatibility
ca
parents: 572
diff changeset
   851
     See also: #newTCPclientToAddress:port:withTimeout:"
13acab81fad0 more ST80 compatibility
ca
parents: 572
diff changeset
   852
13acab81fad0 more ST80 compatibility
ca
parents: 572
diff changeset
   853
    ^ self newTCPclientToAddress:aHostAddress port:aService withTimeout:nil
13acab81fad0 more ST80 compatibility
ca
parents: 572
diff changeset
   854
!
13acab81fad0 more ST80 compatibility
ca
parents: 572
diff changeset
   855
4570
39e965ca8d06 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4568
diff changeset
   856
newTCPclientToAddress:aSocketAddressOrByteArray port:aService withTimeout:milliSecondsOrTimeDuration
576
13acab81fad0 more ST80 compatibility
ca
parents: 572
diff changeset
   857
    "create a new TCP client socket connecting to a service.
13acab81fad0 more ST80 compatibility
ca
parents: 572
diff changeset
   858
     Return a socket instance if ok, nil on failure.
13acab81fad0 more ST80 compatibility
ca
parents: 572
diff changeset
   859
     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
   860
     and return nil."
576
13acab81fad0 more ST80 compatibility
ca
parents: 572
diff changeset
   861
3059
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
   862
    |port socketAddress|
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
   863
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
   864
    aService isString ifTrue:[
5452
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
   865
        port := self portOfService:aService protocol:#tcp.
3059
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
   866
    ] ifFalse:[
5452
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
   867
        port := aService.
3059
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
   868
    ].
3217
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
   869
    socketAddress := aSocketAddressOrByteArray isSocketAddress
5452
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
   870
                        ifTrue:[aSocketAddressOrByteArray]
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
   871
                        ifFalse:[
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
   872
                            "Passing ByteArrays is obsolete and only supported for IPv4"
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
   873
                            IPSocketAddress hostAddress:aSocketAddressOrByteArray
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
   874
                        ].
3059
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
   875
    port notNil ifTrue:[
5452
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
   876
        socketAddress port:port.
3059
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
   877
    ].
4570
39e965ca8d06 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4568
diff changeset
   878
    ^ self newTCPclientToAddress:socketAddress withTimeout:milliSecondsOrTimeDuration
39e965ca8d06 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4568
diff changeset
   879
39e965ca8d06 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4568
diff changeset
   880
    "Modified (format): / 19-01-2018 / 18:26:51 / stefan"
576
13acab81fad0 more ST80 compatibility
ca
parents: 572
diff changeset
   881
!
13acab81fad0 more ST80 compatibility
ca
parents: 572
diff changeset
   882
4570
39e965ca8d06 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4568
diff changeset
   883
newTCPclientToAddress:aSocketAddress withTimeout:milliSecondsOrTimeDuration
126
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
   884
    "create a new TCP client socket connecting to a service.
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
   885
     Return a socket instance if ok, nil on failure.
3059
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
   886
     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
   887
     and return nil."
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
   888
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
   889
    |socket|
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
   890
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
   891
    socket := self domain:aSocketAddress domain type:#stream.
4570
39e965ca8d06 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4568
diff changeset
   892
    ^ [
5452
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
   893
        (socket connectTo:aSocketAddress withTimeout:milliSecondsOrTimeDuration)
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
   894
        ifTrue:[socket] ifFalse:[socket close. nil]
4570
39e965ca8d06 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4568
diff changeset
   895
    ] ifCurtailed:[
5452
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
   896
        socket close.
3059
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
   897
    ].
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
   898
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
   899
    "
5452
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
   900
        self newTCPclientToAddress:(IPv6SocketAddress hostName:'www.exept.de' port:80) withTimeout:nil
3059
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
   901
    "
4570
39e965ca8d06 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4568
diff changeset
   902
39e965ca8d06 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4568
diff changeset
   903
    "Modified (format): / 19-01-2018 / 18:22:30 / stefan"
3059
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
   904
!
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
   905
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
   906
newTCPclientToHost:hostNameOrAddress port:aPortOrServiceName
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
   907
    "create a new TCP client socket connecting to a service.
3985
f4df11cffecf #OTHER by mawalch
mawalch
parents: 3843
diff changeset
   908
     If hostNameOrAddress is a string, try all the resolved addresses regardless
3988
7bf762b79544 #DOCUMENTATION by mawalch
mawalch
parents: 3985
diff changeset
   909
     whether for IPv4 or IPv6.
3059
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
   910
     Return a socket instance if ok, nil on failure.
126
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
   911
     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
   912
     not the whole smalltalk).
126
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
   913
     See also: #newTCPclientToHost:port:withTimeout:"
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
   914
3590
3487165a9cdf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3550
diff changeset
   915
    ^ self
5452
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
   916
        newTCPclientToHost:hostNameOrAddress
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
   917
        port:aPortOrServiceName
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
   918
        domain:self defaultIpDomainForConnect
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
   919
        withTimeout:nil
126
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
   920
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
   921
    "
4239
827d8755965f #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4234
diff changeset
   922
      Socket newTCPclientToHost:'www.exept.de' port:'https'
126
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
   923
    "
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
    "Created: 31.10.1995 / 18:54:11 / cg"
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
   926
!
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
   927
4570
39e965ca8d06 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4568
diff changeset
   928
newTCPclientToHost:hostNameOrAddress port:aPortOrServiceName domain:aDomainSymbolOrNil withTimeout:milliSecondsOrTimeDuration
3059
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
   929
    "create a new TCP client socket connecting to a service on hostNameOrAddress.
3985
f4df11cffecf #OTHER by mawalch
mawalch
parents: 3843
diff changeset
   930
     If hostNameOrAddress is a string, try all the resolved addresses.
126
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
   931
     Return a socket instance if ok, nil on failure.
3059
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
   932
     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
   933
     Set aDomainSymbolOrNil to nil, to try all protocols.
4570
39e965ca8d06 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4568
diff changeset
   934
     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
   935
     and return nil."
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
   936
4570
39e965ca8d06 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4568
diff changeset
   937
    |socket addressList lastDomainSymbol lastNotification|
3059
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
   938
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
   939
    hostNameOrAddress isString ifFalse:[
5452
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
   940
        ^ self newTCPclientToAddress:hostNameOrAddress port:aPortOrServiceName withTimeout:milliSecondsOrTimeDuration.
126
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
   941
    ].
3059
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
   942
4341
2b08cb3ff1a3 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 4320
diff changeset
   943
    addressList := SocketAddress
5452
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
   944
                        allForHostName:hostNameOrAddress
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
   945
                        serviceName:aPortOrServiceName
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
   946
                        domain:aDomainSymbolOrNil
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
   947
                        type:#stream.
4341
2b08cb3ff1a3 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 4320
diff changeset
   948
2b08cb3ff1a3 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 4320
diff changeset
   949
    addressList do:[:eachAddress|
5452
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
   950
        |domainSymbol|
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
   951
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
   952
        domainSymbol := eachAddress domain.
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
   953
        domainSymbol ~~ lastDomainSymbol ifTrue:[
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
   954
            socket notNil ifTrue:[
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
   955
                socket close.
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
   956
            ].
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
   957
            socket := self new domain:domainSymbol type:#stream.
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
   958
            lastDomainSymbol := domainSymbol.
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
   959
        ].
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
   960
        [
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
   961
            (socket connectTo:eachAddress withTimeout:milliSecondsOrTimeDuration) ifTrue:[
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
   962
                ^ socket.
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
   963
            ].
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
   964
        ] on:SocketErrorNotification do:[:ex|
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
   965
            lastNotification := ex.
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
   966
        ].
3059
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
   967
    ].
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
   968
    socket notNil ifTrue:[
5452
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
   969
        socket close.
4570
39e965ca8d06 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4568
diff changeset
   970
    ].
39e965ca8d06 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4568
diff changeset
   971
    lastNotification notNil ifTrue:[
5452
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
   972
        "if someone is interested in the notification - raise the last one"
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
   973
        lastNotification raiseRequest.
3059
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
   974
    ].
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
   975
    ^ nil.
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
   976
4791
1323fc4dc376 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4774
diff changeset
   977
    "<<EOC
3059
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
   978
      Socket newTCPclientToHost:'www.exept.de' port:80 domain:#'AF_INET' withTimeout:1000.
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
   979
      Socket newTCPclientToHost:'www.exept.de' port:80 domain:#'AF_INET6' withTimeout:1000.
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
   980
      Socket newTCPclientToHost:'www.exept.de' port:80 domain:nil withTimeout:1000.
4791
1323fc4dc376 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4774
diff changeset
   981
1323fc4dc376 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4774
diff changeset
   982
      [
5452
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
   983
        "if nobody is listening (Connection refused") the timeout does not apply"
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
   984
        Socket newTCPclientToHost:'localhost' port:'nntp' withTimeout:10s
4791
1323fc4dc376 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4774
diff changeset
   985
      ] on:SocketErrorNotification do:[:ex|
5452
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
   986
        ex halt.
4791
1323fc4dc376 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4774
diff changeset
   987
      ].
1323fc4dc376 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4774
diff changeset
   988
EOC"
604
b302a21afece Remove redundant code.
Stefan Vogel <sv@exept.de>
parents: 589
diff changeset
   989
4570
39e965ca8d06 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4568
diff changeset
   990
    "Modified: / 19-01-2018 / 18:12:29 / stefan"
4791
1323fc4dc376 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4774
diff changeset
   991
    "Modified: / 28-01-2019 / 10:48:18 / Stefan Vogel"
126
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
   992
!
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
   993
4570
39e965ca8d06 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4568
diff changeset
   994
newTCPclientToHost:hostNameOrAddress port:aPortOrServiceName withTimeout:milliSecondsOrTimeDuration
3059
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
   995
    "create a new TCP client socket connecting to a service on hostNameOrAddress.
3985
f4df11cffecf #OTHER by mawalch
mawalch
parents: 3843
diff changeset
   996
     If hostNameOrAddress is a string, try all the resolved addresses regardless
3988
7bf762b79544 #DOCUMENTATION by mawalch
mawalch
parents: 3985
diff changeset
   997
     whether for IPv4 or IPv6.
3059
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
   998
     Return a socket instance if ok, nil on failure.
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
   999
     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
  1000
     and return nil."
3217
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  1001
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  1002
    ^ self
5452
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  1003
        newTCPclientToHost:hostNameOrAddress
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  1004
        port:aPortOrServiceName
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  1005
        domain:self defaultIpDomainForConnect
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  1006
        withTimeout:milliSecondsOrTimeDuration
4570
39e965ca8d06 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4568
diff changeset
  1007
39e965ca8d06 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4568
diff changeset
  1008
    "Modified (format): / 19-01-2018 / 18:24:57 / stefan"
3059
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  1009
!
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  1010
506
11ef93d12870 support anonymous (OS_specified) ports. (for FTP-protocol)
Claus Gittinger <cg@exept.de>
parents: 486
diff changeset
  1011
newTCPserverAtAnonymousPort
11ef93d12870 support anonymous (OS_specified) ports. (for FTP-protocol)
Claus Gittinger <cg@exept.de>
parents: 486
diff changeset
  1012
    "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
  1013
     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
  1014
811
72d9ac1a7f95 comments
Claus Gittinger <cg@exept.de>
parents: 809
diff changeset
  1015
    ^ self newTCPserverAtPort:0
506
11ef93d12870 support anonymous (OS_specified) ports. (for FTP-protocol)
Claus Gittinger <cg@exept.de>
parents: 486
diff changeset
  1016
11ef93d12870 support anonymous (OS_specified) ports. (for FTP-protocol)
Claus Gittinger <cg@exept.de>
parents: 486
diff changeset
  1017
!
11ef93d12870 support anonymous (OS_specified) ports. (for FTP-protocol)
Claus Gittinger <cg@exept.de>
parents: 486
diff changeset
  1018
4944
f4f8254bfb3b #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 4942
diff changeset
  1019
newTCPserverAtPort:portNrOrServiceName
126
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
  1020
    "create a new TCP server socket providing service."
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
  1021
4944
f4f8254bfb3b #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 4942
diff changeset
  1022
    ^ self newTCP:portNrOrServiceName
f4f8254bfb3b #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 4942
diff changeset
  1023
f4f8254bfb3b #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 4942
diff changeset
  1024
    "Modified (format): / 17-05-2019 / 13:10:33 / Claus Gittinger"
126
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
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
  1027
newUDP
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
  1028
    "create a UDP socket - no binding or other setup is done,
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
  1029
     neither connect nor connect-wait is done."
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 new domain:#'AF_INET' type:#datagram
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
    "Socket newUDP"
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
  1034
!
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
  1035
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
  1036
newUDP:aServiceOrNil
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
  1037
    "create a UDP socket for a service -
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
  1038
     neither connect nor connect-wait is done."
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
  1039
3059
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  1040
    |newSock socketAddressClass socketAddress|
126
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
    newSock := self newUDP.
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
  1043
    (newSock notNil and:[aServiceOrNil notNil]) ifTrue:[
5452
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  1044
        [
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  1045
            socketAddressClass := newSock socketAddressClass.
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  1046
            socketAddress := socketAddressClass hostName:nil serviceName:aServiceOrNil type:#stream.
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  1047
            socketAddress hostAddress:socketAddressClass anyAddress.
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  1048
            newSock bindTo:socketAddress reuseAddress:true.
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  1049
        ] ifCurtailed:[
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  1050
            newSock close.
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  1051
        ]
126
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
  1052
    ].
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
  1053
    ^ newSock
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
  1054
1911
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
  1055
    "
5452
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  1056
        Socket newUDP:4444.
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  1057
        Socket newUDP:'activesync'.
1911
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
  1058
    "
126
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
  1059
!
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
  1060
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
  1061
newUDPserverAtPort:aService
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
  1062
    "create a new UDP server socket providing service."
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
  1063
1911
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
  1064
    ^ self newUDP:aService
126
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
  1065
!
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
  1066
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
  1067
newUNIX
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
  1068
    "create a UNIX domain socket - no binding or other setup is done,
811
72d9ac1a7f95 comments
Claus Gittinger <cg@exept.de>
parents: 809
diff changeset
  1069
     neither connect nor connect-wait is done.
72d9ac1a7f95 comments
Claus Gittinger <cg@exept.de>
parents: 809
diff changeset
  1070
     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
  1071
     return nil."
126
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
  1072
3059
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  1073
    ^ self new domain:#'AF_UNIX' type:#stream
126
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
  1074
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
  1075
    "
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
  1076
     Socket newUNIX
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
  1077
    "
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
  1078
!
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
  1079
1485
d8578cf3504b gcc3.3.1 insn-scheduler bug workaround
Claus Gittinger <cg@exept.de>
parents: 1474
diff changeset
  1080
newUNIXclientTo:pathName
126
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
  1081
    "create a new UNIX client socket connecting to a pathname.
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
  1082
     Return a socket instance if ok, nil on failure.
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
  1083
     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
  1084
     not the whole smalltalk).
811
72d9ac1a7f95 comments
Claus Gittinger <cg@exept.de>
parents: 809
diff changeset
  1085
     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
  1086
     return nil.
126
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
  1087
     See also: #newUNIXclientTo:withTimeout:"
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
  1088
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
  1089
    ^ self newUNIXclientTo:pathName withTimeout:nil
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
  1090
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
  1091
!
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
  1092
4570
39e965ca8d06 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4568
diff changeset
  1093
newUNIXclientTo:pathName withTimeout:milliSecondsOrTimeDuration
126
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
  1094
    "create a new UNIX client socket connecting to a pathname.
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
  1095
     Return a socket instance if ok, nil on failure.
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
  1096
     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
  1097
     and return nil.
72d9ac1a7f95 comments
Claus Gittinger <cg@exept.de>
parents: 809
diff changeset
  1098
     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
  1099
     return nil."
126
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
  1100
4570
39e965ca8d06 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4568
diff changeset
  1101
    |socket|
39e965ca8d06 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4568
diff changeset
  1102
39e965ca8d06 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4568
diff changeset
  1103
    socket := self newUNIX.
39e965ca8d06 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4568
diff changeset
  1104
    socket isNil ifTrue:[
5452
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  1105
        ^ nil.
126
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
  1106
    ].
4570
39e965ca8d06 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4568
diff changeset
  1107
    ^ [
5452
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  1108
        (socket connectTo:(UDSocketAddress name:pathName) withTimeout:milliSecondsOrTimeDuration)
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  1109
        ifTrue:[socket] ifFalse:[socket close. nil]
4570
39e965ca8d06 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4568
diff changeset
  1110
    ] ifCurtailed:[
5452
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  1111
        socket close.
4570
39e965ca8d06 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4568
diff changeset
  1112
    ].
126
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
  1113
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
  1114
    "
5452
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  1115
        Socket newUNIXclientTo:'/tmp/foo'
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  1116
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  1117
        [
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  1118
            Socket newUNIXclientTo:'/tmp/foo'
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  1119
        ] on:SocketErrorNotification do:[:ex|
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  1120
            ex halt.
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  1121
        ]
126
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
  1122
    "
4570
39e965ca8d06 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4568
diff changeset
  1123
39e965ca8d06 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4568
diff changeset
  1124
    "Modified (format): / 19-01-2018 / 18:23:24 / stefan"
126
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
  1125
!
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
  1126
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
  1127
newUNIXserverAt:pathName
811
72d9ac1a7f95 comments
Claus Gittinger <cg@exept.de>
parents: 809
diff changeset
  1128
    "create a new UNIX server socket providing service at a pathname.
72d9ac1a7f95 comments
Claus Gittinger <cg@exept.de>
parents: 809
diff changeset
  1129
     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
  1130
     return nil."
126
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
  1131
3059
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  1132
    ^ self bindTo:(UDSocketAddress name:pathName) type:#stream.
126
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
  1133
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
  1134
    "
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
  1135
     |s s2|
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
  1136
3059
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  1137
    '/tmp/foo' asFilename remove.
126
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
  1138
     s := Socket newUNIXserverAt:'/tmp/foo'.
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
  1139
     s listenFor:5.
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
  1140
     s2 := s accept.
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
  1141
    "
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
  1142
! !
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
  1143
1462
5602fce52b42 squeak stuff
Claus Gittinger <cg@exept.de>
parents: 1413
diff changeset
  1144
!Socket class methodsFor:'Compatibility-ST80'!
5602fce52b42 squeak stuff
Claus Gittinger <cg@exept.de>
parents: 1413
diff changeset
  1145
5602fce52b42 squeak stuff
Claus Gittinger <cg@exept.de>
parents: 1413
diff changeset
  1146
family:domainSymbol type:typeSymbol
5602fce52b42 squeak stuff
Claus Gittinger <cg@exept.de>
parents: 1413
diff changeset
  1147
    "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
  1148
     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
  1149
     Type must be #stream, #datagram or #raw."
1462
5602fce52b42 squeak stuff
Claus Gittinger <cg@exept.de>
parents: 1413
diff changeset
  1150
5602fce52b42 squeak stuff
Claus Gittinger <cg@exept.de>
parents: 1413
diff changeset
  1151
    ^ self domain:domainSymbol type:typeSymbol
5602fce52b42 squeak stuff
Claus Gittinger <cg@exept.de>
parents: 1413
diff changeset
  1152
5602fce52b42 squeak stuff
Claus Gittinger <cg@exept.de>
parents: 1413
diff changeset
  1153
    "
3059
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  1154
     Socket family:#AF_INET type:#stream
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  1155
     Socket family:#AF_INET type:#datagram
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  1156
     Socket family:#AF_UNIX type:#stream
1462
5602fce52b42 squeak stuff
Claus Gittinger <cg@exept.de>
parents: 1413
diff changeset
  1157
    "
5602fce52b42 squeak stuff
Claus Gittinger <cg@exept.de>
parents: 1413
diff changeset
  1158
!
5602fce52b42 squeak stuff
Claus Gittinger <cg@exept.de>
parents: 1413
diff changeset
  1159
5602fce52b42 squeak stuff
Claus Gittinger <cg@exept.de>
parents: 1413
diff changeset
  1160
getHostname
3462
cfdc47761d0f class: Socket
Claus Gittinger <cg@exept.de>
parents: 3281
diff changeset
  1161
    "return the computer's hostname string"
1462
5602fce52b42 squeak stuff
Claus Gittinger <cg@exept.de>
parents: 1413
diff changeset
  1162
5602fce52b42 squeak stuff
Claus Gittinger <cg@exept.de>
parents: 1413
diff changeset
  1163
    ^ OperatingSystem getHostName
5602fce52b42 squeak stuff
Claus Gittinger <cg@exept.de>
parents: 1413
diff changeset
  1164
5602fce52b42 squeak stuff
Claus Gittinger <cg@exept.de>
parents: 1413
diff changeset
  1165
    "Created: / 27.2.1998 / 02:32:17 / cg"
5602fce52b42 squeak stuff
Claus Gittinger <cg@exept.de>
parents: 1413
diff changeset
  1166
!
5602fce52b42 squeak stuff
Claus Gittinger <cg@exept.de>
parents: 1413
diff changeset
  1167
5602fce52b42 squeak stuff
Claus Gittinger <cg@exept.de>
parents: 1413
diff changeset
  1168
sockStream
5602fce52b42 squeak stuff
Claus Gittinger <cg@exept.de>
parents: 1413
diff changeset
  1169
    "return the type code for stream sockets"
5602fce52b42 squeak stuff
Claus Gittinger <cg@exept.de>
parents: 1413
diff changeset
  1170
5602fce52b42 squeak stuff
Claus Gittinger <cg@exept.de>
parents: 1413
diff changeset
  1171
    ^ #stream
5602fce52b42 squeak stuff
Claus Gittinger <cg@exept.de>
parents: 1413
diff changeset
  1172
! !
5602fce52b42 squeak stuff
Claus Gittinger <cg@exept.de>
parents: 1413
diff changeset
  1173
1600
f3acd5382fa1 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1584
diff changeset
  1174
!Socket class methodsFor:'Compatibility-Squeak'!
f3acd5382fa1 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1584
diff changeset
  1175
2900
0e8b305e9a98 class: Socket
Claus Gittinger <cg@exept.de>
parents: 2899
diff changeset
  1176
deadlineSecs:seconds
0e8b305e9a98 class: Socket
Claus Gittinger <cg@exept.de>
parents: 2899
diff changeset
  1177
    ^ Timestamp now addSeconds:seconds
0e8b305e9a98 class: Socket
Claus Gittinger <cg@exept.de>
parents: 2899
diff changeset
  1178
!
0e8b305e9a98 class: Socket
Claus Gittinger <cg@exept.de>
parents: 2899
diff changeset
  1179
1600
f3acd5382fa1 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1584
diff changeset
  1180
initializeNetwork
f3acd5382fa1 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1584
diff changeset
  1181
    "/ intentionally left blank here
f3acd5382fa1 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1584
diff changeset
  1182
!
f3acd5382fa1 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1584
diff changeset
  1183
4587
caa262d036d2 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4570
diff changeset
  1184
openConnectionToHostNamed:hostName port:portNr
caa262d036d2 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4570
diff changeset
  1185
    ^ self newTCPclientToHost:hostName port:portNr
caa262d036d2 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4570
diff changeset
  1186
!
caa262d036d2 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4570
diff changeset
  1187
3485
2afd6854bff9 class: Socket
Claus Gittinger <cg@exept.de>
parents: 3484
diff changeset
  1188
standardDeadline
2afd6854bff9 class: Socket
Claus Gittinger <cg@exept.de>
parents: 3484
diff changeset
  1189
    "a standard timeout in seconds for connection setup;
2afd6854bff9 class: Socket
Claus Gittinger <cg@exept.de>
parents: 3484
diff changeset
  1190
     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
  1191
2afd6854bff9 class: Socket
Claus Gittinger <cg@exept.de>
parents: 3484
diff changeset
  1192
    ^ 30
2afd6854bff9 class: Socket
Claus Gittinger <cg@exept.de>
parents: 3484
diff changeset
  1193
!
2afd6854bff9 class: Socket
Claus Gittinger <cg@exept.de>
parents: 3484
diff changeset
  1194
2292
c4b0b901278e added: #standardTimeout
Claus Gittinger <cg@exept.de>
parents: 1940
diff changeset
  1195
standardTimeout
3485
2afd6854bff9 class: Socket
Claus Gittinger <cg@exept.de>
parents: 3484
diff changeset
  1196
    "a standard timeout in seconds for transfers;
2afd6854bff9 class: Socket
Claus Gittinger <cg@exept.de>
parents: 3484
diff changeset
  1197
     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
  1198
2292
c4b0b901278e added: #standardTimeout
Claus Gittinger <cg@exept.de>
parents: 1940
diff changeset
  1199
    ^ 30
c4b0b901278e added: #standardTimeout
Claus Gittinger <cg@exept.de>
parents: 1940
diff changeset
  1200
!
c4b0b901278e added: #standardTimeout
Claus Gittinger <cg@exept.de>
parents: 1940
diff changeset
  1201
1600
f3acd5382fa1 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1584
diff changeset
  1202
wildcardPort
f3acd5382fa1 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1584
diff changeset
  1203
    ^ nil
f3acd5382fa1 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1584
diff changeset
  1204
! !
f3acd5382fa1 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1584
diff changeset
  1205
1462
5602fce52b42 squeak stuff
Claus Gittinger <cg@exept.de>
parents: 1413
diff changeset
  1206
!Socket class methodsFor:'Compatibility-VW'!
5602fce52b42 squeak stuff
Claus Gittinger <cg@exept.de>
parents: 1413
diff changeset
  1207
1485
d8578cf3504b gcc3.3.1 insn-scheduler bug workaround
Claus Gittinger <cg@exept.de>
parents: 1474
diff changeset
  1208
AF_INET
1462
5602fce52b42 squeak stuff
Claus Gittinger <cg@exept.de>
parents: 1413
diff changeset
  1209
    ^ #AF_INET
5602fce52b42 squeak stuff
Claus Gittinger <cg@exept.de>
parents: 1413
diff changeset
  1210
!
5602fce52b42 squeak stuff
Claus Gittinger <cg@exept.de>
parents: 1413
diff changeset
  1211
5602fce52b42 squeak stuff
Claus Gittinger <cg@exept.de>
parents: 1413
diff changeset
  1212
SOCK_STREAM
5602fce52b42 squeak stuff
Claus Gittinger <cg@exept.de>
parents: 1413
diff changeset
  1213
    ^ #SOCK_STREAM
5602fce52b42 squeak stuff
Claus Gittinger <cg@exept.de>
parents: 1413
diff changeset
  1214
! !
5602fce52b42 squeak stuff
Claus Gittinger <cg@exept.de>
parents: 1413
diff changeset
  1215
5602fce52b42 squeak stuff
Claus Gittinger <cg@exept.de>
parents: 1413
diff changeset
  1216
!Socket class methodsFor:'Signal constants'!
5602fce52b42 squeak stuff
Claus Gittinger <cg@exept.de>
parents: 1413
diff changeset
  1217
5602fce52b42 squeak stuff
Claus Gittinger <cg@exept.de>
parents: 1413
diff changeset
  1218
brokenConnectionSignal
5602fce52b42 squeak stuff
Claus Gittinger <cg@exept.de>
parents: 1413
diff changeset
  1219
    "return the signal used to tell broken connections.
5602fce52b42 squeak stuff
Claus Gittinger <cg@exept.de>
parents: 1413
diff changeset
  1220
     Since in unix, this is the same as the broken pipe signal,
5602fce52b42 squeak stuff
Claus Gittinger <cg@exept.de>
parents: 1413
diff changeset
  1221
     return that one.
5602fce52b42 squeak stuff
Claus Gittinger <cg@exept.de>
parents: 1413
diff changeset
  1222
     (for other Operatingsystems, this may change ..)"
5602fce52b42 squeak stuff
Claus Gittinger <cg@exept.de>
parents: 1413
diff changeset
  1223
5602fce52b42 squeak stuff
Claus Gittinger <cg@exept.de>
parents: 1413
diff changeset
  1224
    ^ PipeStream brokenPipeSignal
5602fce52b42 squeak stuff
Claus Gittinger <cg@exept.de>
parents: 1413
diff changeset
  1225
!
5602fce52b42 squeak stuff
Claus Gittinger <cg@exept.de>
parents: 1413
diff changeset
  1226
5602fce52b42 squeak stuff
Claus Gittinger <cg@exept.de>
parents: 1413
diff changeset
  1227
invalidArgumentsSignal
5602fce52b42 squeak stuff
Claus Gittinger <cg@exept.de>
parents: 1413
diff changeset
  1228
    "dummy for compatibility"
5602fce52b42 squeak stuff
Claus Gittinger <cg@exept.de>
parents: 1413
diff changeset
  1229
5602fce52b42 squeak stuff
Claus Gittinger <cg@exept.de>
parents: 1413
diff changeset
  1230
    ^ self errorSignal
5602fce52b42 squeak stuff
Claus Gittinger <cg@exept.de>
parents: 1413
diff changeset
  1231
! !
5602fce52b42 squeak stuff
Claus Gittinger <cg@exept.de>
parents: 1413
diff changeset
  1232
5602fce52b42 squeak stuff
Claus Gittinger <cg@exept.de>
parents: 1413
diff changeset
  1233
!Socket class methodsFor:'debugging'!
5602fce52b42 squeak stuff
Claus Gittinger <cg@exept.de>
parents: 1413
diff changeset
  1234
5602fce52b42 squeak stuff
Claus Gittinger <cg@exept.de>
parents: 1413
diff changeset
  1235
debug:aBoolean
5602fce52b42 squeak stuff
Claus Gittinger <cg@exept.de>
parents: 1413
diff changeset
  1236
    "turn on/off internal debugprints.
5602fce52b42 squeak stuff
Claus Gittinger <cg@exept.de>
parents: 1413
diff changeset
  1237
     This method is for ST/X debugging only and
5602fce52b42 squeak stuff
Claus Gittinger <cg@exept.de>
parents: 1413
diff changeset
  1238
     may  be removed in later versions"
5602fce52b42 squeak stuff
Claus Gittinger <cg@exept.de>
parents: 1413
diff changeset
  1239
5602fce52b42 squeak stuff
Claus Gittinger <cg@exept.de>
parents: 1413
diff changeset
  1240
%{  /* NOCONTEXT */
5602fce52b42 squeak stuff
Claus Gittinger <cg@exept.de>
parents: 1413
diff changeset
  1241
5602fce52b42 squeak stuff
Claus Gittinger <cg@exept.de>
parents: 1413
diff changeset
  1242
    __debugging__ = (aBoolean == true);
5602fce52b42 squeak stuff
Claus Gittinger <cg@exept.de>
parents: 1413
diff changeset
  1243
%}
5602fce52b42 squeak stuff
Claus Gittinger <cg@exept.de>
parents: 1413
diff changeset
  1244
    "
5602fce52b42 squeak stuff
Claus Gittinger <cg@exept.de>
parents: 1413
diff changeset
  1245
     Socket debug:true
5602fce52b42 squeak stuff
Claus Gittinger <cg@exept.de>
parents: 1413
diff changeset
  1246
     Socket debug:false
5602fce52b42 squeak stuff
Claus Gittinger <cg@exept.de>
parents: 1413
diff changeset
  1247
    "
5602fce52b42 squeak stuff
Claus Gittinger <cg@exept.de>
parents: 1413
diff changeset
  1248
! !
5602fce52b42 squeak stuff
Claus Gittinger <cg@exept.de>
parents: 1413
diff changeset
  1249
3059
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  1250
!Socket class methodsFor:'defaults'!
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  1251
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  1252
defaultIpDomainForConnect
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  1253
    "answer the domain used to look up host names for connect:
5452
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  1254
        #AF_INET    use only IPv4
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  1255
        #AF_INET6   use only IPv6
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  1256
        nil         use both IPv4 and IPv6"
4239
827d8755965f #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4234
diff changeset
  1257
827d8755965f #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4234
diff changeset
  1258
    ^ nil
3059
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  1259
! !
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  1260
1911
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
  1261
!Socket class methodsFor:'obsolete'!
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
  1262
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
  1263
connectTo:service on:host
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
  1264
    <resource: #obsolete>
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
  1265
    "standard & easy client setup:
5452
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  1266
        create new client tcp socket, bind and connect;
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  1267
        return the socket.
1911
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
  1268
     The thread blocks (interruptable), until the connection is established."
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
  1269
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
  1270
    ^ self newTCPclientToHost:host port:(self portOfService:service).
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
  1271
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
  1272
    "
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
  1273
     Socket connectTo:9995 on:'clam'
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
  1274
     Socket connectTo:4711 on:'exept'
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
  1275
     Socket connectTo:'finger' on:'clam'
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
  1276
     Socket connectTo:'ftp' on:'exept'
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
  1277
     Socket connectTo:'nntp' on:(OperatingSystem getEnvironment:'NNTPSERVER')
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
  1278
    "
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
  1279
!
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
  1280
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
  1281
networkLongOrderIsMSB
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
  1282
    "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
  1283
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
  1284
    <resource: #obsolete>
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
  1285
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
  1286
    ^ true
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
  1287
!
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
  1288
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
  1289
networkShortOrderIsMSB
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
  1290
    "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
  1291
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
  1292
    <resource: #obsolete>
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
  1293
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
  1294
    ^ true
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
  1295
!
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
  1296
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
  1297
provide:aService
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
  1298
    "standard & easy server setup:
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
  1299
     create a new TCP server socket providing a service."
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
  1300
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
  1301
    <resource:#obsolete>
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
  1302
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
  1303
    |newSock|
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
  1304
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
  1305
    self obsoleteMethodWarning:'use #newTCPserverAtPort: / #listen'.
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
  1306
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
  1307
    newSock := self newTCPserverAtPort:(self portOfService:aService).
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
  1308
    newSock notNil ifTrue:[
5452
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  1309
        newSock listenFor:5.
1911
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
  1310
    ].
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
  1311
    ^ newSock
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
  1312
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
  1313
    "
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
  1314
     Socket provide:9995
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
  1315
     (Socket provide:9996) accept
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
  1316
     Socket provide:'nntp'
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
  1317
    "
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
  1318
! !
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
  1319
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
  1320
!Socket class methodsFor:'obsolete host queries'!
525
5891518d17a3 appletalk support - untested
Claus Gittinger <cg@exept.de>
parents: 524
diff changeset
  1321
5891518d17a3 appletalk support - untested
Claus Gittinger <cg@exept.de>
parents: 524
diff changeset
  1322
appletalkAddressOfHost:aHostName
1911
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
  1323
    <resource: #obsolete>
525
5891518d17a3 appletalk support - untested
Claus Gittinger <cg@exept.de>
parents: 524
diff changeset
  1324
    "return the APPLETALK address for a hostname as a byteArray,
819
4cc15700d123 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 817
diff changeset
  1325
     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
  1326
     followed by the node byte.
525
5891518d17a3 appletalk support - untested
Claus Gittinger <cg@exept.de>
parents: 524
diff changeset
  1327
     If the host is unknown, return nil.
812
c8101ea70e6c *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 811
diff changeset
  1328
     This is the reverse operation to #hostWithAppletalkAddress:.
c8101ea70e6c *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 811
diff changeset
  1329
     WARNING: untested code - I have no appletalk to test this."
525
5891518d17a3 appletalk support - untested
Claus Gittinger <cg@exept.de>
parents: 524
diff changeset
  1330
1485
d8578cf3504b gcc3.3.1 insn-scheduler bug workaround
Claus Gittinger <cg@exept.de>
parents: 1474
diff changeset
  1331
    NameLookupError
5452
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  1332
        handle:[:ex |
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  1333
            ^ nil
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  1334
        ]
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  1335
        do:[
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  1336
            ^ (AppletalkSocketAddress hostName:aHostName) address
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  1337
        ]
525
5891518d17a3 appletalk support - untested
Claus Gittinger <cg@exept.de>
parents: 524
diff changeset
  1338
!
5891518d17a3 appletalk support - untested
Claus Gittinger <cg@exept.de>
parents: 524
diff changeset
  1339
1278
7251c65b8d38 use nameLookup from SocketAddress for all addr-families
Claus Gittinger <cg@exept.de>
parents: 1274
diff changeset
  1340
hostWithAppletalkAddress:addrByteArray
1911
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
  1341
    <resource: #obsolete>
525
5891518d17a3 appletalk support - untested
Claus Gittinger <cg@exept.de>
parents: 524
diff changeset
  1342
    "return the hostname for an APPLETALK address.
5891518d17a3 appletalk support - untested
Claus Gittinger <cg@exept.de>
parents: 524
diff changeset
  1343
     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
  1344
     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
  1345
     The last byte is the node number.
4320
5b7848099dea #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 4293
diff changeset
  1346
     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
  1347
     This is is the reverse operation to #appletalkAddressOfHost:.
c8101ea70e6c *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 811
diff changeset
  1348
     WARNING: untested code - I have no appletalk to test this."
525
5891518d17a3 appletalk support - untested
Claus Gittinger <cg@exept.de>
parents: 524
diff changeset
  1349
1485
d8578cf3504b gcc3.3.1 insn-scheduler bug workaround
Claus Gittinger <cg@exept.de>
parents: 1474
diff changeset
  1350
    NameLookupError
5452
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  1351
        handle:[:ex |
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  1352
            ^ nil
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  1353
        ]
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  1354
        do:[
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  1355
            ^ (AppletalkSocketAddress hostAddress:addrByteArray) hostName
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  1356
        ]
1278
7251c65b8d38 use nameLookup from SocketAddress for all addr-families
Claus Gittinger <cg@exept.de>
parents: 1274
diff changeset
  1357
525
5891518d17a3 appletalk support - untested
Claus Gittinger <cg@exept.de>
parents: 524
diff changeset
  1358
    "
1278
7251c65b8d38 use nameLookup from SocketAddress for all addr-families
Claus Gittinger <cg@exept.de>
parents: 1274
diff changeset
  1359
     Socket appletalkAddressOfHost:'yourAppleHere'
1485
d8578cf3504b gcc3.3.1 insn-scheduler bug workaround
Claus Gittinger <cg@exept.de>
parents: 1474
diff changeset
  1360
     Socket hostWithAppletalkAddress:#[1 2 3]
525
5891518d17a3 appletalk support - untested
Claus Gittinger <cg@exept.de>
parents: 524
diff changeset
  1361
     "
4320
5b7848099dea #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 4293
diff changeset
  1362
5b7848099dea #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 4293
diff changeset
  1363
    "Modified (comment): / 13-02-2017 / 20:30:56 / cg"
126
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
  1364
!
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
  1365
1278
7251c65b8d38 use nameLookup from SocketAddress for all addr-families
Claus Gittinger <cg@exept.de>
parents: 1274
diff changeset
  1366
hostWithIpAddress:addrByteArray
1911
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
  1367
    <resource: #obsolete>
126
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
  1368
    "return the hostname for an IP (internet-) address.
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
  1369
     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
  1370
     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
  1371
     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
  1372
     This is the reverse operation to #ipAddressOfHost:."
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
  1373
1485
d8578cf3504b gcc3.3.1 insn-scheduler bug workaround
Claus Gittinger <cg@exept.de>
parents: 1474
diff changeset
  1374
    NameLookupError
5452
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  1375
        handle:[:ex |
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  1376
            ^ nil
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  1377
        ]
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  1378
        do:[
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  1379
            ^ (IPSocketAddress hostAddress:addrByteArray) hostName
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  1380
        ]
126
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
  1381
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
  1382
    "
1485
d8578cf3504b gcc3.3.1 insn-scheduler bug workaround
Claus Gittinger <cg@exept.de>
parents: 1474
diff changeset
  1383
     Socket ipAddressOfHost:'clam'
d8578cf3504b gcc3.3.1 insn-scheduler bug workaround
Claus Gittinger <cg@exept.de>
parents: 1474
diff changeset
  1384
     Socket hostWithIpAddress:(Socket ipAddressOfHost:'clam')
d8578cf3504b gcc3.3.1 insn-scheduler bug workaround
Claus Gittinger <cg@exept.de>
parents: 1474
diff changeset
  1385
     Socket ipAddressOfHost:'porty'
1278
7251c65b8d38 use nameLookup from SocketAddress for all addr-families
Claus Gittinger <cg@exept.de>
parents: 1274
diff changeset
  1386
     Socket hostWithIpAddress:(Socket ipAddressOfHost:'porty')
1485
d8578cf3504b gcc3.3.1 insn-scheduler bug workaround
Claus Gittinger <cg@exept.de>
parents: 1474
diff changeset
  1387
     Socket hostWithIpAddress:#[1 2 3 4]
d8578cf3504b gcc3.3.1 insn-scheduler bug workaround
Claus Gittinger <cg@exept.de>
parents: 1474
diff changeset
  1388
     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
  1389
     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
  1390
     Socket hostWithIpAddress:(Socket ipAddressOfHost:'www.altavista.com')
126
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
  1391
     "
4320
5b7848099dea #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 4293
diff changeset
  1392
5b7848099dea #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 4293
diff changeset
  1393
    "Modified (comment): / 13-02-2017 / 20:31:01 / cg"
126
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
  1394
!
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
  1395
1278
7251c65b8d38 use nameLookup from SocketAddress for all addr-families
Claus Gittinger <cg@exept.de>
parents: 1274
diff changeset
  1396
hostWithIpV6Address:addrByteArray
1911
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
  1397
    <resource: #obsolete>
820
b6860c3660c8 Fix address sizes when calling gethostbyaddr
Stefan Vogel <sv@exept.de>
parents: 819
diff changeset
  1398
    "return the hostname for an IPv6 (internet-) address.
b6860c3660c8 Fix address sizes when calling gethostbyaddr
Stefan Vogel <sv@exept.de>
parents: 819
diff changeset
  1399
     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
  1400
     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
  1401
     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
  1402
     This is the reverse operation to #ipV6AddressOfHost:."
b6860c3660c8 Fix address sizes when calling gethostbyaddr
Stefan Vogel <sv@exept.de>
parents: 819
diff changeset
  1403
1485
d8578cf3504b gcc3.3.1 insn-scheduler bug workaround
Claus Gittinger <cg@exept.de>
parents: 1474
diff changeset
  1404
    NameLookupError
5452
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  1405
        handle:[:ex |
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  1406
            ^ nil
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  1407
        ]
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  1408
        do:[
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  1409
            ^ (IPv6SocketAddress hostAddress:addrByteArray) hostName
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  1410
        ]
820
b6860c3660c8 Fix address sizes when calling gethostbyaddr
Stefan Vogel <sv@exept.de>
parents: 819
diff changeset
  1411
b6860c3660c8 Fix address sizes when calling gethostbyaddr
Stefan Vogel <sv@exept.de>
parents: 819
diff changeset
  1412
    "
1485
d8578cf3504b gcc3.3.1 insn-scheduler bug workaround
Claus Gittinger <cg@exept.de>
parents: 1474
diff changeset
  1413
     Socket ipV6AddressOfHost:'clam'
d8578cf3504b gcc3.3.1 insn-scheduler bug workaround
Claus Gittinger <cg@exept.de>
parents: 1474
diff changeset
  1414
     Socket hostWithIpV6Address:(Socket ipAddressOfHost:'clam')
d8578cf3504b gcc3.3.1 insn-scheduler bug workaround
Claus Gittinger <cg@exept.de>
parents: 1474
diff changeset
  1415
     Socket ipV6AddressOfHost:'porty'
d8578cf3504b gcc3.3.1 insn-scheduler bug workaround
Claus Gittinger <cg@exept.de>
parents: 1474
diff changeset
  1416
     Socket hostWithIpV6Address:(Socket ipAddressOfHost:'porty')
d8578cf3504b gcc3.3.1 insn-scheduler bug workaround
Claus Gittinger <cg@exept.de>
parents: 1474
diff changeset
  1417
     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
  1418
     Socket ipV6AddressOfHost:'www.exept.de'
820
b6860c3660c8 Fix address sizes when calling gethostbyaddr
Stefan Vogel <sv@exept.de>
parents: 819
diff changeset
  1419
     "
4320
5b7848099dea #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 4293
diff changeset
  1420
5b7848099dea #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 4293
diff changeset
  1421
    "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
  1422
!
b6860c3660c8 Fix address sizes when calling gethostbyaddr
Stefan Vogel <sv@exept.de>
parents: 819
diff changeset
  1423
6
claus
parents: 4
diff changeset
  1424
ipAddressOfHost:aHostName
1911
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
  1425
    <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
  1426
    "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
  1427
     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
  1428
     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
  1429
     This is the reverse operation to #hostWithIpAddress:."
6
claus
parents: 4
diff changeset
  1430
1485
d8578cf3504b gcc3.3.1 insn-scheduler bug workaround
Claus Gittinger <cg@exept.de>
parents: 1474
diff changeset
  1431
    NameLookupError
5452
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  1432
        handle:[:ex |
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  1433
            ^ nil
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  1434
        ]
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  1435
        do:[
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  1436
            ^ (IPSocketAddress hostName:aHostName) address
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  1437
        ]
21
33eb5ffad09d *** empty log message ***
claus
parents: 8
diff changeset
  1438
71
claus
parents: 63
diff changeset
  1439
    "
1485
d8578cf3504b gcc3.3.1 insn-scheduler bug workaround
Claus Gittinger <cg@exept.de>
parents: 1474
diff changeset
  1440
     Socket ipAddressOfHost:'localhost'
d8578cf3504b gcc3.3.1 insn-scheduler bug workaround
Claus Gittinger <cg@exept.de>
parents: 1474
diff changeset
  1441
     Socket ipAddressOfHost:'exept'
d8578cf3504b gcc3.3.1 insn-scheduler bug workaround
Claus Gittinger <cg@exept.de>
parents: 1474
diff changeset
  1442
     Socket ipAddressOfHost:'1.2.3.4'
1274
f257a1b16b4d use naemLookup from SocketAddress for ipv6
Claus Gittinger <cg@exept.de>
parents: 1263
diff changeset
  1443
     Socket ipAddressOfHost:'193.15.16.17'
1485
d8578cf3504b gcc3.3.1 insn-scheduler bug workaround
Claus Gittinger <cg@exept.de>
parents: 1474
diff changeset
  1444
     Socket ipAddressOfHost:'josef'
d8578cf3504b gcc3.3.1 insn-scheduler bug workaround
Claus Gittinger <cg@exept.de>
parents: 1474
diff changeset
  1445
     Socket ipAddressOfHost:'styx.com'
d8578cf3504b gcc3.3.1 insn-scheduler bug workaround
Claus Gittinger <cg@exept.de>
parents: 1474
diff changeset
  1446
     Socket hostWithIpAddress:(Socket ipAddressOfHost:'localhost')
d8578cf3504b gcc3.3.1 insn-scheduler bug workaround
Claus Gittinger <cg@exept.de>
parents: 1474
diff changeset
  1447
     Socket ipAddressOfHost:(Socket hostWithIpAddress:'127.0.0.1')
71
claus
parents: 63
diff changeset
  1448
    "
819
4cc15700d123 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 817
diff changeset
  1449
!
4cc15700d123 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 817
diff changeset
  1450
4cc15700d123 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 817
diff changeset
  1451
ipV6AddressOfHost:aHostName
1911
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
  1452
    <resource: #obsolete>
819
4cc15700d123 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 817
diff changeset
  1453
    "return the IPv6 (internet-) number for a hostname as a byteArray,
4cc15700d123 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 817
diff changeset
  1454
     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
  1455
     If the host is unknown, return nil.
4cc15700d123 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 817
diff changeset
  1456
     This is the reverse operation to #hostWithIpV6Address:."
4cc15700d123 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 817
diff changeset
  1457
1485
d8578cf3504b gcc3.3.1 insn-scheduler bug workaround
Claus Gittinger <cg@exept.de>
parents: 1474
diff changeset
  1458
    NameLookupError
5452
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  1459
        handle:[:ex |
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  1460
            ^ nil
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  1461
        ]
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  1462
        do:[
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  1463
            ^ (IPv6SocketAddress hostName:aHostName) address
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  1464
        ]
819
4cc15700d123 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 817
diff changeset
  1465
4cc15700d123 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 817
diff changeset
  1466
    "
1485
d8578cf3504b gcc3.3.1 insn-scheduler bug workaround
Claus Gittinger <cg@exept.de>
parents: 1474
diff changeset
  1467
     Socket ipV6AddressOfHost:'localhost'
d8578cf3504b gcc3.3.1 insn-scheduler bug workaround
Claus Gittinger <cg@exept.de>
parents: 1474
diff changeset
  1468
     Socket ipV6AddressOfHost:'exept'
d8578cf3504b gcc3.3.1 insn-scheduler bug workaround
Claus Gittinger <cg@exept.de>
parents: 1474
diff changeset
  1469
     Socket ipV6AddressOfHost:'exept.exept.de'
d8578cf3504b gcc3.3.1 insn-scheduler bug workaround
Claus Gittinger <cg@exept.de>
parents: 1474
diff changeset
  1470
     Socket ipV6AddressOfHost:'www.google.de'
d8578cf3504b gcc3.3.1 insn-scheduler bug workaround
Claus Gittinger <cg@exept.de>
parents: 1474
diff changeset
  1471
     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
  1472
     Socket ipV6AddressOfHost:'josef'
d8578cf3504b gcc3.3.1 insn-scheduler bug workaround
Claus Gittinger <cg@exept.de>
parents: 1474
diff changeset
  1473
     Socket ipV6AddressOfHost:'styx.com'
d8578cf3504b gcc3.3.1 insn-scheduler bug workaround
Claus Gittinger <cg@exept.de>
parents: 1474
diff changeset
  1474
     Socket hostWithIpV6Address:(Socket ipV6AddressOfHost:'localhost')
d8578cf3504b gcc3.3.1 insn-scheduler bug workaround
Claus Gittinger <cg@exept.de>
parents: 1474
diff changeset
  1475
     Socket ipV6AddressOfHost:(Socket hostV6WithIpAddress:'127.0.0.1')
819
4cc15700d123 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 817
diff changeset
  1476
    "
531
ca4c73813531 category changes
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
  1477
! !
ca4c73813531 category changes
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
  1478
ca4c73813531 category changes
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
  1479
!Socket class methodsFor:'queries'!
ca4c73813531 category changes
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
  1480
1260
9a8fb2391174 instance creation of peer refactored
Claus Gittinger <cg@exept.de>
parents: 1235
diff changeset
  1481
peerFromDomain:domain name:peerName port:port
9a8fb2391174 instance creation of peer refactored
Claus Gittinger <cg@exept.de>
parents: 1235
diff changeset
  1482
    |addrClass|
9a8fb2391174 instance creation of peer refactored
Claus Gittinger <cg@exept.de>
parents: 1235
diff changeset
  1483
9a8fb2391174 instance creation of peer refactored
Claus Gittinger <cg@exept.de>
parents: 1235
diff changeset
  1484
    addrClass := self socketAddressClassForDomain:domain.
1263
23161346a162 no longer callBack into sockets getHostName/getAddress code.
Claus Gittinger <cg@exept.de>
parents: 1260
diff changeset
  1485
    ^ 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
  1486
!
7e5f2f6b177d getHostByAddr - call is now done lazy, when the socket is asked for the peer
Claus Gittinger <cg@exept.de>
parents: 1186
diff changeset
  1487
7e5f2f6b177d getHostByAddr - call is now done lazy, when the socket is asked for the peer
Claus Gittinger <cg@exept.de>
parents: 1186
diff changeset
  1488
peerNameFromDomain:domain peer:peer
1260
9a8fb2391174 instance creation of peer refactored
Claus Gittinger <cg@exept.de>
parents: 1235
diff changeset
  1489
    |addrClass|
9a8fb2391174 instance creation of peer refactored
Claus Gittinger <cg@exept.de>
parents: 1235
diff changeset
  1490
9a8fb2391174 instance creation of peer refactored
Claus Gittinger <cg@exept.de>
parents: 1235
diff changeset
  1491
    addrClass := self socketAddressClassForDomain:domain.
9a8fb2391174 instance creation of peer refactored
Claus Gittinger <cg@exept.de>
parents: 1235
diff changeset
  1492
    ^ 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
  1493
!
7e5f2f6b177d getHostByAddr - call is now done lazy, when the socket is asked for the peer
Claus Gittinger <cg@exept.de>
parents: 1186
diff changeset
  1494
0
1cf8d1747859 Initial revision
claus
parents:
diff changeset
  1495
portOfService:aNameOrNumber
819
4cc15700d123 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 817
diff changeset
  1496
    "returns the port-number for a given IP-service
0
1cf8d1747859 Initial revision
claus
parents:
diff changeset
  1497
     or nil if no such service exists;
1cf8d1747859 Initial revision
claus
parents:
diff changeset
  1498
     - used to convert service names to portNumbers"
1cf8d1747859 Initial revision
claus
parents:
diff changeset
  1499
91
Claus Gittinger <cg@exept.de>
parents: 85
diff changeset
  1500
    ^ self portOfService:aNameOrNumber protocol:nil
Claus Gittinger <cg@exept.de>
parents: 85
diff changeset
  1501
28
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1502
    "
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1503
     Socket portOfService:'finger'
1485
d8578cf3504b gcc3.3.1 insn-scheduler bug workaround
Claus Gittinger <cg@exept.de>
parents: 1474
diff changeset
  1504
     Socket portOfService:'nntp'
d8578cf3504b gcc3.3.1 insn-scheduler bug workaround
Claus Gittinger <cg@exept.de>
parents: 1474
diff changeset
  1505
     Socket portOfService:'echo'
d8578cf3504b gcc3.3.1 insn-scheduler bug workaround
Claus Gittinger <cg@exept.de>
parents: 1474
diff changeset
  1506
     Socket portOfService:'snmp'
28
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1507
    "
0
1cf8d1747859 Initial revision
claus
parents:
diff changeset
  1508
!
1cf8d1747859 Initial revision
claus
parents:
diff changeset
  1509
91
Claus Gittinger <cg@exept.de>
parents: 85
diff changeset
  1510
portOfService:aNameOrNumber protocol:aProtocol
819
4cc15700d123 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 817
diff changeset
  1511
    "returns the port-number for a given IP-service
91
Claus Gittinger <cg@exept.de>
parents: 85
diff changeset
  1512
     or nil if no such service exists;
Claus Gittinger <cg@exept.de>
parents: 85
diff changeset
  1513
     - used to convert service names to portNumbers"
Claus Gittinger <cg@exept.de>
parents: 85
diff changeset
  1514
2909
aacef77a1697 64bit fixes
Claus Gittinger <cg@exept.de>
parents: 2904
diff changeset
  1515
%{ /* UNLIMITEDSTACK(noWIN32) */
418
317e55c6c281 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 403
diff changeset
  1516
#ifndef NO_SOCKET
91
Claus Gittinger <cg@exept.de>
parents: 85
diff changeset
  1517
    struct servent *servent = NULL;
Claus Gittinger <cg@exept.de>
parents: 85
diff changeset
  1518
    char *protocol;
Claus Gittinger <cg@exept.de>
parents: 85
diff changeset
  1519
    int tryBoth = 0;
524
8287da54eccf more empty code for other domains;
Claus Gittinger <cg@exept.de>
parents: 513
diff changeset
  1520
    short portNo;
91
Claus Gittinger <cg@exept.de>
parents: 85
diff changeset
  1521
604
b302a21afece Remove redundant code.
Stefan Vogel <sv@exept.de>
parents: 589
diff changeset
  1522
    if (__isSmallInteger(aNameOrNumber)) {
5452
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  1523
        RETURN ( aNameOrNumber );
92
Claus Gittinger <cg@exept.de>
parents: 91
diff changeset
  1524
    }
Claus Gittinger <cg@exept.de>
parents: 91
diff changeset
  1525
2331
b5280e1b3b9f changed:
Stefan Vogel <sv@exept.de>
parents: 2327
diff changeset
  1526
    if (__isStringLike(aProtocol)) {
5452
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  1527
        protocol = (char *)__stringVal(aProtocol);
604
b302a21afece Remove redundant code.
Stefan Vogel <sv@exept.de>
parents: 589
diff changeset
  1528
    } else {
5452
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  1529
        protocol = "tcp";
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  1530
        tryBoth = 1;
91
Claus Gittinger <cg@exept.de>
parents: 85
diff changeset
  1531
    }
524
8287da54eccf more empty code for other domains;
Claus Gittinger <cg@exept.de>
parents: 513
diff changeset
  1532
2331
b5280e1b3b9f changed:
Stefan Vogel <sv@exept.de>
parents: 2327
diff changeset
  1533
    if (__isStringLike(aNameOrNumber)) {
5452
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  1534
        servent = getservbyname((char *) __stringVal(aNameOrNumber), protocol);
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  1535
        if (servent != NULL) {
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  1536
            RETURN ( __MKSMALLINT(ntohs(servent->s_port)) );
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  1537
        }
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  1538
        if (tryBoth) {
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  1539
            servent = getservbyname((char *) __stringVal(aNameOrNumber), "udp");
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  1540
            if (servent != NULL) {
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  1541
                RETURN ( __MKSMALLINT(ntohs(servent->s_port)) );
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  1542
            }
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  1543
        }
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  1544
        RETURN ( nil );
91
Claus Gittinger <cg@exept.de>
parents: 85
diff changeset
  1545
    }
418
317e55c6c281 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 403
diff changeset
  1546
#endif
91
Claus Gittinger <cg@exept.de>
parents: 85
diff changeset
  1547
    RETURN ( nil );
Claus Gittinger <cg@exept.de>
parents: 85
diff changeset
  1548
%}
Claus Gittinger <cg@exept.de>
parents: 85
diff changeset
  1549
    "
Claus Gittinger <cg@exept.de>
parents: 85
diff changeset
  1550
     Socket portOfService:'echo' protocol:'udp'
Claus Gittinger <cg@exept.de>
parents: 85
diff changeset
  1551
     Socket portOfService:'echo' protocol:'tcp'
Claus Gittinger <cg@exept.de>
parents: 85
diff changeset
  1552
    "
Claus Gittinger <cg@exept.de>
parents: 85
diff changeset
  1553
!
Claus Gittinger <cg@exept.de>
parents: 85
diff changeset
  1554
0
1cf8d1747859 Initial revision
claus
parents:
diff changeset
  1555
protocolOfService:aNameOrNumber
819
4cc15700d123 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 817
diff changeset
  1556
    "returns the protocol (as string) for a given IP-service
28
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1557
     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
  1558
92005eec5c9d fixed moving-object-when-interrupted-with-scavenge bugs;
Claus Gittinger <cg@exept.de>
parents: 1503
diff changeset
  1559
%{  /* UNLIMITEDSTACK(noWIN32) */
418
317e55c6c281 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 403
diff changeset
  1560
#ifndef NO_SOCKET
0
1cf8d1747859 Initial revision
claus
parents:
diff changeset
  1561
    struct servent *servent = NULL;
524
8287da54eccf more empty code for other domains;
Claus Gittinger <cg@exept.de>
parents: 513
diff changeset
  1562
    short portNo;
0
1cf8d1747859 Initial revision
claus
parents:
diff changeset
  1563
58
bd6753bf0401 *** empty log message ***
claus
parents: 51
diff changeset
  1564
    if (__isSmallInteger(aNameOrNumber)) {
5452
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  1565
        portNo = __intVal(aNameOrNumber);
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  1566
        servent = getservbyport(htons(portNo), "tcp") ;
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  1567
        if (servent == NULL) {
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  1568
            servent = getservbyport(htons(portNo), "udp") ;
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  1569
            if (servent == NULL) {
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  1570
                RETURN ( nil );
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  1571
            }
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  1572
        }
0
1cf8d1747859 Initial revision
claus
parents:
diff changeset
  1573
    } else {
5452
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  1574
        if (__isStringLike(aNameOrNumber)) {
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  1575
            servent = getservbyname((char *) __stringVal(aNameOrNumber), "tcp");
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  1576
            if (servent == NULL) {
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  1577
                servent = getservbyname((char *) __stringVal(aNameOrNumber), "udp");
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  1578
                if (servent == NULL) {
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  1579
                    RETURN ( nil );
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  1580
                }
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  1581
            }
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  1582
        }
0
1cf8d1747859 Initial revision
claus
parents:
diff changeset
  1583
    }
1cf8d1747859 Initial revision
claus
parents:
diff changeset
  1584
    if (servent) {
5452
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  1585
        RETURN ( __MKSTRING(servent->s_proto) );
0
1cf8d1747859 Initial revision
claus
parents:
diff changeset
  1586
    }
1504
92005eec5c9d fixed moving-object-when-interrupted-with-scavenge bugs;
Claus Gittinger <cg@exept.de>
parents: 1503
diff changeset
  1587
#endif /* !NO_SOCKET */
0
1cf8d1747859 Initial revision
claus
parents:
diff changeset
  1588
    RETURN ( nil );
1cf8d1747859 Initial revision
claus
parents:
diff changeset
  1589
%}
28
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1590
    "
1485
d8578cf3504b gcc3.3.1 insn-scheduler bug workaround
Claus Gittinger <cg@exept.de>
parents: 1474
diff changeset
  1591
     Socket protocolOfService:'finger'
d8578cf3504b gcc3.3.1 insn-scheduler bug workaround
Claus Gittinger <cg@exept.de>
parents: 1474
diff changeset
  1592
     Socket protocolOfService:'nntp'
28
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1593
     Socket protocolOfService:'xxx'
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1594
     Socket protocolOfService:79
1485
d8578cf3504b gcc3.3.1 insn-scheduler bug workaround
Claus Gittinger <cg@exept.de>
parents: 1474
diff changeset
  1595
     Socket protocolOfService:'snmp'
28
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1596
    "
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1597
!
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1598
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
  1599
socketAddressClassForDomain:domain
1230
2cfb8c270cb5 more functionality moved to SocketAccessor
Claus Gittinger <cg@exept.de>
parents: 1224
diff changeset
  1600
    ^ SocketAddress knownClassFromCode:domain
2cfb8c270cb5 more functionality moved to SocketAccessor
Claus Gittinger <cg@exept.de>
parents: 1224
diff changeset
  1601
2cfb8c270cb5 more functionality moved to SocketAccessor
Claus Gittinger <cg@exept.de>
parents: 1224
diff changeset
  1602
    "
3059
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  1603
     self socketAddressClassForDomain:#AF_INET
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  1604
     self socketAddressClassForDomain:#AF_UNIX
1230
2cfb8c270cb5 more functionality moved to SocketAccessor
Claus Gittinger <cg@exept.de>
parents: 1224
diff changeset
  1605
    "
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
  1606
!
7e5f2f6b177d getHostByAddr - call is now done lazy, when the socket is asked for the peer
Claus Gittinger <cg@exept.de>
parents: 1186
diff changeset
  1607
532
f997c3873602 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 531
diff changeset
  1608
supportedProtocolFamilies
f997c3873602 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 531
diff changeset
  1609
    "return a collection of supported protocol families.
f997c3873602 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 531
diff changeset
  1610
     This list specifies what the Socket class supports -
f997c3873602 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 531
diff changeset
  1611
     socket creation may still fail, if your system was built
f997c3873602 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 531
diff changeset
  1612
     without it."
f997c3873602 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 531
diff changeset
  1613
1280
b973855bfe74 moved all socket constant queries from SocketHandle
Claus Gittinger <cg@exept.de>
parents: 1278
diff changeset
  1614
    ^ OperatingSystem supportedProtocolFamilies
532
f997c3873602 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 531
diff changeset
  1615
f997c3873602 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 531
diff changeset
  1616
    "
f997c3873602 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 531
diff changeset
  1617
     Socket supportedProtocolFamilies
f997c3873602 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 531
diff changeset
  1618
    "
559
61012867ebed cleanup if #connect is interrupted
Claus Gittinger <cg@exept.de>
parents: 551
diff changeset
  1619
!
61012867ebed cleanup if #connect is interrupted
Claus Gittinger <cg@exept.de>
parents: 551
diff changeset
  1620
61012867ebed cleanup if #connect is interrupted
Claus Gittinger <cg@exept.de>
parents: 551
diff changeset
  1621
typeOfProtocol:aProtocol
61012867ebed cleanup if #connect is interrupted
Claus Gittinger <cg@exept.de>
parents: 551
diff changeset
  1622
    "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
  1623
     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
  1624
61012867ebed cleanup if #connect is interrupted
Claus Gittinger <cg@exept.de>
parents: 551
diff changeset
  1625
    (aProtocol = 'tcp') ifTrue:[^ #stream].
61012867ebed cleanup if #connect is interrupted
Claus Gittinger <cg@exept.de>
parents: 551
diff changeset
  1626
    (aProtocol = 'udp') ifTrue:[^ #datagram].
61012867ebed cleanup if #connect is interrupted
Claus Gittinger <cg@exept.de>
parents: 551
diff changeset
  1627
    (aProtocol = 'ip')  ifTrue:[^ #raw].
61012867ebed cleanup if #connect is interrupted
Claus Gittinger <cg@exept.de>
parents: 551
diff changeset
  1628
    "
61012867ebed cleanup if #connect is interrupted
Claus Gittinger <cg@exept.de>
parents: 551
diff changeset
  1629
     unix domain
61012867ebed cleanup if #connect is interrupted
Claus Gittinger <cg@exept.de>
parents: 551
diff changeset
  1630
    "
61012867ebed cleanup if #connect is interrupted
Claus Gittinger <cg@exept.de>
parents: 551
diff changeset
  1631
    (aProtocol = 'ud')  ifTrue:[^ #stream].
61012867ebed cleanup if #connect is interrupted
Claus Gittinger <cg@exept.de>
parents: 551
diff changeset
  1632
    "
61012867ebed cleanup if #connect is interrupted
Claus Gittinger <cg@exept.de>
parents: 551
diff changeset
  1633
     add x25 stuff (if any) here ...
61012867ebed cleanup if #connect is interrupted
Claus Gittinger <cg@exept.de>
parents: 551
diff changeset
  1634
    "
61012867ebed cleanup if #connect is interrupted
Claus Gittinger <cg@exept.de>
parents: 551
diff changeset
  1635
    "
61012867ebed cleanup if #connect is interrupted
Claus Gittinger <cg@exept.de>
parents: 551
diff changeset
  1636
     add appletalk stuff (if any) here ...
61012867ebed cleanup if #connect is interrupted
Claus Gittinger <cg@exept.de>
parents: 551
diff changeset
  1637
    "
61012867ebed cleanup if #connect is interrupted
Claus Gittinger <cg@exept.de>
parents: 551
diff changeset
  1638
    "
61012867ebed cleanup if #connect is interrupted
Claus Gittinger <cg@exept.de>
parents: 551
diff changeset
  1639
     add other stuff (if any) here ...
61012867ebed cleanup if #connect is interrupted
Claus Gittinger <cg@exept.de>
parents: 551
diff changeset
  1640
    "
61012867ebed cleanup if #connect is interrupted
Claus Gittinger <cg@exept.de>
parents: 551
diff changeset
  1641
    ^ nil
61012867ebed cleanup if #connect is interrupted
Claus Gittinger <cg@exept.de>
parents: 551
diff changeset
  1642
61012867ebed cleanup if #connect is interrupted
Claus Gittinger <cg@exept.de>
parents: 551
diff changeset
  1643
    "
61012867ebed cleanup if #connect is interrupted
Claus Gittinger <cg@exept.de>
parents: 551
diff changeset
  1644
     Socket typeOfProtocol:'tcp'
61012867ebed cleanup if #connect is interrupted
Claus Gittinger <cg@exept.de>
parents: 551
diff changeset
  1645
     Socket typeOfProtocol:'ucp'
61012867ebed cleanup if #connect is interrupted
Claus Gittinger <cg@exept.de>
parents: 551
diff changeset
  1646
     Socket typeOfProtocol:(Socket protocolOfService:'nntp')
61012867ebed cleanup if #connect is interrupted
Claus Gittinger <cg@exept.de>
parents: 551
diff changeset
  1647
     Socket typeOfProtocol:(Socket protocolOfService:'echo')
61012867ebed cleanup if #connect is interrupted
Claus Gittinger <cg@exept.de>
parents: 551
diff changeset
  1648
    "
28
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1649
! !
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1650
1202
c52279df60d8 method category rename
Claus Gittinger <cg@exept.de>
parents: 1187
diff changeset
  1651
!Socket methodsFor:'Compatibility-Dolphin'!
1110
0876a3d30fd2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1035
diff changeset
  1652
0876a3d30fd2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1035
diff changeset
  1653
setReceiveTimeout: milliseconds
0876a3d30fd2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1035
diff changeset
  1654
    self receiveTimeout:(milliseconds / 1000)
0876a3d30fd2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1035
diff changeset
  1655
!
0876a3d30fd2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1035
diff changeset
  1656
0876a3d30fd2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1035
diff changeset
  1657
setSendTimeout: milliseconds
0876a3d30fd2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1035
diff changeset
  1658
    self sendTimeout:(milliseconds / 1000)
0876a3d30fd2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1035
diff changeset
  1659
! !
0876a3d30fd2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1035
diff changeset
  1660
1202
c52279df60d8 method category rename
Claus Gittinger <cg@exept.de>
parents: 1187
diff changeset
  1661
!Socket methodsFor:'Compatibility-ST80'!
28
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1662
887
2b2dc6b59b5a more VW compatibility
Claus Gittinger <cg@exept.de>
parents: 876
diff changeset
  1663
acceptNonBlock
2b2dc6b59b5a more VW compatibility
Claus Gittinger <cg@exept.de>
parents: 876
diff changeset
  1664
    ^ self accept
2b2dc6b59b5a more VW compatibility
Claus Gittinger <cg@exept.de>
parents: 876
diff changeset
  1665
!
2b2dc6b59b5a more VW compatibility
Claus Gittinger <cg@exept.de>
parents: 876
diff changeset
  1666
1485
d8578cf3504b gcc3.3.1 insn-scheduler bug workaround
Claus Gittinger <cg@exept.de>
parents: 1474
diff changeset
  1667
ioConnection
887
2b2dc6b59b5a more VW compatibility
Claus Gittinger <cg@exept.de>
parents: 876
diff changeset
  1668
    ^ self
2b2dc6b59b5a more VW compatibility
Claus Gittinger <cg@exept.de>
parents: 876
diff changeset
  1669
!
2b2dc6b59b5a more VW compatibility
Claus Gittinger <cg@exept.de>
parents: 876
diff changeset
  1670
126
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
  1671
notReadySignal
781
4d61e7588ff3 added #waitForNewConnectionOrDataOnAny:timeout:
Claus Gittinger <cg@exept.de>
parents: 776
diff changeset
  1672
    "ST-80 mimicry.
4d61e7588ff3 added #waitForNewConnectionOrDataOnAny:timeout:
Claus Gittinger <cg@exept.de>
parents: 776
diff changeset
  1673
     for now - this is not yet raised"
71
claus
parents: 63
diff changeset
  1674
126
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
  1675
    ^ Signal new
486
ed4e215e83ef ST-80 mimicry
Claus Gittinger <cg@exept.de>
parents: 470
diff changeset
  1676
!
ed4e215e83ef ST-80 mimicry
Claus Gittinger <cg@exept.de>
parents: 470
diff changeset
  1677
576
13acab81fad0 more ST80 compatibility
ca
parents: 572
diff changeset
  1678
readAppendStream
781
4d61e7588ff3 added #waitForNewConnectionOrDataOnAny:timeout:
Claus Gittinger <cg@exept.de>
parents: 776
diff changeset
  1679
    "ST-80 mimicry.
4293
82b9928ddcae #OTHER by mawalch
mawalch
parents: 4288
diff changeset
  1680
     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
  1681
     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
  1682
     the actual stream.
781
4d61e7588ff3 added #waitForNewConnectionOrDataOnAny:timeout:
Claus Gittinger <cg@exept.de>
parents: 776
diff changeset
  1683
     In ST/X, sockets inherit from stream, so
4d61e7588ff3 added #waitForNewConnectionOrDataOnAny:timeout:
Claus Gittinger <cg@exept.de>
parents: 776
diff changeset
  1684
     this method returns the receiver, for transparency"
4d61e7588ff3 added #waitForNewConnectionOrDataOnAny:timeout:
Claus Gittinger <cg@exept.de>
parents: 776
diff changeset
  1685
576
13acab81fad0 more ST80 compatibility
ca
parents: 572
diff changeset
  1686
    ^ self
13acab81fad0 more ST80 compatibility
ca
parents: 572
diff changeset
  1687
!
13acab81fad0 more ST80 compatibility
ca
parents: 572
diff changeset
  1688
486
ed4e215e83ef ST-80 mimicry
Claus Gittinger <cg@exept.de>
parents: 470
diff changeset
  1689
readStream
ed4e215e83ef ST-80 mimicry
Claus Gittinger <cg@exept.de>
parents: 470
diff changeset
  1690
    "ST-80 mimicry.
4293
82b9928ddcae #OTHER by mawalch
mawalch
parents: 4288
diff changeset
  1691
     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
  1692
     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
  1693
     the actual stream.
781
4d61e7588ff3 added #waitForNewConnectionOrDataOnAny:timeout:
Claus Gittinger <cg@exept.de>
parents: 776
diff changeset
  1694
     In ST/X, sockets inherit from stream, so
4d61e7588ff3 added #waitForNewConnectionOrDataOnAny:timeout:
Claus Gittinger <cg@exept.de>
parents: 776
diff changeset
  1695
     this method returns the receiver, for transparency"
486
ed4e215e83ef ST-80 mimicry
Claus Gittinger <cg@exept.de>
parents: 470
diff changeset
  1696
ed4e215e83ef ST-80 mimicry
Claus Gittinger <cg@exept.de>
parents: 470
diff changeset
  1697
    ^ self
ed4e215e83ef ST-80 mimicry
Claus Gittinger <cg@exept.de>
parents: 470
diff changeset
  1698
ed4e215e83ef ST-80 mimicry
Claus Gittinger <cg@exept.de>
parents: 470
diff changeset
  1699
    "Created: 24.1.1997 / 23:52:57 / cg"
ed4e215e83ef ST-80 mimicry
Claus Gittinger <cg@exept.de>
parents: 470
diff changeset
  1700
!
ed4e215e83ef ST-80 mimicry
Claus Gittinger <cg@exept.de>
parents: 470
diff changeset
  1701
ed4e215e83ef ST-80 mimicry
Claus Gittinger <cg@exept.de>
parents: 470
diff changeset
  1702
writeStream
ed4e215e83ef ST-80 mimicry
Claus Gittinger <cg@exept.de>
parents: 470
diff changeset
  1703
    "ST-80 mimicry.
4293
82b9928ddcae #OTHER by mawalch
mawalch
parents: 4288
diff changeset
  1704
     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
  1705
     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
  1706
     the actual stream.
781
4d61e7588ff3 added #waitForNewConnectionOrDataOnAny:timeout:
Claus Gittinger <cg@exept.de>
parents: 776
diff changeset
  1707
     In ST/X, sockets inherit from stream, so
4d61e7588ff3 added #waitForNewConnectionOrDataOnAny:timeout:
Claus Gittinger <cg@exept.de>
parents: 776
diff changeset
  1708
     this method returns the receiver, for transparency"
486
ed4e215e83ef ST-80 mimicry
Claus Gittinger <cg@exept.de>
parents: 470
diff changeset
  1709
ed4e215e83ef ST-80 mimicry
Claus Gittinger <cg@exept.de>
parents: 470
diff changeset
  1710
    ^ self
ed4e215e83ef ST-80 mimicry
Claus Gittinger <cg@exept.de>
parents: 470
diff changeset
  1711
ed4e215e83ef ST-80 mimicry
Claus Gittinger <cg@exept.de>
parents: 470
diff changeset
  1712
    "Created: 24.1.1997 / 10:34:35 / cg"
ed4e215e83ef ST-80 mimicry
Claus Gittinger <cg@exept.de>
parents: 470
diff changeset
  1713
    "Modified: 24.1.1997 / 23:52:52 / cg"
71
claus
parents: 63
diff changeset
  1714
! !
claus
parents: 63
diff changeset
  1715
1202
c52279df60d8 method category rename
Claus Gittinger <cg@exept.de>
parents: 1187
diff changeset
  1716
!Socket methodsFor:'Compatibility-Squeak'!
771
74abb04ef57c checkin from browser
Claus Gittinger <cg@exept.de>
parents: 752
diff changeset
  1717
1462
5602fce52b42 squeak stuff
Claus Gittinger <cg@exept.de>
parents: 1413
diff changeset
  1718
address
5602fce52b42 squeak stuff
Claus Gittinger <cg@exept.de>
parents: 1413
diff changeset
  1719
    ^ self getSocketAddress
5602fce52b42 squeak stuff
Claus Gittinger <cg@exept.de>
parents: 1413
diff changeset
  1720
!
5602fce52b42 squeak stuff
Claus Gittinger <cg@exept.de>
parents: 1413
diff changeset
  1721
2308
d8b410a4f38b added: #connectToHostNamed:port:
Claus Gittinger <cg@exept.de>
parents: 2292
diff changeset
  1722
connectToHostNamed:hostName port:portNr
d8b410a4f38b added: #connectToHostNamed:port:
Claus Gittinger <cg@exept.de>
parents: 2292
diff changeset
  1723
    self connectTo:hostName port:portNr
d8b410a4f38b added: #connectToHostNamed:port:
Claus Gittinger <cg@exept.de>
parents: 2292
diff changeset
  1724
!
d8b410a4f38b added: #connectToHostNamed:port:
Claus Gittinger <cg@exept.de>
parents: 2292
diff changeset
  1725
1462
5602fce52b42 squeak stuff
Claus Gittinger <cg@exept.de>
parents: 1413
diff changeset
  1726
dataAvailable
5602fce52b42 squeak stuff
Claus Gittinger <cg@exept.de>
parents: 1413
diff changeset
  1727
    ^ self canReadWithoutBlocking
5602fce52b42 squeak stuff
Claus Gittinger <cg@exept.de>
parents: 1413
diff changeset
  1728
!
5602fce52b42 squeak stuff
Claus Gittinger <cg@exept.de>
parents: 1413
diff changeset
  1729
1886
e0d23764c809 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1885
diff changeset
  1730
destroy
e0d23764c809 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1885
diff changeset
  1731
    self close
e0d23764c809 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1885
diff changeset
  1732
e0d23764c809 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1885
diff changeset
  1733
    "Created: / 04-06-2007 / 21:29:03 / cg"
e0d23764c809 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1885
diff changeset
  1734
!
e0d23764c809 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1885
diff changeset
  1735
1462
5602fce52b42 squeak stuff
Claus Gittinger <cg@exept.de>
parents: 1413
diff changeset
  1736
listenOn:aPortNr
1882
6f818f33c85a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1863
diff changeset
  1737
    self listenOn:aPortNr backlogSize:5
6f818f33c85a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1863
diff changeset
  1738
6f818f33c85a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1863
diff changeset
  1739
    "Modified: / 31-05-2007 / 17:59:53 / cg"
6f818f33c85a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1863
diff changeset
  1740
!
6f818f33c85a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1863
diff changeset
  1741
6f818f33c85a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1863
diff changeset
  1742
listenOn:aPortNr backlogSize:aNumber
1462
5602fce52b42 squeak stuff
Claus Gittinger <cg@exept.de>
parents: 1413
diff changeset
  1743
    self bindTo:aPortNr address:nil.
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  1744
    self listenFor:aNumber
1882
6f818f33c85a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1863
diff changeset
  1745
6f818f33c85a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1863
diff changeset
  1746
    "Created: / 31-05-2007 / 17:59:47 / cg"
1462
5602fce52b42 squeak stuff
Claus Gittinger <cg@exept.de>
parents: 1413
diff changeset
  1747
!
5602fce52b42 squeak stuff
Claus Gittinger <cg@exept.de>
parents: 1413
diff changeset
  1748
4587
caa262d036d2 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4570
diff changeset
  1749
noTimeout
caa262d036d2 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4570
diff changeset
  1750
    "disable timeouts - dummy for now"
caa262d036d2 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4570
diff changeset
  1751
5001
11cbbbcbc87e warnings
Claus Gittinger <cg@exept.de>
parents: 4961
diff changeset
  1752
    ^ self
4587
caa262d036d2 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4570
diff changeset
  1753
!
caa262d036d2 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4570
diff changeset
  1754
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  1755
peerName
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  1756
    "return my peer (i.e. ipAddr + port);
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  1757
     May return nil if not yet setup completely."
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  1758
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  1759
    ^ self getPeer
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  1760
!
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  1761
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  1762
sendData: aStringOrByteArray
3155
d1884a37375c Initialize in instance initialize method insted in #new
Stefan Vogel <sv@exept.de>
parents: 3152
diff changeset
  1763
    "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
  1764
     Return the number of bytes sent."
d1884a37375c Initialize in instance initialize method insted in #new
Stefan Vogel <sv@exept.de>
parents: 3152
diff changeset
  1765
d1884a37375c Initialize in instance initialize method insted in #new
Stefan Vogel <sv@exept.de>
parents: 3152
diff changeset
  1766
    ^ self nextPutBytes:aStringOrByteArray size from:aStringOrByteArray startingAt:1.
771
74abb04ef57c checkin from browser
Claus Gittinger <cg@exept.de>
parents: 752
diff changeset
  1767
! !
74abb04ef57c checkin from browser
Claus Gittinger <cg@exept.de>
parents: 752
diff changeset
  1768
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  1769
!Socket methodsFor:'accepting connections'!
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  1770
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  1771
accept
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  1772
    "create a new TCP socket from accepting on the receiver.
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  1773
     This method will suspend the current process if no connection is waiting.
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  1774
     For ST-80 compatibility"
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  1775
3633
3a21f142432e #REFACTORING
Stefan Vogel <sv@exept.de>
parents: 3620
diff changeset
  1776
    ^ self waitForNewConnectionWithTimeout:nil
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  1777
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  1778
    "
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  1779
     |sock newSock|
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  1780
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  1781
     sock := Socket provide:8004.
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  1782
     sock listenFor:5.
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  1783
     newSock := sock accept.
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  1784
    "
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
blockingAccept
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  1788
    "create a new TCP socket from accepting on the receiver.
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  1789
     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
  1790
     For ST-80 compatibility"
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  1791
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  1792
    |newSock|
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  1793
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  1794
    newSock := self class new.
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  1795
    (newSock primAcceptOn:self blocking:true) ifFalse:[
5452
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  1796
        "should raise an error here - primitive code raises a notification"
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  1797
        ^ nil
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  1798
    ].
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  1799
    ^ newSock
4568
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  1800
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  1801
    "Modified (format): / 19-01-2018 / 13:32:25 / stefan"
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  1802
! !
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
!Socket methodsFor:'binding'!
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  1805
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  1806
bindAnonymously
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  1807
    "bind to any address. A free port will be allocated.
4942
9f424bed67c4 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 4796
diff changeset
  1808
     Our own socket address will be determined after connection set up.
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  1809
     This is the default after the socket has been created"
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  1810
3059
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  1811
    ^ self bindTo:nil reuseAddress:false
2321
6f4cc7b644db filePointer -> handle migration
Claus Gittinger <cg@exept.de>
parents: 2308
diff changeset
  1812
6f4cc7b644db filePointer -> handle migration
Claus Gittinger <cg@exept.de>
parents: 2308
diff changeset
  1813
    "
1938
831af28cc848 comments
Stefan Vogel <sv@exept.de>
parents: 1935
diff changeset
  1814
      self newTCP bindAnonymously; listenFor:1; yourself
4206
ac9a6e096796 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4203
diff changeset
  1815
      self newTCP bindAnonymously; port
1938
831af28cc848 comments
Stefan Vogel <sv@exept.de>
parents: 1935
diff changeset
  1816
    "
4942
9f424bed67c4 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 4796
diff changeset
  1817
9f424bed67c4 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 4796
diff changeset
  1818
    "Modified (comment): / 08-05-2019 / 14:40:11 / Claus Gittinger"
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  1819
!
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  1820
3059
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  1821
bindAnonymouslyToAddress:aSocketAddress
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  1822
    "bind to address addressString.
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  1823
     A free port will be allocated"
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  1824
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  1825
    ^ self
5452
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  1826
        bindTo:0
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  1827
        address:aSocketAddress
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  1828
        reuseAddress:false
2321
6f4cc7b644db filePointer -> handle migration
Claus Gittinger <cg@exept.de>
parents: 2308
diff changeset
  1829
6f4cc7b644db filePointer -> handle migration
Claus Gittinger <cg@exept.de>
parents: 2308
diff changeset
  1830
    "
3059
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  1831
      self newTCP bindAnonymouslyToAddress:IPSocketAddress localHost; listenFor:1; yourself
1938
831af28cc848 comments
Stefan Vogel <sv@exept.de>
parents: 1935
diff changeset
  1832
    "
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  1833
!
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  1834
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  1835
bindTo:aSocketAddress
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  1836
    "ST80 compatible bind, expecting a socketAddress argument.
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  1837
     The socketAddress object (an instance of SocketAddress)
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  1838
     is supposed to respond to #portOrName and #address requests."
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  1839
3059
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  1840
    ^ self bindTo:aSocketAddress reuseAddress:true
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  1841
!
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  1842
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  1843
bindTo:portNrOrNameString address:addressString
3059
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  1844
    "Old interface: bind the socket to an address
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  1845
     - returns true if ok, false otherwise.
4568
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  1846
     Notify with a SocketErrorNotification on error.
3059
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  1847
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  1848
     The interpretation of hostOrPathNameOrSocketAddrOrNil portNrOrName depends on the domain:
5452
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  1849
        Best use a SocketAddress
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  1850
        For backward compatibility:
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  1851
            AF_INET domain can also use (4byte) byteArray like internet numbers,
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  1852
            AF_UNIX domain cab use pathname strings."
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  1853
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  1854
    ^ self
5452
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  1855
        bindTo:portNrOrNameString
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  1856
        address:addressString
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  1857
        reuseAddress:true
4568
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  1858
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  1859
    "Modified (comment): / 19-01-2018 / 13:36:54 / stefan"
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  1860
!
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  1861
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  1862
bindTo:portNrOrNameOrNil address:hostOrPathNameOrSocketAddrOrNil reuseAddress:reuse
3059
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  1863
    "Old interface: bind the socket to an address
4568
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  1864
     Notify with a SocketErrorNotification on error.
3059
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  1865
     - returns true if ok, false otherwise.
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  1866
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  1867
     The interpretation of hostOrPathNameOrSocketAddrOrNil portNrOrName depends on the domain:
5452
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  1868
        Best use a SocketAddress
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  1869
        For backward compatibility:
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  1870
            AF_INET domain can also use (4byte) byteArray like internet numbers,
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  1871
            AF_UNIX domain can use pathname strings.
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  1872
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  1873
     The reuse boolean argument controls if the SO_REUSEADDR socket option
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  1874
     is to be set (to avoid the 'bind: address in use' error).
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  1875
    "
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  1876
3059
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  1877
    |socketAddress|
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  1878
2321
6f4cc7b644db filePointer -> handle migration
Claus Gittinger <cg@exept.de>
parents: 2308
diff changeset
  1879
    handle isNil ifTrue:[
5452
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  1880
        ^ self errorNotOpen
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  1881
    ].
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  1882
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  1883
    hostOrPathNameOrSocketAddrOrNil isNil ifTrue:[
5452
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  1884
        socketAddress := self socketAddressClass anyHost.
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  1885
    ] ifFalse:[
5452
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  1886
        (hostOrPathNameOrSocketAddrOrNil isSocketAddress) ifTrue:[
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  1887
            socketAddress := hostOrPathNameOrSocketAddrOrNil.
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  1888
        ] ifFalse:[
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  1889
            "backward compatibility: support for byteArray and string arg"
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  1890
            hostOrPathNameOrSocketAddrOrNil isString ifTrue:[
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  1891
                socketAddress := self socketAddressClass hostName:hostOrPathNameOrSocketAddrOrNil.
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  1892
            ] ifFalse:[
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  1893
                hostOrPathNameOrSocketAddrOrNil isByteCollection ifFalse:[
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  1894
                    ^ self error:'bindTo: bad host (socketAddress) argument'
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  1895
                ].
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  1896
                socketAddress := self socketAddressClass hostAddress:hostOrPathNameOrSocketAddrOrNil.
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  1897
            ].
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  1898
        ].
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  1899
    ].
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  1900
    portNrOrNameOrNil notNil ifTrue:[
5452
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  1901
        socketAddress port:portNrOrNameOrNil.
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  1902
    ].
3059
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  1903
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  1904
    ^ self bindTo:socketAddress reuseAddress:reuse.
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  1905
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  1906
    "
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  1907
     (Socket domain:#'AF_INET' type:#stream)
5452
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  1908
         bindTo:2144 address:nil; yourself
3059
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  1909
    "
4568
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  1910
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  1911
    "Modified (comment): / 19-01-2018 / 13:37:13 / stefan"
3059
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  1912
!
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  1913
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  1914
bindTo:aSocketAddress reuseAddress:reuse
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  1915
    "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
  1916
     Notify with a SocketErrorNotification on error.
3059
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  1917
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  1918
     The reuse boolean argument controls if the SO_REUSEADDR socket option
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  1919
     is to be set (to avoid the 'bind: address in use' error).
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  1920
3137
df3e9cebf52c class: Socket
Stefan Vogel <sv@exept.de>
parents: 3127
diff changeset
  1921
     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
  1922
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  1923
    |ok error socketAddress|
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  1924
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  1925
    handle isNil ifTrue:[
5452
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  1926
        ^ self errorNotOpen
3059
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  1927
    ].
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  1928
    socketAddress := aSocketAddress.
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  1929
    socketAddress isNil ifTrue:[
5452
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  1930
        "ok, get an all zero socket address, so it is for anyHost
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  1931
         and the port will be assigned"
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  1932
        socketAddress := self socketAddressClass new.
3513
8105bf370769 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3485
diff changeset
  1933
    ].
8105bf370769 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3485
diff changeset
  1934
    domain == #'AF_INET6' ifTrue:[
5452
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  1935
        "accept also IPv4 connections on IPv6 sockets (this is off by default for windows"
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  1936
        self setSocketOption:#'IPV6_V6ONLY' argument:false argument:nil.
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  1937
    ].
2321
6f4cc7b644db filePointer -> handle migration
Claus Gittinger <cg@exept.de>
parents: 2308
diff changeset
  1938
    ok := false.
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  1939
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  1940
%{  /* STACK: 100000 */
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  1941
#ifndef NO_SOCKET
2321
6f4cc7b644db filePointer -> handle migration
Claus Gittinger <cg@exept.de>
parents: 2308
diff changeset
  1942
    OBJ fp = __INST(handle);
6f4cc7b644db filePointer -> handle migration
Claus Gittinger <cg@exept.de>
parents: 2308
diff changeset
  1943
    SOCKET sock;
6f4cc7b644db filePointer -> handle migration
Claus Gittinger <cg@exept.de>
parents: 2308
diff changeset
  1944
    union sockaddr_u sa;
6f4cc7b644db filePointer -> handle migration
Claus Gittinger <cg@exept.de>
parents: 2308
diff changeset
  1945
    int sockaddr_size;
2909
aacef77a1697 64bit fixes
Claus Gittinger <cg@exept.de>
parents: 2904
diff changeset
  1946
    INT ret;
2321
6f4cc7b644db filePointer -> handle migration
Claus Gittinger <cg@exept.de>
parents: 2308
diff changeset
  1947
    int sockAddrOffs;
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  1948
3059
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  1949
    if (fp == nil) {
5452
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  1950
        goto getOutOfHere;
2321
6f4cc7b644db filePointer -> handle migration
Claus Gittinger <cg@exept.de>
parents: 2308
diff changeset
  1951
    }
3059
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  1952
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  1953
    if (! __isBytes(socketAddress)) {
5452
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  1954
        error = __mkSmallInteger(-1);
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  1955
        goto getOutOfHere;
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  1956
    }
2321
6f4cc7b644db filePointer -> handle migration
Claus Gittinger <cg@exept.de>
parents: 2308
diff changeset
  1957
    /* get the socket-address */
3059
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  1958
    if (__isNonNilObject(socketAddress)){
5452
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  1959
        int nIndex;
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  1960
        OBJ cls = __qClass(socketAddress);
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  1961
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  1962
        sockAddrOffs = __OBJS2BYTES__(__intVal(__ClassInstPtr(cls)->c_ninstvars));
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  1963
        nIndex = __qSize(socketAddress) - OHDR_SIZE;
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  1964
        sockaddr_size = nIndex - sockAddrOffs;
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  1965
        if (sockaddr_size > sizeof(sa)) {
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  1966
            error=__mkSmallInteger(-2);
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  1967
            goto getOutOfHere;
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  1968
        }
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  1969
        memcpy(&sa, __byteArrayVal(socketAddress) + sockAddrOffs, sockaddr_size);
2321
6f4cc7b644db filePointer -> handle migration
Claus Gittinger <cg@exept.de>
parents: 2308
diff changeset
  1970
    }
6f4cc7b644db filePointer -> handle migration
Claus Gittinger <cg@exept.de>
parents: 2308
diff changeset
  1971
6f4cc7b644db filePointer -> handle migration
Claus Gittinger <cg@exept.de>
parents: 2308
diff changeset
  1972
    sock = SOCKET_FROM_FILE_OBJECT(fp);
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  1973
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  1974
# ifdef SO_REUSEADDR
2321
6f4cc7b644db filePointer -> handle migration
Claus Gittinger <cg@exept.de>
parents: 2308
diff changeset
  1975
    if (reuse == true) {
5452
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  1976
        int on = 1;
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  1977
        if (setsockopt(sock, SOL_SOCKET, SO_REUSEADDR, (char *) &on, sizeof (on)) < 0) {
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  1978
            DBGPRINTF(("SOCKET: setsockopt - SO_REUSEADDR failed\n"));
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  1979
        }
2321
6f4cc7b644db filePointer -> handle migration
Claus Gittinger <cg@exept.de>
parents: 2308
diff changeset
  1980
    }
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  1981
# endif /* SO_REUSEADDR */
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  1982
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  1983
# ifdef BIND_BLOCKS
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  1984
#  ifdef DO_WRAP_CALLS
2321
6f4cc7b644db filePointer -> handle migration
Claus Gittinger <cg@exept.de>
parents: 2308
diff changeset
  1985
    do {
5452
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  1986
        __threadErrno = 0;
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  1987
        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
  1988
    } while ((ret < 0) && (__threadErrno == EINTR));
3126
d95cc55a4fb5 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3123
diff changeset
  1989
    if (ret < 0) {
5452
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  1990
        errno = __threadErrno;
3126
d95cc55a4fb5 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3123
diff changeset
  1991
    }
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  1992
#  else
2321
6f4cc7b644db filePointer -> handle migration
Claus Gittinger <cg@exept.de>
parents: 2308
diff changeset
  1993
    __BEGIN_INTERRUPTABLE__
6f4cc7b644db filePointer -> handle migration
Claus Gittinger <cg@exept.de>
parents: 2308
diff changeset
  1994
    do {
5452
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  1995
        ret = bind(sock, (struct sockaddr *)&sa, sockaddr_size);
2321
6f4cc7b644db filePointer -> handle migration
Claus Gittinger <cg@exept.de>
parents: 2308
diff changeset
  1996
    } while ((ret < 0) && (errno == EINTR));
6f4cc7b644db filePointer -> handle migration
Claus Gittinger <cg@exept.de>
parents: 2308
diff changeset
  1997
    __END_INTERRUPTABLE__
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  1998
#  endif
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  1999
# else
3126
d95cc55a4fb5 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3123
diff changeset
  2000
    errno = 0;
2321
6f4cc7b644db filePointer -> handle migration
Claus Gittinger <cg@exept.de>
parents: 2308
diff changeset
  2001
    ret = bind(sock, (struct sockaddr *)&sa, sockaddr_size);
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2002
# endif
2321
6f4cc7b644db filePointer -> handle migration
Claus Gittinger <cg@exept.de>
parents: 2308
diff changeset
  2003
    if (ret < 0) {
3843
fbced69597a7 oops - error check was disabled
Claus Gittinger <cg@exept.de>
parents: 3742
diff changeset
  2004
# ifdef __win32__
5452
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  2005
        if (errno == 0) {
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  2006
            errno = WSAGetLastError();
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  2007
        }
3126
d95cc55a4fb5 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3123
diff changeset
  2008
# endif
5452
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  2009
        DBGPRINTF(("SOCKET: bind failed errno=%d\n", errno));
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  2010
        error = __INST(lastErrorNumber) = __MKSMALLINT(errno);
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  2011
        goto getOutOfHere;
2321
6f4cc7b644db filePointer -> handle migration
Claus Gittinger <cg@exept.de>
parents: 2308
diff changeset
  2012
    } else {
5452
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  2013
        ok = true;
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2014
    }
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2015
#endif /* NO_SOCKET */
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2016
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2017
getOutOfHere: ;
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2018
%}.
4234
eb1b470a27ee #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 4206
diff changeset
  2019
    ok ifFalse:[
5452
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  2020
        |errorHolder errorString|
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  2021
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  2022
        error isInteger ifTrue:[
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  2023
            errorHolder := OperatingSystem errorHolderForNumber:error.
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  2024
            errorString := errorHolder errorString.
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  2025
        ] ifFalse:[
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  2026
            errorString := error.
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  2027
        ].
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  2028
        OpenError newException
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  2029
            errorString:('cannot bind socket to address: %1 (%2)'
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  2030
                            bindWith:socketAddress
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  2031
                            with:errorString);
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  2032
            errorCode:error;
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  2033
            osErrorHolder:errorHolder;
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  2034
            parameter:self;
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  2035
            raiseRequest.
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  2036
        "maybe someone catches the error and binds to some other port..."
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  2037
        ^ true.
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2038
    ].
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2039
3059
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  2040
    port := socketAddress port.
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  2041
    port == 0 ifTrue:[
5452
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  2042
        "this is a bind to a random port, now we can get the real port"
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  2043
        port := self getFullSocketAddress port.
3059
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  2044
    ].
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2045
    ^ true
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2046
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2047
    "
3059
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  2048
     (Socket domain:#'AF_INET' type:#stream)
5452
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  2049
        bindTo:(IPSocketAddress anyHost port:445) reuseAddress:false;
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  2050
        yourself.
3059
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  2051
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  2052
     (Socket domain:#'AF_INET' type:#stream)
5452
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  2053
        bindTo:139 reuseAddress:false;
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  2054
        yourself.
3059
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  2055
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  2056
     (Socket domain:#'AF_INET6' type:#stream)
5452
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  2057
        bindTo:nil reuseAddress:false;
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  2058
        yourself.
3059
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  2059
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  2060
     (Socket domain:#'AF_INET' type:#stream)
5452
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  2061
        bindTo:(IPSocketAddress localHost port:2122) reuseAddress:false;
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  2062
        yourself.
3059
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  2063
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  2064
     (Socket domain:#'AF_UNIX' type:#stream)
5452
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  2065
        bindTo:nil reuseAddress:false;
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  2066
        yourself.
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2067
    "
4568
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  2068
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  2069
    "Modified: / 19-01-2018 / 13:37:21 / stefan"
4942
9f424bed67c4 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 4796
diff changeset
  2070
    "Modified (format): / 08-05-2019 / 14:41:18 / Claus Gittinger"
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2071
!
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2072
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2073
listenFor:aNumber
4568
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  2074
    "start listening; return true if ok, false on error.
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  2075
     Notify with a SocketErrorNotification on error.
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2076
     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
  2077
4568
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  2078
    |err|
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  2079
2321
6f4cc7b644db filePointer -> handle migration
Claus Gittinger <cg@exept.de>
parents: 2308
diff changeset
  2080
    handle isNil ifTrue:[
5452
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  2081
        ^ self errorNotOpen
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2082
    ].
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2083
%{
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2084
#ifndef NO_SOCKET
2321
6f4cc7b644db filePointer -> handle migration
Claus Gittinger <cg@exept.de>
parents: 2308
diff changeset
  2085
    OBJ fp = __INST(handle);
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2086
    SOCKET sock;
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2087
    int ret;
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2088
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2089
    if (! __isSmallInteger(aNumber)) {
5452
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  2090
        DBGPRINTF(("SOCKET: invalid arg\n"));
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  2091
        err = @symbol(badArgument);
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  2092
        goto out;
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2093
    }
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2094
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2095
    sock = SOCKET_FROM_FILE_OBJECT(fp);
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2096
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2097
#ifdef LISTEN_BLOCKS
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2098
# ifdef DO_WRAP_CALLS
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2099
    do {
5452
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  2100
        __threadErrno = 0;
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  2101
        ret = STX_WSA_NOINT_CALL2("listen", listen, sock, __intVal(aNumber));
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2102
    } while ((ret < 0) && (__threadErrno == EINTR));
3126
d95cc55a4fb5 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3123
diff changeset
  2103
    if (ret < 0) {
5452
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  2104
        errno = __threadErrno;
3126
d95cc55a4fb5 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3123
diff changeset
  2105
    }
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2106
# else
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2107
    __BEGIN_INTERRUPTABLE__
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2108
    do {
5452
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  2109
        ret = listen(sock, __intVal(aNumber));
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2110
    } while ((ret < 0) && (errno == EINTR));
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2111
    __END_INTERRUPTABLE__
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2112
# endif
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2113
#else
3126
d95cc55a4fb5 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3123
diff changeset
  2114
    errno = 0;
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2115
    ret = listen(sock, __intVal(aNumber));
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2116
#endif
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2117
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2118
    if (ret < 0) {
3843
fbced69597a7 oops - error check was disabled
Claus Gittinger <cg@exept.de>
parents: 3742
diff changeset
  2119
# ifdef __win32__
5452
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  2120
        if (errno == 0) {
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  2121
            errno = WSAGetLastError();
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  2122
        }
3126
d95cc55a4fb5 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3123
diff changeset
  2123
# endif
5452
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  2124
        err = __MKSMALLINT(errno);
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  2125
        DBGPRINTF(("SOCKET: listen call failed errno=%d\n", errno));
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  2126
        goto out;
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2127
    }
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2128
#else
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2129
    RETURN (false);
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2130
#endif
4568
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  2131
out:;
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2132
%}.
4568
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  2133
    err notNil ifTrue:[
5452
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  2134
        err isSymbol ifTrue:[
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  2135
            self error:err.
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  2136
        ].
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  2137
        ^ self reportError:err.
4568
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  2138
    ].
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  2139
3157
44f5f9f79256 initialize methods
Stefan Vogel <sv@exept.de>
parents: 3155
diff changeset
  2140
    listening := aNumber.
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2141
    ^ true
4568
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  2142
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  2143
    "
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  2144
       [
5452
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  2145
           |sock|
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  2146
           sock := Socket newTCP.
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  2147
           sock listenFor:1.
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  2148
           sock
4568
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  2149
       ] on:SocketErrorNotification do:[:ex|
5452
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  2150
           ex halt.
4568
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  2151
       ].
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
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  2154
    "Modified (comment): / 19-01-2018 / 13:50:09 / stefan"
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2155
! !
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2156
1576
a2ffb22c5f5e New: #shutDownInput #shutDownOutput
Stefan Vogel <sv@exept.de>
parents: 1568
diff changeset
  2157
!Socket methodsFor:'closing'!
a2ffb22c5f5e New: #shutDownInput #shutDownOutput
Stefan Vogel <sv@exept.de>
parents: 1568
diff changeset
  2158
4172
2a6544c030fc #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 4091
diff changeset
  2159
abortAndClose
2a6544c030fc #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 4091
diff changeset
  2160
    "immediately abort the connection:
5452
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  2161
        discard buffered data and close the stream"
4414
42edc97b2323 bcopy -> memcpy
Claus Gittinger <cg@exept.de>
parents: 4341
diff changeset
  2162
42edc97b2323 bcopy -> memcpy
Claus Gittinger <cg@exept.de>
parents: 4341
diff changeset
  2163
    self linger:0.
42edc97b2323 bcopy -> memcpy
Claus Gittinger <cg@exept.de>
parents: 4341
diff changeset
  2164
    self close.
3224
bad706c50347 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3223
diff changeset
  2165
!
bad706c50347 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3223
diff changeset
  2166
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2167
shutDown
4414
42edc97b2323 bcopy -> memcpy
Claus Gittinger <cg@exept.de>
parents: 4341
diff changeset
  2168
    "shutDown (initiate a graceful close)
4172
2a6544c030fc #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 4091
diff changeset
  2169
     and close (free the filedescriptor) the socket.
4414
42edc97b2323 bcopy -> memcpy
Claus Gittinger <cg@exept.de>
parents: 4341
diff changeset
  2170
     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
  2171
     background, unless you set linger"
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2172
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2173
    self shutdown:2.
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2174
    self close
1576
a2ffb22c5f5e New: #shutDownInput #shutDownOutput
Stefan Vogel <sv@exept.de>
parents: 1568
diff changeset
  2175
!
a2ffb22c5f5e New: #shutDownInput #shutDownOutput
Stefan Vogel <sv@exept.de>
parents: 1568
diff changeset
  2176
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2177
shutDownInput
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2178
    "shutDown the input side of the socket.
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2179
     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
  2180
     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
  2181
     (e.g. setting the TCP-Windowsize to 0)"
a2ffb22c5f5e New: #shutDownInput #shutDownOutput
Stefan Vogel <sv@exept.de>
parents: 1568
diff changeset
  2182
a2ffb22c5f5e New: #shutDownInput #shutDownOutput
Stefan Vogel <sv@exept.de>
parents: 1568
diff changeset
  2183
    self shutdown:0.
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2184
!
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2185
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2186
shutDownOutput
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2187
    "shutDown the output side of the socket.
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2188
     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
  2189
     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
  2190
     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
  2191
     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
  2192
     has been delivered to the peer.
2a6544c030fc #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 4091
diff changeset
  2193
     Otherwise the operation returns immediately."
1343
cc3bed115c0a definitions cleanup with stxOSDefs.h
penk
parents: 1342
diff changeset
  2194
1884
ee0d640a25a7 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1882
diff changeset
  2195
    self shutdown:1.
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2196
! !
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2197
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2198
!Socket methodsFor:'connecting'!
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2199
3059
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  2200
connectTo:aSocketAddress
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  2201
    ^ self connectTo:aSocketAddress withTimeout:nil
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  2202
!
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  2203
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2204
connectTo:hostOrPathName port:portNrOrName
3655
eb81fa3d8407 #REFACTORING
Stefan Vogel <sv@exept.de>
parents: 3633
diff changeset
  2205
    <resource: #obsolete>
3059
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  2206
    "Backward compatibility connect; connect to port, portNrOrNameOrNil on host, hostOrPathNameOrSocketAddr.
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  2207
     For backward compatibility, hostOrPathNameOrSocketAddr may be also a string or a byteArray,
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  2208
     but it is recommended to pass SocketAddress instances.
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2209
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2210
     Return true if ok, false otherwise.
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2211
     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
  2212
     See also: #connectTo:port:withTimeout: for a somewhat nicer interface."
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2213
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2214
    ^ self connectTo:hostOrPathName port:portNrOrName withTimeout:nil
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2215
!
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2216
4570
39e965ca8d06 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4568
diff changeset
  2217
connectTo:hostOrPathNameOrSocketAddr port:portNrOrNameOrNil withTimeout:milliSecondsOrTimeDuration
3655
eb81fa3d8407 #REFACTORING
Stefan Vogel <sv@exept.de>
parents: 3633
diff changeset
  2218
    <resource: #obsolete>
3059
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  2219
    "Backward compatibility connect; connect to port, portNrOrNameOrNil on host, hostOrPathNameOrSocketAddr.
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  2220
     For backward compatibility, hostOrPathNameOrSocketAddr may be also a string or a byteArray,
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  2221
     but it is recommended to pass SocketAddress instances.
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2222
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2223
     Return true if ok, false otherwise.
4568
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  2224
     Notify with a SocketErrorNotification on error.
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  2225
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2226
     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
  2227
     or milliSecondsOrTimeDuration milliseconds have passed."
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2228
3059
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  2229
    |domainClass socketAddress|
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  2230
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  2231
    (hostOrPathNameOrSocketAddr isSocketAddress) ifTrue:[
5452
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  2232
        socketAddress := hostOrPathNameOrSocketAddr.
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  2233
        portNrOrNameOrNil notNil ifTrue:[
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  2234
            socketAddress port:portNrOrNameOrNil.
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  2235
        ].
3059
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  2236
    ] ifFalse:[
5452
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  2237
        "backward compatibility: support for byteArray and string arg"
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  2238
        domainClass := self class socketAddressClassForDomain:domain.
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  2239
        domainClass isNil ifTrue:[
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  2240
            ^ self error:'invalid (unsupported) domain'.
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  2241
        ].
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  2242
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  2243
        hostOrPathNameOrSocketAddr isString ifTrue:[
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  2244
            socketAddress := domainClass hostName:hostOrPathNameOrSocketAddr serviceName:portNrOrNameOrNil type:#SOCK_STREAM.
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  2245
            peerName := hostOrPathNameOrSocketAddr.
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  2246
        ] ifFalse:[
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  2247
            hostOrPathNameOrSocketAddr isByteCollection ifFalse:[
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  2248
                ^ self error:'connectTo: bad host (socketAddress) argument'
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  2249
            ].
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  2250
            socketAddress := domainClass hostAddress:hostOrPathNameOrSocketAddr port:portNrOrNameOrNil.
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  2251
        ].
3059
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  2252
    ].
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  2253
4570
39e965ca8d06 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4568
diff changeset
  2254
    ^ self connectTo:socketAddress withTimeout:milliSecondsOrTimeDuration.
3059
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  2255
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  2256
    "
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  2257
       |sock|
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  2258
       sock := Socket newTCP.
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  2259
       sock connectTo:'localhost' port:21 withTimeout:1000.
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  2260
       sock
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  2261
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  2262
       |sock|
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  2263
       sock := Socket newTCP.
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  2264
       sock connectTo:'localhost' port:9876 withTimeout:2000.
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  2265
       sock
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  2266
    "
4568
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  2267
4570
39e965ca8d06 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4568
diff changeset
  2268
    "Modified (comment): / 19-01-2018 / 17:48:08 / stefan"
3059
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  2269
!
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  2270
4570
39e965ca8d06 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4568
diff changeset
  2271
connectTo:aSocketAddress withTimeout:milliSecondsOrTimeDuration
3059
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  2272
    "Connect to a SocketAddress.
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  2273
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  2274
     Return true if ok, false otherwise.
4568
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  2275
     Notify with a SocketErrorNotification on error.
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  2276
3059
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  2277
     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
  2278
     or timeout milliseconds have passed."
3059
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  2279
4570
39e965ca8d06 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4568
diff changeset
  2280
    |isAsync err timeoutMs milliSeconds|
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2281
2321
6f4cc7b644db filePointer -> handle migration
Claus Gittinger <cg@exept.de>
parents: 2308
diff changeset
  2282
    handle isNil ifTrue:[
5452
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  2283
        ^ self errorNotOpen
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2284
    ].
4234
eb1b470a27ee #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 4206
diff changeset
  2285
    isAsync := false.
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2286
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2287
%{  /* STACK: 100000 */
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2288
#ifndef NO_SOCKET
3123
55ef9ca4f09f class: Socket
Stefan Vogel <sv@exept.de>
parents: 3077
diff changeset
  2289
//#define DUMP_ADDRESS 1
2321
6f4cc7b644db filePointer -> handle migration
Claus Gittinger <cg@exept.de>
parents: 2308
diff changeset
  2290
    OBJ fp = __INST(handle);
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2291
    union sockaddr_u sa;
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2292
    SOCKET sock;
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2293
    int a;
2909
aacef77a1697 64bit fixes
Claus Gittinger <cg@exept.de>
parents: 2904
diff changeset
  2294
    INT ret;
aacef77a1697 64bit fixes
Claus Gittinger <cg@exept.de>
parents: 2904
diff changeset
  2295
    int oldFlags;
3741
2a39a558012f mingw change
Claus Gittinger <cg@exept.de>
parents: 3657
diff changeset
  2296
# ifdef __MINGW64__
2a39a558012f mingw change
Claus Gittinger <cg@exept.de>
parents: 3657
diff changeset
  2297
    unsigned long on = 1;
2a39a558012f mingw change
Claus Gittinger <cg@exept.de>
parents: 3657
diff changeset
  2298
# else
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2299
    int on = 1;
3741
2a39a558012f mingw change
Claus Gittinger <cg@exept.de>
parents: 3657
diff changeset
  2300
#endif
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2301
    int sockaddr_size;
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2302
3059
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  2303
    if (!__isNonNilObject(aSocketAddress) || !__isBytes(aSocketAddress)) {
5452
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  2304
        DBGPRINTF(("SOCKET: invalid socketAddress\n"));
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  2305
        err = @symbol(argumentError);
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  2306
        goto out;
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2307
    }
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2308
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2309
    {
5452
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  2310
        int sockAddrOffs = 0;
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  2311
        int nIndex =__byteArraySize(aSocketAddress);
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  2312
        OBJ cls = __qClass(aSocketAddress);
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  2313
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  2314
        //if (cls != @global(ByteArray))
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  2315
        //    sockAddrOffs = __OBJS2BYTES__(__intVal(__ClassInstPtr(cls)->c_ninstvars));
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  2316
        sockaddr_size = nIndex - sockAddrOffs;
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  2317
        if (sockaddr_size > sizeof(sa)) {
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  2318
            DBGPRINTF(("SOCKET: invalid (short) socketAddress\n"));
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  2319
            err = @symbol(argumentError);
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  2320
            goto out;
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  2321
        }
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  2322
        memcpy(&sa, __byteArrayVal(aSocketAddress) + sockAddrOffs, sockaddr_size);
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2323
    }
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2324
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2325
    sock = SOCKET_FROM_FILE_OBJECT(fp);
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2326
3843
fbced69597a7 oops - error check was disabled
Claus Gittinger <cg@exept.de>
parents: 3742
diff changeset
  2327
#ifdef __win32__
3657
Stefan Vogel <sv@exept.de>
parents: 3655
diff changeset
  2328
     ioctlsocket(sock, FIONBIO, &on);
Stefan Vogel <sv@exept.de>
parents: 3655
diff changeset
  2329
#elif defined(O_NONBLOCK)
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2330
    /*
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2331
     * set to non-blocking and wait later
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2332
     */
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2333
    oldFlags = fcntl(sock, F_GETFL, 0);
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2334
    /* on SUNOS4.x, would use fcntl(osfd, F_SETFL, flags | FNDELAY); */
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2335
    fcntl(sock, F_SETFL, oldFlags | O_NONBLOCK);
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2336
# endif
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2337
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2338
    /*
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2339
     * connect
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2340
     */
3123
55ef9ca4f09f class: Socket
Stefan Vogel <sv@exept.de>
parents: 3077
diff changeset
  2341
4039
87f0dc2e89d8 #OTHER by mawalch
mawalch
parents: 4038
diff changeset
  2342
// we do not use wrap calls any longer, because they have problems with aborting.
3657
Stefan Vogel <sv@exept.de>
parents: 3655
diff changeset
  2343
// we use nonblocking accept() instead.
Stefan Vogel <sv@exept.de>
parents: 3655
diff changeset
  2344
# if 0 && defined(DO_WRAP_CALLS)
3217
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  2345
    // __setWrapCallDebugging(1,1);
2414
886ecf4b36cd changed:
ab
parents: 2340
diff changeset
  2346
3123
55ef9ca4f09f class: Socket
Stefan Vogel <sv@exept.de>
parents: 3077
diff changeset
  2347
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2348
    do {
5452
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  2349
        DBGFPRINTF((stderr, "SOCKET: (sock=%d) connect...\n", sock));
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  2350
        ret = STX_WSA_NOINT_CALL3("connect", connect, sock, &sa, (INT)sockaddr_size);
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  2351
        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
  2352
    } while ((ret < 0) && (__threadErrno == EINTR));
3123
55ef9ca4f09f class: Socket
Stefan Vogel <sv@exept.de>
parents: 3077
diff changeset
  2353
3077
032905ddd57a class: Socket
Claus Gittinger <cg@exept.de>
parents: 3072
diff changeset
  2354
    if (ret < 0) {
5452
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  2355
        int optLen = sizeof(errno);
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  2356
        errno = __threadErrno;
3123
55ef9ca4f09f class: Socket
Stefan Vogel <sv@exept.de>
parents: 3077
diff changeset
  2357
#if 0
5452
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  2358
        if (getsockopt(sock, SOL_SOCKET, SO_ERROR, &errno, &optLen) == SOCKET_ERROR) {
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  2359
            DBGFPRINTF((stderr, "SOCKET: getsockopt(SO_ERROR) failed: %d\n", WSAGetLastError()));
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  2360
        }
3657
Stefan Vogel <sv@exept.de>
parents: 3655
diff changeset
  2361
#endif // 0
3077
032905ddd57a class: Socket
Claus Gittinger <cg@exept.de>
parents: 3072
diff changeset
  2362
    }
032905ddd57a class: Socket
Claus Gittinger <cg@exept.de>
parents: 3072
diff changeset
  2363
032905ddd57a class: Socket
Claus Gittinger <cg@exept.de>
parents: 3072
diff changeset
  2364
    // __setWrapCallDebugging(1,0);
3657
Stefan Vogel <sv@exept.de>
parents: 3655
diff changeset
  2365
# else // !DO_WRAP_CALLS
Stefan Vogel <sv@exept.de>
parents: 3655
diff changeset
  2366
3843
fbced69597a7 oops - error check was disabled
Claus Gittinger <cg@exept.de>
parents: 3742
diff changeset
  2367
#  if !defined(__win32__) && !defined(O_NONBLOCK)
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2368
    __BEGIN_INTERRUPTABLE__
3657
Stefan Vogel <sv@exept.de>
parents: 3655
diff changeset
  2369
#  endif
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2370
    do {
5452
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  2371
        ret = connect(sock, (struct sockaddr *)&sa, sockaddr_size);
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2372
    } while ((ret < 0)
3843
fbced69597a7 oops - error check was disabled
Claus Gittinger <cg@exept.de>
parents: 3742
diff changeset
  2373
#  ifdef __win32__
5452
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  2374
             && (errno = WSAGetLastError())
3657
Stefan Vogel <sv@exept.de>
parents: 3655
diff changeset
  2375
#  endif
5452
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  2376
             && ((errno == EINTR)
3657
Stefan Vogel <sv@exept.de>
parents: 3655
diff changeset
  2377
#  ifdef EAGAIN
5452
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  2378
                 || (errno == EAGAIN)
3657
Stefan Vogel <sv@exept.de>
parents: 3655
diff changeset
  2379
#  endif
5452
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  2380
                ));
3843
fbced69597a7 oops - error check was disabled
Claus Gittinger <cg@exept.de>
parents: 3742
diff changeset
  2381
#  if !defined(__win32__) && !defined(O_NONBLOCK)
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2382
    __END_INTERRUPTABLE__
3657
Stefan Vogel <sv@exept.de>
parents: 3655
diff changeset
  2383
#  endif
Stefan Vogel <sv@exept.de>
parents: 3655
diff changeset
  2384
#endif
Stefan Vogel <sv@exept.de>
parents: 3655
diff changeset
  2385
3843
fbced69597a7 oops - error check was disabled
Claus Gittinger <cg@exept.de>
parents: 3742
diff changeset
  2386
#if defined(__win32__) && !defined(EINPROGRESS)
3657
Stefan Vogel <sv@exept.de>
parents: 3655
diff changeset
  2387
# define EINPROGRESSS WSAEINPROGRESSS
Stefan Vogel <sv@exept.de>
parents: 3655
diff changeset
  2388
# define EALREADY WSAEALREADY
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2389
#endif
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2390
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2391
    if (ret < 0) {
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2392
# if defined(EINPROGRESS) || defined(EALREADY)
5452
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  2393
        if (0
3843
fbced69597a7 oops - error check was disabled
Claus Gittinger <cg@exept.de>
parents: 3742
diff changeset
  2394
#  ifdef __win32__
5452
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  2395
            || (errno == WSAEWOULDBLOCK)
3657
Stefan Vogel <sv@exept.de>
parents: 3655
diff changeset
  2396
#  endif
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2397
#  ifdef EINPROGRESS
5452
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  2398
            || (errno == EINPROGRESS)
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2399
#  endif
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2400
#  ifdef EALREADY
5452
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  2401
            || (errno == EALREADY)
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2402
#  endif
5452
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  2403
        ) {
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  2404
            /*
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  2405
             * This was a nonblocking operation that will take some time.
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  2406
             * Do a select on read to get informed when the operation is ready.
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  2407
             */
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  2408
            DBGFPRINTF((stderr, "SOCKET: isAsync is true\n"));
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  2409
            isAsync = true;
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  2410
        } else
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2411
# endif /* EINPROGRESS or EALREADY */
5452
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  2412
        {
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  2413
            DBGFPRINTF((stderr, "SOCKET: connect failed ret=%"_ld_" errno=%d __threadErrno=%d\n",
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  2414
                        (INT)ret, errno, __threadErrno ));
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2415
# ifdef DUMP_ADDRESS
5452
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  2416
            {
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  2417
                unsigned char *cp = (unsigned char *)(&sa);
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  2418
                int i;
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  2419
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  2420
                console_printf("address data:\n");
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  2421
                for (i=0; i<sockaddr_size; i++) {
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  2422
                    console_printf(" %02x\n", *cp++);
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  2423
                }
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  2424
            }
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2425
# endif
5452
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  2426
            err = __MKSMALLINT(errno);
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  2427
        }
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2428
    }
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2429
3843
fbced69597a7 oops - error check was disabled
Claus Gittinger <cg@exept.de>
parents: 3742
diff changeset
  2430
# ifdef __win32__
3657
Stefan Vogel <sv@exept.de>
parents: 3655
diff changeset
  2431
    {
5452
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  2432
        int off = 0;
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  2433
        ioctlsocket(sock, FIONBIO, &off);
3657
Stefan Vogel <sv@exept.de>
parents: 3655
diff changeset
  2434
    }
Stefan Vogel <sv@exept.de>
parents: 3655
diff changeset
  2435
# elif defined(O_NONBLOCK) // Linux / Unix
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2436
    fcntl(sock, F_SETFL, oldFlags);
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2437
# endif
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2438
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2439
# else /* NO_SOCKET */
3077
032905ddd57a class: Socket
Claus Gittinger <cg@exept.de>
parents: 3072
diff changeset
  2440
    err = @symbol(notSupported);
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2441
# endif /* NO_SOCKET */
3077
032905ddd57a class: Socket
Claus Gittinger <cg@exept.de>
parents: 3072
diff changeset
  2442
out:;
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2443
%}.
3217
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  2444
3077
032905ddd57a class: Socket
Claus Gittinger <cg@exept.de>
parents: 3072
diff changeset
  2445
    err notNil ifTrue:[
5452
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  2446
        err isSymbol ifTrue:[
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  2447
            self primitiveFailed:err.
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  2448
        ].
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  2449
        ^ self reportError:err.
3077
032905ddd57a class: Socket
Claus Gittinger <cg@exept.de>
parents: 3072
diff changeset
  2450
    ].
4234
eb1b470a27ee #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 4206
diff changeset
  2451
    isAsync ifTrue:[
5452
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  2452
        milliSeconds := milliSecondsOrTimeDuration.
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  2453
        milliSecondsOrTimeDuration isTimeDuration ifTrue:[
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  2454
            milliSeconds := milliSecondsOrTimeDuration asMilliseconds.
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  2455
        ].
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  2456
        (self writeExceptionWaitWithTimeoutMs:milliSeconds) ifTrue:[
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  2457
            "/ a timeout occurred
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  2458
            "/ should I cancel the connect?
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  2459
            ^ self reportError:(OperatingSystem errorNumberFor:#ETIMEDOUT).
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  2460
        ].
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  2461
        err := self getSocketError.
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  2462
        err ~~ 0 ifTrue:[
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  2463
            ^ self reportError:err.
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  2464
        ].
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2465
    ].
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2466
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
  2467
3059
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  2468
    peer := aSocketAddress.
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2469
    port isNil ifTrue:[
5452
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  2470
        "socket has not been explicitly bound,
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  2471
         after connect it has been bound implicitly - fetch the port"
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  2472
        port := self getFullSocketAddress port.
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2473
    ].
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2474
    ^ true
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2475
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2476
    "
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2477
       |sock|
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2478
       sock := Socket newTCP.
3059
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  2479
       sock connectTo:(IPSocketAddress localHost port:21) withTimeout:1000.
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2480
       sock
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2481
4568
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  2482
       [
5452
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  2483
           |sock|
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  2484
           sock := Socket newTCP.
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  2485
           sock connectTo:(IPSocketAddress localHost port:21) withTimeout:1000.
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  2486
           sock
4568
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  2487
       ] on:SocketErrorNotification do:[:ex|
5452
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  2488
           ex halt.
4568
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  2489
       ].
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  2490
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2491
       |sock|
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2492
       sock := Socket newTCP.
3059
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  2493
       sock connectTo:(IPSocketAddress localHost port:9876) withTimeout:2000.
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2494
       sock
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2495
    "
4568
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  2496
4570
39e965ca8d06 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4568
diff changeset
  2497
    "Modified: / 19-01-2018 / 17:57:36 / stefan"
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2498
! !
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2499
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2500
!Socket methodsFor:'datagram transmission'!
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2501
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2502
receiveBuffer:aDataBuffer start:startIndex for:nBytes
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2503
    "receive data
4626
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2504
     Return the number of bytes received.
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2505
     The thread blocks until data arrives - you may want to wait before
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2506
     receiving, using #readWait or #readWaitWithTimeout:."
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2507
3126
d95cc55a4fb5 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3123
diff changeset
  2508
    |nReceived error|
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2509
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2510
%{
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2511
#ifndef NO_SOCKET
2321
6f4cc7b644db filePointer -> handle migration
Claus Gittinger <cg@exept.de>
parents: 2308
diff changeset
  2512
    OBJ fp = __INST(handle);
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2513
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2514
    if (fp != nil) {
5452
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  2515
        SOCKET sock;
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  2516
        INT objSize, offs;
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  2517
        INT n;
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  2518
        char *extPtr;
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  2519
        unsigned char *buffer;
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  2520
        unsigned char *allocatedBuffer = NULL;
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  2521
        INT flags = 0;
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  2522
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  2523
        sock = SOCKET_FROM_FILE_OBJECT(fp);
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  2524
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  2525
        if (! setupBufferParameters(aDataBuffer, startIndex, &extPtr, &offs, &objSize)) goto bad;
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  2526
        if (__isSmallInteger(nBytes)) {
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  2527
            if (__intVal(nBytes) < objSize) {
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  2528
                objSize = __intVal(nBytes);
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  2529
            }
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  2530
        }
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2531
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2532
# ifdef DO_WRAP_CALLS
5452
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  2533
        if (extPtr) {
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  2534
            buffer = extPtr + offs;
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  2535
        } else {
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  2536
            allocatedBuffer = buffer = (char *)malloc(objSize);
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  2537
        }
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  2538
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  2539
        do {
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  2540
            __threadErrno = 0;
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  2541
            n = (INT)STX_WSA_NOINT_CALL4("recv", recv, sock, buffer, objSize, flags);
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  2542
        } while ((n < 0) && (__threadErrno == EINTR));
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  2543
        if (n < 0) {
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  2544
            errno = __threadErrno;
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  2545
        }
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  2546
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  2547
        if (allocatedBuffer) {
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  2548
            if (n > 0) {
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  2549
                memcpy((char *)__InstPtr(aDataBuffer) + offs, allocatedBuffer, n);
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  2550
            }
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  2551
            free(allocatedBuffer);
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  2552
        }
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2553
# else
5452
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  2554
        __BEGIN_INTERRUPTABLE__
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  2555
        do {
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  2556
            if (extPtr) {
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  2557
                n = recv(sock, extPtr + offs, objSize, flags);
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  2558
            } else {
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  2559
                n = recv(sock, (char *)__InstPtr(aDataBuffer) + offs, objSize, flags);
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  2560
            }
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  2561
        } while ((n < 0) && (errno == EINTR));
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  2562
        __END_INTERRUPTABLE__
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2563
# endif
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2564
5452
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  2565
        if (n < 0) {
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  2566
            error = __INST(lastErrorNumber) = __MKSMALLINT(errno);
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  2567
        } else {
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  2568
            RETURN(__MKSMALLINT(n));
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  2569
        }
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2570
    }
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2571
#endif
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2572
bad: ;
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2573
%}.
3126
d95cc55a4fb5 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3123
diff changeset
  2574
    error notNil ifTrue:[
5452
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  2575
        ^ self readError:error.
915
3dc0e3cd838a added interface to send() and recv()
Claus Gittinger <cg@exept.de>
parents: 898
diff changeset
  2576
    ].
3dc0e3cd838a added interface to send() and recv()
Claus Gittinger <cg@exept.de>
parents: 898
diff changeset
  2577
    "
1282
7e4ffdfd19f6 remove historic leftover
Claus Gittinger <cg@exept.de>
parents: 1280
diff changeset
  2578
     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
  2579
    "
3dc0e3cd838a added interface to send() and recv()
Claus Gittinger <cg@exept.de>
parents: 898
diff changeset
  2580
    self primitiveFailed
4626
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2581
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2582
    "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
  2583
!
7d016cc30052 fixed & moved pingWalk from SNMPSession to here;
Claus Gittinger <cg@exept.de>
parents: 98
diff changeset
  2584
4626
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2585
receiveFrom:aSocketAddress buffer:aDataBuffer
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2586
    "receive datagramm data - put address of originating host into
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2587
     aSocketAddress, data into aDataBuffer.
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2588
     aDataBuffer must be ByteArray-like.
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2589
     For backward compatibility, aSocketAddress may be a non-SocketAddress;
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2590
     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
  2591
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2592
     Return the number of bytes received.
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2593
     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
  2594
     receiving, using #readWait or #readWaitWithTimeout:."
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2595
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2596
    ^ 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
  2597
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2598
    "Modified (comment): / 21-03-2018 / 19:33:59 / stefan"
3615
ffe86e1b14ed #BUGFIX
Stefan Vogel <sv@exept.de>
parents: 3614
diff changeset
  2599
!
ffe86e1b14ed #BUGFIX
Stefan Vogel <sv@exept.de>
parents: 3614
diff changeset
  2600
4626
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2601
receiveFrom:aSocketAddress buffer:aDataBuffer start:startIndex for:nBytes
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2602
    ^ self receiveFrom:aSocketAddress buffer:aDataBuffer start:startIndex for:nBytes flags:0
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2603
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2604
    "Modified (format): / 21-03-2018 / 19:32:27 / stefan"
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2605
!
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2606
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2607
receiveFrom:aSocketAddress buffer:aDataBuffer start:startIndex for:nBytes flags:flags
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2608
    "receive datagramm data
4626
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2609
     - put address of originating host into aSocketAddress, data into aDataBuffer.
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2610
     aDataBuffer must be ByteArray-like.
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2611
     For backward compatibility, aSocketAddress may be a non-SocketAddress;
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2612
     then, it must be a byteArray with appropriate size for the addressBytes.
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2613
4626
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2614
     Return the number of bytes received.
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2615
     The thread blocks until data arrives - you may want to wait before
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2616
     receiving, using #readWait or #readWaitWithTimeout:."
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2617
3126
d95cc55a4fb5 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3123
diff changeset
  2618
    |domainClass addr addrLen nReceived error|
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2619
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2620
    domainClass := self class socketAddressClassForDomain:domain.
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2621
    domainClass isNil ifTrue:[
5452
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  2622
        ^ self error:'invalid (unsupported) domain'.
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2623
    ].
4626
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2624
    aSocketAddress isSocketAddress ifTrue:[
5452
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  2625
        aSocketAddress class == domainClass ifFalse:[
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  2626
            ^ self error:'addressBuffer class mismatch (domain)'.
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  2627
        ].
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  2628
        addr := aSocketAddress.
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2629
    ] ifFalse:[
5452
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  2630
        aSocketAddress notNil ifTrue:[
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  2631
            addr := domainClass new.
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  2632
        ].
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2633
    ].
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2634
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2635
%{
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2636
#ifndef NO_SOCKET
2321
6f4cc7b644db filePointer -> handle migration
Claus Gittinger <cg@exept.de>
parents: 2308
diff changeset
  2637
    OBJ fp = __INST(handle);
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2638
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2639
    if (fp != nil) {
5452
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  2640
        SOCKET sock;
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  2641
        size_t objSize;
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  2642
        union sockaddr_u sa;
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  2643
        socklen_t alen = 0;
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  2644
        INT n, offs;
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  2645
        int _flags = __longIntVal(flags);
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  2646
        char *extPtr;
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  2647
        unsigned char *allocatedBuffer = NULL, *buffer = NULL;
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  2648
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  2649
        sock = SOCKET_FROM_FILE_OBJECT(fp);
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  2650
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  2651
        if (! setupBufferParameters(aDataBuffer, startIndex, &extPtr, &offs, &objSize)) goto bad;
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  2652
        if (__isSmallInteger(nBytes)) {
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  2653
            if (__intVal(nBytes) < objSize) {
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  2654
                objSize = __intVal(nBytes);
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  2655
            }
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  2656
        }
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2657
# ifdef DO_WRAP_CALLS
5452
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  2658
        if (extPtr) {
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  2659
            buffer = extPtr + offs;
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  2660
        } else {
5472
b1822258a4be #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 5467
diff changeset
  2661
            allocatedBuffer = buffer = (unsigned char *)malloc(objSize);
5452
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  2662
        }
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  2663
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  2664
        do {
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  2665
            __threadErrno = 0;
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  2666
            alen = sizeof(sa);
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  2667
            n = (INT)STX_WSA_NOINT_CALL6("recvfrom", recvfrom, sock, buffer, objSize, _flags, (struct sockaddr *)&sa, &alen);
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  2668
        } while ((n < 0) && (__threadErrno == EINTR));
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  2669
        if (n < 0) {
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  2670
            errno = __threadErrno;
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  2671
        }
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  2672
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  2673
        if (allocatedBuffer) {
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  2674
            if (n > 0) {
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  2675
                memcpy((char *)__InstPtr(aDataBuffer) + offs, allocatedBuffer, n);
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  2676
            }
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  2677
            free(allocatedBuffer);
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  2678
        }
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2679
# else
5452
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  2680
        __BEGIN_INTERRUPTABLE__
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  2681
        do {
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  2682
            alen = sizeof(sa);
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  2683
            if (extPtr) {
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  2684
                n = recvfrom(sock, extPtr + offs, objSize, _flags, (struct sockaddr *) &sa, &alen);
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  2685
            } else {
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  2686
                n = recvfrom(sock, (char *)__InstPtr(aDataBuffer) + offs, objSize, _flags, (struct sockaddr *) &sa, &alen);
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  2687
            }
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  2688
        } while ((n < 0) && (errno == EINTR));
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  2689
        __END_INTERRUPTABLE__
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2690
# endif
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2691
5472
b1822258a4be #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 5467
diff changeset
  2692
        if (n >= 0 && __isNonNilObject(addr)) {
b1822258a4be #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 5467
diff changeset
  2693
            char *addrPtr;
b1822258a4be #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 5467
diff changeset
  2694
            int nInstVars, nInstBytes, objSize;
b1822258a4be #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 5467
diff changeset
  2695
            OBJ oClass = __qClass(addr);
b1822258a4be #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 5467
diff changeset
  2696
b1822258a4be #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 5467
diff changeset
  2697
            if (! __isBytes(addr))
b1822258a4be #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 5467
diff changeset
  2698
                goto bad;
b1822258a4be #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 5467
diff changeset
  2699
            nInstVars = __intVal(__ClassInstPtr(oClass)->c_ninstvars);
b1822258a4be #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 5467
diff changeset
  2700
            nInstBytes = OHDR_SIZE + (nInstVars * sizeof(OBJ));
b1822258a4be #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 5467
diff changeset
  2701
            objSize = __qSize(addr) - nInstBytes;
b1822258a4be #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 5467
diff changeset
  2702
            addrPtr = (char *)__InstPtr(addr) + nInstBytes;
b1822258a4be #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 5467
diff changeset
  2703
            if (objSize < alen)
b1822258a4be #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 5467
diff changeset
  2704
                goto bad;
b1822258a4be #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 5467
diff changeset
  2705
b1822258a4be #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 5467
diff changeset
  2706
            /*
b1822258a4be #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 5467
diff changeset
  2707
             * extract the datagrams address
b1822258a4be #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 5467
diff changeset
  2708
             */
b1822258a4be #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 5467
diff changeset
  2709
            memcpy(addrPtr, (char *)&sa, alen);
b1822258a4be #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 5467
diff changeset
  2710
            addrLen = __MKSMALLINT(alen);
5452
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  2711
        }
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  2712
        if (n < 0) {
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  2713
            error = __INST(lastErrorNumber) = __MKSMALLINT(errno);
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  2714
        }
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  2715
        nReceived = __MKSMALLINT(n);
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2716
    }
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2717
#endif
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2718
bad: ;
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2719
%}.
3126
d95cc55a4fb5 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3123
diff changeset
  2720
    error notNil ifTrue:[
5452
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  2721
        ^ self readError:error.
3126
d95cc55a4fb5 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3123
diff changeset
  2722
    ].
d95cc55a4fb5 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3123
diff changeset
  2723
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2724
    nReceived notNil ifTrue:[
5472
b1822258a4be #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 5467
diff changeset
  2725
        (addrLen notNil and:[addr ~~ aSocketAddress]) ifTrue:[
b1822258a4be #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 5467
diff changeset
  2726
            self obsoleteFeatureWarning:'please use a socketAddress argument'.
b1822258a4be #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 5467
diff changeset
  2727
b1822258a4be #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 5467
diff changeset
  2728
            "can be a ByteArray for backward compatibility"
b1822258a4be #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 5467
diff changeset
  2729
            aSocketAddress replaceFrom:1 to:addrLen with:(addr hostAddress).
5452
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  2730
        ].
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  2731
        ^ nReceived
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2732
    ].
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2733
    "
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2734
     arrive here if you try to receive into an invalid buffer
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2735
     (i.e. not ByteArray-like),
1485
d8578cf3504b gcc3.3.1 insn-scheduler bug workaround
Claus Gittinger <cg@exept.de>
parents: 1474
diff changeset
  2736
     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
  2737
     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
  2738
    "
126
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
  2739
    self primitiveFailed
4626
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2740
5472
b1822258a4be #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 5467
diff changeset
  2741
    "Modified: / 06-04-2020 / 22:33:10 / stefan"
116
7789fb1c9fa2 more UD socket fixes (at least client side seems to work now)
Claus Gittinger <cg@exept.de>
parents: 115
diff changeset
  2742
!
7789fb1c9fa2 more UD socket fixes (at least client side seems to work now)
Claus Gittinger <cg@exept.de>
parents: 115
diff changeset
  2743
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2744
sendBuffer:aDataBuffer start:startIndex for:nBytes flags:flags
4626
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2745
    "send data. aDataBuffer be ByteArray-like.
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2746
     Return the number of bytes transmitted, or a negative number on error."
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2747
3126
d95cc55a4fb5 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3123
diff changeset
  2748
    |error|
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2749
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2750
%{
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2751
#ifndef NO_SOCKET
2321
6f4cc7b644db filePointer -> handle migration
Claus Gittinger <cg@exept.de>
parents: 2308
diff changeset
  2752
    OBJ fp = __INST(handle);
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2753
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2754
    if ((fp != nil)
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2755
     && __isSmallInteger(startIndex)
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2756
     && __isSmallInteger(nBytes)) {
5452
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  2757
        SOCKET sock;
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  2758
        INT objSize, n, offs;
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  2759
        char *extPtr;
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  2760
        int _flags = __longIntVal(flags);
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  2761
        unsigned long norder;
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  2762
        unsigned char *buffer, *allocatedBuffer = NULL;
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  2763
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  2764
        sock = SOCKET_FROM_FILE_OBJECT(fp);
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  2765
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  2766
        if (! setupBufferParameters(aDataBuffer, startIndex, &extPtr, &offs, &objSize)) goto bad;
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  2767
        if (__isSmallInteger(nBytes)) {
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  2768
            if (__intVal(nBytes) < objSize) {
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  2769
                objSize = __intVal(nBytes);
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  2770
            }
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  2771
        }
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2772
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2773
# ifdef DGRAM_DEBUG
5452
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  2774
        console_printf("sending %d bytes ...\n", nBytes);
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2775
# endif
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2776
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2777
#ifdef DO_WRAP_CALLS
5452
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  2778
        if (extPtr) {
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  2779
            buffer = extPtr + offs;
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  2780
        } else {
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  2781
            allocatedBuffer = buffer = (char *)malloc(objSize);
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  2782
            memcpy(allocatedBuffer, (char *)__InstPtr(aDataBuffer) + offs, objSize);
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  2783
        }
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  2784
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  2785
        do {
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  2786
            __threadErrno = 0;
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  2787
            n = (INT)STX_WSA_NOINT_CALL4("send", send, sock, buffer, objSize, _flags);
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  2788
        } while ((n < 0) && (__threadErrno == EINTR));
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  2789
        if (n < 0) {
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  2790
            errno = __threadErrno;
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  2791
        }
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  2792
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  2793
        if (allocatedBuffer) {
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  2794
            free(allocatedBuffer);
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  2795
        }
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2796
#else
5452
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  2797
        __BEGIN_INTERRUPTABLE__
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  2798
        do {
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  2799
            if (extPtr) {
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  2800
                n = send(sock, extPtr + offs, objSize, _flags);
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  2801
            } else {
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  2802
                n = send(sock, (char *)__InstPtr(aDataBuffer) + offs, objSize, _flags);
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  2803
            }
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  2804
        } while ((n < 0) && (errno == EINTR));
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  2805
        __END_INTERRUPTABLE__
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2806
#endif
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2807
5452
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  2808
        if (n < 0) {
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  2809
            error = __INST(lastErrorNumber) = __MKSMALLINT(errno);
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  2810
        } else {
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  2811
            RETURN (__MKSMALLINT(n));
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  2812
        }
915
3dc0e3cd838a added interface to send() and recv()
Claus Gittinger <cg@exept.de>
parents: 898
diff changeset
  2813
    }
3dc0e3cd838a added interface to send() and recv()
Claus Gittinger <cg@exept.de>
parents: 898
diff changeset
  2814
#endif
3dc0e3cd838a added interface to send() and recv()
Claus Gittinger <cg@exept.de>
parents: 898
diff changeset
  2815
bad: ;
3dc0e3cd838a added interface to send() and recv()
Claus Gittinger <cg@exept.de>
parents: 898
diff changeset
  2816
%}.
3126
d95cc55a4fb5 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3123
diff changeset
  2817
    error notNil ifTrue:[
5452
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  2818
        self writeError:error.
3126
d95cc55a4fb5 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3123
diff changeset
  2819
    ].
d95cc55a4fb5 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3123
diff changeset
  2820
915
3dc0e3cd838a added interface to send() and recv()
Claus Gittinger <cg@exept.de>
parents: 898
diff changeset
  2821
    "
1485
d8578cf3504b gcc3.3.1 insn-scheduler bug workaround
Claus Gittinger <cg@exept.de>
parents: 1474
diff changeset
  2822
     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
  2823
    "
3dc0e3cd838a added interface to send() and recv()
Claus Gittinger <cg@exept.de>
parents: 898
diff changeset
  2824
    self primitiveFailed
4626
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2825
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2826
    "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
  2827
!
3dc0e3cd838a added interface to send() and recv()
Claus Gittinger <cg@exept.de>
parents: 898
diff changeset
  2828
4626
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2829
sendTo:aSocketAddress buffer:buffer
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2830
    "send datagramm data - fetch address of destination host from
4626
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2831
     aSocketAddress, data from aDataBuffer.
5001
11cbbbcbc87e warnings
Claus Gittinger <cg@exept.de>
parents: 4961
diff changeset
  2832
     aDataBuffer must be ByteArray-like.
11cbbbcbc87e warnings
Claus Gittinger <cg@exept.de>
parents: 4961
diff changeset
  2833
     aSocketAddress must be a valid SocketAddress for my domain
4626
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2834
     (i.e. for IPv4, an IPSocketAddress).
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2835
     For backward compatibility, a ByteArray is still supported in aSocketAddress
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2836
     (i.e. for IPv4, a 4-byte byteArray).
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2837
     Return the number of bytes transmitted."
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
    ^ 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
  2840
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2841
    "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
  2842
!
7789fb1c9fa2 more UD socket fixes (at least client side seems to work now)
Claus Gittinger <cg@exept.de>
parents: 115
diff changeset
  2843
4626
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2844
sendTo:aSocketAddress buffer:buffer start:startIndex for:count
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2845
    "send datagramm data - fetch address of destination host from
4626
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2846
     aSocketAddress, data from aDataBuffer.
5001
11cbbbcbc87e warnings
Claus Gittinger <cg@exept.de>
parents: 4961
diff changeset
  2847
     aDataBuffer must be ByteArray-like.
11cbbbcbc87e warnings
Claus Gittinger <cg@exept.de>
parents: 4961
diff changeset
  2848
     aSocketAddress must be a valid SocketAddress for my domain
4626
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2849
     (i.e. for IPv4, an IPSocketAddress).
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2850
     For backward compatibility, a ByteArray is still supported in aSocketAddress
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2851
     (i.e. for IPv4, a 4-byte byteArray).
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2852
     Return the number of bytes transmitted."
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2853
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2854
    ^ self sendTo:aSocketAddress buffer:buffer start:startIndex for:count flags:0
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
    "Modified (comment): / 21-03-2018 / 19:29:07 / stefan"
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2857
!
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2858
4626
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2859
sendTo:aSocketAddress buffer:aDataBuffer start:startIndex for:nBytes flags:flags
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2860
    "send datagramm data - fetch address of destination host from
4626
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2861
     aSocketAddress, data from aDataBuffer starting at startIndex,
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2862
     sending count bytes.
5001
11cbbbcbc87e warnings
Claus Gittinger <cg@exept.de>
parents: 4961
diff changeset
  2863
     aDataBuffer must be ByteArray-like.
11cbbbcbc87e warnings
Claus Gittinger <cg@exept.de>
parents: 4961
diff changeset
  2864
     aSocketAddress must be a valid SocketAddress for my domain
4626
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2865
     (i.e. for IPv4, an IPSocketAddress).
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2866
     For backward compatibility, a ByteArray is still supported in aSocketAddress
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2867
     (i.e. for IPv4, a 4-byte byteArray).
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2868
     Return the number of bytes transmitted."
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2869
3126
d95cc55a4fb5 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3123
diff changeset
  2870
    |domainClass addr error|
1885
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
    aSocketAddress isSocketAddress ifTrue:[
5452
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  2873
        addr := aSocketAddress.
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2874
    ] ifFalse:[
5452
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  2875
        aSocketAddress isByteArray ifFalse:[
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  2876
            ^ self error:'bad socketAddress argument'
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  2877
        ].
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  2878
        domainClass := self class socketAddressClassForDomain:domain.
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  2879
        domainClass isNil ifTrue:[
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  2880
            ^ self error:'invalid (unsupported) domain'.
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  2881
        ].
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  2882
        addr := domainClass hostAddress:aSocketAddress.
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2883
    ].
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2884
%{
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2885
#ifndef NO_SOCKET
2321
6f4cc7b644db filePointer -> handle migration
Claus Gittinger <cg@exept.de>
parents: 2308
diff changeset
  2886
    OBJ fp = __INST(handle);
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2887
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2888
    if ((fp != nil)
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2889
     && __isSmallInteger(startIndex)
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2890
     && __isSmallInteger(nBytes)) {
5452
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  2891
        SOCKET sock;
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  2892
        INT objSize;
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  2893
        struct sockaddr *sockaddr_ptr;
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  2894
        union sockaddr_u sa;
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  2895
        socklen_t sockaddr_size, alen = 0;
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  2896
        INT sockAddrOffs;
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  2897
        INT n, offs;
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  2898
        char *extPtr;
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  2899
        int _flags = __longIntVal(flags);
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  2900
        unsigned long norder;
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  2901
        unsigned char *buffer;
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  2902
        unsigned char *allocatedBuffer = NULL;
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  2903
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  2904
        sock = SOCKET_FROM_FILE_OBJECT(fp);
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  2905
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  2906
        if (! __isBytes(addr)) {
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  2907
            sockaddr_size = 0;
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  2908
            sockaddr_ptr = (struct sockaddr *)0;
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  2909
        } else {
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  2910
            int nIndex;
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  2911
            OBJ cls;
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  2912
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  2913
            sockAddrOffs = 0;
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  2914
            if ((cls = __qClass(addr)) != @global(ByteArray))
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  2915
                sockAddrOffs += __OBJS2BYTES__(__intVal(__ClassInstPtr(cls)->c_ninstvars));
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  2916
            nIndex = __qSize(addr) - OHDR_SIZE;
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  2917
            sockaddr_size = nIndex - sockAddrOffs;
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  2918
            if (sockaddr_size > sizeof(sa)) {
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  2919
                console_fprintf(stderr, "Socket [warning]: bad socketAddr\n");
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  2920
                goto bad;
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  2921
            }
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  2922
            memcpy(&sa, (__byteArrayVal(addr) + sockAddrOffs), sockaddr_size);
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  2923
            sockaddr_ptr = (struct sockaddr *)(&sa);
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  2924
        }
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  2925
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  2926
        if (! setupBufferParameters(aDataBuffer, startIndex, &extPtr, &offs, &objSize)) goto bad;
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  2927
        if (__isSmallInteger(nBytes)) {
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  2928
            if (__intVal(nBytes) < objSize) {
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  2929
                objSize = __intVal(nBytes);
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  2930
            }
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  2931
        }
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2932
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2933
#ifdef DO_WRAP_CALLS
5452
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  2934
        if (extPtr) {
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  2935
            buffer = extPtr + offs;
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  2936
        } else {
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  2937
            allocatedBuffer = buffer = (char *)malloc(objSize);
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  2938
            memcpy(allocatedBuffer, (char *)__InstPtr(aDataBuffer) + offs, objSize);
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  2939
        }
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  2940
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  2941
        do {
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  2942
            __threadErrno = 0;
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  2943
            n = (INT)STX_WSA_NOINT_CALL6("sendto", sendto, sock, buffer, objSize, _flags, sockaddr_ptr, sockaddr_size);
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  2944
        } while ((n < 0) && (__threadErrno == EINTR));
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  2945
        if (n < 0) {
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  2946
            errno = __threadErrno;
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  2947
        }
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  2948
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  2949
        if (allocatedBuffer) {
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  2950
            free(allocatedBuffer);
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  2951
        }
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2952
#else
5452
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  2953
        __BEGIN_INTERRUPTABLE__
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  2954
        do {
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  2955
            if (extPtr) {
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  2956
                n = sendto(sock, extPtr + offs, objSize, _flags, sockaddr_ptr, sockaddr_size);
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  2957
            } else {
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  2958
                n = sendto(sock, (char *)__InstPtr(aDataBuffer) + offs, objSize, _flags, sockaddr_ptr, sockaddr_size);
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  2959
            }
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  2960
        } while ((n < 0) && (errno == EINTR));
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  2961
        __END_INTERRUPTABLE__
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2962
#endif
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2963
5452
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  2964
        if (n < 0) {
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  2965
            error = __INST(lastErrorNumber) = __MKSMALLINT(errno);
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  2966
        } else {
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  2967
            RETURN (__MKSMALLINT(n));
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  2968
        }
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2969
    }
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2970
#endif
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2971
bad: ;
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2972
%}.
3126
d95cc55a4fb5 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3123
diff changeset
  2973
    error notNil ifTrue:[
5452
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  2974
        self writeError:error.
3126
d95cc55a4fb5 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3123
diff changeset
  2975
    ].
d95cc55a4fb5 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3123
diff changeset
  2976
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2977
    "
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2978
     arrive here if you try to send from an invalid buffer
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2979
     (i.e. not ByteArray-like),
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2980
     or if the addressBuffer is nonNil AND not a ByteArray/String
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2981
     or if the addressBuffer is nonNil AND too small.
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2982
    "
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2983
    self primitiveFailed
4626
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2984
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2985
    "Modified: / 21-03-2018 / 19:27:51 / stefan"
0
1cf8d1747859 Initial revision
claus
parents:
diff changeset
  2986
! !
1cf8d1747859 Initial revision
claus
parents:
diff changeset
  2987
4568
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  2988
!Socket methodsFor:'error reporting'!
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  2989
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  2990
reportError:osErrorNumber
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  2991
    "report an error to the initiator of a Socket operation.
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  2992
     We raise a notification for newer code, and also
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  2993
     return false for old code not catching the notification."
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  2994
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  2995
    |errorHolder|
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  2996
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  2997
    lastErrorNumber := osErrorNumber.
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  2998
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  2999
    errorHolder := OperatingSystem errorHolderForNumber:osErrorNumber.
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  3000
    SocketErrorNotification raiseRequestWith:errorHolder.
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  3001
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  3002
    ^ false.
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  3003
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  3004
    "Created: / 19-01-2018 / 12:50:00 / stefan"
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  3005
! !
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  3006
4172
2a6544c030fc #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 4091
diff changeset
  3007
!Socket methodsFor:'finalization'!
2a6544c030fc #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 4091
diff changeset
  3008
2a6544c030fc #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 4091
diff changeset
  3009
finalize
2a6544c030fc #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 4091
diff changeset
  3010
    self linger:0.      "/ do an abortive release - discard buffered data
2a6544c030fc #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 4091
diff changeset
  3011
    self closeFile.     "/ does not wait due to abortive release.
2a6544c030fc #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 4091
diff changeset
  3012
! !
2a6544c030fc #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 4091
diff changeset
  3013
3484
ccd8683e4e7e class: Socket
Claus Gittinger <cg@exept.de>
parents: 3481
diff changeset
  3014
!Socket methodsFor:'initialization'!
ccd8683e4e7e class: Socket
Claus Gittinger <cg@exept.de>
parents: 3481
diff changeset
  3015
ccd8683e4e7e class: Socket
Claus Gittinger <cg@exept.de>
parents: 3481
diff changeset
  3016
initialize
ccd8683e4e7e class: Socket
Claus Gittinger <cg@exept.de>
parents: 3481
diff changeset
  3017
    super initialize.
ccd8683e4e7e class: Socket
Claus Gittinger <cg@exept.de>
parents: 3481
diff changeset
  3018
    "/ transparent
ccd8683e4e7e class: Socket
Claus Gittinger <cg@exept.de>
parents: 3481
diff changeset
  3019
    eolMode := nil.
ccd8683e4e7e class: Socket
Claus Gittinger <cg@exept.de>
parents: 3481
diff changeset
  3020
! !
ccd8683e4e7e class: Socket
Claus Gittinger <cg@exept.de>
parents: 3481
diff changeset
  3021
3123
55ef9ca4f09f class: Socket
Stefan Vogel <sv@exept.de>
parents: 3077
diff changeset
  3022
!Socket methodsFor:'low level'!
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3023
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  3024
getSocketAdress
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  3025
    "BAD SPELLING, of #getSocketAddress, kept for compatibility with swazoo"
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  3026
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  3027
    <resource: #obsolete>
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  3028
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  3029
    ^ self getSocketAddress
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  3030
!
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  3031
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3032
getSocketError
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3033
    "get the SO_ERROR form the socket, which indicates the
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3034
     result of an asynchronous operation"
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3035
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3036
%{
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3037
#ifndef NO_SOCKET
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3038
    OBJ fp;
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3039
    int err;
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3040
2321
6f4cc7b644db filePointer -> handle migration
Claus Gittinger <cg@exept.de>
parents: 2308
diff changeset
  3041
    fp = __INST(handle);
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3042
    if (fp == nil) {
5452
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  3043
        err = EBADF;
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3044
    } else {
5452
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  3045
        unsigned int sz;
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  3046
        SOCKET sock;
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  3047
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  3048
        sock = SOCKET_FROM_FILE_OBJECT(fp);
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  3049
        sz = sizeof(err);
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  3050
        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
  3051
# ifdef __win32__
5452
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  3052
            errno = WSAGetLastError();
1558
a563aac90660 No need to ask Socket>>#networkXXXOrderIsMSB, because the return value is
Stefan Vogel <sv@exept.de>
parents: 1542
diff changeset
  3053
# endif
5452
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  3054
            err = errno;
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  3055
        }
1558
a563aac90660 No need to ask Socket>>#networkXXXOrderIsMSB, because the return value is
Stefan Vogel <sv@exept.de>
parents: 1542
diff changeset
  3056
    }
a563aac90660 No need to ask Socket>>#networkXXXOrderIsMSB, because the return value is
Stefan Vogel <sv@exept.de>
parents: 1542
diff changeset
  3057
a563aac90660 No need to ask Socket>>#networkXXXOrderIsMSB, because the return value is
Stefan Vogel <sv@exept.de>
parents: 1542
diff changeset
  3058
    RETURN(__MKSMALLINT(err));
a563aac90660 No need to ask Socket>>#networkXXXOrderIsMSB, because the return value is
Stefan Vogel <sv@exept.de>
parents: 1542
diff changeset
  3059
#endif
a563aac90660 No need to ask Socket>>#networkXXXOrderIsMSB, because the return value is
Stefan Vogel <sv@exept.de>
parents: 1542
diff changeset
  3060
%}
a563aac90660 No need to ask Socket>>#networkXXXOrderIsMSB, because the return value is
Stefan Vogel <sv@exept.de>
parents: 1542
diff changeset
  3061
!
a563aac90660 No need to ask Socket>>#networkXXXOrderIsMSB, because the return value is
Stefan Vogel <sv@exept.de>
parents: 1542
diff changeset
  3062
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  3063
listenWithBacklog:aNumber
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  3064
    <resource: #obsolete>
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  3065
    "same as listenFor: - backward compatibility with old ST/X"
3059
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  3066
    self obsoleteMethodWarning.
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  3067
    ^ self listenFor:aNumber
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3068
!
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3069
3246
c75a006f9a7a Win32 sockets use handles instead of file pointers
Stefan Vogel <sv@exept.de>
parents: 3224
diff changeset
  3070
primAcceptOn:aServerSocket blocking:blocking
3059
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  3071
    "accept a connection on a server port (created with:'Socket>>newTCP:')
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  3072
     usage is: (Socket basicNew acceptOn:(Socket newTCP:9999)).
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  3073
     Return the true if ok; false if not.
4568
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  3074
     Notify with a SocketErrorNotification on error.
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  3075
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  3076
     If blocking is true, the accept() syscall (and the whole smalltalk image)
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  3077
     will block, until a connection is accepted.
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  3078
     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
  3079
4568
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  3080
    |serverSocketHandle addr domainClass newHandle err|
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  3081
2321
6f4cc7b644db filePointer -> handle migration
Claus Gittinger <cg@exept.de>
parents: 2308
diff changeset
  3082
    handle notNil ifTrue:[
5452
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  3083
        ^ self errorAlreadyOpen.
4180
f2539f82b744 #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4172
diff changeset
  3084
    ].
f2539f82b744 #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4172
diff changeset
  3085
    serverSocketHandle := aServerSocket fileHandle.
f2539f82b744 #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4172
diff changeset
  3086
    serverSocketHandle isNil ifTrue:[
5452
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  3087
        "socket is not open"
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  3088
        ^ self errorNotOpen
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  3089
    ].
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  3090
3246
c75a006f9a7a Win32 sockets use handles instead of file pointers
Stefan Vogel <sv@exept.de>
parents: 3224
diff changeset
  3091
    domain := aServerSocket domain.
c75a006f9a7a Win32 sockets use handles instead of file pointers
Stefan Vogel <sv@exept.de>
parents: 3224
diff changeset
  3092
    socketType := aServerSocket type.
c75a006f9a7a Win32 sockets use handles instead of file pointers
Stefan Vogel <sv@exept.de>
parents: 3224
diff changeset
  3093
    handleType := aServerSocket handleType.
3059
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  3094
    "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
  3095
    domainClass := self class socketAddressClassForDomain:domain.
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  3096
    domainClass isNil ifTrue:[
5452
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  3097
        ^ self error:'invalid (unsupported) domain'.
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  3098
    ].
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  3099
    addr := domainClass new.
3246
c75a006f9a7a Win32 sockets use handles instead of file pointers
Stefan Vogel <sv@exept.de>
parents: 3224
diff changeset
  3100
    newHandle := OperatingSystem socketAccessor new.
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  3101
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  3102
%{  /* STACK: 100000 */
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3103
#ifndef NO_SOCKET
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  3104
    FILE *fp;
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  3105
    int flags;
3246
c75a006f9a7a Win32 sockets use handles instead of file pointers
Stefan Vogel <sv@exept.de>
parents: 3224
diff changeset
  3106
    SOCKET serverSocket, newSock;
c75a006f9a7a Win32 sockets use handles instead of file pointers
Stefan Vogel <sv@exept.de>
parents: 3224
diff changeset
  3107
    int _fd;
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  3108
    union sockaddr_u sa;
3059
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  3109
    unsigned int alen;
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  3110
3843
fbced69597a7 oops - error check was disabled
Claus Gittinger <cg@exept.de>
parents: 3742
diff changeset
  3111
# ifdef __win32__
3246
c75a006f9a7a Win32 sockets use handles instead of file pointers
Stefan Vogel <sv@exept.de>
parents: 3224
diff changeset
  3112
    serverSocket = SOCKET_FROM_FILE_OBJECT(serverSocketHandle);
3843
fbced69597a7 oops - error check was disabled
Claus Gittinger <cg@exept.de>
parents: 3742
diff changeset
  3113
# else
3247
259f71b89b6e class: Socket
Stefan Vogel <sv@exept.de>
parents: 3246
diff changeset
  3114
    serverSocket = __intVal(serverSocketHandle);
3843
fbced69597a7 oops - error check was disabled
Claus Gittinger <cg@exept.de>
parents: 3742
diff changeset
  3115
# endif
3246
c75a006f9a7a Win32 sockets use handles instead of file pointers
Stefan Vogel <sv@exept.de>
parents: 3224
diff changeset
  3116
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  3117
# 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
  3118
    if (blocking == false) {
5452
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  3119
        flags = fcntl(serverSocket, F_GETFL);
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  3120
        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
  3121
    }
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  3122
# endif
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  3123
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3124
# ifdef DO_WRAP_CALLS
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3125
    do {
5452
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  3126
        __threadErrno = 0;
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  3127
        alen = sizeof(sa);
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  3128
        newSock = (SOCKET)STX_WSA_CALL3("accept", accept, serverSocket, &sa, &alen);
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  3129
    } while ((newSock < 0) && (__threadErrno == EINTR));
4568
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  3130
    if (newSock == -1) {
5452
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  3131
        err = __MKSMALLINT(__threadErrno);
3126
d95cc55a4fb5 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3123
diff changeset
  3132
    }
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3133
# else
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3134
    __BEGIN_INTERRUPTABLE__
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3135
    do {
5452
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  3136
        alen = sizeof(sa);
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  3137
        newSock = accept(serverSocket, (struct sockaddr *) &sa, &alen);
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  3138
    } while ((newSock < 0) && (errno == EINTR));
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3139
    __END_INTERRUPTABLE__
4568
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  3140
    if (newSock == -1) {
5452
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  3141
        err = __MKSMALLINT(errno);
4568
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  3142
    }
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3143
# endif
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  3144
    DBGFPRINTF((stderr, "SOCKET: accept newSock=%d\n", newSock));
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  3145
3246
c75a006f9a7a Win32 sockets use handles instead of file pointers
Stefan Vogel <sv@exept.de>
parents: 3224
diff changeset
  3146
# if defined(O_NDELAY) && defined(SET_NDELAY)
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  3147
    if (blocking == false) {
5452
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  3148
        fcntl(serverSocket, F_SETFL, flags);
3246
c75a006f9a7a Win32 sockets use handles instead of file pointers
Stefan Vogel <sv@exept.de>
parents: 3224
diff changeset
  3149
    }
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  3150
# endif
3246
c75a006f9a7a Win32 sockets use handles instead of file pointers
Stefan Vogel <sv@exept.de>
parents: 3224
diff changeset
  3151
    if (newSock == -1) {
5452
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  3152
        DBGPRINTF(("SOCKET: accept call failed errno=%d\n", (int)(__intVal(err))));
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  3153
        goto out;
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  3154
    }
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  3155
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  3156
    if (__isNonNilObject(addr)) {
5452
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  3157
        OBJ oClass = __qClass(addr);
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  3158
        int nInstVars, nInstBytes, objSize;
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  3159
        char *addrP;
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  3160
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  3161
        if (! __isBytes(addr)) {
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  3162
            DBGPRINTF(("SOCKET: bad addr\n"));
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  3163
            closesocket(newSock);
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  3164
            err = @symbol(badAddressArg);
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  3165
            goto out;
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  3166
        }
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  3167
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  3168
        nInstVars = __intVal(__ClassInstPtr(oClass)->c_ninstvars);
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  3169
        nInstBytes = OHDR_SIZE + (nInstVars * sizeof(OBJ));
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  3170
        objSize = __qSize(addr) - nInstBytes;
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  3171
        addrP = (char *)__InstPtr(addr) + nInstBytes;
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  3172
        if (objSize < alen) {
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  3173
            DBGPRINTF(("SOCKET: bad addr\n"));
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  3174
            closesocket(newSock);
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  3175
            err = @symbol(badAddressArgLen);
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  3176
            goto out;
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  3177
        }
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  3178
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  3179
        /*
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  3180
         * extract the partners address
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  3181
         */
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  3182
        memcpy(addrP, (char *)&sa, alen);
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  3183
    }
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  3184
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  3185
    /*
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  3186
     * make it a FILE *
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  3187
     */
3843
fbced69597a7 oops - error check was disabled
Claus Gittinger <cg@exept.de>
parents: 3742
diff changeset
  3188
# ifdef __win32__
3246
c75a006f9a7a Win32 sockets use handles instead of file pointers
Stefan Vogel <sv@exept.de>
parents: 3224
diff changeset
  3189
#  if 0 && (defined( __BORLANDC__ ) || defined( __MINGW__ ))
c75a006f9a7a Win32 sockets use handles instead of file pointers
Stefan Vogel <sv@exept.de>
parents: 3224
diff changeset
  3190
    __stxWrapApiEnterCritical();
c75a006f9a7a Win32 sockets use handles instead of file pointers
Stefan Vogel <sv@exept.de>
parents: 3224
diff changeset
  3191
    _fd = _open_osfhandle((long)newSock, 0);
c75a006f9a7a Win32 sockets use handles instead of file pointers
Stefan Vogel <sv@exept.de>
parents: 3224
diff changeset
  3192
    __stxWrapApiLeaveCritical();
c75a006f9a7a Win32 sockets use handles instead of file pointers
Stefan Vogel <sv@exept.de>
parents: 3224
diff changeset
  3193
    DBGPRINTF(("SOCKET: sock=%d fd=%d\n", newSock, _fd));
2773
ab3049f4a351 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2748
diff changeset
  3194
#  else
3246
c75a006f9a7a Win32 sockets use handles instead of file pointers
Stefan Vogel <sv@exept.de>
parents: 3224
diff changeset
  3195
    _fd = (int)newSock;
2773
ab3049f4a351 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2748
diff changeset
  3196
#  endif
3843
fbced69597a7 oops - error check was disabled
Claus Gittinger <cg@exept.de>
parents: 3742
diff changeset
  3197
# else // ! __win32__
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  3198
    fp = fdopen(newSock, "r+");
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  3199
    if (! fp) {
5452
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  3200
        DBGPRINTF(("SOCKET: fdopen call failed\n"));
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  3201
        err = __MKSMALLINT(errno);
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  3202
        closesocket(newSock);
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  3203
        DBGFPRINTF((stderr, "SOCKET: close (fdopen failed) (%d)\n", newSock));
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  3204
        goto out;
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  3205
    }
3843
fbced69597a7 oops - error check was disabled
Claus Gittinger <cg@exept.de>
parents: 3742
diff changeset
  3206
# endif // ! __win32__
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  3207
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  3208
    if ((@global(FileOpenTrace) == true) || __debugging__) {
3843
fbced69597a7 oops - error check was disabled
Claus Gittinger <cg@exept.de>
parents: 3742
diff changeset
  3209
# ifdef __win32__
5452
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  3210
        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
  3211
# else
5452
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  3212
        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
  3213
# endif
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  3214
    }
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  3215
3843
fbced69597a7 oops - error check was disabled
Claus Gittinger <cg@exept.de>
parents: 3742
diff changeset
  3216
# ifdef __win32__
3246
c75a006f9a7a Win32 sockets use handles instead of file pointers
Stefan Vogel <sv@exept.de>
parents: 3224
diff changeset
  3217
    __externalAddressVal(newHandle) = _fd;
c75a006f9a7a Win32 sockets use handles instead of file pointers
Stefan Vogel <sv@exept.de>
parents: 3224
diff changeset
  3218
    __INST(handleType) = @symbol(socketHandle);
c75a006f9a7a Win32 sockets use handles instead of file pointers
Stefan Vogel <sv@exept.de>
parents: 3224
diff changeset
  3219
# else
c75a006f9a7a Win32 sockets use handles instead of file pointers
Stefan Vogel <sv@exept.de>
parents: 3224
diff changeset
  3220
    __externalAddressVal(newHandle) = fp;
c75a006f9a7a Win32 sockets use handles instead of file pointers
Stefan Vogel <sv@exept.de>
parents: 3224
diff changeset
  3221
    __INST(handleType) = @symbol(socketFilePointer);
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  3222
# endif
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  3223
#endif /* not NO_SOCKET */
4568
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  3224
out:;
1558
a563aac90660 No need to ask Socket>>#networkXXXOrderIsMSB, because the return value is
Stefan Vogel <sv@exept.de>
parents: 1542
diff changeset
  3225
%}.
3246
c75a006f9a7a Win32 sockets use handles instead of file pointers
Stefan Vogel <sv@exept.de>
parents: 3224
diff changeset
  3226
4568
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  3227
    err notNil ifTrue:[
5452
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  3228
        err isSymbol ifTrue:[
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  3229
            self error:err.
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  3230
        ].
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  3231
        ^ self reportError:err.
4568
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  3232
    ].
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  3233
3246
c75a006f9a7a Win32 sockets use handles instead of file pointers
Stefan Vogel <sv@exept.de>
parents: 3224
diff changeset
  3234
    handle := newHandle.
c75a006f9a7a Win32 sockets use handles instead of file pointers
Stefan Vogel <sv@exept.de>
parents: 3224
diff changeset
  3235
    buffered := false.
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  3236
    mode := #readwrite.
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  3237
    binary := false.
3620
c648d063bccc #REFACTORING
Stefan Vogel <sv@exept.de>
parents: 3617
diff changeset
  3238
    self registerForFinalization.
3059
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  3239
    peer := addr.
3246
c75a006f9a7a Win32 sockets use handles instead of file pointers
Stefan Vogel <sv@exept.de>
parents: 3224
diff changeset
  3240
    port := aServerSocket port.
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  3241
1558
a563aac90660 No need to ask Socket>>#networkXXXOrderIsMSB, because the return value is
Stefan Vogel <sv@exept.de>
parents: 1542
diff changeset
  3242
    ^ true
4568
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  3243
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  3244
    "Modified (comment): / 19-01-2018 / 13:35:57 / stefan"
2551
6da1bc89b74a changed:
Stefan Vogel <sv@exept.de>
parents: 2516
diff changeset
  3245
!
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3246
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3247
setSocketOption:option argument:arg1 argument:arg2
3513
8105bf370769 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3485
diff changeset
  3248
    |ok error|
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3249
2551
6da1bc89b74a changed:
Stefan Vogel <sv@exept.de>
parents: 2516
diff changeset
  3250
    handle isNil ifTrue:[
5452
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  3251
        ^ self errorNotOpen
2551
6da1bc89b74a changed:
Stefan Vogel <sv@exept.de>
parents: 2516
diff changeset
  3252
    ].
6da1bc89b74a changed:
Stefan Vogel <sv@exept.de>
parents: 2516
diff changeset
  3253
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3254
%{  /* STACK: 32000 */
2818
94d67df5c00d compilable with tcc
Claus Gittinger <cg@exept.de>
parents: 2773
diff changeset
  3255
#ifndef NO_SOCKET
2321
6f4cc7b644db filePointer -> handle migration
Claus Gittinger <cg@exept.de>
parents: 2308
diff changeset
  3256
    OBJ fp = __INST(handle);
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3257
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3258
    if (fp != nil) {
5452
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  3259
        SOCKET sock = SOCKET_FROM_FILE_OBJECT(fp);
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  3260
        int opt = -1;
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  3261
        int level = -1;
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  3262
        int usize = -1;
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  3263
        int ret;
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  3264
        union u {
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  3265
            BOOL        u_bool;
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  3266
            int         u_int;
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  3267
            struct linger  u_linger;
2516
592619f82885 Add setsockopt for Multicast stuff
Stefan Vogel <sv@exept.de>
parents: 2465
diff changeset
  3268
# ifdef IP_ADD_MEMBERSHIP
5452
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  3269
            struct ip_mreq u_ip_mreq;
2516
592619f82885 Add setsockopt for Multicast stuff
Stefan Vogel <sv@exept.de>
parents: 2465
diff changeset
  3270
# endif
3467
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
  3271
# if defined(SO_RCVTIMEO) || defined(SO_SNDTIMEO)
5452
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  3272
            struct timeval u_tv;
3467
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
  3273
# endif
5452
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  3274
        } u;
2516
592619f82885 Add setsockopt for Multicast stuff
Stefan Vogel <sv@exept.de>
parents: 2465
diff changeset
  3275
592619f82885 Add setsockopt for Multicast stuff
Stefan Vogel <sv@exept.de>
parents: 2465
diff changeset
  3276
# ifdef IP_ADD_MEMBERSHIP
5452
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  3277
        if (option == @symbol(IP_DROP_MEMBERSHIP)) {
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  3278
            opt = IP_DROP_MEMBERSHIP;
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  3279
            goto dropOrAdd;
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  3280
        }
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  3281
        if (option == @symbol(IP_ADD_MEMBERSHIP)) {
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  3282
            /* add membership to a multicast group */
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  3283
            opt = IP_ADD_MEMBERSHIP;
2516
592619f82885 Add setsockopt for Multicast stuff
Stefan Vogel <sv@exept.de>
parents: 2465
diff changeset
  3284
dropOrAdd:
5452
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  3285
            level = IPPROTO_IP;
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  3286
            usize = sizeof(u.u_ip_mreq);
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  3287
            if (__isByteArrayLike(arg1) && __isByteArrayLike(arg2)) {
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  3288
                memcpy(&u.u_ip_mreq.imr_multiaddr, __byteArrayVal(arg1), sizeof(u.u_ip_mreq.imr_multiaddr));
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  3289
                memcpy(&u.u_ip_mreq.imr_interface, __byteArrayVal(arg2), sizeof(u.u_ip_mreq.imr_interface));
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  3290
                // once we use the struct ip_mreqn:
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  3291
                // u.u_ip_mreqn.imr_ifindex = 0;
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  3292
            }
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  3293
            else
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  3294
                goto argError;
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  3295
        }
2516
592619f82885 Add setsockopt for Multicast stuff
Stefan Vogel <sv@exept.de>
parents: 2465
diff changeset
  3296
# endif /* IP_ADD_MEMBERSHIP */
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3297
4738
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
  3298
# ifdef IP_TTL
5452
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  3299
        if (option == @symbol(IP_TTL)) {
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  3300
            opt = IP_TTL;
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  3301
            level = IPPROTO_IP;
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  3302
            usize = sizeof(u.u_int);
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  3303
            if (__isSmallInteger(arg1))u.u_int = __intVal(arg1);
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  3304
            else goto argError;
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  3305
        }
4738
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
  3306
# endif /* IP_TTL */
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
  3307
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
  3308
# ifdef IP_MULTICAST_TTL
5452
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  3309
        if (option == @symbol(IP_MULTICAST_TTL)) {
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  3310
            opt = IP_MULTICAST_TTL;
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  3311
            level = IPPROTO_IP;
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  3312
            usize = sizeof(u.u_int);
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  3313
            if (__isSmallInteger(arg1))u.u_int = __intVal(arg1);
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  3314
            else goto argError;
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  3315
        }
4738
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
  3316
# endif /* IP_TTL */
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
  3317
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
  3318
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3319
# ifdef SO_BROADCAST
5452
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  3320
        if (option == @symbol(SO_BROADCAST)) {
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  3321
            /* Enables transmission and receipt of broadcast messages on the socket. */
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  3322
            opt = SO_BROADCAST;
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  3323
            level = SOL_SOCKET;
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  3324
            usize = sizeof(u.u_bool);
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  3325
            if (arg1 == true) u.u_bool = TRUE;
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  3326
            else if (arg1 == false) u.u_bool = FALSE;
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  3327
            else goto argError;
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  3328
        }
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3329
# endif /* SO_BROADCAST */
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3330
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3331
# ifdef SO_CONDITIONAL
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3332
#  if 0
5452
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  3333
        if (option == @symbol(SO_CONDITIONAL)) {
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  3334
            /* Enables sockets to delay the acknowledgment of a connection until after the WSAAccept condition function is called. */
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  3335
            opt = SO_CONDITIONAL;
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  3336
            level = SOL_SOCKET;
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  3337
            usize = sizeof(u.u_bool);
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  3338
            if (arg1 == true) u.u_bool = TRUE;
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  3339
            else if (arg1 == false) u.u_bool = FALSE;
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  3340
            else goto argError;
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  3341
        }
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3342
#  endif
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3343
# endif /* SO_CONDITIONAL */
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3344
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3345
# ifdef SO_DEBUG
5452
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  3346
        if (option == @symbol(SO_DEBUG)) {
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  3347
            /* Records debugging information. */
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  3348
            opt = SO_DEBUG;
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  3349
            level = SOL_SOCKET;
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  3350
            usize = sizeof(u.u_bool);
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  3351
            if (arg1 == true) u.u_bool = TRUE;
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  3352
            else if (arg1 == false) u.u_bool = FALSE;
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  3353
            else goto argError;
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  3354
        }
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3355
# endif /* SO_DEBUG */
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3356
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3357
# ifdef SO_DONTLINGER
5452
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  3358
        if (option == @symbol(SO_DONTLINGER)) {
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  3359
            /* Does not block close waiting for unsent data to be sent.
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  3360
               Setting this option is equivalent to setting SO_LINGER with l_onoff set to zero. */
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  3361
            opt = SO_DONTLINGER;
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  3362
            level = SOL_SOCKET;
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  3363
            usize = sizeof(u.u_bool);
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  3364
            if (arg1 == true) u.u_bool = TRUE;
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  3365
            else if (arg1 == false) u.u_bool = FALSE;
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  3366
            else goto argError;
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  3367
        }
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3368
# endif /* SO_DONTLINGER */
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3369
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3370
# ifdef SO_DONTROUTE
5452
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  3371
        if (option == @symbol(SO_DONTROUTE)) {
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  3372
            /* Does not route: sends directly to interface.
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  3373
               Succeeds but is ignored on AF_INET sockets;
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  3374
               fails on AF_INET6 sockets with WSAENOPROTOOPT.
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  3375
               Not supported on ATM sockets (results in an error). */
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  3376
            opt = SO_DONTROUTE;
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  3377
            level = SOL_SOCKET;
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  3378
            usize = sizeof(u.u_bool);
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  3379
            if (arg1 == true) u.u_bool = TRUE;
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  3380
            else if (arg1 == false) u.u_bool = FALSE;
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  3381
            else goto argError;
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  3382
        }
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3383
# endif /* SO_DONTROUTE */
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3384
2516
592619f82885 Add setsockopt for Multicast stuff
Stefan Vogel <sv@exept.de>
parents: 2465
diff changeset
  3385
#if defined(IPPROTO_TCP) && defined(TCP_NODELAY)
5452
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  3386
        if (option == @symbol(TCP_NODELAY)) {
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  3387
            /* enable/disable TCP_NODELAY (i.e. disable/enable the Nagle algorithm) */
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  3388
            opt = TCP_NODELAY;
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  3389
            level = IPPROTO_TCP;
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  3390
            usize = sizeof(u.u_bool);
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  3391
            if (arg1 == true) u.u_bool = TRUE;
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  3392
            else if (arg1 == false) u.u_bool = FALSE;
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  3393
            else goto argError;
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  3394
        }
2516
592619f82885 Add setsockopt for Multicast stuff
Stefan Vogel <sv@exept.de>
parents: 2465
diff changeset
  3395
# endif /* TCP_NODELAY */
592619f82885 Add setsockopt for Multicast stuff
Stefan Vogel <sv@exept.de>
parents: 2465
diff changeset
  3396
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3397
# ifdef SO_KEEPALIVE
5452
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  3398
        if (option == @symbol(SO_KEEPALIVE)) {
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  3399
            /* Sends keep-alives. Not supported on ATM sockets (results in an error). */
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  3400
            opt = SO_KEEPALIVE;
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  3401
            level = SOL_SOCKET;
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  3402
            usize = sizeof(u.u_bool);
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  3403
            if (arg1 == true) u.u_bool = TRUE;
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  3404
            else if (arg1 == false) u.u_bool = FALSE;
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  3405
            else goto argError;
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  3406
        }
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3407
# endif /* SO_KEEPALIVE */
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3408
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3409
# ifdef SO_LINGER
5452
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  3410
        if (option == @symbol(SO_LINGER)) {
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  3411
            /* Lingers on close if unsent data is present. */
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  3412
            opt = SO_LINGER;
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  3413
            level = SOL_SOCKET;
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  3414
            usize = sizeof(u.u_linger);
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  3415
            if (arg1 == true) u.u_linger.l_onoff = TRUE;
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  3416
            else if (arg1 == false) u.u_linger.l_onoff = FALSE;
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  3417
            else goto argError;
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  3418
            if (arg2 == nil) u.u_linger.l_linger = 0;
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  3419
            else if (__isSmallInteger(arg2))u.u_linger.l_linger = __intVal(arg2);
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  3420
            else goto argError;
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  3421
            DBGPRINTF(("SOCKET: SO_LINGER %d %d\n", u.u_linger.l_onoff, u.u_linger.l_linger));
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  3422
        }
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3423
# endif /* SO_LINGER */
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3424
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3425
# ifdef SO_OOBINLINE
5452
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  3426
        if (option == @symbol(SO_OOBINLINE)) {
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  3427
            /* Receives OOB data in the normal data stream. */
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  3428
            opt = SO_OOBINLINE;
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  3429
            level = SOL_SOCKET;
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  3430
            usize = sizeof(u.u_bool);
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  3431
            if (arg1 == true) u.u_bool = TRUE;
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  3432
            else if (arg1 == false) u.u_bool = FALSE;
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  3433
            else goto argError;
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  3434
        }
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3435
# endif /* SO_OOBINLINE */
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3436
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3437
# ifdef SO_RCVBUF
5452
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  3438
        if (option == @symbol(SO_RCVBUF)) {
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  3439
            /* Specifies the total per-socket buffer space reserved for receives.
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  3440
               This is unrelated to SO_MAX_MSG_SIZE or the size of a TCP window. */
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  3441
            opt = SO_RCVBUF;
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  3442
            level = SOL_SOCKET;
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  3443
            usize = sizeof(u.u_int);
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  3444
            if (__isSmallInteger(arg1))u.u_int = __intVal(arg1);
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  3445
            else goto argError;
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  3446
        }
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3447
# endif /* SO_RCVBUF */
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3448
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3449
# ifdef SO_SNDBUF
5452
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  3450
        if (option == @symbol(SO_SNDBUF)) {
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  3451
            /* Specifies the total per-socket buffer space reserved for sends.
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  3452
               This is unrelated to SO_MAX_MSG_SIZE or the size of a TCP window. */
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  3453
            opt = SO_SNDBUF;
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  3454
            level = SOL_SOCKET;
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  3455
            usize = sizeof(u.u_int);
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  3456
            if (__isSmallInteger(arg1))u.u_int = __intVal(arg1);
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  3457
            else goto argError;
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  3458
        }
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3459
# endif /* SO_SNDBUF */
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3460
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3461
# ifdef SO_REUSEADDR
5452
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  3462
        if (option == @symbol(SO_REUSEADDR)) {
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  3463
            /* Allows the socket to be bound to an address that is already in use.  */
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  3464
            opt = SO_REUSEADDR;
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  3465
            level = SOL_SOCKET;
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  3466
            usize = sizeof(u.u_bool);
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  3467
            if (arg1 == true) u.u_bool = TRUE;
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  3468
            else if (arg1 == false) u.u_bool = FALSE;
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  3469
            else goto argError;
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  3470
        }
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3471
# endif /* SO_OOBINLINE */
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3472
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3473
# ifdef SO_EXCLUSIVEADDRUSE
5452
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  3474
        if (option == @symbol(SO_EXCLUSIVEADDRUSE)) {
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  3475
            /* Enables a socket to be bound for exclusive access.
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  3476
               Does not require administrative privilege.  */
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  3477
            opt = SO_EXCLUSIVEADDRUSE;
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  3478
            level = SOL_SOCKET;
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  3479
            usize = sizeof(u.u_bool);
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  3480
            if (arg1 == true) u.u_bool = TRUE;
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  3481
            else if (arg1 == false) u.u_bool = FALSE;
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  3482
            else goto argError;
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  3483
        }
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3484
# endif /* SO_OOBINLINE */
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3485
3467
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
  3486
# ifdef SO_RCVTIMEO
5452
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  3487
        if ((option == @symbol(SO_RCVTIMEO))
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  3488
         && __isSmallInteger(arg1)
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  3489
         && __isSmallInteger(arg2)) {
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  3490
            opt = SO_RCVTIMEO;
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  3491
            level = SOL_SOCKET;
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  3492
            u.u_tv.tv_sec = __intVal(arg1);
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  3493
            u.u_tv.tv_usec = __intVal(arg2);
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  3494
            usize = sizeof(u.u_tv);
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  3495
        }
3467
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
  3496
# endif /* SO_RCVTIMEO */
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
  3497
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
  3498
# ifdef SO_SNDTIMEO
5452
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  3499
        if ((option == @symbol(SO_SNDTIMEO))
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  3500
         && __isSmallInteger(arg1)
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  3501
         && __isSmallInteger(arg2)) {
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  3502
            opt = SO_SNDTIMEO;
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  3503
            level = SOL_SOCKET;
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  3504
            u.u_tv.tv_sec = __intVal(arg1);
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  3505
            u.u_tv.tv_usec = __intVal(arg2);
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  3506
            usize = sizeof(u.u_tv);
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  3507
        }
3467
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
  3508
# endif /* SO_SNDTIMEO */
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
  3509
3843
fbced69597a7 oops - error check was disabled
Claus Gittinger <cg@exept.de>
parents: 3742
diff changeset
  3510
# if !defined(IPV6_V6ONLY) && defined(__win32__)
3513
8105bf370769 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3485
diff changeset
  3511
#  define IPPROTO_IPV6 41
8105bf370769 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3485
diff changeset
  3512
#  define IPV6_V6ONLY 27
8105bf370769 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3485
diff changeset
  3513
# endif
8105bf370769 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3485
diff changeset
  3514
8105bf370769 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3485
diff changeset
  3515
# if defined(IPV6_V6ONLY)
5452
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  3516
        if (option == @symbol(IPV6_V6ONLY)) {
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  3517
            opt = IPV6_V6ONLY;
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  3518
            level = IPPROTO_IPV6;
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  3519
            usize = sizeof(u.u_bool);
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  3520
            if (arg1 == true) u.u_bool = TRUE;
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  3521
            else if (arg1 == false) u.u_bool = FALSE;
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  3522
            else goto argError;
3843
fbced69597a7 oops - error check was disabled
Claus Gittinger <cg@exept.de>
parents: 3742
diff changeset
  3523
#  ifdef __win32__
5452
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  3524
            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
  3525
#  endif
5452
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  3526
        }
3513
8105bf370769 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3485
diff changeset
  3527
# endif /* IPV6_V6ONLY */
8105bf370769 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3485
diff changeset
  3528
5452
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  3529
        if (usize == -1) goto argError;
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  3530
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  3531
        ok = (setsockopt(sock, level, opt, (char *)&u, usize) >= 0) ? true : false;
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  3532
        if (ok == false) {
3843
fbced69597a7 oops - error check was disabled
Claus Gittinger <cg@exept.de>
parents: 3742
diff changeset
  3533
# ifdef __win32__
5452
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  3534
            error = __mkSmallInteger(WSAGetLastError());
3843
fbced69597a7 oops - error check was disabled
Claus Gittinger <cg@exept.de>
parents: 3742
diff changeset
  3535
# else
5452
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  3536
            error = __mkSmallInteger(errno);
3843
fbced69597a7 oops - error check was disabled
Claus Gittinger <cg@exept.de>
parents: 3742
diff changeset
  3537
# endif
5452
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  3538
        }
3513
8105bf370769 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3485
diff changeset
  3539
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3540
    }
1529
911273d090c1 Re-unified Win32 and Unix code into single Socket.st.
Claus Gittinger <cg@exept.de>
parents: 1505
diff changeset
  3541
argError: ;
2818
94d67df5c00d compilable with tcc
Claus Gittinger <cg@exept.de>
parents: 2773
diff changeset
  3542
#endif /* NO_SOCKET */
1529
911273d090c1 Re-unified Win32 and Unix code into single Socket.st.
Claus Gittinger <cg@exept.de>
parents: 1505
diff changeset
  3543
%}.
911273d090c1 Re-unified Win32 and Unix code into single Socket.st.
Claus Gittinger <cg@exept.de>
parents: 1505
diff changeset
  3544
    ok isNil ifTrue:[
5452
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  3545
        self primitiveFailed
1529
911273d090c1 Re-unified Win32 and Unix code into single Socket.st.
Claus Gittinger <cg@exept.de>
parents: 1505
diff changeset
  3546
    ].
911273d090c1 Re-unified Win32 and Unix code into single Socket.st.
Claus Gittinger <cg@exept.de>
parents: 1505
diff changeset
  3547
    ok ifFalse:[
5452
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  3548
        '++++ 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
  3549
    ].
2551
6da1bc89b74a changed:
Stefan Vogel <sv@exept.de>
parents: 2516
diff changeset
  3550
!
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3551
2823
10179ccfae5d Default for close - linger in background instead 30s in foreground
Stefan Vogel <sv@exept.de>
parents: 2818
diff changeset
  3552
shutdown:howNum
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3553
    "shutDown the socket - inform it that no more I/O will be performed.
5452
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  3554
         0 - read side   (no further reads)
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  3555
             the tcp receive window is closed, so the peer cannot send more data.
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  3556
         1 - write side  (no further writes)
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  3557
             first, all queued data will be delivered to the peer.
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  3558
             Then, an orderly release (TCP FIN) is sent to signal the peer,
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  3559
             that we will not send more data.
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  3560
         2 - both read side and write side."
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3561
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3562
%{
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3563
#ifndef NO_SOCKET
2823
10179ccfae5d Default for close - linger in background instead 30s in foreground
Stefan Vogel <sv@exept.de>
parents: 2818
diff changeset
  3564
    OBJ __handle = __INST(handle);
3246
c75a006f9a7a Win32 sockets use handles instead of file pointers
Stefan Vogel <sv@exept.de>
parents: 3224
diff changeset
  3565
2823
10179ccfae5d Default for close - linger in background instead 30s in foreground
Stefan Vogel <sv@exept.de>
parents: 2818
diff changeset
  3566
    if ((__handle != nil) && __isSmallInteger(howNum)) {
5452
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  3567
        SOCKET sock = SOCKET_FROM_FILE_OBJECT(__handle);
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  3568
        INT how = __intVal(howNum);
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  3569
        INT ret;
2823
10179ccfae5d Default for close - linger in background instead 30s in foreground
Stefan Vogel <sv@exept.de>
parents: 2818
diff changeset
  3570
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3571
# ifdef DO_WRAP_CALLS
5452
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  3572
        do {
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  3573
            __threadErrno = 0;
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  3574
            DBGFPRINTF((stderr, "SOCKET: shutDown...\n"));
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  3575
            ret = (INT)STX_WSA_NOINT_CALL2("shutdown", shutdown, sock, how);
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  3576
            DBGFPRINTF((stderr, "SOCKET: shutDown -> %d (%d)\n", ret, __threadErrno));
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  3577
        } 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
  3578
# else
5452
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  3579
        __BEGIN_INTERRUPTABLE__
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  3580
        shutdown(sock, how);
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  3581
        __END_INTERRUPTABLE__
1529
911273d090c1 Re-unified Win32 and Unix code into single Socket.st.
Claus Gittinger <cg@exept.de>
parents: 1505
diff changeset
  3582
# endif
781
4d61e7588ff3 added #waitForNewConnectionOrDataOnAny:timeout:
Claus Gittinger <cg@exept.de>
parents: 776
diff changeset
  3583
    }
4d61e7588ff3 added #waitForNewConnectionOrDataOnAny:timeout:
Claus Gittinger <cg@exept.de>
parents: 776
diff changeset
  3584
#endif
1339
cc973a42aa54 shutdown: added
Claus Gittinger <cg@exept.de>
parents: 1338
diff changeset
  3585
%}.
781
4d61e7588ff3 added #waitForNewConnectionOrDataOnAny:timeout:
Claus Gittinger <cg@exept.de>
parents: 776
diff changeset
  3586
! !
4d61e7588ff3 added #waitForNewConnectionOrDataOnAny:timeout:
Claus Gittinger <cg@exept.de>
parents: 776
diff changeset
  3587
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3588
!Socket methodsFor:'printing & storing'!
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3589
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3590
printOn:aStream
3530
ce2171c0fe57 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3514
diff changeset
  3591
    aStream nextPutAll:self className; nextPutAll:'('.
5464
7f31945df4b1 #QUALITY by stefan
Stefan Vogel <sv@exept.de>
parents: 5460
diff changeset
  3592
    self isOpen ifFalse:[
7f31945df4b1 #QUALITY by stefan
Stefan Vogel <sv@exept.de>
parents: 5460
diff changeset
  3593
        aStream nextPutAll:'*closed* '.
7f31945df4b1 #QUALITY by stefan
Stefan Vogel <sv@exept.de>
parents: 5460
diff changeset
  3594
    ].    
3530
ce2171c0fe57 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3514
diff changeset
  3595
    domain printOn:aStream.
ce2171c0fe57 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3514
diff changeset
  3596
    aStream nextPutAll:' protocol='.
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3597
    protocol printOn:aStream.
4736
c5a3e2dae276 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 4671
diff changeset
  3598
    aStream nextPutAll:' type='.
c5a3e2dae276 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 4671
diff changeset
  3599
    socketType printOn:aStream.
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3600
    aStream nextPutAll:' port='.
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  3601
    self port printOn:aStream.
4636
7e1e0ce3e0b4 #QUALITY by stefan
Stefan Vogel <sv@exept.de>
parents: 4630
diff changeset
  3602
    peer notNil ifTrue:[
5452
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  3603
        aStream nextPutAll:' peer='.
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  3604
        peer printOn:aStream.
4636
7e1e0ce3e0b4 #QUALITY by stefan
Stefan Vogel <sv@exept.de>
parents: 4630
diff changeset
  3605
    ].
7e1e0ce3e0b4 #QUALITY by stefan
Stefan Vogel <sv@exept.de>
parents: 4630
diff changeset
  3606
    listening notNil ifTrue:[
5452
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  3607
        aStream nextPutAll:' *listening('.
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  3608
        listening printOn:aStream.
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  3609
        aStream nextPutAll:')*'.
4636
7e1e0ce3e0b4 #QUALITY by stefan
Stefan Vogel <sv@exept.de>
parents: 4630
diff changeset
  3610
    ].
1842
88c04d1e9e6b changed #printOn:
Stefan Vogel <sv@exept.de>
parents: 1839
diff changeset
  3611
    aStream nextPut:$).
4636
7e1e0ce3e0b4 #QUALITY by stefan
Stefan Vogel <sv@exept.de>
parents: 4630
diff changeset
  3612
7e1e0ce3e0b4 #QUALITY by stefan
Stefan Vogel <sv@exept.de>
parents: 4630
diff changeset
  3613
    "Modified: / 23-04-2018 / 19:44:24 / stefan"
4736
c5a3e2dae276 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 4671
diff changeset
  3614
    "Modified: / 19-09-2018 / 18:30:20 / Claus Gittinger"
5464
7f31945df4b1 #QUALITY by stefan
Stefan Vogel <sv@exept.de>
parents: 5460
diff changeset
  3615
    "Modified: / 02-03-2020 / 19:25:40 / Stefan Vogel"
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3616
! !
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3617
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3618
!Socket methodsFor:'queries'!
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3619
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3620
domain
3059
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  3621
    "return the sockets addressing domain (i.e. #AF_INET, #AF_INET6, #AF_UNIX, ...)"
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3622
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3623
    ^ domain
126
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
  3624
!
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
  3625
3059
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  3626
getFullPeerAddress
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  3627
    "implemented for swazoo project (primitive code can't be loaded as extension)
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3628
     Answer my own address (I am bound to this address).
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3629
     Note that this address may change after a connect or accept."
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3630
3059
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  3631
    |error domainClass addr|
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3632
2321
6f4cc7b644db filePointer -> handle migration
Claus Gittinger <cg@exept.de>
parents: 2308
diff changeset
  3633
    handle isNil ifTrue:[
5452
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  3634
        ^ self errorNotOpen
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
    domainClass := self class socketAddressClassForDomain:domain.
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3638
    domainClass isNil ifTrue:[
5452
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  3639
        ^ self error:'invalid (unsupported) domain'.
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3640
    ].
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3641
    addr := domainClass new.
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3642
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3643
%{
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3644
#ifndef NO_SOCKET
2321
6f4cc7b644db filePointer -> handle migration
Claus Gittinger <cg@exept.de>
parents: 2308
diff changeset
  3645
    OBJ fp = __INST(handle);
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3646
    SOCKET sock;
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3647
    int ret;
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3648
    union sockaddr_u sa;
3059
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  3649
    unsigned int alen = sizeof(sa);
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3650
    char *addrP;
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3651
    int addrObjSize, nAddrInstBytes;
3059
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  3652
    OBJ addrClass;
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  3653
    int nAddrInstVars;
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3654
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3655
    if (!__isNonNilObject(addr) || !__isBytes(addr)) {
5452
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  3656
        DBGPRINTF(("SOCKET: bad addr\n"));
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  3657
        error = @symbol(badArgument);
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  3658
        goto err;
3059
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  3659
    }
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  3660
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  3661
    addrClass = __qClass(addr);
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  3662
    nAddrInstVars = __intVal(__ClassInstPtr(addrClass)->c_ninstvars);
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  3663
    nAddrInstBytes = OHDR_SIZE + (nAddrInstVars * sizeof(OBJ));
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  3664
    addrObjSize = __qSize(addr) - nAddrInstBytes;
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  3665
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  3666
    sock = SOCKET_FROM_FILE_OBJECT(fp);
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  3667
    ret = getpeername(sock, (struct sockaddr *)&sa, &alen);
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  3668
    if (ret < 0) {
3843
fbced69597a7 oops - error check was disabled
Claus Gittinger <cg@exept.de>
parents: 3742
diff changeset
  3669
# ifdef __win32__
5452
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  3670
        errno = WSAGetLastError();
3059
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  3671
# endif
5452
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  3672
        DBGPRINTF(("SOCKET: getsocketname failed ret=%d errno=%d\n", ret, errno));
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  3673
        error = __MKSMALLINT(errno);
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  3674
        goto err;
3059
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  3675
    }
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  3676
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  3677
    if (addrObjSize < alen) {
5452
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  3678
        DBGPRINTF(("SOCKET: bad addr\n"));
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  3679
        error = @symbol(badArgument);
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  3680
        goto err;
3059
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  3681
    }
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  3682
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  3683
    addrP = (char *)__InstPtr(addr) + nAddrInstBytes;
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  3684
    memcpy(addrP, (char *)&sa, alen);
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  3685
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  3686
err:;
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  3687
#else /* NO_SOCKET */
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  3688
    error = @symbol(notImplemented);
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  3689
#endif /* NO_SOCKET */
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  3690
%}.
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  3691
    error notNil ifTrue:[
5452
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  3692
        ^ self errorReporter reportOn:error
3059
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  3693
    ].
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  3694
    ^ addr
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  3695
!
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  3696
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  3697
getFullSocketAddress
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  3698
    "implemented for swazoo project (primitive code can't be loaded as extension)
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  3699
     Answer my own address (I am bound to this address).
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  3700
     Note that this address may change after a connect or accept."
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  3701
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  3702
    |error domainClass addr|
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  3703
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  3704
    handle isNil ifTrue:[
5452
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  3705
        ^ self errorNotOpen
3059
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  3706
    ].
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  3707
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  3708
    domainClass := self class socketAddressClassForDomain:domain.
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  3709
    domainClass isNil ifTrue:[
5452
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  3710
        ^ self error:'invalid (unsupported) domain'.
3059
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
    addr := domainClass new.
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  3713
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  3714
%{
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  3715
#ifndef NO_SOCKET
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  3716
    OBJ fp = __INST(handle);
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  3717
    SOCKET sock;
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  3718
    int ret;
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  3719
    union sockaddr_u sa;
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  3720
    unsigned int alen = sizeof(sa);
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  3721
    char *addrP;
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  3722
    int addrObjSize, nAddrInstBytes;
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  3723
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  3724
    if (!__isNonNilObject(addr) || !__isBytes(addr)) {
5452
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  3725
        DBGPRINTF(("SOCKET: bad addr\n"));
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  3726
        error = @symbol(badArgument);
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  3727
        goto err;
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3728
    }
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3729
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3730
    {
5452
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  3731
        OBJ addrClass;
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  3732
        int nAddrInstVars;
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  3733
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  3734
        addrClass = __qClass(addr);
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  3735
        nAddrInstVars = __intVal(__ClassInstPtr(addrClass)->c_ninstvars);
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  3736
        nAddrInstBytes = OHDR_SIZE + (nAddrInstVars * sizeof(OBJ));
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  3737
        addrObjSize = __qSize(addr) - nAddrInstBytes;
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3738
    }
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3739
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3740
    sock = SOCKET_FROM_FILE_OBJECT(fp);
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3741
    ret = getsockname(sock, (struct sockaddr *)&sa, &alen);
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3742
    if (ret < 0) {
3843
fbced69597a7 oops - error check was disabled
Claus Gittinger <cg@exept.de>
parents: 3742
diff changeset
  3743
# ifdef __win32__
5452
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  3744
        errno = WSAGetLastError();
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3745
# endif
5452
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  3746
        DBGPRINTF(("SOCKET: getsocketname failed ret=%d errno=%d\n", ret, errno));
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  3747
        error = __MKSMALLINT(errno);
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  3748
        goto err;
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3749
    }
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3750
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3751
    if (addrObjSize < alen) {
5452
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  3752
        DBGPRINTF(("SOCKET: bad addr\n"));
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  3753
        error = @symbol(badArgument);
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  3754
        goto err;
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3755
    }
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3756
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3757
    addrP = (char *)__InstPtr(addr) + nAddrInstBytes;
3059
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  3758
    memcpy(addrP, (char *)&sa, alen);
1535
f6aa0fc8c3cc getSocketAddress
Claus Gittinger <cg@exept.de>
parents: 1533
diff changeset
  3759
f6aa0fc8c3cc getSocketAddress
Claus Gittinger <cg@exept.de>
parents: 1533
diff changeset
  3760
err:;
f6aa0fc8c3cc getSocketAddress
Claus Gittinger <cg@exept.de>
parents: 1533
diff changeset
  3761
#else /* NO_SOCKET */
f6aa0fc8c3cc getSocketAddress
Claus Gittinger <cg@exept.de>
parents: 1533
diff changeset
  3762
    error = @symbol(notImplemented);
f6aa0fc8c3cc getSocketAddress
Claus Gittinger <cg@exept.de>
parents: 1533
diff changeset
  3763
#endif /* NO_SOCKET */
f6aa0fc8c3cc getSocketAddress
Claus Gittinger <cg@exept.de>
parents: 1533
diff changeset
  3764
%}.
f6aa0fc8c3cc getSocketAddress
Claus Gittinger <cg@exept.de>
parents: 1533
diff changeset
  3765
    error notNil ifTrue:[
5452
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  3766
        ^ self errorReporter reportOn:error
1535
f6aa0fc8c3cc getSocketAddress
Claus Gittinger <cg@exept.de>
parents: 1533
diff changeset
  3767
    ].
f6aa0fc8c3cc getSocketAddress
Claus Gittinger <cg@exept.de>
parents: 1533
diff changeset
  3768
    ^ addr
f6aa0fc8c3cc getSocketAddress
Claus Gittinger <cg@exept.de>
parents: 1533
diff changeset
  3769
!
f6aa0fc8c3cc getSocketAddress
Claus Gittinger <cg@exept.de>
parents: 1533
diff changeset
  3770
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3771
getName
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3772
    "return the name; here, we return the ports name"
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3773
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  3774
    ^ self port printString
126
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
  3775
!
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
  3776
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3777
getPeer
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3778
    "ST-80 compatibility: return an IPSocketAddress instance representing
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3779
     my hostname/port combination.
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3780
     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
  3781
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
  3782
    ^ peer
102
5dc264007513 added getPeer for ST-80 compatibility
Claus Gittinger <cg@exept.de>
parents: 99
diff changeset
  3783
!
5dc264007513 added getPeer for ST-80 compatibility
Claus Gittinger <cg@exept.de>
parents: 99
diff changeset
  3784
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3785
getPeerName
4091
ff4070ceffad #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 4039
diff changeset
  3786
    "return the peer name; that's the hostname (or dotted name) of the
25
996051271ce9 *** empty log message ***
claus
parents: 21
diff changeset
  3787
     partners host after an accept."
996051271ce9 *** empty log message ***
claus
parents: 21
diff changeset
  3788
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
  3789
    peerName isNil ifTrue:[
5452
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  3790
        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
  3791
    ].
25
996051271ce9 *** empty log message ***
claus
parents: 21
diff changeset
  3792
    ^ peerName
28
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  3793
!
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  3794
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3795
getSocketAddress
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3796
    "implemented for swazoo project primitive code cant load as extension
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3797
     answer my own address (I am bound to this address).
1146
71a9df78ba9e bad spelling
Stefan Vogel <sv@exept.de>
parents: 1136
diff changeset
  3798
     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
  3799
1535
f6aa0fc8c3cc getSocketAddress
Claus Gittinger <cg@exept.de>
parents: 1533
diff changeset
  3800
    ^ self getFullSocketAddress hostAddress
1146
71a9df78ba9e bad spelling
Stefan Vogel <sv@exept.de>
parents: 1136
diff changeset
  3801
!
71a9df78ba9e bad spelling
Stefan Vogel <sv@exept.de>
parents: 1136
diff changeset
  3802
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3803
isActive
4795
58f0486fe4ba #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4791
diff changeset
  3804
    "return true, if the receiver has a connection or is bound or listening"
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3805
2321
6f4cc7b644db filePointer -> handle migration
Claus Gittinger <cg@exept.de>
parents: 2308
diff changeset
  3806
    ^ handle notNil
4795
58f0486fe4ba #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4791
diff changeset
  3807
58f0486fe4ba #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4791
diff changeset
  3808
    "Modified (comment): / 05-02-2019 / 17:19:35 / Stefan Vogel"
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3809
!
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3810
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3811
isConnected
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3812
    "return true, if the receiver has a connection"
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3813
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3814
    ^ self isActive
5452
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  3815
        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
  3816
!
a563aac90660 No need to ask Socket>>#networkXXXOrderIsMSB, because the return value is
Stefan Vogel <sv@exept.de>
parents: 1542
diff changeset
  3817
5196
f2b4c109c24f #FEATURE by exept
Claus Gittinger <cg@exept.de>
parents: 5001
diff changeset
  3818
isListening
f2b4c109c24f #FEATURE by exept
Claus Gittinger <cg@exept.de>
parents: 5001
diff changeset
  3819
    ^ listening notNil
f2b4c109c24f #FEATURE by exept
Claus Gittinger <cg@exept.de>
parents: 5001
diff changeset
  3820
!
f2b4c109c24f #FEATURE by exept
Claus Gittinger <cg@exept.de>
parents: 5001
diff changeset
  3821
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3822
port
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  3823
    "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
  3824
     - so this is the local port."
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  3825
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  3826
"/    port isNil ifTrue:[
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  3827
"/        port := self getFullSocketAddress port.
1505
Stefan Vogel <sv@exept.de>
parents: 1504
diff changeset
  3828
"/    ].
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  3829
71
claus
parents: 63
diff changeset
  3830
    ^ port
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3831
!
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3832
3059
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  3833
socketAddressClass
4288
00e575acf898 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 4261
diff changeset
  3834
    "get the matching SocketAddress class for this socket"
3059
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  3835
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  3836
    |domainClass|
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  3837
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  3838
    domainClass := self class socketAddressClassForDomain:domain.
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  3839
    domainClass isNil ifTrue:[
5452
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  3840
        ^ self error:'invalid (unsupported) domain'.
3059
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  3841
    ].
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  3842
    ^ domainClass.
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  3843
!
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  3844
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3845
type
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3846
    "return the sockets connection type (i.e. #datagram, #stream etc)"
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3847
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3848
    ^ socketType
81
claus
parents: 79
diff changeset
  3849
! !
claus
parents: 79
diff changeset
  3850
126
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
  3851
!Socket methodsFor:'socket setup'!
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
  3852
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3853
domain:domainArg type:typeArg
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3854
    "set up socket with domain and type.
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3855
     This is a low level entry; no binding, listening or connect
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3856
     is done. Both arguments must be symbols from one of
3059
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  3857
      #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
  3858
3137
df3e9cebf52c class: Socket
Stefan Vogel <sv@exept.de>
parents: 3127
diff changeset
  3859
    ^ self domain:domainArg type:typeArg protocol:nil
126
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
  3860
!
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
  3861
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3862
domain:domainArg type:typeArg protocol:protocolNumber
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3863
    "set up socket with domain, type and protocol number.
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3864
     This is a low level entry; no binding, listening or connect
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3865
     is done. Both arguments must be symbols from one of
3059
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  3866
     #AF_INET, #AF_INET6, #AF_UNIX ... and #stream, #datagram, #raw resp."
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3867
3246
c75a006f9a7a Win32 sockets use handles instead of file pointers
Stefan Vogel <sv@exept.de>
parents: 3224
diff changeset
  3868
    |domainName domainCode typeCode error newHandle|
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3869
2321
6f4cc7b644db filePointer -> handle migration
Claus Gittinger <cg@exept.de>
parents: 2308
diff changeset
  3870
    handle notNil ifTrue:[
5452
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  3871
        ^ self errorAlreadyOpen
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3872
    ].
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3873
    domainName := SocketAddress domainCodeFromName:domainArg.
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3874
    domainCode := OperatingSystem domainCodeOf:domainName.
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3875
    typeCode := OperatingSystem socketTypeCodeOf:typeArg.
3246
c75a006f9a7a Win32 sockets use handles instead of file pointers
Stefan Vogel <sv@exept.de>
parents: 3224
diff changeset
  3876
    newHandle := OperatingSystem socketAccessor new.
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3877
%{
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3878
#ifndef NO_SOCKET
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3879
    FILE *fp;
3137
df3e9cebf52c class: Socket
Stefan Vogel <sv@exept.de>
parents: 3127
diff changeset
  3880
    int dom, typ, proto = 0;
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3881
    int on = 1;
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3882
    SOCKET sock;
3246
c75a006f9a7a Win32 sockets use handles instead of file pointers
Stefan Vogel <sv@exept.de>
parents: 3224
diff changeset
  3883
    int _fd;
c75a006f9a7a Win32 sockets use handles instead of file pointers
Stefan Vogel <sv@exept.de>
parents: 3224
diff changeset
  3884
3843
fbced69597a7 oops - error check was disabled
Claus Gittinger <cg@exept.de>
parents: 3742
diff changeset
  3885
# ifdef __win32__
3123
55ef9ca4f09f class: Socket
Stefan Vogel <sv@exept.de>
parents: 3077
diff changeset
  3886
#  ifndef WSA_FLAG_NO_HANDLE_INHERIT
55ef9ca4f09f class: Socket
Stefan Vogel <sv@exept.de>
parents: 3077
diff changeset
  3887
#   define WSA_FLAG_NO_HANDLE_INHERIT 0x80
55ef9ca4f09f class: Socket
Stefan Vogel <sv@exept.de>
parents: 3077
diff changeset
  3888
#  endif
55ef9ca4f09f class: Socket
Stefan Vogel <sv@exept.de>
parents: 3077
diff changeset
  3889
    static int noInheritFlag = WSA_FLAG_NO_HANDLE_INHERIT;
55ef9ca4f09f class: Socket
Stefan Vogel <sv@exept.de>
parents: 3077
diff changeset
  3890
# endif
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3891
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3892
    if (! __isSmallInteger(domainCode)) {
5452
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  3893
        error = @symbol(badArgument1);
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  3894
        goto out;
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3895
    }
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3896
    if (! __isSmallInteger(typeCode)) {
5452
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  3897
        error = @symbol(badArgument2);
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  3898
        goto out;
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3899
    }
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3900
    if (protocolNumber != nil) {
5452
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  3901
        if (!__isSmallInteger(protocolNumber)) {
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  3902
            error = @symbol(badArgument3);
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  3903
            goto out;
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  3904
        }
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  3905
        proto = __intVal(protocolNumber);
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3906
    }
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3907
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3908
    /*
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3909
     * get address and protocol-family
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3910
     */
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3911
    dom = __intVal(domainCode);
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3912
    typ = __intVal(typeCode);
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3913
3843
fbced69597a7 oops - error check was disabled
Claus Gittinger <cg@exept.de>
parents: 3742
diff changeset
  3914
# ifdef __win32__
3123
55ef9ca4f09f class: Socket
Stefan Vogel <sv@exept.de>
parents: 3077
diff changeset
  3915
    sock = WSASocket(dom, typ, proto, 0, 0, noInheritFlag);
55ef9ca4f09f class: Socket
Stefan Vogel <sv@exept.de>
parents: 3077
diff changeset
  3916
    if (sock == INVALID_SOCKET && noInheritFlag) {
5452
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  3917
        // tried to open socket with WSA_FLAG_NO_HANDLE_INHERIT
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  3918
        // This fails on older windows versions, e.g. Windows XP
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  3919
        sock = WSASocket(dom, typ, proto, 0, 0, 0);
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  3920
        if (sock != INVALID_SOCKET) {
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  3921
            // no error without WSA_FLAG_NO_HANDLE_INHERIT,
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  3922
            // never use this flag again!
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  3923
            noInheritFlag = 0;
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  3924
        }
3123
55ef9ca4f09f class: Socket
Stefan Vogel <sv@exept.de>
parents: 3077
diff changeset
  3925
    }
55ef9ca4f09f class: Socket
Stefan Vogel <sv@exept.de>
parents: 3077
diff changeset
  3926
    if (sock == INVALID_SOCKET) {
5452
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  3927
        errno = WSAGetLastError();
3123
55ef9ca4f09f class: Socket
Stefan Vogel <sv@exept.de>
parents: 3077
diff changeset
  3928
3843
fbced69597a7 oops - error check was disabled
Claus Gittinger <cg@exept.de>
parents: 3742
diff changeset
  3929
# else  // !__win32__
3123
55ef9ca4f09f class: Socket
Stefan Vogel <sv@exept.de>
parents: 3077
diff changeset
  3930
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3931
    sock = socket(dom, typ, proto);
3123
55ef9ca4f09f class: Socket
Stefan Vogel <sv@exept.de>
parents: 3077
diff changeset
  3932
# if defined(EPROTONOSUPPORT) /* for SGI */
55ef9ca4f09f class: Socket
Stefan Vogel <sv@exept.de>
parents: 3077
diff changeset
  3933
    if ((sock < 0) && (proto != 0) && (errno == EPROTONOSUPPORT)) {
5452
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  3934
        DBGPRINTF(("SOCKET: retry with UNSPEC protocol\n"));
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  3935
        proto = 0;
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  3936
        sock = socket(dom, typ, 0);
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3937
    }
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3938
# endif
3123
55ef9ca4f09f class: Socket
Stefan Vogel <sv@exept.de>
parents: 3077
diff changeset
  3939
    if (sock < 0) {
3843
fbced69597a7 oops - error check was disabled
Claus Gittinger <cg@exept.de>
parents: 3742
diff changeset
  3940
# endif // !__win32__
3123
55ef9ca4f09f class: Socket
Stefan Vogel <sv@exept.de>
parents: 3077
diff changeset
  3941
5452
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  3942
        DBGPRINTF(("SOCKET: socket(dom=%d typ=%d proto=%d) call failed errno=%d\n", dom, typ, proto, errno));
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  3943
        error = __MKSMALLINT(errno);
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3944
    } else {
3123
55ef9ca4f09f class: Socket
Stefan Vogel <sv@exept.de>
parents: 3077
diff changeset
  3945
# if defined(SET_LINGER_WHEN_CREATING_SOCKET) && defined(SO_LINGER)
5452
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  3946
        {
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  3947
            struct linger l;
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  3948
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  3949
            l.l_onoff = 1;
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  3950
            l.l_linger = 30;
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  3951
            setsockopt(sock, SOL_SOCKET, SO_LINGER, &l, sizeof(l));
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  3952
        }
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3953
# endif
3843
fbced69597a7 oops - error check was disabled
Claus Gittinger <cg@exept.de>
parents: 3742
diff changeset
  3954
# ifdef __win32__
5452
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  3955
        /*
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  3956
         * make it blocking
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  3957
         */
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  3958
        {
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  3959
            unsigned long zero = 0;
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  3960
            ioctlsocket(sock, FIONBIO, &zero);
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  3961
        }
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  3962
        {
3246
c75a006f9a7a Win32 sockets use handles instead of file pointers
Stefan Vogel <sv@exept.de>
parents: 3224
diff changeset
  3963
#  if 0 && (defined( __BORLANDC__ ) || defined( __MINGW__ ))
5452
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  3964
            /*
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  3965
             * make it a FILE *
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  3966
             */
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  3967
            __stxWrapApiEnterCritical();
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  3968
            _fd = _open_osfhandle((long)sock, 0);
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  3969
            __stxWrapApiLeaveCritical();
2773
ab3049f4a351 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2748
diff changeset
  3970
#  else
5452
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  3971
            _fd = (int)sock;
2773
ab3049f4a351 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2748
diff changeset
  3972
#  endif
5452
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  3973
            DBGPRINTF(("SOCKET: sock=%d fd=%d\n", sock, _fd));
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  3974
        }
3843
fbced69597a7 oops - error check was disabled
Claus Gittinger <cg@exept.de>
parents: 3742
diff changeset
  3975
# else  // !__win32__
5452
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  3976
        fp = fdopen(sock, "r+");
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  3977
        if (! fp) {
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  3978
            DBGPRINTF(("SOCKET: fdopen call failed\n"));
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  3979
            error = __MKSMALLINT(errno);
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  3980
            __BEGIN_INTERRUPTABLE__
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  3981
            closesocket(sock);
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  3982
            DBGFPRINTF((stderr, "SOCKET: fdopen failed (%d)\n", sock));
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  3983
            __END_INTERRUPTABLE__
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  3984
            goto out;
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  3985
        }
3843
fbced69597a7 oops - error check was disabled
Claus Gittinger <cg@exept.de>
parents: 3742
diff changeset
  3986
# endif // !__win32__
3246
c75a006f9a7a Win32 sockets use handles instead of file pointers
Stefan Vogel <sv@exept.de>
parents: 3224
diff changeset
  3987
5452
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  3988
        if (@global(FileOpenTrace) == true) {
3843
fbced69597a7 oops - error check was disabled
Claus Gittinger <cg@exept.de>
parents: 3742
diff changeset
  3989
# ifdef __win32__
5452
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  3990
            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
  3991
# else
5452
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  3992
            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
  3993
# endif
5452
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  3994
        }
3246
c75a006f9a7a Win32 sockets use handles instead of file pointers
Stefan Vogel <sv@exept.de>
parents: 3224
diff changeset
  3995
3843
fbced69597a7 oops - error check was disabled
Claus Gittinger <cg@exept.de>
parents: 3742
diff changeset
  3996
# ifdef __win32__
5452
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  3997
        __externalAddressVal(newHandle) = _fd;
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  3998
        __INST(handleType) = @symbol(socketHandle);
3246
c75a006f9a7a Win32 sockets use handles instead of file pointers
Stefan Vogel <sv@exept.de>
parents: 3224
diff changeset
  3999
# else
5452
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  4000
        __externalAddressVal(newHandle) = fp;
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  4001
        __INST(handleType) = @symbol(socketFilePointer);
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  4002
# endif
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  4003
    }
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  4004
#endif
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  4005
out:;
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  4006
%}.
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  4007
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  4008
    "all ok?"
3246
c75a006f9a7a Win32 sockets use handles instead of file pointers
Stefan Vogel <sv@exept.de>
parents: 3224
diff changeset
  4009
    handleType notNil ifTrue:[
5452
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  4010
        handle := newHandle.
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  4011
        domain := domainArg.
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  4012
        socketType := typeArg.
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  4013
        self registerForFinalization.
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  4014
        ^ self.
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  4015
    ].
3217
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  4016
    error isInteger ifTrue:[
5452
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  4017
        lastErrorNumber := error.
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  4018
        ^ self openError:error.
3217
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  4019
    ].
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  4020
    ^ self primitiveFailed:error.
126
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
  4021
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
  4022
    "
3059
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  4023
     Socket new domain:#AF_INET type:#stream
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  4024
     Socket new domain:#AF_UNIX type:#stream
126
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
  4025
    "
28
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  4026
! !
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  4027
5466
50ae296c9744 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 5465
diff changeset
  4028
28
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  4029
!Socket methodsFor:'specials'!
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  4030
3467
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
  4031
linger:anIntegerOrNil
3224
bad706c50347 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3223
diff changeset
  4032
    "set the linger behavior on close:
bad706c50347 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3223
diff changeset
  4033
      anIntegerOrNil == nil: close returns immediately, socket tries
5452
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  4034
                             to send buffered data in background.
3224
bad706c50347 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3223
diff changeset
  4035
      anIntegerOrNil == 0:   close returns immediately, bufferd data is discarded.
bad706c50347 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3223
diff changeset
  4036
      anIntegerOrNil > 0:    close waits this many seconds for buffered data
5452
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  4037
                             to be delivered, after this time buffered data is
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  4038
                             discarded and close returns with an error.
4796
3d3c49ddabdb #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 4795
diff changeset
  4039
     (returns false, if unsupported)"
3467
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
  4040
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
  4041
    ^ self
5452
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  4042
        setSocketOption:#'SO_LINGER'
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  4043
        argument:anIntegerOrNil notNil
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  4044
        argument:anIntegerOrNil.
4796
3d3c49ddabdb #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 4795
diff changeset
  4045
3d3c49ddabdb #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 4795
diff changeset
  4046
    "Modified (comment): / 08-02-2019 / 22:33:14 / Claus Gittinger"
3224
bad706c50347 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3223
diff changeset
  4047
!
bad706c50347 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3223
diff changeset
  4048
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  4049
receiveBufferSize
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  4050
    "get the send buffer size - for special applications only.
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  4051
     Not all operatingSystems offer this functionality
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  4052
     (returns nil, if unsupported)"
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  4053
2321
6f4cc7b644db filePointer -> handle migration
Claus Gittinger <cg@exept.de>
parents: 2308
diff changeset
  4054
    handle isNil ifTrue:[
5452
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  4055
        ^ self errorNotOpen
1335
0fafb78d7a80 sockopt utilities added
Claus Gittinger <cg@exept.de>
parents: 1316
diff changeset
  4056
    ].
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  4057
%{
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  4058
#if defined(SO_RCVBUF) && defined(SOL_SOCKET)
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  4059
    {
5452
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  4060
        OBJ fp = __INST(handle);
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  4061
        SOCKET sock;
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  4062
        int opt;
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  4063
        unsigned int size;
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  4064
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  4065
        sock = SOCKET_FROM_FILE_OBJECT(fp);
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  4066
        if (getsockopt(sock, SOL_SOCKET, SO_RCVBUF, (char *)&opt, &size) >= 0) {
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  4067
            RETURN( __MKSMALLINT(opt) );
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  4068
        }
1335
0fafb78d7a80 sockopt utilities added
Claus Gittinger <cg@exept.de>
parents: 1316
diff changeset
  4069
    }
0fafb78d7a80 sockopt utilities added
Claus Gittinger <cg@exept.de>
parents: 1316
diff changeset
  4070
#endif
0fafb78d7a80 sockopt utilities added
Claus Gittinger <cg@exept.de>
parents: 1316
diff changeset
  4071
%}.
0fafb78d7a80 sockopt utilities added
Claus Gittinger <cg@exept.de>
parents: 1316
diff changeset
  4072
    ^ nil
0fafb78d7a80 sockopt utilities added
Claus Gittinger <cg@exept.de>
parents: 1316
diff changeset
  4073
!
0fafb78d7a80 sockopt utilities added
Claus Gittinger <cg@exept.de>
parents: 1316
diff changeset
  4074
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  4075
receiveBufferSize:size
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  4076
    "set the receive buffer size - for special applications only.
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  4077
     Not all operatingSystems offer this functionality
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  4078
     (returns false, if unsupported)"
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
    handle isNil ifTrue:[
5452
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  4081
        ^ self errorNotOpen
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  4082
    ].
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  4083
%{
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  4084
#if defined(SO_RCVBUF) && defined(SOL_SOCKET)
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  4085
    if (__isSmallInteger(size)) {
5452
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  4086
        OBJ fp = __INST(handle);
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  4087
        SOCKET sock;
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  4088
        int opt;
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  4089
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  4090
        sock = SOCKET_FROM_FILE_OBJECT(fp);
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  4091
        opt = __intVal(size);
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  4092
        if (setsockopt(sock, SOL_SOCKET, SO_RCVBUF, (char *)&opt, sizeof(int)) >= 0 ) {
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  4093
            RETURN(true);
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  4094
        }
1335
0fafb78d7a80 sockopt utilities added
Claus Gittinger <cg@exept.de>
parents: 1316
diff changeset
  4095
    }
0fafb78d7a80 sockopt utilities added
Claus Gittinger <cg@exept.de>
parents: 1316
diff changeset
  4096
#endif
0fafb78d7a80 sockopt utilities added
Claus Gittinger <cg@exept.de>
parents: 1316
diff changeset
  4097
%}.
0fafb78d7a80 sockopt utilities added
Claus Gittinger <cg@exept.de>
parents: 1316
diff changeset
  4098
    ^ false
0fafb78d7a80 sockopt utilities added
Claus Gittinger <cg@exept.de>
parents: 1316
diff changeset
  4099
!
0fafb78d7a80 sockopt utilities added
Claus Gittinger <cg@exept.de>
parents: 1316
diff changeset
  4100
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  4101
receiveTimeout
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  4102
    "get the receive timeout in millis - for special applications only.
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  4103
     Not all operatingSystems offer this functionality
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  4104
     (returns nil, if unsupported)"
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  4105
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  4106
    |millis|
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  4107
2321
6f4cc7b644db filePointer -> handle migration
Claus Gittinger <cg@exept.de>
parents: 2308
diff changeset
  4108
    handle isNil ifTrue:[
5452
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  4109
        ^ self errorNotOpen
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  4110
    ].
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  4111
%{
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  4112
#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
  4113
    OBJ fp = __INST(handle);
c75a006f9a7a Win32 sockets use handles instead of file pointers
Stefan Vogel <sv@exept.de>
parents: 3224
diff changeset
  4114
    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
  4115
    int len;
c75a006f9a7a Win32 sockets use handles instead of file pointers
Stefan Vogel <sv@exept.de>
parents: 3224
diff changeset
  4116
    int __millis;
c75a006f9a7a Win32 sockets use handles instead of file pointers
Stefan Vogel <sv@exept.de>
parents: 3224
diff changeset
  4117
    struct timeval tv = {0, 0};
c75a006f9a7a Win32 sockets use handles instead of file pointers
Stefan Vogel <sv@exept.de>
parents: 3224
diff changeset
  4118
c75a006f9a7a Win32 sockets use handles instead of file pointers
Stefan Vogel <sv@exept.de>
parents: 3224
diff changeset
  4119
    len = sizeof(struct timeval);
c75a006f9a7a Win32 sockets use handles instead of file pointers
Stefan Vogel <sv@exept.de>
parents: 3224
diff changeset
  4120
    if (getsockopt(sock, SOL_SOCKET, SO_RCVTIMEO, (void *)&tv, &len) == 0) {
5452
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  4121
        __millis = (tv.tv_sec * 1000) + (tv.tv_usec / 1000);
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  4122
        millis = __mkSmallInteger(__millis);
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  4123
# if 0
5452
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  4124
        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
  4125
# endif
3246
c75a006f9a7a Win32 sockets use handles instead of file pointers
Stefan Vogel <sv@exept.de>
parents: 3224
diff changeset
  4126
    } else {
5452
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  4127
        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
  4128
    }
3bca500e0c7a send and receiveTimeout fixed
Claus Gittinger <cg@exept.de>
parents: 1561
diff changeset
  4129
#endif
3bca500e0c7a send and receiveTimeout fixed
Claus Gittinger <cg@exept.de>
parents: 1561
diff changeset
  4130
%}.
4570
39e965ca8d06 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4568
diff changeset
  4131
    ^ millis
39e965ca8d06 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4568
diff changeset
  4132
39e965ca8d06 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4568
diff changeset
  4133
    "
5452
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  4134
        Socket newTCP receiveTimeout
4570
39e965ca8d06 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4568
diff changeset
  4135
    "
39e965ca8d06 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4568
diff changeset
  4136
39e965ca8d06 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4568
diff changeset
  4137
    "Modified: / 19-01-2018 / 19:15:17 / stefan"
1568
3bca500e0c7a send and receiveTimeout fixed
Claus Gittinger <cg@exept.de>
parents: 1561
diff changeset
  4138
!
3bca500e0c7a send and receiveTimeout fixed
Claus Gittinger <cg@exept.de>
parents: 1561
diff changeset
  4139
4570
39e965ca8d06 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4568
diff changeset
  4140
receiveTimeout:secondsOrTimeDuration
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  4141
    "set the receive timeout - for special applications only.
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  4142
     Not all operatingSystems offer this functionality
4570
39e965ca8d06 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4568
diff changeset
  4143
     (returns false, if unsupported).
39e965ca8d06 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4568
diff changeset
  4144
39e965ca8d06 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4568
diff changeset
  4145
     From linux manpage:
5452
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  4146
          SO_RCVTIMEO and SO_SNDTIMEO
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  4147
              Specify  the  receiving  or  sending  timeouts  until reporting an error.  The argument is a
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  4148
              struct timeval.  If an input or output function blocks for this period of time, and data has
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  4149
              been  sent  or received, the return value of that function will be the amount of data trans-
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  4150
              ferred; if no data has been transferred and  the  timeout  has  been  reached,  then  -1  is
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  4151
              returned with errno set to EAGAIN or EWOULDBLOCK, or EINPROGRESS (for connect(2)) just as if
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  4152
              the socket was specified to be nonblocking.  If the timeout is set to  zero  (the  default),
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  4153
              then the operation will never timeout.  Timeouts only have effect for system calls that per-
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  4154
              form socket I/O (e.g., read(2), recvmsg(2), send(2), sendmsg(2)); timeouts  have  no  effect
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  4155
              for select(2), poll(2), epoll_wait(2), and so on."
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  4156
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  4157
    |millis|
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  4158
2321
6f4cc7b644db filePointer -> handle migration
Claus Gittinger <cg@exept.de>
parents: 2308
diff changeset
  4159
    handle isNil ifTrue:[
5452
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  4160
        ^ self errorNotOpen
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  4161
    ].
4570
39e965ca8d06 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4568
diff changeset
  4162
    secondsOrTimeDuration isTimeDuration ifTrue:[
5452
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  4163
        millis := secondsOrTimeDuration getMilliseconds.
4570
39e965ca8d06 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4568
diff changeset
  4164
    ] ifFalse:[
5452
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  4165
        millis := (secondsOrTimeDuration * 1000) rounded.
4570
39e965ca8d06 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4568
diff changeset
  4166
    ].
39e965ca8d06 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4568
diff changeset
  4167
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  4168
%{
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  4169
#if defined(SO_RCVTIMEO) && defined(SOL_SOCKET)
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  4170
    if (__isSmallInteger(millis)) {
5452
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  4171
        OBJ fp = __INST(handle);
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  4172
        SOCKET sock = SOCKET_FROM_FILE_OBJECT(fp);
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  4173
        int __millis = __intVal(millis);
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  4174
        struct timeval tv = {0, 0};
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  4175
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  4176
        tv.tv_sec = __millis / 1000;
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  4177
        tv.tv_usec = (__millis % 1000) * 1000;
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  4178
# if 0
5452
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  4179
        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
  4180
# endif
5452
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  4181
        if (setsockopt(sock, SOL_SOCKET, SO_RCVTIMEO, (void *)&tv, sizeof(struct timeval)) == 0) {
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  4182
            RETURN(true);
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  4183
        }
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  4184
        console_fprintf(stderr, "Socket [warning]: setsockopt %d failed; errno=%d\n", sock, errno);
28
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  4185
    }
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  4186
#endif
71
claus
parents: 63
diff changeset
  4187
%}.
28
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  4188
    ^ false
4570
39e965ca8d06 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4568
diff changeset
  4189
39e965ca8d06 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4568
diff changeset
  4190
    "
5452
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  4191
        Socket newTCP
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  4192
            receiveTimeout:5s;
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  4193
            receiveTimeout
4570
39e965ca8d06 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4568
diff changeset
  4194
    "
39e965ca8d06 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4568
diff changeset
  4195
39e965ca8d06 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4568
diff changeset
  4196
    "Modified (comment): / 19-01-2018 / 19:14:49 / stefan"
81
claus
parents: 79
diff changeset
  4197
!
claus
parents: 79
diff changeset
  4198
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  4199
sendBufferSize
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  4200
    "get the send buffer size - for special applications only.
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  4201
     Not all operatingSystems offer this functionality
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  4202
     (returns nil, if unsupported)"
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  4203
2321
6f4cc7b644db filePointer -> handle migration
Claus Gittinger <cg@exept.de>
parents: 2308
diff changeset
  4204
    handle isNil ifTrue:[
5452
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  4205
        ^ self errorNotOpen
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  4206
    ].
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  4207
%{
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  4208
#if defined(SO_SNDBUF) && defined(SOL_SOCKET)
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  4209
    {
5452
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  4210
        OBJ fp = __INST(handle);
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  4211
        SOCKET sock;
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  4212
        int opt;
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  4213
        unsigned int size;
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  4214
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  4215
        sock = SOCKET_FROM_FILE_OBJECT(fp);
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  4216
        if (getsockopt(sock, SOL_SOCKET, SO_SNDBUF, (char *)&opt, &size) >= 0) {
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  4217
            RETURN( __MKSMALLINT(opt) );
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  4218
        }
1335
0fafb78d7a80 sockopt utilities added
Claus Gittinger <cg@exept.de>
parents: 1316
diff changeset
  4219
    }
0fafb78d7a80 sockopt utilities added
Claus Gittinger <cg@exept.de>
parents: 1316
diff changeset
  4220
#endif
0fafb78d7a80 sockopt utilities added
Claus Gittinger <cg@exept.de>
parents: 1316
diff changeset
  4221
%}.
0fafb78d7a80 sockopt utilities added
Claus Gittinger <cg@exept.de>
parents: 1316
diff changeset
  4222
    ^ nil
0fafb78d7a80 sockopt utilities added
Claus Gittinger <cg@exept.de>
parents: 1316
diff changeset
  4223
!
0fafb78d7a80 sockopt utilities added
Claus Gittinger <cg@exept.de>
parents: 1316
diff changeset
  4224
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  4225
sendBufferSize:size
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  4226
    "set the send buffer size - for special applications only.
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  4227
     Not all operatingSystems offer this functionality
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  4228
     (returns false, if unsupported)"
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  4229
2321
6f4cc7b644db filePointer -> handle migration
Claus Gittinger <cg@exept.de>
parents: 2308
diff changeset
  4230
    handle isNil ifTrue:[
5452
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  4231
        ^ self errorNotOpen
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  4232
    ].
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  4233
%{
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  4234
#if defined(SO_SNDBUF) && defined(SOL_SOCKET)
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  4235
    if (__isSmallInteger(size)) {
5452
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  4236
        OBJ fp = __INST(handle);
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  4237
        SOCKET sock;
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  4238
        int opt;
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  4239
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  4240
        sock = SOCKET_FROM_FILE_OBJECT(fp);
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  4241
        opt = __intVal(size);
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  4242
        if (setsockopt(sock, SOL_SOCKET, SO_SNDBUF, (char *)&opt, sizeof(int)) >= 0) {
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  4243
            RETURN(true);
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  4244
        }
1335
0fafb78d7a80 sockopt utilities added
Claus Gittinger <cg@exept.de>
parents: 1316
diff changeset
  4245
    }
0fafb78d7a80 sockopt utilities added
Claus Gittinger <cg@exept.de>
parents: 1316
diff changeset
  4246
#endif
0fafb78d7a80 sockopt utilities added
Claus Gittinger <cg@exept.de>
parents: 1316
diff changeset
  4247
%}.
0fafb78d7a80 sockopt utilities added
Claus Gittinger <cg@exept.de>
parents: 1316
diff changeset
  4248
    ^ false
0fafb78d7a80 sockopt utilities added
Claus Gittinger <cg@exept.de>
parents: 1316
diff changeset
  4249
!
0fafb78d7a80 sockopt utilities added
Claus Gittinger <cg@exept.de>
parents: 1316
diff changeset
  4250
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  4251
sendTimeout
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  4252
    "get the send timeout in millis - for special applications only.
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  4253
     Not all operatingSystems offer this functionality
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  4254
     (returns nil, if unsupported)"
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  4255
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  4256
    |millis|
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  4257
2321
6f4cc7b644db filePointer -> handle migration
Claus Gittinger <cg@exept.de>
parents: 2308
diff changeset
  4258
    handle isNil ifTrue:[
5452
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  4259
        ^ self errorNotOpen
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  4260
    ].
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  4261
%{
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  4262
#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
  4263
    OBJ fp = __INST(handle);
c75a006f9a7a Win32 sockets use handles instead of file pointers
Stefan Vogel <sv@exept.de>
parents: 3224
diff changeset
  4264
    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
  4265
    int len;
c75a006f9a7a Win32 sockets use handles instead of file pointers
Stefan Vogel <sv@exept.de>
parents: 3224
diff changeset
  4266
    int __millis;
c75a006f9a7a Win32 sockets use handles instead of file pointers
Stefan Vogel <sv@exept.de>
parents: 3224
diff changeset
  4267
    struct timeval tv = {0, 0};
c75a006f9a7a Win32 sockets use handles instead of file pointers
Stefan Vogel <sv@exept.de>
parents: 3224
diff changeset
  4268
c75a006f9a7a Win32 sockets use handles instead of file pointers
Stefan Vogel <sv@exept.de>
parents: 3224
diff changeset
  4269
    len = sizeof(struct timeval);
c75a006f9a7a Win32 sockets use handles instead of file pointers
Stefan Vogel <sv@exept.de>
parents: 3224
diff changeset
  4270
    if (getsockopt(sock, SOL_SOCKET, SO_SNDTIMEO, (void *)&tv, &len) == 0) {
5452
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  4271
        __millis = (tv.tv_sec * 1000) + (tv.tv_usec / 1000);
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  4272
        millis = __mkSmallInteger(__millis);
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  4273
# if 0
5452
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  4274
        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
  4275
# endif
3246
c75a006f9a7a Win32 sockets use handles instead of file pointers
Stefan Vogel <sv@exept.de>
parents: 3224
diff changeset
  4276
    } else {
5452
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  4277
        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
  4278
    }
3bca500e0c7a send and receiveTimeout fixed
Claus Gittinger <cg@exept.de>
parents: 1561
diff changeset
  4279
#endif
3bca500e0c7a send and receiveTimeout fixed
Claus Gittinger <cg@exept.de>
parents: 1561
diff changeset
  4280
%}.
4570
39e965ca8d06 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4568
diff changeset
  4281
    ^ millis
39e965ca8d06 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4568
diff changeset
  4282
39e965ca8d06 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4568
diff changeset
  4283
    "
5452
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  4284
        Socket newTCP sendTimeout
4570
39e965ca8d06 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4568
diff changeset
  4285
    "
39e965ca8d06 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4568
diff changeset
  4286
39e965ca8d06 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4568
diff changeset
  4287
    "Modified (comment): / 19-01-2018 / 19:16:23 / stefan"
1568
3bca500e0c7a send and receiveTimeout fixed
Claus Gittinger <cg@exept.de>
parents: 1561
diff changeset
  4288
!
3bca500e0c7a send and receiveTimeout fixed
Claus Gittinger <cg@exept.de>
parents: 1561
diff changeset
  4289
4570
39e965ca8d06 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4568
diff changeset
  4290
sendTimeout:secondsOrTimeDuration
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  4291
    "set the send timeout - for special applications only.
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  4292
     Not all operatingSystems offer this functionality
4570
39e965ca8d06 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4568
diff changeset
  4293
     (returns false, if unsupported).
39e965ca8d06 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4568
diff changeset
  4294
     From linux manpage:
5452
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  4295
          SO_RCVTIMEO and SO_SNDTIMEO
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  4296
              Specify  the  receiving  or  sending  timeouts  until reporting an error.  The argument is a
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  4297
              struct timeval.  If an input or output function blocks for this period of time, and data has
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  4298
              been  sent  or received, the return value of that function will be the amount of data trans-
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  4299
              ferred; if no data has been transferred and  the  timeout  has  been  reached,  then  -1  is
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  4300
              returned with errno set to EAGAIN or EWOULDBLOCK, or EINPROGRESS (for connect(2)) just as if
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  4301
              the socket was specified to be nonblocking.  If the timeout is set to  zero  (the  default),
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  4302
              then the operation will never timeout.  Timeouts only have effect for system calls that per-
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  4303
              form socket I/O (e.g., read(2), recvmsg(2), send(2), sendmsg(2)); timeouts  have  no  effect
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  4304
              for select(2), poll(2), epoll_wait(2), and so on."
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  4305
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  4306
    |millis|
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  4307
2321
6f4cc7b644db filePointer -> handle migration
Claus Gittinger <cg@exept.de>
parents: 2308
diff changeset
  4308
    handle isNil ifTrue:[
5452
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  4309
        ^ self errorNotOpen
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  4310
    ].
4570
39e965ca8d06 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4568
diff changeset
  4311
    secondsOrTimeDuration isTimeDuration ifTrue:[
5452
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  4312
        millis := secondsOrTimeDuration getMilliseconds.
4570
39e965ca8d06 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4568
diff changeset
  4313
    ] ifFalse:[
5452
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  4314
        millis := (secondsOrTimeDuration * 1000) rounded.
4570
39e965ca8d06 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4568
diff changeset
  4315
    ].
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  4316
%{
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  4317
#if defined(SO_SNDTIMEO) && defined(SOL_SOCKET)
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  4318
    if (__isSmallInteger(millis)) {
5452
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  4319
        OBJ fp = __INST(handle);
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  4320
        SOCKET sock = SOCKET_FROM_FILE_OBJECT(fp);
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  4321
        int __millis = __intVal(millis);
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  4322
        struct timeval tv = {0, 0};
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  4323
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  4324
        tv.tv_sec = __millis / 1000;
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  4325
        tv.tv_usec = (__millis % 1000) * 1000;
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  4326
# if 0
5452
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  4327
        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
  4328
# endif
5452
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  4329
        if (setsockopt(sock, SOL_SOCKET, SO_SNDTIMEO, (void *)&tv, sizeof(struct timeval)) == 0) {
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  4330
            RETURN(true);
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  4331
        }
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  4332
        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
  4333
    }
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
  4334
#endif
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
  4335
%}.
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
  4336
    ^ false
4570
39e965ca8d06 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4568
diff changeset
  4337
39e965ca8d06 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4568
diff changeset
  4338
    "
5452
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  4339
        Socket newTCP
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  4340
            sendTimeout:5s;
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  4341
            sendTimeout
4570
39e965ca8d06 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4568
diff changeset
  4342
    "
39e965ca8d06 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4568
diff changeset
  4343
39e965ca8d06 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4568
diff changeset
  4344
    "Modified (comment): / 19-01-2018 / 19:12:51 / stefan"
1340
eb9b1f1340e5 setTCP_NODELAY
Claus Gittinger <cg@exept.de>
parents: 1339
diff changeset
  4345
!
eb9b1f1340e5 setTCP_NODELAY
Claus Gittinger <cg@exept.de>
parents: 1339
diff changeset
  4346
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  4347
setTCPCork:aBoolean
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  4348
    "enable/disable TCP_CORK (do-not-send-partial-frames)
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  4349
     For special applications only.
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  4350
     Not all OperatingSystems offer this functionality
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  4351
     (returns false, if unsupported)"
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  4352
2551
6da1bc89b74a changed:
Stefan Vogel <sv@exept.de>
parents: 2516
diff changeset
  4353
    ^ self setSocketOption:#'TCP_CORK' argument:aBoolean argument:nil.
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  4354
!
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  4355
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  4356
setTCPNoDelay:aBoolean
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  4357
    "enable/disable TCP_NODELAY (i.e. disable/enable the Nagle algorithm)
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  4358
     For special applications only.
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  4359
     Not all OperatingSystems offer this functionality
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  4360
     (returns false, if unsupported)"
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  4361
2551
6da1bc89b74a changed:
Stefan Vogel <sv@exept.de>
parents: 2516
diff changeset
  4362
    ^ self setSocketOption:#'TCP_NODELAY' argument:aBoolean argument:nil.
126
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
  4363
! !
82
claus
parents: 81
diff changeset
  4364
5441
bdf6b4e8c68b #BUGFIX by Stefan Reise
sr
parents: 5440
diff changeset
  4365
!Socket methodsFor:'support websocket'!
bdf6b4e8c68b #BUGFIX by Stefan Reise
sr
parents: 5440
diff changeset
  4366
5467
914f6955a10a #REFACTORING by Stefan Reise
sr
parents: 5466
diff changeset
  4367
blockingNextPutAllForNonBlockingSocket:someBytes
914f6955a10a #REFACTORING by Stefan Reise
sr
parents: 5466
diff changeset
  4368
    "explanation of the method name:
914f6955a10a #REFACTORING by Stefan Reise
sr
parents: 5466
diff changeset
  4369
     blocking -> this method blocks its STX process until all bytes have been written
914f6955a10a #REFACTORING by Stefan Reise
sr
parents: 5466
diff changeset
  4370
     ForNonBlockingSocket -> this method only works with non-blocking sockets
914f6955a10a #REFACTORING by Stefan Reise
sr
parents: 5466
diff changeset
  4371
914f6955a10a #REFACTORING by Stefan Reise
sr
parents: 5466
diff changeset
  4372
     the write is done within the current thread, 
914f6955a10a #REFACTORING by Stefan Reise
sr
parents: 5466
diff changeset
  4373
     but the primitiv #send returns because the socket is non-blocking (in case of would block). 
914f6955a10a #REFACTORING by Stefan Reise
sr
parents: 5466
diff changeset
  4374
     of cause if you write big data at once and the socket never would block, STX will freeze,
914f6955a10a #REFACTORING by Stefan Reise
sr
parents: 5466
diff changeset
  4375
     so please split big data into small packages"
914f6955a10a #REFACTORING by Stefan Reise
sr
parents: 5466
diff changeset
  4376
914f6955a10a #REFACTORING by Stefan Reise
sr
parents: 5466
diff changeset
  4377
    "PROBLEM \ BUG:
914f6955a10a #REFACTORING by Stefan Reise
sr
parents: 5466
diff changeset
  4378
        currently STX will freeze when writing and reading concurrently on the same blocking socket from both ends.
914f6955a10a #REFACTORING by Stefan Reise
sr
parents: 5466
diff changeset
  4379
        even when all those writers and readers have their own thread (by calling via __NOINT_CALL).
914f6955a10a #REFACTORING by Stefan Reise
sr
parents: 5466
diff changeset
  4380
914f6955a10a #REFACTORING by Stefan Reise
sr
parents: 5466
diff changeset
  4381
     WORKAROUND (or Other Concept):
914f6955a10a #REFACTORING by Stefan Reise
sr
parents: 5466
diff changeset
  4382
        using a non-blocking socket
914f6955a10a #REFACTORING by Stefan Reise
sr
parents: 5466
diff changeset
  4383
914f6955a10a #REFACTORING by Stefan Reise
sr
parents: 5466
diff changeset
  4384
        NEW PROBLEM: 
914f6955a10a #REFACTORING by Stefan Reise
sr
parents: 5466
diff changeset
  4385
        with non-blocking sockets you can not use the default #nextPut: 
914f6955a10a #REFACTORING by Stefan Reise
sr
parents: 5466
diff changeset
  4386
        because #nextPut: ends up in __NOINT_CALL('send') and probably due to until now not supported non-blocking sockets,
914f6955a10a #REFACTORING by Stefan Reise
sr
parents: 5466
diff changeset
  4387
        it does not set __threadErrno correctly to WOULDBLOCK in case of would block.
914f6955a10a #REFACTORING by Stefan Reise
sr
parents: 5466
diff changeset
  4388
        so by using default #nextPut: with an non-blocking socket you will miss some bytes or 
914f6955a10a #REFACTORING by Stefan Reise
sr
parents: 5466
diff changeset
  4389
        falsely get an error instead of WOULBLOCK
914f6955a10a #REFACTORING by Stefan Reise
sr
parents: 5466
diff changeset
  4390
914f6955a10a #REFACTORING by Stefan Reise
sr
parents: 5466
diff changeset
  4391
        NEXT WORKAROUND:
914f6955a10a #REFACTORING by Stefan Reise
sr
parents: 5466
diff changeset
  4392
        use a your own #nextPut: method (#blockingNextPutAllForNonBlockingSocket:) and handle WOULDBLOCK correctly
914f6955a10a #REFACTORING by Stefan Reise
sr
parents: 5466
diff changeset
  4393
914f6955a10a #REFACTORING by Stefan Reise
sr
parents: 5466
diff changeset
  4394
     Notes:
914f6955a10a #REFACTORING by Stefan Reise
sr
parents: 5466
diff changeset
  4395
     - all sockets under windows are created as blocking sockets by default
914f6955a10a #REFACTORING by Stefan Reise
sr
parents: 5466
diff changeset
  4396
     - there is NO query in windows to ask if a socket is blocking or non-blocking"
5441
bdf6b4e8c68b #BUGFIX by Stefan Reise
sr
parents: 5440
diff changeset
  4397
bdf6b4e8c68b #BUGFIX by Stefan Reise
sr
parents: 5440
diff changeset
  4398
    |bytes countRemainingBytesToWrite result|
bdf6b4e8c68b #BUGFIX by Stefan Reise
sr
parents: 5440
diff changeset
  4399
bdf6b4e8c68b #BUGFIX by Stefan Reise
sr
parents: 5440
diff changeset
  4400
    OperatingSystem isMSWINDOWSlike ifFalse:[
5445
41990ba5aeff #FEATURE by Stefan Reise
sr
parents: 5443
diff changeset
  4401
        "this method supports non blocking socket for windows,
41990ba5aeff #FEATURE by Stefan Reise
sr
parents: 5443
diff changeset
  4402
         for other os use the default behavior"
41990ba5aeff #FEATURE by Stefan Reise
sr
parents: 5443
diff changeset
  4403
        self nextPutAll:someBytes.
41990ba5aeff #FEATURE by Stefan Reise
sr
parents: 5443
diff changeset
  4404
        ^ self 
5441
bdf6b4e8c68b #BUGFIX by Stefan Reise
sr
parents: 5440
diff changeset
  4405
    ].
bdf6b4e8c68b #BUGFIX by Stefan Reise
sr
parents: 5440
diff changeset
  4406
bdf6b4e8c68b #BUGFIX by Stefan Reise
sr
parents: 5440
diff changeset
  4407
    bytes := someBytes asByteArray.
bdf6b4e8c68b #BUGFIX by Stefan Reise
sr
parents: 5440
diff changeset
  4408
    countRemainingBytesToWrite := bytes size.
bdf6b4e8c68b #BUGFIX by Stefan Reise
sr
parents: 5440
diff changeset
  4409
bdf6b4e8c68b #BUGFIX by Stefan Reise
sr
parents: 5440
diff changeset
  4410
    [
5467
914f6955a10a #REFACTORING by Stefan Reise
sr
parents: 5466
diff changeset
  4411
        result := self systemBlockingNextPutAll:bytes. "/ may just writes a subset or may 0 -> would block
5441
bdf6b4e8c68b #BUGFIX by Stefan Reise
sr
parents: 5440
diff changeset
  4412
        result >= 0 "/ 0 or more bytes has been written
bdf6b4e8c68b #BUGFIX by Stefan Reise
sr
parents: 5440
diff changeset
  4413
        and:[result ~= countRemainingBytesToWrite] "/ there are remaining bytes to write 
bdf6b4e8c68b #BUGFIX by Stefan Reise
sr
parents: 5440
diff changeset
  4414
    ] whileTrue:[
bdf6b4e8c68b #BUGFIX by Stefan Reise
sr
parents: 5440
diff changeset
  4415
        result > 0 ifTrue:[
bdf6b4e8c68b #BUGFIX by Stefan Reise
sr
parents: 5440
diff changeset
  4416
            bytes := bytes copyFrom:result + 1.
bdf6b4e8c68b #BUGFIX by Stefan Reise
sr
parents: 5440
diff changeset
  4417
            countRemainingBytesToWrite := bytes size.
bdf6b4e8c68b #BUGFIX by Stefan Reise
sr
parents: 5440
diff changeset
  4418
        ].
bdf6b4e8c68b #BUGFIX by Stefan Reise
sr
parents: 5440
diff changeset
  4419
5464
7f31945df4b1 #QUALITY by stefan
Stefan Vogel <sv@exept.de>
parents: 5460
diff changeset
  4420
        "/ timeout does not matter, we wait indefinitely (due to loop)   
5441
bdf6b4e8c68b #BUGFIX by Stefan Reise
sr
parents: 5440
diff changeset
  4421
        self writeWaitWithTimeoutMs:1000.
bdf6b4e8c68b #BUGFIX by Stefan Reise
sr
parents: 5440
diff changeset
  4422
    ].
bdf6b4e8c68b #BUGFIX by Stefan Reise
sr
parents: 5440
diff changeset
  4423
5467
914f6955a10a #REFACTORING by Stefan Reise
sr
parents: 5466
diff changeset
  4424
    "Created: / 05-03-2020 / 10:35:54 / Stefan Reise"
5441
bdf6b4e8c68b #BUGFIX by Stefan Reise
sr
parents: 5440
diff changeset
  4425
!
bdf6b4e8c68b #BUGFIX by Stefan Reise
sr
parents: 5440
diff changeset
  4426
5467
914f6955a10a #REFACTORING by Stefan Reise
sr
parents: 5466
diff changeset
  4427
setNonBlocking
914f6955a10a #REFACTORING by Stefan Reise
sr
parents: 5466
diff changeset
  4428
    "DO NO move this functionality into Win32OperatingSystem #setBlocking:fd:, 
914f6955a10a #REFACTORING by Stefan Reise
sr
parents: 5466
diff changeset
  4429
     because it will not work correctly, caused by the following problems. 
914f6955a10a #REFACTORING by Stefan Reise
sr
parents: 5466
diff changeset
  4430
     and even if the problems has been fixed, it would change the behavior for all sockets (not only websockets)"
914f6955a10a #REFACTORING by Stefan Reise
sr
parents: 5466
diff changeset
  4431
914f6955a10a #REFACTORING by Stefan Reise
sr
parents: 5466
diff changeset
  4432
    "PROBLEM \ BUG:
914f6955a10a #REFACTORING by Stefan Reise
sr
parents: 5466
diff changeset
  4433
        currently STX will freeze when writing and reading concurrently on the same blocking socket from both ends.
914f6955a10a #REFACTORING by Stefan Reise
sr
parents: 5466
diff changeset
  4434
        even when all those writers and readers have their own thread (by calling via __NOINT_CALL).
914f6955a10a #REFACTORING by Stefan Reise
sr
parents: 5466
diff changeset
  4435
914f6955a10a #REFACTORING by Stefan Reise
sr
parents: 5466
diff changeset
  4436
     WORKAROUND (or Other Concept):
914f6955a10a #REFACTORING by Stefan Reise
sr
parents: 5466
diff changeset
  4437
        using a non-blocking socket
914f6955a10a #REFACTORING by Stefan Reise
sr
parents: 5466
diff changeset
  4438
914f6955a10a #REFACTORING by Stefan Reise
sr
parents: 5466
diff changeset
  4439
        NEW PROBLEM: 
914f6955a10a #REFACTORING by Stefan Reise
sr
parents: 5466
diff changeset
  4440
        with non-blocking sockets you can not use the default #nextPut: 
914f6955a10a #REFACTORING by Stefan Reise
sr
parents: 5466
diff changeset
  4441
        because #nextPut: ends up in __NOINT_CALL('send') and probably due to until now not supported non-blocking sockets,
914f6955a10a #REFACTORING by Stefan Reise
sr
parents: 5466
diff changeset
  4442
        it does not set __threadErrno correctly to WOULDBLOCK in case of would block.
914f6955a10a #REFACTORING by Stefan Reise
sr
parents: 5466
diff changeset
  4443
        so by using default #nextPut: with an non-blocking socket you will miss some bytes or 
914f6955a10a #REFACTORING by Stefan Reise
sr
parents: 5466
diff changeset
  4444
        falsely get an error instead of WOULBLOCK
914f6955a10a #REFACTORING by Stefan Reise
sr
parents: 5466
diff changeset
  4445
914f6955a10a #REFACTORING by Stefan Reise
sr
parents: 5466
diff changeset
  4446
        NEXT WORKAROUND:
914f6955a10a #REFACTORING by Stefan Reise
sr
parents: 5466
diff changeset
  4447
        use a your own #nextPut: method (#blockingNextPutAllForNonBlockingSocket:) and handle WOULDBLOCK correctly
914f6955a10a #REFACTORING by Stefan Reise
sr
parents: 5466
diff changeset
  4448
914f6955a10a #REFACTORING by Stefan Reise
sr
parents: 5466
diff changeset
  4449
     Notes:
914f6955a10a #REFACTORING by Stefan Reise
sr
parents: 5466
diff changeset
  4450
     - all sockets under windows are created as blocking sockets by default
914f6955a10a #REFACTORING by Stefan Reise
sr
parents: 5466
diff changeset
  4451
     - there is NO query in windows to ask if a socket is blocking or non-blocking"
914f6955a10a #REFACTORING by Stefan Reise
sr
parents: 5466
diff changeset
  4452
914f6955a10a #REFACTORING by Stefan Reise
sr
parents: 5466
diff changeset
  4453
    OperatingSystem isMSWINDOWSlike ifFalse:[
914f6955a10a #REFACTORING by Stefan Reise
sr
parents: 5466
diff changeset
  4454
        "/ this method is for windows os only
914f6955a10a #REFACTORING by Stefan Reise
sr
parents: 5466
diff changeset
  4455
        ^ self
914f6955a10a #REFACTORING by Stefan Reise
sr
parents: 5466
diff changeset
  4456
    ].
914f6955a10a #REFACTORING by Stefan Reise
sr
parents: 5466
diff changeset
  4457
914f6955a10a #REFACTORING by Stefan Reise
sr
parents: 5466
diff changeset
  4458
%{
914f6955a10a #REFACTORING by Stefan Reise
sr
parents: 5466
diff changeset
  4459
# ifdef __win32__
914f6955a10a #REFACTORING by Stefan Reise
sr
parents: 5466
diff changeset
  4460
    OBJ fp = __INST(handle);
914f6955a10a #REFACTORING by Stefan Reise
sr
parents: 5466
diff changeset
  4461
914f6955a10a #REFACTORING by Stefan Reise
sr
parents: 5466
diff changeset
  4462
    // ALWAYS check for proper arguments, please
914f6955a10a #REFACTORING by Stefan Reise
sr
parents: 5466
diff changeset
  4463
    if (fp != NULL) {
914f6955a10a #REFACTORING by Stefan Reise
sr
parents: 5466
diff changeset
  4464
        int result;
914f6955a10a #REFACTORING by Stefan Reise
sr
parents: 5466
diff changeset
  4465
        u_long nonBlocking = 1;
914f6955a10a #REFACTORING by Stefan Reise
sr
parents: 5466
diff changeset
  4466
        SOCKET socket = SOCKET_FROM_FILE_OBJECT(fp);
914f6955a10a #REFACTORING by Stefan Reise
sr
parents: 5466
diff changeset
  4467
914f6955a10a #REFACTORING by Stefan Reise
sr
parents: 5466
diff changeset
  4468
        result = ioctlsocket(socket, FIONBIO, &nonBlocking);
914f6955a10a #REFACTORING by Stefan Reise
sr
parents: 5466
diff changeset
  4469
        if (result == SOCKET_ERROR) {
914f6955a10a #REFACTORING by Stefan Reise
sr
parents: 5466
diff changeset
  4470
            console_fprintf(stderr, "Win32OS [info]: ioctlsocket failed with %d\n", WSAGetLastError());
914f6955a10a #REFACTORING by Stefan Reise
sr
parents: 5466
diff changeset
  4471
            RETURN(false);
914f6955a10a #REFACTORING by Stefan Reise
sr
parents: 5466
diff changeset
  4472
        }
914f6955a10a #REFACTORING by Stefan Reise
sr
parents: 5466
diff changeset
  4473
914f6955a10a #REFACTORING by Stefan Reise
sr
parents: 5466
diff changeset
  4474
        RETURN(true);
914f6955a10a #REFACTORING by Stefan Reise
sr
parents: 5466
diff changeset
  4475
    }
914f6955a10a #REFACTORING by Stefan Reise
sr
parents: 5466
diff changeset
  4476
#endif // __win32__
914f6955a10a #REFACTORING by Stefan Reise
sr
parents: 5466
diff changeset
  4477
%}.
914f6955a10a #REFACTORING by Stefan Reise
sr
parents: 5466
diff changeset
  4478
914f6955a10a #REFACTORING by Stefan Reise
sr
parents: 5466
diff changeset
  4479
    self primitiveFailed.
914f6955a10a #REFACTORING by Stefan Reise
sr
parents: 5466
diff changeset
  4480
914f6955a10a #REFACTORING by Stefan Reise
sr
parents: 5466
diff changeset
  4481
    "Modified: / 03-03-2020 / 15:29:26 / Stefan Vogel"
914f6955a10a #REFACTORING by Stefan Reise
sr
parents: 5466
diff changeset
  4482
    "Modified: / 05-03-2020 / 10:37:12 / Stefan Reise"
914f6955a10a #REFACTORING by Stefan Reise
sr
parents: 5466
diff changeset
  4483
!
914f6955a10a #REFACTORING by Stefan Reise
sr
parents: 5466
diff changeset
  4484
914f6955a10a #REFACTORING by Stefan Reise
sr
parents: 5466
diff changeset
  4485
systemBlockingNextPutAll:someBytes
914f6955a10a #REFACTORING by Stefan Reise
sr
parents: 5466
diff changeset
  4486
    "explanation of the method name:
914f6955a10a #REFACTORING by Stefan Reise
sr
parents: 5466
diff changeset
  4487
     systemBlocking -> this method blocks the entire STX 
914f6955a10a #REFACTORING by Stefan Reise
sr
parents: 5466
diff changeset
  4488
     until all bytes have been written or until the socket would block
914f6955a10a #REFACTORING by Stefan Reise
sr
parents: 5466
diff changeset
  4489
914f6955a10a #REFACTORING by Stefan Reise
sr
parents: 5466
diff changeset
  4490
     so please split big data into small packages"
914f6955a10a #REFACTORING by Stefan Reise
sr
parents: 5466
diff changeset
  4491
914f6955a10a #REFACTORING by Stefan Reise
sr
parents: 5466
diff changeset
  4492
    "PROBLEM \ BUG:
914f6955a10a #REFACTORING by Stefan Reise
sr
parents: 5466
diff changeset
  4493
        currently STX will freeze when writing and reading concurrently on the same blocking socket from both ends.
914f6955a10a #REFACTORING by Stefan Reise
sr
parents: 5466
diff changeset
  4494
        even when all those writers and readers have their own thread (by calling via __NOINT_CALL).
914f6955a10a #REFACTORING by Stefan Reise
sr
parents: 5466
diff changeset
  4495
914f6955a10a #REFACTORING by Stefan Reise
sr
parents: 5466
diff changeset
  4496
     WORKAROUND (or Other Concept):
914f6955a10a #REFACTORING by Stefan Reise
sr
parents: 5466
diff changeset
  4497
        using a non-blocking socket
914f6955a10a #REFACTORING by Stefan Reise
sr
parents: 5466
diff changeset
  4498
914f6955a10a #REFACTORING by Stefan Reise
sr
parents: 5466
diff changeset
  4499
        NEW PROBLEM: 
914f6955a10a #REFACTORING by Stefan Reise
sr
parents: 5466
diff changeset
  4500
        with non-blocking sockets you can not use the default #nextPut: 
914f6955a10a #REFACTORING by Stefan Reise
sr
parents: 5466
diff changeset
  4501
        because #nextPut: ends up in __NOINT_CALL('send') and probably due to until now not supported non-blocking sockets,
914f6955a10a #REFACTORING by Stefan Reise
sr
parents: 5466
diff changeset
  4502
        it does not set __threadErrno correctly to WOULDBLOCK in case of would block.
914f6955a10a #REFACTORING by Stefan Reise
sr
parents: 5466
diff changeset
  4503
        so by using default #nextPut: with an non-blocking socket you will miss some bytes or 
914f6955a10a #REFACTORING by Stefan Reise
sr
parents: 5466
diff changeset
  4504
        falsely get an error instead of WOULBLOCK
914f6955a10a #REFACTORING by Stefan Reise
sr
parents: 5466
diff changeset
  4505
914f6955a10a #REFACTORING by Stefan Reise
sr
parents: 5466
diff changeset
  4506
        NEXT WORKAROUND:
914f6955a10a #REFACTORING by Stefan Reise
sr
parents: 5466
diff changeset
  4507
        use a your own #nextPut: method (#blockingNextPutAllForNonBlockingSocket:) and handle WOULDBLOCK correctly
914f6955a10a #REFACTORING by Stefan Reise
sr
parents: 5466
diff changeset
  4508
914f6955a10a #REFACTORING by Stefan Reise
sr
parents: 5466
diff changeset
  4509
     Notes:
914f6955a10a #REFACTORING by Stefan Reise
sr
parents: 5466
diff changeset
  4510
     - all sockets under windows are created as blocking sockets by default
914f6955a10a #REFACTORING by Stefan Reise
sr
parents: 5466
diff changeset
  4511
     - there is NO query in windows to ask if a socket is blocking or non-blocking"
5441
bdf6b4e8c68b #BUGFIX by Stefan Reise
sr
parents: 5440
diff changeset
  4512
5451
d98c8a76546d #FEATURE by Stefan Reise
sr
parents: 5450
diff changeset
  4513
    |bytes byteLength returnValue wsaError|
5441
bdf6b4e8c68b #BUGFIX by Stefan Reise
sr
parents: 5440
diff changeset
  4514
bdf6b4e8c68b #BUGFIX by Stefan Reise
sr
parents: 5440
diff changeset
  4515
    OperatingSystem isMSWINDOWSlike ifFalse:[
bdf6b4e8c68b #BUGFIX by Stefan Reise
sr
parents: 5440
diff changeset
  4516
        self error:'this method is for windows os only'.
bdf6b4e8c68b #BUGFIX by Stefan Reise
sr
parents: 5440
diff changeset
  4517
    ].
bdf6b4e8c68b #BUGFIX by Stefan Reise
sr
parents: 5440
diff changeset
  4518
bdf6b4e8c68b #BUGFIX by Stefan Reise
sr
parents: 5440
diff changeset
  4519
    bytes := someBytes asExternalBytes.
bdf6b4e8c68b #BUGFIX by Stefan Reise
sr
parents: 5440
diff changeset
  4520
    byteLength := bytes size.
bdf6b4e8c68b #BUGFIX by Stefan Reise
sr
parents: 5440
diff changeset
  4521
bdf6b4e8c68b #BUGFIX by Stefan Reise
sr
parents: 5440
diff changeset
  4522
    "
bdf6b4e8c68b #BUGFIX by Stefan Reise
sr
parents: 5440
diff changeset
  4523
        -1      error
bdf6b4e8c68b #BUGFIX by Stefan Reise
sr
parents: 5440
diff changeset
  4524
        0       0 bytes sent or would block -> try again after wait
bdf6b4e8c68b #BUGFIX by Stefan Reise
sr
parents: 5440
diff changeset
  4525
        > 0     bytes sent (recall myself with the remaining bytes)
bdf6b4e8c68b #BUGFIX by Stefan Reise
sr
parents: 5440
diff changeset
  4526
    "
bdf6b4e8c68b #BUGFIX by Stefan Reise
sr
parents: 5440
diff changeset
  4527
    returnValue := -1. 
bdf6b4e8c68b #BUGFIX by Stefan Reise
sr
parents: 5440
diff changeset
  4528
5464
7f31945df4b1 #QUALITY by stefan
Stefan Vogel <sv@exept.de>
parents: 5460
diff changeset
  4529
%{
5443
3eac683cfb1d put #ifdef around win32 only code
Stefan Vogel <sv@exept.de>
parents: 5442
diff changeset
  4530
# ifdef __win32__
5467
914f6955a10a #REFACTORING by Stefan Reise
sr
parents: 5466
diff changeset
  4531
    OBJ fp = __INST(handle);
914f6955a10a #REFACTORING by Stefan Reise
sr
parents: 5466
diff changeset
  4532
5464
7f31945df4b1 #QUALITY by stefan
Stefan Vogel <sv@exept.de>
parents: 5460
diff changeset
  4533
    // ALWAYS check for proper arguments, please
5467
914f6955a10a #REFACTORING by Stefan Reise
sr
parents: 5466
diff changeset
  4534
    if (
914f6955a10a #REFACTORING by Stefan Reise
sr
parents: 5466
diff changeset
  4535
        __isExternalAddressLike(bytes) 
5465
52c1146e9b95 #BUGFIX by Stefan Reise
sr
parents: 5464
diff changeset
  4536
        && __isSmallInteger(byteLength) 
52c1146e9b95 #BUGFIX by Stefan Reise
sr
parents: 5464
diff changeset
  4537
        && (fp != NULL)
52c1146e9b95 #BUGFIX by Stefan Reise
sr
parents: 5464
diff changeset
  4538
    ) {
5464
7f31945df4b1 #QUALITY by stefan
Stefan Vogel <sv@exept.de>
parents: 5460
diff changeset
  4539
        int sendResult;
7f31945df4b1 #QUALITY by stefan
Stefan Vogel <sv@exept.de>
parents: 5460
diff changeset
  4540
        int wsaErrorNo;
7f31945df4b1 #QUALITY by stefan
Stefan Vogel <sv@exept.de>
parents: 5460
diff changeset
  4541
        char *pBytes = __externalAddressVal(bytes);
7f31945df4b1 #QUALITY by stefan
Stefan Vogel <sv@exept.de>
parents: 5460
diff changeset
  4542
        SOCKET socket = SOCKET_FROM_FILE_OBJECT(fp);
7f31945df4b1 #QUALITY by stefan
Stefan Vogel <sv@exept.de>
parents: 5460
diff changeset
  4543
7f31945df4b1 #QUALITY by stefan
Stefan Vogel <sv@exept.de>
parents: 5460
diff changeset
  4544
        sendResult = send(socket, pBytes, __intVal(byteLength), 0);
7f31945df4b1 #QUALITY by stefan
Stefan Vogel <sv@exept.de>
parents: 5460
diff changeset
  4545
        if (sendResult == SOCKET_ERROR) {
7f31945df4b1 #QUALITY by stefan
Stefan Vogel <sv@exept.de>
parents: 5460
diff changeset
  4546
            wsaErrorNo = WSAGetLastError();
7f31945df4b1 #QUALITY by stefan
Stefan Vogel <sv@exept.de>
parents: 5460
diff changeset
  4547
            if (wsaErrorNo == WSAEWOULDBLOCK) {
7f31945df4b1 #QUALITY by stefan
Stefan Vogel <sv@exept.de>
parents: 5460
diff changeset
  4548
                returnValue = __MKSMALLINT(0);
5441
bdf6b4e8c68b #BUGFIX by Stefan Reise
sr
parents: 5440
diff changeset
  4549
            } else {
5464
7f31945df4b1 #QUALITY by stefan
Stefan Vogel <sv@exept.de>
parents: 5460
diff changeset
  4550
                console_printf("send failed with: %d\n", wsaErrorNo);
7f31945df4b1 #QUALITY by stefan
Stefan Vogel <sv@exept.de>
parents: 5460
diff changeset
  4551
                wsaError = __MKSMALLINT(wsaErrorNo);           
5441
bdf6b4e8c68b #BUGFIX by Stefan Reise
sr
parents: 5440
diff changeset
  4552
            }
5464
7f31945df4b1 #QUALITY by stefan
Stefan Vogel <sv@exept.de>
parents: 5460
diff changeset
  4553
        } else {
7f31945df4b1 #QUALITY by stefan
Stefan Vogel <sv@exept.de>
parents: 5460
diff changeset
  4554
            returnValue = __MKSMALLINT(sendResult);
5441
bdf6b4e8c68b #BUGFIX by Stefan Reise
sr
parents: 5440
diff changeset
  4555
        }
5464
7f31945df4b1 #QUALITY by stefan
Stefan Vogel <sv@exept.de>
parents: 5460
diff changeset
  4556
    }
5443
3eac683cfb1d put #ifdef around win32 only code
Stefan Vogel <sv@exept.de>
parents: 5442
diff changeset
  4557
#endif // __win32__
5464
7f31945df4b1 #QUALITY by stefan
Stefan Vogel <sv@exept.de>
parents: 5460
diff changeset
  4558
%}.
5441
bdf6b4e8c68b #BUGFIX by Stefan Reise
sr
parents: 5440
diff changeset
  4559
bdf6b4e8c68b #BUGFIX by Stefan Reise
sr
parents: 5440
diff changeset
  4560
    returnValue < 0 ifTrue:[
5451
d98c8a76546d #FEATURE by Stefan Reise
sr
parents: 5450
diff changeset
  4561
        WriteError raiseWith:wsaError.   
5441
bdf6b4e8c68b #BUGFIX by Stefan Reise
sr
parents: 5440
diff changeset
  4562
    ].
bdf6b4e8c68b #BUGFIX by Stefan Reise
sr
parents: 5440
diff changeset
  4563
bdf6b4e8c68b #BUGFIX by Stefan Reise
sr
parents: 5440
diff changeset
  4564
    ^ returnValue
bdf6b4e8c68b #BUGFIX by Stefan Reise
sr
parents: 5440
diff changeset
  4565
5467
914f6955a10a #REFACTORING by Stefan Reise
sr
parents: 5466
diff changeset
  4566
    "Created: / 05-03-2020 / 10:48:56 / Stefan Reise"
5441
bdf6b4e8c68b #BUGFIX by Stefan Reise
sr
parents: 5440
diff changeset
  4567
! !
bdf6b4e8c68b #BUGFIX by Stefan Reise
sr
parents: 5440
diff changeset
  4568
5450
7bc191b240c5 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5445
diff changeset
  4569
!Socket methodsFor:'testing'!
7bc191b240c5 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5445
diff changeset
  4570
7bc191b240c5 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5445
diff changeset
  4571
isSSLSocket
7bc191b240c5 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5445
diff changeset
  4572
    ^ false
7bc191b240c5 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5445
diff changeset
  4573
! !
7bc191b240c5 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5445
diff changeset
  4574
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  4575
!Socket methodsFor:'waiting'!
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  4576
5454
f4227aa5c07b #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5452
diff changeset
  4577
waitForConnection:secondsOrTimeDurationOrNil
f4227aa5c07b #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5452
diff changeset
  4578
    "wait for the connection secondsOrTimeDurationOrNil.
f4227aa5c07b #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5452
diff changeset
  4579
     Return true if connected"
f4227aa5c07b #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5452
diff changeset
  4580
f4227aa5c07b #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5452
diff changeset
  4581
    self readWaitWithTimeout:secondsOrTimeDurationOrNil.
f4227aa5c07b #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5452
diff changeset
  4582
    ^ self isConnected
f4227aa5c07b #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5452
diff changeset
  4583
f4227aa5c07b #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5452
diff changeset
  4584
    "Created: / 17-02-2020 / 20:02:53 / Stefan Vogel"
f4227aa5c07b #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5452
diff changeset
  4585
!
f4227aa5c07b #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5452
diff changeset
  4586
f4227aa5c07b #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5452
diff changeset
  4587
waitForConnectionUntil:aTimestamp
f4227aa5c07b #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5452
diff changeset
  4588
    "return true if connected"
f4227aa5c07b #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5452
diff changeset
  4589
f4227aa5c07b #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5452
diff changeset
  4590
    self readWaitWithTimeoutMs: (aTimestamp millisecondDeltaFrom:Timestamp now).
f4227aa5c07b #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5452
diff changeset
  4591
    ^ self isConnected
f4227aa5c07b #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5452
diff changeset
  4592
!
f4227aa5c07b #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5452
diff changeset
  4593
f4227aa5c07b #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5452
diff changeset
  4594
waitForConnectionWithErrorOnTimeout:secondsOrTimeDurationOrNil
f4227aa5c07b #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5452
diff changeset
  4595
    "wait for the connection secondsOrTimeDurationOrNil.
f4227aa5c07b #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5452
diff changeset
  4596
     Raise an error if not connected."
f4227aa5c07b #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5452
diff changeset
  4597
f4227aa5c07b #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5452
diff changeset
  4598
    self readWaitWithTimeout:secondsOrTimeDurationOrNil.
f4227aa5c07b #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5452
diff changeset
  4599
    self isConnected ifFalse:[
f4227aa5c07b #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5452
diff changeset
  4600
        OpenError 
f4227aa5c07b #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5452
diff changeset
  4601
            raiseRequestWith:self 
f4227aa5c07b #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5452
diff changeset
  4602
            errorString:('Failed to connect to: %1 timeout:%2' 
f4227aa5c07b #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5452
diff changeset
  4603
                            bindWith:self getPeer with:secondsOrTimeDurationOrNil).
f4227aa5c07b #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5452
diff changeset
  4604
    ].
f4227aa5c07b #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5452
diff changeset
  4605
f4227aa5c07b #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5452
diff changeset
  4606
    "Created: / 19-02-2020 / 22:55:04 / Stefan Vogel"
f4227aa5c07b #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5452
diff changeset
  4607
!
f4227aa5c07b #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5452
diff changeset
  4608
4570
39e965ca8d06 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4568
diff changeset
  4609
waitForNewConnectionOrDataOnAny:otherConnections timeout:secondsOrTimeDurationOrNil
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  4610
    "suspend the current process, until either a new connection comes
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  4611
     in at the receiver, or data arrives on any of the otherConnections.
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  4612
     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
  4613
     For an old connection, that socket is returned.
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  4614
     In any case, the caller gets a socket to operate on as return value,
4032
24df60dcd5f4 #OTHER by mawalch
mawalch
parents: 3989
diff changeset
  4615
     or nil, if a timeout occurred.
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  4616
     This method implements the inner wait-primitive of a multi-connection
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  4617
     server application."
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  4618
5466
50ae296c9744 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 5465
diff changeset
  4619
    |wasBlocked sema|
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  4620
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  4621
    "first, a quick check if data is already available"
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  4622
    self canReadWithoutBlocking ifTrue:[
5452
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  4623
        ^ self accept.
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  4624
    ].
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  4625
    otherConnections do:[:aConnection |
5452
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  4626
        aConnection canReadWithoutBlocking ifTrue:[
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  4627
            ^ aConnection
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  4628
        ]
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  4629
    ].
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  4630
3281
bd9392932db1 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3247
diff changeset
  4631
    "check again - prevent incoming interrupts from disturbing our setup"
4570
39e965ca8d06 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4568
diff changeset
  4632
3281
bd9392932db1 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3247
diff changeset
  4633
    wasBlocked := OperatingSystem blockInterrupts.
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  4634
    [
5466
50ae296c9744 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 5465
diff changeset
  4635
        sema := Semaphore name:'Socket-multiReadWait'.
5452
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  4636
        otherConnections do:[:aConnection |
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  4637
            Processor signal:sema onInput:(aConnection fileDescriptor).
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  4638
        ].
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  4639
        Processor signal:sema onInput:(self fileDescriptor).
5466
50ae296c9744 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 5465
diff changeset
  4640
        secondsOrTimeDurationOrNil notNil ifTrue:[
50ae296c9744 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 5465
diff changeset
  4641
            Processor signal:sema after:secondsOrTimeDurationOrNil
5452
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  4642
        ].
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  4643
        Processor activeProcess state:#ioWait.
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  4644
        sema wait.
3281
bd9392932db1 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3247
diff changeset
  4645
    ] ifCurtailed:[
5452
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  4646
        sema notNil ifTrue:[Processor disableSemaphore:sema].
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  4647
        wasBlocked ifFalse:[OperatingSystem unblockInterrupts].
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  4648
    ].
3281
bd9392932db1 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3247
diff changeset
  4649
    wasBlocked ifFalse:[OperatingSystem unblockInterrupts].
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  4650
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  4651
    "see who it was ..."
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  4652
    self canReadWithoutBlocking ifTrue:[
5452
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  4653
        ^ self accept.
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  4654
    ].
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  4655
    otherConnections do:[:aConnection |
5452
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  4656
        aConnection canReadWithoutBlocking ifTrue:[
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  4657
            ^ aConnection
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  4658
        ]
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  4659
    ].
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  4660
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  4661
    "none - a timeout"
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  4662
    ^ nil
4497
bf5e9d5ec532 #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 4414
diff changeset
  4663
bf5e9d5ec532 #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 4414
diff changeset
  4664
    "Modified: / 09-08-2017 / 11:59:50 / cg"
4570
39e965ca8d06 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4568
diff changeset
  4665
    "Modified: / 19-01-2018 / 18:59:17 / stefan"
5466
50ae296c9744 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 5465
diff changeset
  4666
    "Modified: / 04-03-2020 / 14:35:04 / Stefan Vogel"
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  4667
!
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  4668
4570
39e965ca8d06 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4568
diff changeset
  4669
waitForNewConnectionWithTimeout:secondsOrTimeDurationOrNil
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  4670
    "suspend the current process, until a new connection comes
5454
f4227aa5c07b #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5452
diff changeset
  4671
     in at the listening receiver or a timeout occurs.
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  4672
     For a new connection, an accept is performed and the new socket is returned.
4032
24df60dcd5f4 #OTHER by mawalch
mawalch
parents: 3989
diff changeset
  4673
     Returns nil, if a timeout occurred.
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  4674
     This method implements the inner wait-primitive of a single-connection
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  4675
     server application."
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  4676
3633
3a21f142432e #REFACTORING
Stefan Vogel <sv@exept.de>
parents: 3620
diff changeset
  4677
    |newSock|
3a21f142432e #REFACTORING
Stefan Vogel <sv@exept.de>
parents: 3620
diff changeset
  4678
4570
39e965ca8d06 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4568
diff changeset
  4679
    (self readWaitWithTimeout:secondsOrTimeDurationOrNil) ifTrue:[
5452
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  4680
        "a timeout occurred - no connection within timeout"
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  4681
        self reportError:(OperatingSystem errorNumberFor:#ETIMEDOUT).
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  4682
        ^ nil.
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  4683
    ].
4180
f2539f82b744 #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4172
diff changeset
  4684
    self isOpen ifFalse:[
5452
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  4685
        "I have been closed while waiting"
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  4686
        ^ self errorNotOpen.
4180
f2539f82b744 #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4172
diff changeset
  4687
    ].
4568
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  4688
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  4689
    "ok, a connection is present - accept it"
3633
3a21f142432e #REFACTORING
Stefan Vogel <sv@exept.de>
parents: 3620
diff changeset
  4690
    newSock := self class new.
3a21f142432e #REFACTORING
Stefan Vogel <sv@exept.de>
parents: 3620
diff changeset
  4691
    (newSock primAcceptOn:self blocking:false) ifFalse:[
5452
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  4692
        "should raise an error here - primitive code raises a notification"
4af47e15a741 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5451
diff changeset
  4693
        ^ nil
3633
3a21f142432e #REFACTORING
Stefan Vogel <sv@exept.de>
parents: 3620
diff changeset
  4694
    ].
3a21f142432e #REFACTORING
Stefan Vogel <sv@exept.de>
parents: 3620
diff changeset
  4695
    ^ newSock
4568
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  4696
4570
39e965ca8d06 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4568
diff changeset
  4697
    "Modified (format): / 19-01-2018 / 18:53:15 / stefan"
5454
f4227aa5c07b #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5452
diff changeset
  4698
    "Modified (comment): / 19-02-2020 / 23:32:32 / Stefan Vogel"
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  4699
! !
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  4700
464
600b101a7035 alen in accept
Claus Gittinger <cg@exept.de>
parents: 463
diff changeset
  4701
!Socket class methodsFor:'documentation'!
206
77166a6b3ee6 For ST80 style socket creation: register socket in Lobby.
Stefan Vogel <sv@exept.de>
parents: 203
diff changeset
  4702
77166a6b3ee6 For ST80 style socket creation: register socket in Lobby.
Stefan Vogel <sv@exept.de>
parents: 203
diff changeset
  4703
version
3590
3487165a9cdf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3550
diff changeset
  4704
    ^ '$Header$'
2292
c4b0b901278e added: #standardTimeout
Claus Gittinger <cg@exept.de>
parents: 1940
diff changeset
  4705
!
c4b0b901278e added: #standardTimeout
Claus Gittinger <cg@exept.de>
parents: 1940
diff changeset
  4706
c4b0b901278e added: #standardTimeout
Claus Gittinger <cg@exept.de>
parents: 1940
diff changeset
  4707
version_CVS
3590
3487165a9cdf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3550
diff changeset
  4708
    ^ '$Header$'
206
77166a6b3ee6 For ST80 style socket creation: register socket in Lobby.
Stefan Vogel <sv@exept.de>
parents: 203
diff changeset
  4709
! !
5196
f2b4c109c24f #FEATURE by exept
Claus Gittinger <cg@exept.de>
parents: 5001
diff changeset
  4710