Socket.st
author Stefan Vogel <sv@exept.de>
Tue, 29 Sep 2015 19:38:57 +0200
changeset 3617 2cb8727b8e0f
parent 3616 0a1001b5c867
child 3619 ae55ba1cd11e
child 3620 c648d063bccc
permissions -rw-r--r--
#BUGFIX class: Socket 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
42
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
     3
	      All Rights Reserved
0
1cf8d1747859 Initial revision
claus
parents:
diff changeset
     4
1cf8d1747859 Initial revision
claus
parents:
diff changeset
     5
 This software is furnished under a license and may be used
1cf8d1747859 Initial revision
claus
parents:
diff changeset
     6
 only in accordance with the terms of that license and with the
1cf8d1747859 Initial revision
claus
parents:
diff changeset
     7
 inclusion of the above copyright notice.   This software may not
1cf8d1747859 Initial revision
claus
parents:
diff changeset
     8
 be provided or otherwise made available to, or used by, any
1cf8d1747859 Initial revision
claus
parents:
diff changeset
     9
 other person.  No title to or ownership of the software is
1cf8d1747859 Initial revision
claus
parents:
diff changeset
    10
 hereby transferred.
1cf8d1747859 Initial revision
claus
parents:
diff changeset
    11
"
888
a868b0e54a2b ipAddress stuff
Claus Gittinger <cg@exept.de>
parents: 887
diff changeset
    12
"{ Package: 'stx:libbasic2' }"
a868b0e54a2b ipAddress stuff
Claus Gittinger <cg@exept.de>
parents: 887
diff changeset
    13
3462
cfdc47761d0f class: Socket
Claus Gittinger <cg@exept.de>
parents: 3281
diff changeset
    14
"{ NameSpace: Smalltalk }"
cfdc47761d0f class: Socket
Claus Gittinger <cg@exept.de>
parents: 3281
diff changeset
    15
63
7dd3d5b7877e *** empty log message ***
claus
parents: 58
diff changeset
    16
NonPositionableExternalStream subclass:#Socket
1505
Stefan Vogel <sv@exept.de>
parents: 1504
diff changeset
    17
	instanceVariableNames:'domain socketType protocol port serviceName peer peerName
Stefan Vogel <sv@exept.de>
parents: 1504
diff changeset
    18
		listening'
206
77166a6b3ee6 For ST80 style socket creation: register socket in Lobby.
Stefan Vogel <sv@exept.de>
parents: 203
diff changeset
    19
	classVariableNames:''
77166a6b3ee6 For ST80 style socket creation: register socket in Lobby.
Stefan Vogel <sv@exept.de>
parents: 203
diff changeset
    20
	poolDictionaries:''
77166a6b3ee6 For ST80 style socket creation: register socket in Lobby.
Stefan Vogel <sv@exept.de>
parents: 203
diff changeset
    21
	category:'Streams-External'
0
1cf8d1747859 Initial revision
claus
parents:
diff changeset
    22
!
1cf8d1747859 Initial revision
claus
parents:
diff changeset
    23
126
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
    24
!Socket primitiveDefinitions!
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
    25
%{
1009
e0839f923a3c double underlines;
Claus Gittinger <cg@exept.de>
parents: 1007
diff changeset
    26
/* #define DGRAM_DEBUG /* */
e0839f923a3c double underlines;
Claus Gittinger <cg@exept.de>
parents: 1007
diff changeset
    27
3590
3487165a9cdf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3550
diff changeset
    28
#ifdef __MINGW__
3487165a9cdf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3550
diff changeset
    29
# include <stdio.h>
3487165a9cdf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3550
diff changeset
    30
#endif
1343
cc3bed115c0a definitions cleanup with stxOSDefs.h
penk
parents: 1342
diff changeset
    31
#include "stxOSDefs.h"
126
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
    32
1503
4d97e4191d04 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1499
diff changeset
    33
#ifdef WIN32
3123
55ef9ca4f09f class: Socket
Stefan Vogel <sv@exept.de>
parents: 3077
diff changeset
    34
//#define DEBUG 1
2818
94d67df5c00d compilable with tcc
Claus Gittinger <cg@exept.de>
parents: 2773
diff changeset
    35
/* 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
    36
# undef __BEGIN_INTERRUPTABLE__
4d97e4191d04 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1499
diff changeset
    37
# undef __END_INTERRUPTABLE__
2818
94d67df5c00d compilable with tcc
Claus Gittinger <cg@exept.de>
parents: 2773
diff changeset
    38
# ifdef __TCC__
94d67df5c00d compilable with tcc
Claus Gittinger <cg@exept.de>
parents: 2773
diff changeset
    39
#  define __BEGIN_INTERRUPTABLE__ xxxx
94d67df5c00d compilable with tcc
Claus Gittinger <cg@exept.de>
parents: 2773
diff changeset
    40
#  define __END_INTERRUPTABLE__ yyyy
94d67df5c00d compilable with tcc
Claus Gittinger <cg@exept.de>
parents: 2773
diff changeset
    41
# else
94d67df5c00d compilable with tcc
Claus Gittinger <cg@exept.de>
parents: 2773
diff changeset
    42
#  define __BEGIN_INTERRUPTABLE__ ..
94d67df5c00d compilable with tcc
Claus Gittinger <cg@exept.de>
parents: 2773
diff changeset
    43
#  define __END_INTERRUPTABLE__ ..
94d67df5c00d compilable with tcc
Claus Gittinger <cg@exept.de>
parents: 2773
diff changeset
    44
# endif
1503
4d97e4191d04 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1499
diff changeset
    45
1504
92005eec5c9d fixed moving-object-when-interrupted-with-scavenge bugs;
Claus Gittinger <cg@exept.de>
parents: 1503
diff changeset
    46
# define WRAP_STDIO
2823
10179ccfae5d Default for close - linger in background instead 30s in foreground
Stefan Vogel <sv@exept.de>
parents: 2818
diff changeset
    47
// 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
    48
// 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
    49
// 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
    50
//# 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
    51
2909
aacef77a1697 64bit fixes
Claus Gittinger <cg@exept.de>
parents: 2904
diff changeset
    52
# ifdef __MINGW__
aacef77a1697 64bit fixes
Claus Gittinger <cg@exept.de>
parents: 2904
diff changeset
    53
extern HANDLE _get_osfhandle();
1845
df4d79bfba9d closesocket is still tricky
Claus Gittinger <cg@exept.de>
parents: 1844
diff changeset
    54
# endif
df4d79bfba9d closesocket is still tricky
Claus Gittinger <cg@exept.de>
parents: 1844
diff changeset
    55
3246
c75a006f9a7a Win32 sockets use handles instead of file pointers
Stefan Vogel <sv@exept.de>
parents: 3224
diff changeset
    56
# if 0 && (defined( __BORLANDC__ ) || defined( __MINGW__ ))
2915
896fffb0f02e mingw64
Claus Gittinger <cg@exept.de>
parents: 2909
diff changeset
    57
#  define SOCKET_FROM_FD(fd)               (SOCKET)(_get_osfhandle(fd))
2909
aacef77a1697 64bit fixes
Claus Gittinger <cg@exept.de>
parents: 2904
diff changeset
    58
# else
3246
c75a006f9a7a Win32 sockets use handles instead of file pointers
Stefan Vogel <sv@exept.de>
parents: 3224
diff changeset
    59
#  define SOCKET_FROM_FD(fd)               (SOCKET)(fd)
2909
aacef77a1697 64bit fixes
Claus Gittinger <cg@exept.de>
parents: 2904
diff changeset
    60
# endif
1504
92005eec5c9d fixed moving-object-when-interrupted-with-scavenge bugs;
Claus Gittinger <cg@exept.de>
parents: 1503
diff changeset
    61
#else /* not WIN32 */
3215
342d793d938c class: Socket
Stefan Vogel <sv@exept.de>
parents: 3214
diff changeset
    62
# define SOCKET_FROM_FD(fd)   (fd)
342d793d938c class: Socket
Stefan Vogel <sv@exept.de>
parents: 3214
diff changeset
    63
# define closesocket(sock)    close(sock)
342d793d938c class: Socket
Stefan Vogel <sv@exept.de>
parents: 3214
diff changeset
    64
# define SOCKET               int
3246
c75a006f9a7a Win32 sockets use handles instead of file pointers
Stefan Vogel <sv@exept.de>
parents: 3224
diff changeset
    65
#endif /* ! WIN32 */
1503
4d97e4191d04 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1499
diff changeset
    66
1843
8ee90d243b49 closeSocket after fclose: no longer (Q: is this the right thing)
Claus Gittinger <cg@exept.de>
parents: 1842
diff changeset
    67
#define SOCKET_FROM_FILE(f)             (SOCKET_FROM_FD(fileno(f)))
3246
c75a006f9a7a Win32 sockets use handles instead of file pointers
Stefan Vogel <sv@exept.de>
parents: 3224
diff changeset
    68
#define SOCKET_FROM_FILE_OBJECT(f)      (__INST(handleType) == @symbol(socketHandle) ? SOCKET_FROM_FD(__FILEVal(f)) : SOCKET_FROM_FILE(__FILEVal(f)))
1539
c0e89dcb58b3 non blocking stuff done right here;
Claus Gittinger <cg@exept.de>
parents: 1538
diff changeset
    69
3590
3487165a9cdf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3550
diff changeset
    70
#ifndef __MINGW__
3487165a9cdf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3550
diff changeset
    71
# include <stdio.h>
3487165a9cdf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3550
diff changeset
    72
#endif
126
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
    73
#include <errno.h>
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
    74
1343
cc3bed115c0a definitions cleanup with stxOSDefs.h
penk
parents: 1342
diff changeset
    75
#ifdef WANT__TCP_DOT_H
cc3bed115c0a definitions cleanup with stxOSDefs.h
penk
parents: 1342
diff changeset
    76
# include <netinet/tcp.h>
cc3bed115c0a definitions cleanup with stxOSDefs.h
penk
parents: 1342
diff changeset
    77
#endif
cc3bed115c0a definitions cleanup with stxOSDefs.h
penk
parents: 1342
diff changeset
    78
1344
70d73917ac78 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1343
diff changeset
    79
#ifdef WANT__NETDB_DOT_H
70d73917ac78 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1343
diff changeset
    80
# include <netdb.h>
1343
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
739
eb3878300c3b removed WIN32 ifdef's - win32 uses Socket_win32.st anyway.
Claus Gittinger <cg@exept.de>
parents: 726
diff changeset
    83
#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
    84
# define USE_H_ERRNO
eb3878300c3b removed WIN32 ifdef's - win32 uses Socket_win32.st anyway.
Claus Gittinger <cg@exept.de>
parents: 726
diff changeset
    85
#endif
eb3878300c3b removed WIN32 ifdef's - win32 uses Socket_win32.st anyway.
Claus Gittinger <cg@exept.de>
parents: 726
diff changeset
    86
126
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
    87
/*
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
    88
 * on some systems errno is a macro ... check for it here
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
    89
 */
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
    90
#ifndef errno
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
    91
 extern errno;
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
    92
#endif
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
    93
648
58e11a70ddaf gethostbyname behaves strange, if a name-server lookup is involved.
Claus Gittinger <cg@exept.de>
parents: 617
diff changeset
    94
#ifdef USE_H_ERRNO
58e11a70ddaf gethostbyname behaves strange, if a name-server lookup is involved.
Claus Gittinger <cg@exept.de>
parents: 617
diff changeset
    95
# ifndef h_errno
58e11a70ddaf gethostbyname behaves strange, if a name-server lookup is involved.
Claus Gittinger <cg@exept.de>
parents: 617
diff changeset
    96
 extern h_errno;
58e11a70ddaf gethostbyname behaves strange, if a name-server lookup is involved.
Claus Gittinger <cg@exept.de>
parents: 617
diff changeset
    97
# endif
58e11a70ddaf gethostbyname behaves strange, if a name-server lookup is involved.
Claus Gittinger <cg@exept.de>
parents: 617
diff changeset
    98
#endif
58e11a70ddaf gethostbyname behaves strange, if a name-server lookup is involved.
Claus Gittinger <cg@exept.de>
parents: 617
diff changeset
    99
126
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
   100
#ifdef DEBUG
1839
c10cd58ec334 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1781
diff changeset
   101
# define DBGPRINTF(x)    { if (__debugging__) console_printf x; }
c10cd58ec334 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1781
diff changeset
   102
# define DBGFPRINTF(x)   { if (__debugging__) console_fprintf x; }
126
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
   103
#else
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
   104
# define DBGPRINTF(x)    /* as nothing */
821
40b0b69bf4b5 more debugs; fixed at-addresses
Claus Gittinger <cg@exept.de>
parents: 820
diff changeset
   105
# define DBGFPRINTF(x)   /* as nothing */
126
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
   106
#endif
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
   107
1531
ec98158988ca compilable under unix
Claus Gittinger <cg@exept.de>
parents: 1529
diff changeset
   108
#ifndef TRUE
1535
f6aa0fc8c3cc getSocketAddress
Claus Gittinger <cg@exept.de>
parents: 1533
diff changeset
   109
# define TRUE   1
1531
ec98158988ca compilable under unix
Claus Gittinger <cg@exept.de>
parents: 1529
diff changeset
   110
#endif
ec98158988ca compilable under unix
Claus Gittinger <cg@exept.de>
parents: 1529
diff changeset
   111
#ifndef FALSE
1535
f6aa0fc8c3cc getSocketAddress
Claus Gittinger <cg@exept.de>
parents: 1533
diff changeset
   112
# define FALSE  0
1531
ec98158988ca compilable under unix
Claus Gittinger <cg@exept.de>
parents: 1529
diff changeset
   113
#endif
ec98158988ca compilable under unix
Claus Gittinger <cg@exept.de>
parents: 1529
diff changeset
   114
#ifndef WIN32
ec98158988ca compilable under unix
Claus Gittinger <cg@exept.de>
parents: 1529
diff changeset
   115
typedef int BOOL;
ec98158988ca compilable under unix
Claus Gittinger <cg@exept.de>
parents: 1529
diff changeset
   116
#endif
ec98158988ca compilable under unix
Claus Gittinger <cg@exept.de>
parents: 1529
diff changeset
   117
1843
8ee90d243b49 closeSocket after fclose: no longer (Q: is this the right thing)
Claus Gittinger <cg@exept.de>
parents: 1842
diff changeset
   118
#ifdef WIN32
8ee90d243b49 closeSocket after fclose: no longer (Q: is this the right thing)
Claus Gittinger <cg@exept.de>
parents: 1842
diff changeset
   119
# undef stdout
8ee90d243b49 closeSocket after fclose: no longer (Q: is this the right thing)
Claus Gittinger <cg@exept.de>
parents: 1842
diff changeset
   120
# undef stderr
8ee90d243b49 closeSocket after fclose: no longer (Q: is this the right thing)
Claus Gittinger <cg@exept.de>
parents: 1842
diff changeset
   121
# 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
   122
# 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
   123
#endif
126
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
   124
%}
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
   125
! !
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
   126
511
c071e228cb24 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 510
diff changeset
   127
!Socket primitiveVariables!
c071e228cb24 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 510
diff changeset
   128
%{
1844
decc9d62520d oops - debug
Claus Gittinger <cg@exept.de>
parents: 1843
diff changeset
   129
static int __debugging__ = 0;
511
c071e228cb24 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 510
diff changeset
   130
%}
c071e228cb24 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 510
diff changeset
   131
! !
c071e228cb24 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 510
diff changeset
   132
1504
92005eec5c9d fixed moving-object-when-interrupted-with-scavenge bugs;
Claus Gittinger <cg@exept.de>
parents: 1503
diff changeset
   133
!Socket primitiveFunctions!
92005eec5c9d fixed moving-object-when-interrupted-with-scavenge bugs;
Claus Gittinger <cg@exept.de>
parents: 1503
diff changeset
   134
%{
92005eec5c9d fixed moving-object-when-interrupted-with-scavenge bugs;
Claus Gittinger <cg@exept.de>
parents: 1503
diff changeset
   135
1529
911273d090c1 Re-unified Win32 and Unix code into single Socket.st.
Claus Gittinger <cg@exept.de>
parents: 1505
diff changeset
   136
static int
3616
Stefan Vogel <sv@exept.de>
parents: 3615
diff changeset
   137
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
   138
{
3616
Stefan Vogel <sv@exept.de>
parents: 3615
diff changeset
   139
        char *extPtr = 0;
Stefan Vogel <sv@exept.de>
parents: 3615
diff changeset
   140
        int sIdx = 0, objSize = 0, offs = 0;
Stefan Vogel <sv@exept.de>
parents: 3615
diff changeset
   141
Stefan Vogel <sv@exept.de>
parents: 3615
diff changeset
   142
        sIdx = 0;
Stefan Vogel <sv@exept.de>
parents: 3615
diff changeset
   143
        if (__isSmallInteger(startIndex)) {
Stefan Vogel <sv@exept.de>
parents: 3615
diff changeset
   144
            sIdx = __intVal(startIndex) - 1;
Stefan Vogel <sv@exept.de>
parents: 3615
diff changeset
   145
        }
Stefan Vogel <sv@exept.de>
parents: 3615
diff changeset
   146
Stefan Vogel <sv@exept.de>
parents: 3615
diff changeset
   147
        if (__isExternalBytesLike(aDataBuffer)) {
Stefan Vogel <sv@exept.de>
parents: 3615
diff changeset
   148
            OBJ sz;
Stefan Vogel <sv@exept.de>
parents: 3615
diff changeset
   149
Stefan Vogel <sv@exept.de>
parents: 3615
diff changeset
   150
            extPtr = (char *)(__externalBytesAddress(aDataBuffer));
Stefan Vogel <sv@exept.de>
parents: 3615
diff changeset
   151
            sz = __externalBytesSize(aDataBuffer);
Stefan Vogel <sv@exept.de>
parents: 3615
diff changeset
   152
            if (__isSmallInteger(sz)) {
Stefan Vogel <sv@exept.de>
parents: 3615
diff changeset
   153
                objSize = __intVal(sz);
Stefan Vogel <sv@exept.de>
parents: 3615
diff changeset
   154
            } else {
Stefan Vogel <sv@exept.de>
parents: 3615
diff changeset
   155
                objSize = 0; /* unknown */
Stefan Vogel <sv@exept.de>
parents: 3615
diff changeset
   156
            }
Stefan Vogel <sv@exept.de>
parents: 3615
diff changeset
   157
            offs = sIdx;
Stefan Vogel <sv@exept.de>
parents: 3615
diff changeset
   158
        } else {
Stefan Vogel <sv@exept.de>
parents: 3615
diff changeset
   159
            OBJ oClass;
Stefan Vogel <sv@exept.de>
parents: 3615
diff changeset
   160
            int nInstVars, nInstBytes;
Stefan Vogel <sv@exept.de>
parents: 3615
diff changeset
   161
Stefan Vogel <sv@exept.de>
parents: 3615
diff changeset
   162
            extPtr = (char *)0;
Stefan Vogel <sv@exept.de>
parents: 3615
diff changeset
   163
            oClass = __Class(aDataBuffer);
Stefan Vogel <sv@exept.de>
parents: 3615
diff changeset
   164
            switch (__intVal(__ClassInstPtr(oClass)->c_flags) & ARRAYMASK) {
Stefan Vogel <sv@exept.de>
parents: 3615
diff changeset
   165
                case BYTEARRAY:
Stefan Vogel <sv@exept.de>
parents: 3615
diff changeset
   166
                    offs = sIdx;
Stefan Vogel <sv@exept.de>
parents: 3615
diff changeset
   167
                    break;
Stefan Vogel <sv@exept.de>
parents: 3615
diff changeset
   168
                case WORDARRAY:
Stefan Vogel <sv@exept.de>
parents: 3615
diff changeset
   169
                case SWORDARRAY:
Stefan Vogel <sv@exept.de>
parents: 3615
diff changeset
   170
                    offs = sIdx * 2;
Stefan Vogel <sv@exept.de>
parents: 3615
diff changeset
   171
                    break;
Stefan Vogel <sv@exept.de>
parents: 3615
diff changeset
   172
                case LONGARRAY:
Stefan Vogel <sv@exept.de>
parents: 3615
diff changeset
   173
                case SLONGARRAY:
Stefan Vogel <sv@exept.de>
parents: 3615
diff changeset
   174
                    offs = sIdx * 4;
Stefan Vogel <sv@exept.de>
parents: 3615
diff changeset
   175
                    break;
Stefan Vogel <sv@exept.de>
parents: 3615
diff changeset
   176
                case LONGLONGARRAY:
Stefan Vogel <sv@exept.de>
parents: 3615
diff changeset
   177
                case SLONGLONGARRAY:
Stefan Vogel <sv@exept.de>
parents: 3615
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
3616
Stefan Vogel <sv@exept.de>
parents: 3615
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
3616
Stefan Vogel <sv@exept.de>
parents: 3615
diff changeset
   182
                    break;
Stefan Vogel <sv@exept.de>
parents: 3615
diff changeset
   183
                case FLOATARRAY:
Stefan Vogel <sv@exept.de>
parents: 3615
diff changeset
   184
                    offs = sIdx * sizeof(float);
Stefan Vogel <sv@exept.de>
parents: 3615
diff changeset
   185
                    break;
Stefan Vogel <sv@exept.de>
parents: 3615
diff changeset
   186
                case DOUBLEARRAY:
Stefan Vogel <sv@exept.de>
parents: 3615
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
3616
Stefan Vogel <sv@exept.de>
parents: 3615
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
3616
Stefan Vogel <sv@exept.de>
parents: 3615
diff changeset
   191
                    break;
Stefan Vogel <sv@exept.de>
parents: 3615
diff changeset
   192
                default:
Stefan Vogel <sv@exept.de>
parents: 3615
diff changeset
   193
                    *p_objSize = -1;
Stefan Vogel <sv@exept.de>
parents: 3615
diff changeset
   194
                    return 0;
Stefan Vogel <sv@exept.de>
parents: 3615
diff changeset
   195
            }
Stefan Vogel <sv@exept.de>
parents: 3615
diff changeset
   196
            nInstVars = __intVal(__ClassInstPtr(oClass)->c_ninstvars);
Stefan Vogel <sv@exept.de>
parents: 3615
diff changeset
   197
            nInstBytes = OHDR_SIZE + nInstVars * sizeof(OBJ);
Stefan Vogel <sv@exept.de>
parents: 3615
diff changeset
   198
            offs = offs + nInstBytes;
Stefan Vogel <sv@exept.de>
parents: 3615
diff changeset
   199
            objSize = __Size(aDataBuffer) - offs;
Stefan Vogel <sv@exept.de>
parents: 3615
diff changeset
   200
        }
Stefan Vogel <sv@exept.de>
parents: 3615
diff changeset
   201
        *p_extPtr = extPtr;
Stefan Vogel <sv@exept.de>
parents: 3615
diff changeset
   202
        *p_objSize = objSize;
Stefan Vogel <sv@exept.de>
parents: 3615
diff changeset
   203
        *p_offs = offs;
Stefan Vogel <sv@exept.de>
parents: 3615
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
42
506596f9a1a8 *** empty log message ***
claus
parents: 38
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.
5891518d17a3 appletalk support - untested
Claus Gittinger <cg@exept.de>
parents: 524
diff changeset
   235
     Implementing those is pretty straight forward, once the address
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,
3590
3487165a9cdf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3550
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:]
3590
3487165a9cdf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3550
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):
3467
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
   256
									[exBegin]
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
   257
	|sock|
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
   258
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
   259
	sock := Socket newTCPclientToHost:'smtp.exept.de' port:'smtp'.
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
   260
	sock isNil ifTrue:[
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
   261
	    self warn:'no smtp daemon is running'.
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
   262
	    ^ self
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
   263
	].
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
   264
	Transcript showCR:sock nextLine.
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
   265
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
   266
	sock nextPutAll:'HELO STX socket test'; cr.
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
   267
	Transcript showCR:sock nextLine.
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
   268
	sock close
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
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):
3467
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
   273
									[exBegin]
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
   274
	|sock entry|
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
   275
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
   276
	sock := Socket newTCPclientToHost:'localhost' port:'finger'.
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
   277
	sock isNil ifTrue:[
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
   278
	    self warn:'no finger daemon is running'.
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
   279
	    ^ self
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
   280
	].
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
   281
	sock useCRLF:true.
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
   282
	sock buffered:false.
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
   283
	sock isNil ifTrue:[
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
   284
	    Transcript showCR:'cannot connect to local finger daemon'
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
   285
	] ifFalse:[
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
   286
	    sock nextPutAll:(OperatingSystem getLoginName).
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
   287
	    sock cr.
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
   288
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
   289
	    entry := sock nextLine.
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
   290
	    Transcript showCR:entry.
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
   291
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
   292
	    sock close
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
   293
	]
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
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):
3467
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
   297
									[exBegin]
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
   298
	|sock|
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
   299
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
   300
	sock := Socket newTCPclientToHost:'www.exept.de' port:'ftp'.
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
   301
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
   302
	sock buffered:false.
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
   303
	Transcript showCR:sock nextLine.
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
   304
	sock nextPutAll:('USER ' , 'anonymous'); cr.
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
   305
	Transcript showCR:sock nextLine.
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
   306
	sock nextPutAll:('PASS ' , 'fooBar'); cr.
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
   307
	Transcript showCR:sock nextLine.
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
   308
	sock nextPutAll:'HELP'; cr.
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
   309
	[
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
   310
	    |line|
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
   311
	    line := sock nextLine.
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
   312
	    Transcript showCR:line.
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
   313
	    (line at:4) = $-
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
   314
	] whileTrue.
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
   315
	sock close.
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
   316
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
   317
	'dont know enough of the ftp protocol to continue here ...'
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
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]):
2824
b00dc482dd03 comment/format in: #examples
Stefan Vogel <sv@exept.de>
parents: 2823
diff changeset
   322
    Note: this is not a real connection, only the destination adress is
3467
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
   323
	  being fixed.
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
   324
									[exBegin]
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
   325
	|sock port|
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
   326
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
   327
	sock := Socket newUDP.
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
   328
	port := Socket portOfService:'snmp'.
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
   329
	sock connectTo:'localhost' port:port.
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
   330
	sock buffered:false.
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
   331
	Transcript showCR:'got it'.
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
   332
	sock close.
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
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):
3467
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
   337
									[exBegin]
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
   338
	|connectSock sock|
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
   339
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
   340
	connectSock := Socket newTCPserverAtPort:9998.
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
   341
	connectSock isNil ifTrue:[
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
   342
	    Transcript showCR:'socket setup failed.'.
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
   343
	] ifFalse:[
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
   344
	    Transcript showCR:'listen ..'.
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
   345
	    (connectSock listenFor:5) ifFalse:[
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
   346
		Transcript showCR:'listen failed.'.
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
   347
	    ] ifTrue:[
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
   348
		Transcript showCR:'wait'.
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
   349
		connectSock readWait.
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
   350
		Transcript showCR:'accept'.
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
   351
		sock := connectSock accept.
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
   352
		sock isNil ifTrue:[
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
   353
		    Transcript showCR:'accept failed.'.
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
   354
		] ifFalse:[
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
   355
		    sock buffered:false.
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
   356
		    Transcript showCR:'server: got it'.
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
   357
		    'can now do transfer via sock'.
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
   358
		    Transcript showCR:'read'.
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
   359
		    Transcript showCR:('got: ' , sock nextLine).
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
   360
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
   361
		    Transcript showCR:'close'.
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
   362
		    sock close
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
   363
		].
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
   364
		connectSock close.
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
   365
	    ]
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
   366
	]
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
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):
3467
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
   371
									[exBegin]
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
   372
	|sock|
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
   373
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
   374
	sock := Socket newTCPclientToHost:'localhost' port:9998.
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
   375
	sock isNil ifTrue:[
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
   376
	    Transcript showCR:'nope'
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
   377
	] ifFalse:[
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
   378
	    sock buffered:false.
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
   379
	    Transcript showCR:'client: got it'.
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
   380
	    'can now do transfer via sock'.
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
   381
	    Transcript showCR:'sending <hello>'.
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
   382
	    sock nextPutLine:'hello'.
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
   383
	    sock close
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
   384
	]
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
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
3467
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
   389
	|connectSock sock|
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
   390
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
   391
	'/tmp/ud_socket' asFilename remove.
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
   392
	connectSock := Socket newUNIXserverAt:'/tmp/ud_socket'.
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
   393
	connectSock isNil ifTrue:[
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
   394
	    Transcript showCR:'socket setup failed.'.
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
   395
	] ifFalse:[
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
   396
	    Transcript showCR:'listen ..'.
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
   397
	    (connectSock listenFor:5) ifFalse:[
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
   398
		Transcript showCR:'listen failed.'.
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
   399
	    ] ifTrue:[
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
   400
		Transcript showCR:'wait'.
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
   401
		connectSock buffered:false.
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
   402
		connectSock readWait.
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
   403
		Transcript showCR:'accept'.
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
   404
		sock := connectSock accept.
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
   405
		sock isNil ifTrue:[
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
   406
		    Transcript showCR:'accept failed.'.
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
   407
		] ifFalse:[
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
   408
		    sock buffered:false.
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
   409
		    Transcript showCR:'server: got it'.
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
   410
		    'can now do transfer via sock'.
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
   411
		    Transcript showCR:'read'.
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
   412
		    Transcript showCR:('got: ' , sock nextLine).
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
   413
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
   414
		    Transcript showCR:'close'.
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
   415
		    sock close
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
   416
		].
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
   417
		connectSock close.
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
   418
	    ]
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
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;
3467
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
   423
	     Notice, this fails, if above server code is executed in the same ST/X image
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
   424
		     (at least on LINUX), since the OS does not correctly handle
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
   425
		     a connect from within an interrupted accept system call
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
   426
		     On SGI's SVR4, this works ok
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
   427
									[exBegin]
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
   428
	|sock|
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
   429
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
   430
	sock := Socket newUNIXclientTo:'/tmp/ud_socket'.
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
   431
	sock isNil ifTrue:[
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
   432
	    Transcript showCR:'nope'
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
   433
	] ifFalse:[
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
   434
	    sock buffered:false.
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
   435
	    Transcript showCR:'client: got it'.
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
   436
	    'can now do transfer via sock'.
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
   437
	    Transcript showCR:'sending <hello>'.
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
   438
	    sock nextPutLine:'hello'.
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
   439
	    sock close
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
   440
	]
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
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):
3467
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
   445
									[exBegin]
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
   446
	|udpSock sock addr n dataBuffer|
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
   447
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
   448
	udpSock := Socket newUDPserverAtPort:9999.
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
   449
	udpSock isNil ifTrue:[
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
   450
	    Transcript showCR:'socket setup failed.'.
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
   451
	] ifFalse:[
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
   452
	    Transcript showCR:'wait'.
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
   453
	    udpSock readWait.
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
   454
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
   455
	    addr := IPSocketAddress new.
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
   456
	    dataBuffer := ByteArray new:1000.
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
   457
	    n := udpSock receiveFrom:addr buffer:dataBuffer start:1 for:dataBuffer size.
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
   458
	    n > 0 ifTrue:[
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
   459
		Transcript showCR:('got: ' , n printString , 'bytes  from ' , addr printString).
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
   460
		Transcript showCR:('data: ' , (dataBuffer copyTo:n) printString).
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
   461
	    ] ifFalse:[
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
   462
		Transcript showCR:'read failed'.
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
   463
	    ].
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
   464
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
   465
	    Transcript showCR:'close'.
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
   466
	    udpSock close
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
   467
	]
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
   468
									[exEnd]
1007
5267b5738779 UDP examples
Claus Gittinger <cg@exept.de>
parents: 1004
diff changeset
   469
    example (connect to above UDP server and send some data;
3467
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
   470
									[exBegin]
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
   471
	|sock|
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
   472
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
   473
	sock := Socket newUDP.
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
   474
	sock isNil ifTrue:[
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
   475
	    Transcript showCR:'nope'
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
   476
	] ifFalse:[
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
   477
	    sock sendTo:(IPSocketAddress new hostName:'localhost' port:9999) buffer:'hello world'.
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
   478
	    sock close
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
   479
	]
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
   480
									[exEnd]
99
7d016cc30052 fixed & moved pingWalk from SNMPSession to here;
Claus Gittinger <cg@exept.de>
parents: 98
diff changeset
   481
7d016cc30052 fixed & moved pingWalk from SNMPSession to here;
Claus Gittinger <cg@exept.de>
parents: 98
diff changeset
   482
    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
   483
    Note: it dosen't use ICMP ping, but tries to reache the echo service,
3467
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
   484
	  which is disabled on most OS.
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
   485
									[exBegin]
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
   486
	|myAddress list top hosts walkProcess port|
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
   487
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
   488
	myAddress := OperatingSystem getNetworkAddresses
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
   489
			keysAndValuesSelect:[:eachIFName :eachAddress|
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
   490
			    eachAddress isLocal not
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
   491
			    and:[eachIFName = 'wlan0']
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
   492
			].
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
   493
	myAddress := myAddress first hostAddress.
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
   494
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
   495
	port := Socket portOfService:'echo'.
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
   496
	port isNil ifTrue:[
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
   497
	    self error:'dont know echo port'.
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
   498
	    ^ self
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
   499
	].
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
   500
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
   501
	top := StandardSystemView new.
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
   502
	top label:'PING net walk'.
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
   503
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
   504
	list := ScrollableView for:ListView in:top.
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
   505
	list origin:0.0@0.0 corner:1.0@1.0.
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
   506
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
   507
	top openAndWait.
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
   508
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
   509
	walkProcess := [
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
   510
	    |l low hi direction tryHostID dottedName hostName conn addr|
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
   511
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
   512
	    l := SortedCollection new.
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
   513
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
   514
	    ' only works with type C-net
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
   515
	      the code below could simply do 1 to:254 do:[:hostID }
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
   516
	      but, to probe likely hosts earlier, the probing is done
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
   517
	      ping-pong like around my ip-address (assuming, that other machines
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
   518
	      have numbers around my own)'.
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
   519
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
   520
	    low := hi := (myAddress at:4).
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
   521
	    direction := 1.
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
   522
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
   523
	    [low > 0 or:[hi < 255]] whileTrue:[
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
   524
		direction > 0 ifTrue:[
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
   525
		    hi := hi + 1.
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
   526
		    tryHostID := hi.
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
   527
		    direction := -1.
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
   528
		] ifFalse:[
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
   529
		    low := low - 1.
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
   530
		    tryHostID := low.
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
   531
		    direction := 1.
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
   532
		].
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
   533
		(tryHostID between:1 and:254) ifTrue:[
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
   534
		    dottedName := (myAddress at:1) printString
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
   535
				  , '.' , (myAddress at:2) printString
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
   536
				  , '.' , (myAddress at:3) printString
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
   537
				  , '.' , tryHostID printString.
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
   538
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
   539
		    top label:'PING net walk - trying ' , dottedName.
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
   540
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
   541
		    top windowGroup withCursor:Cursor wait do:[
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
   542
			conn := Socket newTCPclientToHost:dottedName port:port withTimeout:1000.
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
   543
			conn notNil ifTrue:[
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
   544
			    addr := Socket ipAddressOfHost:dottedName.
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
   545
			    hostName := Socket hostWithIpAddress:addr.
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
   546
			    hostName isNil ifTrue:[
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
   547
				hostName :='?'
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
   548
			    ].
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
   549
			    l add:(dottedName paddedTo:15 with:Character space)
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
   550
				   , ' '
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
   551
				   , (hostName paddedTo:15 with:Character space)
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
   552
				   , ' up & reachable'.
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
   553
			    list list:l.
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
   554
			    conn close.
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
   555
			]
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
   556
		    ].
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
   557
		].
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
   558
	    ].
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
   559
	    top label:'PING reachable hosts'.
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
   560
	] forkAt:(Processor userBackgroundPriority).
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
   561
	walkProcess name:'ping net walker'.
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
   562
									[exEnd]
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
   563
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
   564
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
   565
	This example creates a simple UDP server that accepts
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
   566
	single packets from anybody and broadcasts them to all
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
   567
	clients that have connected so far.
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
   568
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
   569
									[exBegin]
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
   570
	| socket address buffer msgSize clients |
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
   571
	clients := Set new.
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
   572
	address := IPSocketAddress new.
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
   573
	buffer := String new: 1024.
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
   574
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
   575
	socket := self newUDPserverAtPort: 6666.
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
   576
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
   577
	Transcript showCR: 'server starting'.
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
   578
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
   579
	[
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
   580
	    [true] whileTrue: [
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
   581
		(socket readWaitWithTimeoutMs: 200) ifFalse: [
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
   582
		    msgSize := socket
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
   583
			    receiveFrom: address
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
   584
			    buffer: buffer
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
   585
			    start: 1
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
   586
			    for: buffer size.
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
   587
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
   588
		    clients add: address copy.
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
   589
		    clients do: [ :clientAddress |
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
   590
			    socket
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
   591
				    sendTo: clientAddress
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
   592
				    buffer: buffer
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
   593
				    start: 1
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
   594
				    for: msgSize]]
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
   595
	    ]
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
   596
	] ensure:[
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
   597
	    Transcript showCR: 'server shutting down'.
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
   598
	    socket close
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
   599
	]
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
   600
									[exEnd]
817
eda0065cbd47 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 814
diff changeset
   601
eda0065cbd47 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 814
diff changeset
   602
   send a datagram to above server:
3467
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
   603
									[exBegin]
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
   604
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
   605
	| socket address buffer host msg |
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
   606
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
   607
	host := Dialog
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
   608
		request: 'What is the name of the server''s host?'
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
   609
		initialAnswer: 'localhost'.
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
   610
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
   611
	socket := self newUDP.
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
   612
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
   613
	address := IPSocketAddress hostName: host port: 6666.
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
   614
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
   615
	buffer := ByteArray new: 1000.
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
   616
	[
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
   617
	    [(msg := Dialog request: 'Say something') isEmpty] whileFalse:[
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
   618
		| replySize stream |
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
   619
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
   620
		socket writeWait.
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
   621
		stream := buffer writeStream.
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
   622
		stream nextPutAll: msg.
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
   623
		socket sendTo:address buffer:buffer start:1 for:stream position.
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
   624
		socket readWait.
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
   625
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
   626
		replySize := socket receiveFrom:address buffer:buffer.
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
   627
		replySize > 0 ifTrue: [
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
   628
		    Transcript cr; nextPutAll: 'Server acknowledged: '.
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
   629
		    Transcript show: ((buffer copyFrom: 1 to: replySize) asString)
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
   630
		]
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
   631
	    ]
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
   632
	] ensure: [socket close].
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
   633
	Transcript cr
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
   634
									[exEnd]
1316
ffe05bfee9b5 example
Claus Gittinger <cg@exept.de>
parents: 1313
diff changeset
   635
ffe05bfee9b5 example
Claus Gittinger <cg@exept.de>
parents: 1313
diff changeset
   636
ffe05bfee9b5 example
Claus Gittinger <cg@exept.de>
parents: 1313
diff changeset
   637
   loopBack:
3467
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
   638
									[exBegin]
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
   639
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
   640
	|readerTask readingSocket writingSocket|
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
   641
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
   642
	readingSocket := self newTCPserverAtPort:9999.
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
   643
	readerTask :=
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
   644
	    [
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
   645
		|connection|
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
   646
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
   647
		readingSocket listenFor:1.
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
   648
		connection := readingSocket accept.
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
   649
		readingSocket close.
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
   650
		[connection atEnd] whileFalse:[
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
   651
		    Transcript showCR:(connection nextLine).
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
   652
		].
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
   653
		connection close.
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
   654
	    ] fork.
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
   655
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
   656
	Delay waitForSeconds:1.
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
   657
	writingSocket := self newTCPclientToHost:'localhost' port:9999.
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
   658
	writingSocket nextPutLine:'Hello'.
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
   659
	writingSocket nextPutLine:'World'.
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
   660
	writingSocket close.
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
   661
									[exEnd]
25
996051271ce9 *** empty log message ***
claus
parents: 21
diff changeset
   662
"
996051271ce9 *** empty log message ***
claus
parents: 21
diff changeset
   663
! !
996051271ce9 *** empty log message ***
claus
parents: 21
diff changeset
   664
1462
5602fce52b42 squeak stuff
Claus Gittinger <cg@exept.de>
parents: 1413
diff changeset
   665
!Socket class methodsFor:'instance creation'!
126
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
   666
3059
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
   667
bindTo:aSocketAddress type:aTypeSymbol
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
   668
    "create a socket for a specific type
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
   669
     and bind it to aSocketAddress.
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
   670
     Type must be:
3217
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
   671
	#stream, #datagram or #raw
3059
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
   672
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
   673
     Neither connect nor connect-wait is done."
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
   674
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
   675
    |newSock|
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
   676
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
   677
    newSock := self domain:aSocketAddress domain type:aTypeSymbol.
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
   678
    [
3217
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
   679
	newSock bindTo:aSocketAddress reuseAddress:true.
3059
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
   680
    ] ifCurtailed:[
3217
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
   681
	newSock close.
3059
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
   682
    ].
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
   683
    ^ newSock
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
   684
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
   685
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
   686
    "
3217
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
   687
	Socket bindTo:(IPSocketAddress anyHost port:8081) type:#stream.
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
   688
	Socket bindTo:(IPv6SocketAddress anyHost port:8081) type:#datagram.
3059
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
   689
    "
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
   690
!
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
   691
126
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
   692
domain:domainSymbol type:type
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
   693
    "create a socket for domain and type -
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
   694
     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
   695
     Domain must be one of the symbols:
3217
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
   696
	#inet, #unix, #appletalk, #decnet, #xns, ...;
819
4cc15700d123 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 817
diff changeset
   697
     Type must be:
3217
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
   698
	#stream, #datagram or #raw
3059
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
   699
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
   700
     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
   701
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
   702
    ^ self new domain:domainSymbol type:type
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
   703
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
   704
    "
3059
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
   705
     Socket domain:#AF_INET type:#stream
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
   706
     Socket domain:#AF_INET type:#datagram
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
   707
     Socket domain:#AF_INET6 type:#stream
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
   708
     Socket domain:#AF_INET6 type:#datagram
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
   709
     Socket domain:#AF_UNIX type:#stream
126
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
   710
    "
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
   711
!
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
   712
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
   713
newTCP
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
   714
    "create a TCP socket - no binding or other setup is done,
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
   715
     neither connect nor connect-wait is done."
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
   716
3059
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
   717
    ^ self new domain:#'AF_INET' type:#stream
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
   718
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
      Socket newTCP
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
   721
    "
126
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
   722
!
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
   723
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
   724
newTCP:aServiceOrNil
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
   725
    "create a TCP socket for a service -
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
   726
     neither connect nor connect-wait is done."
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
   727
3059
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
   728
    |newSock socketAddress socketAddressClass|
126
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
   729
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
   730
    newSock := self newTCP.
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
   731
    (newSock notNil and:[aServiceOrNil notNil]) ifTrue:[
3217
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
   732
	[
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
   733
	    socketAddressClass := newSock socketAddressClass.
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
   734
	    socketAddress := socketAddressClass hostName:nil serviceName:aServiceOrNil type:#stream.
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
   735
	    socketAddress hostAddress:socketAddressClass anyAddress.
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
   736
	    newSock bindTo:socketAddress reuseAddress:true.
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
   737
	] ifCurtailed:[
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
   738
	    newSock close.
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
   739
	]
126
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
   740
    ].
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
   741
    ^ newSock
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
   742
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
   743
1911
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
   744
    "
3217
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
   745
	Socket newTCP:'http-alt'.
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
   746
	Socket newTCP:9996.
1911
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
   747
    "
126
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
576
13acab81fad0 more ST80 compatibility
ca
parents: 572
diff changeset
   750
newTCPclientToAddress:aHostAddress port:aService
13acab81fad0 more ST80 compatibility
ca
parents: 572
diff changeset
   751
    "create a new TCP client socket connecting to a service.
13acab81fad0 more ST80 compatibility
ca
parents: 572
diff changeset
   752
     Return a socket instance if ok, nil on failure.
13acab81fad0 more ST80 compatibility
ca
parents: 572
diff changeset
   753
     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
   754
     not the whole smalltalk).
576
13acab81fad0 more ST80 compatibility
ca
parents: 572
diff changeset
   755
     See also: #newTCPclientToAddress:port:withTimeout:"
13acab81fad0 more ST80 compatibility
ca
parents: 572
diff changeset
   756
13acab81fad0 more ST80 compatibility
ca
parents: 572
diff changeset
   757
    ^ self newTCPclientToAddress:aHostAddress port:aService withTimeout:nil
13acab81fad0 more ST80 compatibility
ca
parents: 572
diff changeset
   758
!
13acab81fad0 more ST80 compatibility
ca
parents: 572
diff changeset
   759
3059
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
   760
newTCPclientToAddress:aSocketAddressOrByteArray port:aService withTimeout:millis
576
13acab81fad0 more ST80 compatibility
ca
parents: 572
diff changeset
   761
    "create a new TCP client socket connecting to a service.
13acab81fad0 more ST80 compatibility
ca
parents: 572
diff changeset
   762
     Return a socket instance if ok, nil on failure.
13acab81fad0 more ST80 compatibility
ca
parents: 572
diff changeset
   763
     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
   764
     and return nil."
576
13acab81fad0 more ST80 compatibility
ca
parents: 572
diff changeset
   765
3059
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
   766
    |port socketAddress|
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
   767
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
   768
    aService isString ifTrue:[
3217
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
   769
	port := self portOfService:aService protocol:#tcp.
3059
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
   770
    ] ifFalse:[
3217
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
   771
	port := aService.
3059
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
   772
    ].
3217
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
   773
    socketAddress := aSocketAddressOrByteArray isSocketAddress
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
   774
			ifTrue:[aSocketAddressOrByteArray]
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
   775
			ifFalse:[
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
   776
			    "Passing ByteArrays is obsolete and only supported for IPv4"
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
   777
			    IPSocketAddress hostAddress:aSocketAddressOrByteArray
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
   778
			].
3059
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
   779
    port notNil ifTrue:[
3217
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
   780
	socketAddress port:port.
3059
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
   781
    ].
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
   782
    ^ self newTCPclientToAddress:socketAddress withTimeout:millis
576
13acab81fad0 more ST80 compatibility
ca
parents: 572
diff changeset
   783
!
13acab81fad0 more ST80 compatibility
ca
parents: 572
diff changeset
   784
3059
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
   785
newTCPclientToAddress:aSocketAddress withTimeout:millis
126
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
   786
    "create a new TCP client socket connecting to a service.
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
   787
     Return a socket instance if ok, nil on failure.
3059
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
   788
     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
   789
     and return nil."
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
   790
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
   791
    |socket|
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
   792
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
   793
    socket := self domain:aSocketAddress domain type:#stream.
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
   794
    (socket connectTo:aSocketAddress withTimeout:millis) ifFalse:[
3217
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
   795
	socket close.
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
   796
	^ nil
3059
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
   797
    ].
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
   798
    ^ socket.
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
   799
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
   800
    "
3217
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
   801
	self newTCPclientToAddress:(IPv6SocketAddress hostName:'www.exept.de' port:80) withTimeout:nil
3059
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
   802
    "
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
   803
!
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
   804
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
   805
newTCPclientToHost:hostNameOrAddress port:aPortOrServiceName
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
   806
    "create a new TCP client socket connecting to a service.
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
   807
     If hostNameOrAddress is a string, try all the resolved adresses regardless
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
   808
     whether fpr IPv4 or IPv6.
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
   809
     Return a socket instance if ok, nil on failure.
126
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
   810
     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
   811
     not the whole smalltalk).
126
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
   812
     See also: #newTCPclientToHost:port:withTimeout:"
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
   813
3590
3487165a9cdf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3550
diff changeset
   814
    ^ self
3487165a9cdf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3550
diff changeset
   815
	newTCPclientToHost:hostNameOrAddress
3487165a9cdf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3550
diff changeset
   816
	port:aPortOrServiceName
3487165a9cdf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3550
diff changeset
   817
	domain:nil
3487165a9cdf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3550
diff changeset
   818
	withTimeout:nil
126
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
   819
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
   820
    "
3059
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
   821
      Socket newTCPclientToHost:'www.exept.de' port:'http'
126
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
   822
    "
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
    "Created: 31.10.1995 / 18:54:11 / cg"
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
   825
!
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
   826
3059
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
   827
newTCPclientToHost:hostNameOrAddress port:aPortOrServiceName domain:aDomainSymbolOrNil withTimeout:millis
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
   828
    "create a new TCP client socket connecting to a service on hostNameOrAddress.
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
   829
     If hostNameOrAddress is a string, try all the resolved adresses.
126
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
   830
     Return a socket instance if ok, nil on failure.
3059
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
   831
     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
   832
     Set aDomainSymbolOrNil to nil, to try all protocols.
126
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
   833
     If the millis arg is nonNil, stop trying to connect after that many milliseconds
3059
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
   834
     and return nil."
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
   835
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
   836
    |socket addressInfoList|
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
   837
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
   838
    hostNameOrAddress isString ifFalse:[
3217
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
   839
	^ self newTCPclientToAddress:hostNameOrAddress port:aPortOrServiceName withTimeout:millis.
126
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
   840
    ].
3059
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
   841
3217
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
   842
    addressInfoList := SocketAddress
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
   843
			    getAddressInfo:hostNameOrAddress
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
   844
			    serviceName:aPortOrServiceName
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
   845
			    domain:aDomainSymbolOrNil
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
   846
			    type:#stream
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
   847
			    protocol:nil
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
   848
			    flags:0.
3059
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
   849
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
   850
    addressInfoList do:[:eachAddressInfo|
3217
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
   851
	|domainSymbol lastDomainSymbol|
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
   852
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
   853
	domainSymbol := eachAddressInfo domain.
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
   854
	domainSymbol ~~ lastDomainSymbol ifTrue:[
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
   855
	    socket notNil ifTrue:[
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
   856
		socket close.
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
   857
	    ].
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
   858
	    socket := self new domain:domainSymbol type:#stream.
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
   859
	    lastDomainSymbol := domainSymbol.
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
   860
	].
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
   861
	(socket connectTo:eachAddressInfo socketAddress withTimeout:millis) ifTrue:[
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
   862
	    ^ socket.
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
   863
	].
3059
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
   864
    ].
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
   865
    socket notNil ifTrue:[
3217
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
   866
	socket close.
3059
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
   867
    ].
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
   868
    ^ nil.
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
   869
126
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
   870
    "
3059
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
   871
      Socket newTCPclientToHost:'www.exept.de' port:80 domain:#'AF_INET' withTimeout:1000.
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
   872
      Socket newTCPclientToHost:'www.exept.de' port:80 domain:#'AF_INET6' withTimeout:1000.
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
   873
      Socket newTCPclientToHost:'www.exept.de' port:80 domain:nil withTimeout:1000.
126
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
   874
      Socket newTCPclientToHost:'localhost' port:'nntp' withTimeout:1000
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
   875
    "
604
b302a21afece Remove redundant code.
Stefan Vogel <sv@exept.de>
parents: 589
diff changeset
   876
b302a21afece Remove redundant code.
Stefan Vogel <sv@exept.de>
parents: 589
diff changeset
   877
    "Modified: / 16.1.1998 / 09:47:06 / stefan"
126
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
   878
!
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
   879
3217
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
   880
newTCPclientToHost:hostNameOrAddress port:aPortOrServiceName withTimeout:millis
3059
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
   881
    "create a new TCP client socket connecting to a service on hostNameOrAddress.
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
   882
     If hostNameOrAddress is a string, try all the resolved adresses regardless
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
   883
     whether fpr IPv4 or IPv6.
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
   884
     Return a socket instance if ok, nil on failure.
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
   885
     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
   886
     and return nil."
3217
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
   887
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
   888
    ^ self
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
   889
	newTCPclientToHost:hostNameOrAddress
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
   890
	port:aPortOrServiceName
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
   891
	domain:self defaultIpDomainForConnect
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
   892
	withTimeout:millis
3059
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
   893
!
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
   894
506
11ef93d12870 support anonymous (OS_specified) ports. (for FTP-protocol)
Claus Gittinger <cg@exept.de>
parents: 486
diff changeset
   895
newTCPserverAtAnonymousPort
11ef93d12870 support anonymous (OS_specified) ports. (for FTP-protocol)
Claus Gittinger <cg@exept.de>
parents: 486
diff changeset
   896
    "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
   897
     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
   898
811
72d9ac1a7f95 comments
Claus Gittinger <cg@exept.de>
parents: 809
diff changeset
   899
    ^ self newTCPserverAtPort:0
506
11ef93d12870 support anonymous (OS_specified) ports. (for FTP-protocol)
Claus Gittinger <cg@exept.de>
parents: 486
diff changeset
   900
11ef93d12870 support anonymous (OS_specified) ports. (for FTP-protocol)
Claus Gittinger <cg@exept.de>
parents: 486
diff changeset
   901
!
11ef93d12870 support anonymous (OS_specified) ports. (for FTP-protocol)
Claus Gittinger <cg@exept.de>
parents: 486
diff changeset
   902
126
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
   903
newTCPserverAtPort:aService
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
   904
    "create a new TCP server socket providing service."
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
   905
1911
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
   906
    ^ self newTCP:aService
126
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
   907
!
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
   908
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
   909
newUDP
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
   910
    "create a UDP socket - no binding or other setup is done,
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
   911
     neither connect nor connect-wait is done."
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
   912
3059
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
   913
    ^ self new domain:#'AF_INET' type:#datagram
126
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
   914
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
   915
    "Socket newUDP"
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
   916
!
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
   917
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
   918
newUDP:aServiceOrNil
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
   919
    "create a UDP socket for a service -
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
   920
     neither connect nor connect-wait is done."
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
   921
3059
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
   922
    |newSock socketAddressClass socketAddress|
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
    newSock := self newUDP.
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
   925
    (newSock notNil and:[aServiceOrNil notNil]) ifTrue:[
3217
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
   926
	[
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
   927
	    socketAddressClass := newSock socketAddressClass.
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
   928
	    socketAddress := socketAddressClass hostName:nil serviceName:aServiceOrNil type:#stream.
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
   929
	    socketAddress hostAddress:socketAddressClass anyAddress.
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
   930
	    newSock bindTo:socketAddress reuseAddress:true.
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
   931
	] ifCurtailed:[
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
   932
	    newSock close.
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
   933
	]
126
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
   934
    ].
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
   935
    ^ newSock
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
   936
1911
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
   937
    "
3217
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
   938
	Socket newUDP:4444.
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
   939
	Socket newUDP:'activesync'.
1911
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
   940
    "
126
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
   941
!
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
   942
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
   943
newUDPserverAtPort:aService
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
   944
    "create a new UDP server socket providing service."
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
   945
1911
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
   946
    ^ self newUDP:aService
126
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
   947
!
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
   948
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
   949
newUNIX
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
   950
    "create a UNIX domain socket - no binding or other setup is done,
811
72d9ac1a7f95 comments
Claus Gittinger <cg@exept.de>
parents: 809
diff changeset
   951
     neither connect nor connect-wait is done.
72d9ac1a7f95 comments
Claus Gittinger <cg@exept.de>
parents: 809
diff changeset
   952
     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
   953
     return nil."
126
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
   954
3059
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
   955
    ^ self new domain:#'AF_UNIX' type:#stream
126
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
   956
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
   957
    "
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
   958
     Socket newUNIX
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
   959
    "
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
   960
!
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
   961
1485
d8578cf3504b gcc3.3.1 insn-scheduler bug workaround
Claus Gittinger <cg@exept.de>
parents: 1474
diff changeset
   962
newUNIXclientTo:pathName
126
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
   963
    "create a new UNIX client socket connecting to a pathname.
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
   964
     Return a socket instance if ok, nil on failure.
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
   965
     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
   966
     not the whole smalltalk).
811
72d9ac1a7f95 comments
Claus Gittinger <cg@exept.de>
parents: 809
diff changeset
   967
     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
   968
     return nil.
126
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
   969
     See also: #newUNIXclientTo:withTimeout:"
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
   970
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
   971
    ^ self newUNIXclientTo:pathName withTimeout:nil
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
   972
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
   973
!
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
   974
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
   975
newUNIXclientTo:pathName withTimeout:millis
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
   976
    "create a new UNIX client socket connecting to a pathname.
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
   977
     Return a socket instance if ok, nil on failure.
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
   978
     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
   979
     and return nil.
72d9ac1a7f95 comments
Claus Gittinger <cg@exept.de>
parents: 809
diff changeset
   980
     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
   981
     return nil."
126
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
   982
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
   983
    |newSock|
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
   984
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
   985
    newSock := self newUNIX.
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
   986
    newSock notNil ifTrue:[
3217
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
   987
	(newSock connectTo:(UDSocketAddress name:pathName) withTimeout:millis) ifFalse:[
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
   988
	    newSock close.
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
   989
	    ^ nil
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
   990
	]
126
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
   991
    ].
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
   992
    ^ newSock
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
   993
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
   994
    "
3217
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
   995
	Socket newUNIXclientTo:'/tmp/foo'
126
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
   996
    "
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
   997
!
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
   998
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
   999
newUNIXserverAt:pathName
811
72d9ac1a7f95 comments
Claus Gittinger <cg@exept.de>
parents: 809
diff changeset
  1000
    "create a new UNIX server socket providing service at a pathname.
72d9ac1a7f95 comments
Claus Gittinger <cg@exept.de>
parents: 809
diff changeset
  1001
     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
  1002
     return nil."
126
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
  1003
3059
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  1004
    ^ self bindTo:(UDSocketAddress name:pathName) type:#stream.
126
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
  1005
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
  1006
    "
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
  1007
     |s s2|
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
  1008
3059
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  1009
    '/tmp/foo' asFilename remove.
126
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
  1010
     s := Socket newUNIXserverAt:'/tmp/foo'.
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
  1011
     s listenFor:5.
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
  1012
     s2 := s accept.
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
  1013
    "
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
  1014
! !
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
  1015
1462
5602fce52b42 squeak stuff
Claus Gittinger <cg@exept.de>
parents: 1413
diff changeset
  1016
!Socket class methodsFor:'Compatibility-ST80'!
5602fce52b42 squeak stuff
Claus Gittinger <cg@exept.de>
parents: 1413
diff changeset
  1017
5602fce52b42 squeak stuff
Claus Gittinger <cg@exept.de>
parents: 1413
diff changeset
  1018
family:domainSymbol type:typeSymbol
5602fce52b42 squeak stuff
Claus Gittinger <cg@exept.de>
parents: 1413
diff changeset
  1019
    "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
  1020
     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
  1021
     Type must be #stream, #datagram or #raw."
1462
5602fce52b42 squeak stuff
Claus Gittinger <cg@exept.de>
parents: 1413
diff changeset
  1022
5602fce52b42 squeak stuff
Claus Gittinger <cg@exept.de>
parents: 1413
diff changeset
  1023
    ^ self domain:domainSymbol type:typeSymbol
5602fce52b42 squeak stuff
Claus Gittinger <cg@exept.de>
parents: 1413
diff changeset
  1024
5602fce52b42 squeak stuff
Claus Gittinger <cg@exept.de>
parents: 1413
diff changeset
  1025
    "
3059
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  1026
     Socket family:#AF_INET type:#stream
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  1027
     Socket family:#AF_INET type:#datagram
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  1028
     Socket family:#AF_UNIX type:#stream
1462
5602fce52b42 squeak stuff
Claus Gittinger <cg@exept.de>
parents: 1413
diff changeset
  1029
    "
5602fce52b42 squeak stuff
Claus Gittinger <cg@exept.de>
parents: 1413
diff changeset
  1030
!
5602fce52b42 squeak stuff
Claus Gittinger <cg@exept.de>
parents: 1413
diff changeset
  1031
5602fce52b42 squeak stuff
Claus Gittinger <cg@exept.de>
parents: 1413
diff changeset
  1032
getHostname
3462
cfdc47761d0f class: Socket
Claus Gittinger <cg@exept.de>
parents: 3281
diff changeset
  1033
    "return the computer's hostname string"
1462
5602fce52b42 squeak stuff
Claus Gittinger <cg@exept.de>
parents: 1413
diff changeset
  1034
5602fce52b42 squeak stuff
Claus Gittinger <cg@exept.de>
parents: 1413
diff changeset
  1035
    ^ OperatingSystem getHostName
5602fce52b42 squeak stuff
Claus Gittinger <cg@exept.de>
parents: 1413
diff changeset
  1036
5602fce52b42 squeak stuff
Claus Gittinger <cg@exept.de>
parents: 1413
diff changeset
  1037
    "Created: / 27.2.1998 / 02:32:17 / cg"
5602fce52b42 squeak stuff
Claus Gittinger <cg@exept.de>
parents: 1413
diff changeset
  1038
!
5602fce52b42 squeak stuff
Claus Gittinger <cg@exept.de>
parents: 1413
diff changeset
  1039
5602fce52b42 squeak stuff
Claus Gittinger <cg@exept.de>
parents: 1413
diff changeset
  1040
sockStream
5602fce52b42 squeak stuff
Claus Gittinger <cg@exept.de>
parents: 1413
diff changeset
  1041
    "return the type code for stream sockets"
5602fce52b42 squeak stuff
Claus Gittinger <cg@exept.de>
parents: 1413
diff changeset
  1042
5602fce52b42 squeak stuff
Claus Gittinger <cg@exept.de>
parents: 1413
diff changeset
  1043
    ^ #stream
5602fce52b42 squeak stuff
Claus Gittinger <cg@exept.de>
parents: 1413
diff changeset
  1044
! !
5602fce52b42 squeak stuff
Claus Gittinger <cg@exept.de>
parents: 1413
diff changeset
  1045
1600
f3acd5382fa1 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1584
diff changeset
  1046
!Socket class methodsFor:'Compatibility-Squeak'!
f3acd5382fa1 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1584
diff changeset
  1047
2900
0e8b305e9a98 class: Socket
Claus Gittinger <cg@exept.de>
parents: 2899
diff changeset
  1048
deadlineSecs:seconds
0e8b305e9a98 class: Socket
Claus Gittinger <cg@exept.de>
parents: 2899
diff changeset
  1049
    ^ Timestamp now addSeconds:seconds
0e8b305e9a98 class: Socket
Claus Gittinger <cg@exept.de>
parents: 2899
diff changeset
  1050
!
0e8b305e9a98 class: Socket
Claus Gittinger <cg@exept.de>
parents: 2899
diff changeset
  1051
1600
f3acd5382fa1 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1584
diff changeset
  1052
initializeNetwork
f3acd5382fa1 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1584
diff changeset
  1053
    "/ intentionally left blank here
f3acd5382fa1 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1584
diff changeset
  1054
!
f3acd5382fa1 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1584
diff changeset
  1055
3485
2afd6854bff9 class: Socket
Claus Gittinger <cg@exept.de>
parents: 3484
diff changeset
  1056
standardDeadline
2afd6854bff9 class: Socket
Claus Gittinger <cg@exept.de>
parents: 3484
diff changeset
  1057
    "a standard timeout in seconds for connection setup;
2afd6854bff9 class: Socket
Claus Gittinger <cg@exept.de>
parents: 3484
diff changeset
  1058
     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
  1059
2afd6854bff9 class: Socket
Claus Gittinger <cg@exept.de>
parents: 3484
diff changeset
  1060
    ^ 30
2afd6854bff9 class: Socket
Claus Gittinger <cg@exept.de>
parents: 3484
diff changeset
  1061
!
2afd6854bff9 class: Socket
Claus Gittinger <cg@exept.de>
parents: 3484
diff changeset
  1062
2292
c4b0b901278e added: #standardTimeout
Claus Gittinger <cg@exept.de>
parents: 1940
diff changeset
  1063
standardTimeout
3485
2afd6854bff9 class: Socket
Claus Gittinger <cg@exept.de>
parents: 3484
diff changeset
  1064
    "a standard timeout in seconds for transfers;
2afd6854bff9 class: Socket
Claus Gittinger <cg@exept.de>
parents: 3484
diff changeset
  1065
     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
  1066
2292
c4b0b901278e added: #standardTimeout
Claus Gittinger <cg@exept.de>
parents: 1940
diff changeset
  1067
    ^ 30
c4b0b901278e added: #standardTimeout
Claus Gittinger <cg@exept.de>
parents: 1940
diff changeset
  1068
!
c4b0b901278e added: #standardTimeout
Claus Gittinger <cg@exept.de>
parents: 1940
diff changeset
  1069
1600
f3acd5382fa1 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1584
diff changeset
  1070
wildcardPort
f3acd5382fa1 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1584
diff changeset
  1071
    ^ nil
f3acd5382fa1 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1584
diff changeset
  1072
! !
f3acd5382fa1 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1584
diff changeset
  1073
1462
5602fce52b42 squeak stuff
Claus Gittinger <cg@exept.de>
parents: 1413
diff changeset
  1074
!Socket class methodsFor:'Compatibility-VW'!
5602fce52b42 squeak stuff
Claus Gittinger <cg@exept.de>
parents: 1413
diff changeset
  1075
1485
d8578cf3504b gcc3.3.1 insn-scheduler bug workaround
Claus Gittinger <cg@exept.de>
parents: 1474
diff changeset
  1076
AF_INET
1462
5602fce52b42 squeak stuff
Claus Gittinger <cg@exept.de>
parents: 1413
diff changeset
  1077
    ^ #AF_INET
5602fce52b42 squeak stuff
Claus Gittinger <cg@exept.de>
parents: 1413
diff changeset
  1078
!
5602fce52b42 squeak stuff
Claus Gittinger <cg@exept.de>
parents: 1413
diff changeset
  1079
5602fce52b42 squeak stuff
Claus Gittinger <cg@exept.de>
parents: 1413
diff changeset
  1080
SOCK_STREAM
5602fce52b42 squeak stuff
Claus Gittinger <cg@exept.de>
parents: 1413
diff changeset
  1081
    ^ #SOCK_STREAM
5602fce52b42 squeak stuff
Claus Gittinger <cg@exept.de>
parents: 1413
diff changeset
  1082
! !
5602fce52b42 squeak stuff
Claus Gittinger <cg@exept.de>
parents: 1413
diff changeset
  1083
5602fce52b42 squeak stuff
Claus Gittinger <cg@exept.de>
parents: 1413
diff changeset
  1084
!Socket class methodsFor:'Signal constants'!
5602fce52b42 squeak stuff
Claus Gittinger <cg@exept.de>
parents: 1413
diff changeset
  1085
5602fce52b42 squeak stuff
Claus Gittinger <cg@exept.de>
parents: 1413
diff changeset
  1086
brokenConnectionSignal
5602fce52b42 squeak stuff
Claus Gittinger <cg@exept.de>
parents: 1413
diff changeset
  1087
    "return the signal used to tell broken connections.
5602fce52b42 squeak stuff
Claus Gittinger <cg@exept.de>
parents: 1413
diff changeset
  1088
     Since in unix, this is the same as the broken pipe signal,
5602fce52b42 squeak stuff
Claus Gittinger <cg@exept.de>
parents: 1413
diff changeset
  1089
     return that one.
5602fce52b42 squeak stuff
Claus Gittinger <cg@exept.de>
parents: 1413
diff changeset
  1090
     (for other Operatingsystems, this may change ..)"
5602fce52b42 squeak stuff
Claus Gittinger <cg@exept.de>
parents: 1413
diff changeset
  1091
5602fce52b42 squeak stuff
Claus Gittinger <cg@exept.de>
parents: 1413
diff changeset
  1092
    ^ PipeStream brokenPipeSignal
5602fce52b42 squeak stuff
Claus Gittinger <cg@exept.de>
parents: 1413
diff changeset
  1093
!
5602fce52b42 squeak stuff
Claus Gittinger <cg@exept.de>
parents: 1413
diff changeset
  1094
5602fce52b42 squeak stuff
Claus Gittinger <cg@exept.de>
parents: 1413
diff changeset
  1095
invalidArgumentsSignal
5602fce52b42 squeak stuff
Claus Gittinger <cg@exept.de>
parents: 1413
diff changeset
  1096
    "dummy for compatibility"
5602fce52b42 squeak stuff
Claus Gittinger <cg@exept.de>
parents: 1413
diff changeset
  1097
5602fce52b42 squeak stuff
Claus Gittinger <cg@exept.de>
parents: 1413
diff changeset
  1098
    ^ self errorSignal
5602fce52b42 squeak stuff
Claus Gittinger <cg@exept.de>
parents: 1413
diff changeset
  1099
! !
5602fce52b42 squeak stuff
Claus Gittinger <cg@exept.de>
parents: 1413
diff changeset
  1100
5602fce52b42 squeak stuff
Claus Gittinger <cg@exept.de>
parents: 1413
diff changeset
  1101
!Socket class methodsFor:'debugging'!
5602fce52b42 squeak stuff
Claus Gittinger <cg@exept.de>
parents: 1413
diff changeset
  1102
5602fce52b42 squeak stuff
Claus Gittinger <cg@exept.de>
parents: 1413
diff changeset
  1103
debug:aBoolean
5602fce52b42 squeak stuff
Claus Gittinger <cg@exept.de>
parents: 1413
diff changeset
  1104
    "turn on/off internal debugprints.
5602fce52b42 squeak stuff
Claus Gittinger <cg@exept.de>
parents: 1413
diff changeset
  1105
     This method is for ST/X debugging only and
5602fce52b42 squeak stuff
Claus Gittinger <cg@exept.de>
parents: 1413
diff changeset
  1106
     may  be removed in later versions"
5602fce52b42 squeak stuff
Claus Gittinger <cg@exept.de>
parents: 1413
diff changeset
  1107
5602fce52b42 squeak stuff
Claus Gittinger <cg@exept.de>
parents: 1413
diff changeset
  1108
%{  /* NOCONTEXT */
5602fce52b42 squeak stuff
Claus Gittinger <cg@exept.de>
parents: 1413
diff changeset
  1109
5602fce52b42 squeak stuff
Claus Gittinger <cg@exept.de>
parents: 1413
diff changeset
  1110
    __debugging__ = (aBoolean == true);
5602fce52b42 squeak stuff
Claus Gittinger <cg@exept.de>
parents: 1413
diff changeset
  1111
%}
5602fce52b42 squeak stuff
Claus Gittinger <cg@exept.de>
parents: 1413
diff changeset
  1112
    "
5602fce52b42 squeak stuff
Claus Gittinger <cg@exept.de>
parents: 1413
diff changeset
  1113
     Socket debug:true
5602fce52b42 squeak stuff
Claus Gittinger <cg@exept.de>
parents: 1413
diff changeset
  1114
     Socket debug:false
5602fce52b42 squeak stuff
Claus Gittinger <cg@exept.de>
parents: 1413
diff changeset
  1115
    "
5602fce52b42 squeak stuff
Claus Gittinger <cg@exept.de>
parents: 1413
diff changeset
  1116
! !
5602fce52b42 squeak stuff
Claus Gittinger <cg@exept.de>
parents: 1413
diff changeset
  1117
3059
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  1118
!Socket class methodsFor:'defaults'!
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  1119
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  1120
defaultIpDomainForConnect
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  1121
    "answer the domain used to look up host names for connect:
3217
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  1122
	#AF_INET    use only IPv4
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  1123
	#AF_INET6   use only IPv6
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  1124
	nil         use both IPv4 and IPv6"
3059
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  1125
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  1126
    ^ #AF_INET
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  1127
! !
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  1128
1911
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
  1129
!Socket class methodsFor:'obsolete'!
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
  1130
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
  1131
connectTo:service on:host
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
  1132
    <resource: #obsolete>
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
  1133
    "standard & easy client setup:
2321
6f4cc7b644db filePointer -> handle migration
Claus Gittinger <cg@exept.de>
parents: 2308
diff changeset
  1134
	create new client tcp socket, bind and connect;
6f4cc7b644db filePointer -> handle migration
Claus Gittinger <cg@exept.de>
parents: 2308
diff changeset
  1135
	return the socket.
1911
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
  1136
     The thread blocks (interruptable), until the connection is established."
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
  1137
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
  1138
    ^ self newTCPclientToHost:host port:(self portOfService:service).
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
  1139
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
  1140
    "
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
  1141
     Socket connectTo:9995 on:'clam'
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
  1142
     Socket connectTo:4711 on:'exept'
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
  1143
     Socket connectTo:'finger' on:'clam'
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
  1144
     Socket connectTo:'ftp' on:'exept'
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
  1145
     Socket connectTo:'nntp' on:(OperatingSystem getEnvironment:'NNTPSERVER')
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
  1146
    "
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
  1147
!
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
  1148
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
  1149
networkLongOrderIsMSB
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
  1150
    "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
  1151
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
  1152
    <resource: #obsolete>
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
  1153
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
  1154
    ^ true
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
  1155
!
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
  1156
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
  1157
networkShortOrderIsMSB
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
  1158
    "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
  1159
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
  1160
    <resource: #obsolete>
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
  1161
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
  1162
    ^ true
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
  1163
!
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
  1164
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
  1165
provide:aService
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
  1166
    "standard & easy server setup:
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
  1167
     create a new TCP server socket providing a service."
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
  1168
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
  1169
    <resource:#obsolete>
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
  1170
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
  1171
    |newSock|
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
  1172
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
  1173
    self obsoleteMethodWarning:'use #newTCPserverAtPort: / #listen'.
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
  1174
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
  1175
    newSock := self newTCPserverAtPort:(self portOfService:aService).
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
  1176
    newSock notNil ifTrue:[
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
  1177
	newSock listenFor:5.
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
  1178
    ].
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
  1179
    ^ newSock
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
  1180
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
  1181
    "
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
  1182
     Socket provide:9995
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
  1183
     (Socket provide:9996) accept
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
  1184
     Socket provide:'nntp'
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
  1185
    "
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
  1186
! !
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
  1187
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
  1188
!Socket class methodsFor:'obsolete host queries'!
525
5891518d17a3 appletalk support - untested
Claus Gittinger <cg@exept.de>
parents: 524
diff changeset
  1189
5891518d17a3 appletalk support - untested
Claus Gittinger <cg@exept.de>
parents: 524
diff changeset
  1190
appletalkAddressOfHost:aHostName
1911
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
  1191
    <resource: #obsolete>
525
5891518d17a3 appletalk support - untested
Claus Gittinger <cg@exept.de>
parents: 524
diff changeset
  1192
    "return the APPLETALK address for a hostname as a byteArray,
819
4cc15700d123 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 817
diff changeset
  1193
     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
  1194
     followed by the node byte.
525
5891518d17a3 appletalk support - untested
Claus Gittinger <cg@exept.de>
parents: 524
diff changeset
  1195
     If the host is unknown, return nil.
812
c8101ea70e6c *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 811
diff changeset
  1196
     This is the reverse operation to #hostWithAppletalkAddress:.
c8101ea70e6c *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 811
diff changeset
  1197
     WARNING: untested code - I have no appletalk to test this."
525
5891518d17a3 appletalk support - untested
Claus Gittinger <cg@exept.de>
parents: 524
diff changeset
  1198
1485
d8578cf3504b gcc3.3.1 insn-scheduler bug workaround
Claus Gittinger <cg@exept.de>
parents: 1474
diff changeset
  1199
    NameLookupError
d8578cf3504b gcc3.3.1 insn-scheduler bug workaround
Claus Gittinger <cg@exept.de>
parents: 1474
diff changeset
  1200
	handle:[:ex |
1343
cc3bed115c0a definitions cleanup with stxOSDefs.h
penk
parents: 1342
diff changeset
  1201
	    ^ nil
cc3bed115c0a definitions cleanup with stxOSDefs.h
penk
parents: 1342
diff changeset
  1202
	]
cc3bed115c0a definitions cleanup with stxOSDefs.h
penk
parents: 1342
diff changeset
  1203
	do:[
cc3bed115c0a definitions cleanup with stxOSDefs.h
penk
parents: 1342
diff changeset
  1204
	    ^ (AppletalkSocketAddress hostName:aHostName) address
cc3bed115c0a definitions cleanup with stxOSDefs.h
penk
parents: 1342
diff changeset
  1205
	]
525
5891518d17a3 appletalk support - untested
Claus Gittinger <cg@exept.de>
parents: 524
diff changeset
  1206
!
5891518d17a3 appletalk support - untested
Claus Gittinger <cg@exept.de>
parents: 524
diff changeset
  1207
1278
7251c65b8d38 use nameLookup from SocketAddress for all addr-families
Claus Gittinger <cg@exept.de>
parents: 1274
diff changeset
  1208
hostWithAppletalkAddress:addrByteArray
1911
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
  1209
    <resource: #obsolete>
525
5891518d17a3 appletalk support - untested
Claus Gittinger <cg@exept.de>
parents: 524
diff changeset
  1210
    "return the hostname for an APPLETALK address.
5891518d17a3 appletalk support - untested
Claus Gittinger <cg@exept.de>
parents: 524
diff changeset
  1211
     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
  1212
     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
  1213
     The last byte is the node number.
5891518d17a3 appletalk support - untested
Claus Gittinger <cg@exept.de>
parents: 524
diff changeset
  1214
     Nil is returned for an unknown host or if its not an appletalk host.
812
c8101ea70e6c *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 811
diff changeset
  1215
     This is is the reverse operation to #appletalkAddressOfHost:.
c8101ea70e6c *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 811
diff changeset
  1216
     WARNING: untested code - I have no appletalk to test this."
525
5891518d17a3 appletalk support - untested
Claus Gittinger <cg@exept.de>
parents: 524
diff changeset
  1217
1485
d8578cf3504b gcc3.3.1 insn-scheduler bug workaround
Claus Gittinger <cg@exept.de>
parents: 1474
diff changeset
  1218
    NameLookupError
d8578cf3504b gcc3.3.1 insn-scheduler bug workaround
Claus Gittinger <cg@exept.de>
parents: 1474
diff changeset
  1219
	handle:[:ex |
1343
cc3bed115c0a definitions cleanup with stxOSDefs.h
penk
parents: 1342
diff changeset
  1220
	    ^ nil
cc3bed115c0a definitions cleanup with stxOSDefs.h
penk
parents: 1342
diff changeset
  1221
	]
cc3bed115c0a definitions cleanup with stxOSDefs.h
penk
parents: 1342
diff changeset
  1222
	do:[
cc3bed115c0a definitions cleanup with stxOSDefs.h
penk
parents: 1342
diff changeset
  1223
	    ^ (AppletalkSocketAddress hostAddress:addrByteArray) hostName
cc3bed115c0a definitions cleanup with stxOSDefs.h
penk
parents: 1342
diff changeset
  1224
	]
1278
7251c65b8d38 use nameLookup from SocketAddress for all addr-families
Claus Gittinger <cg@exept.de>
parents: 1274
diff changeset
  1225
525
5891518d17a3 appletalk support - untested
Claus Gittinger <cg@exept.de>
parents: 524
diff changeset
  1226
    "
1278
7251c65b8d38 use nameLookup from SocketAddress for all addr-families
Claus Gittinger <cg@exept.de>
parents: 1274
diff changeset
  1227
     Socket appletalkAddressOfHost:'yourAppleHere'
1485
d8578cf3504b gcc3.3.1 insn-scheduler bug workaround
Claus Gittinger <cg@exept.de>
parents: 1474
diff changeset
  1228
     Socket hostWithAppletalkAddress:#[1 2 3]
525
5891518d17a3 appletalk support - untested
Claus Gittinger <cg@exept.de>
parents: 524
diff changeset
  1229
     "
126
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
  1230
!
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
  1231
1278
7251c65b8d38 use nameLookup from SocketAddress for all addr-families
Claus Gittinger <cg@exept.de>
parents: 1274
diff changeset
  1232
hostWithIpAddress:addrByteArray
1911
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
  1233
    <resource: #obsolete>
126
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
  1234
    "return the hostname for an IP (internet-) address.
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
  1235
     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
  1236
     the network bytes come first (no matter what the local byteorder is).
525
5891518d17a3 appletalk support - untested
Claus Gittinger <cg@exept.de>
parents: 524
diff changeset
  1237
     Nil is returned for an unknown host or if its not an internet host.
126
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
  1238
     This is the reverse operation to #ipAddressOfHost:."
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
  1239
1485
d8578cf3504b gcc3.3.1 insn-scheduler bug workaround
Claus Gittinger <cg@exept.de>
parents: 1474
diff changeset
  1240
    NameLookupError
d8578cf3504b gcc3.3.1 insn-scheduler bug workaround
Claus Gittinger <cg@exept.de>
parents: 1474
diff changeset
  1241
	handle:[:ex |
1343
cc3bed115c0a definitions cleanup with stxOSDefs.h
penk
parents: 1342
diff changeset
  1242
	    ^ nil
cc3bed115c0a definitions cleanup with stxOSDefs.h
penk
parents: 1342
diff changeset
  1243
	]
cc3bed115c0a definitions cleanup with stxOSDefs.h
penk
parents: 1342
diff changeset
  1244
	do:[
cc3bed115c0a definitions cleanup with stxOSDefs.h
penk
parents: 1342
diff changeset
  1245
	    ^ (IPSocketAddress hostAddress:addrByteArray) hostName
cc3bed115c0a definitions cleanup with stxOSDefs.h
penk
parents: 1342
diff changeset
  1246
	]
126
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
  1247
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
  1248
    "
1485
d8578cf3504b gcc3.3.1 insn-scheduler bug workaround
Claus Gittinger <cg@exept.de>
parents: 1474
diff changeset
  1249
     Socket ipAddressOfHost:'clam'
d8578cf3504b gcc3.3.1 insn-scheduler bug workaround
Claus Gittinger <cg@exept.de>
parents: 1474
diff changeset
  1250
     Socket hostWithIpAddress:(Socket ipAddressOfHost:'clam')
d8578cf3504b gcc3.3.1 insn-scheduler bug workaround
Claus Gittinger <cg@exept.de>
parents: 1474
diff changeset
  1251
     Socket ipAddressOfHost:'porty'
1278
7251c65b8d38 use nameLookup from SocketAddress for all addr-families
Claus Gittinger <cg@exept.de>
parents: 1274
diff changeset
  1252
     Socket hostWithIpAddress:(Socket ipAddressOfHost:'porty')
1485
d8578cf3504b gcc3.3.1 insn-scheduler bug workaround
Claus Gittinger <cg@exept.de>
parents: 1474
diff changeset
  1253
     Socket hostWithIpAddress:#[1 2 3 4]
d8578cf3504b gcc3.3.1 insn-scheduler bug workaround
Claus Gittinger <cg@exept.de>
parents: 1474
diff changeset
  1254
     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
  1255
     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
  1256
     Socket hostWithIpAddress:(Socket ipAddressOfHost:'www.altavista.com')
126
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
  1257
     "
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
  1258
!
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
  1259
1278
7251c65b8d38 use nameLookup from SocketAddress for all addr-families
Claus Gittinger <cg@exept.de>
parents: 1274
diff changeset
  1260
hostWithIpV6Address:addrByteArray
1911
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
  1261
    <resource: #obsolete>
820
b6860c3660c8 Fix address sizes when calling gethostbyaddr
Stefan Vogel <sv@exept.de>
parents: 819
diff changeset
  1262
    "return the hostname for an IPv6 (internet-) address.
b6860c3660c8 Fix address sizes when calling gethostbyaddr
Stefan Vogel <sv@exept.de>
parents: 819
diff changeset
  1263
     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
  1264
     the network bytes come first (no matter what the local byteorder is).
b6860c3660c8 Fix address sizes when calling gethostbyaddr
Stefan Vogel <sv@exept.de>
parents: 819
diff changeset
  1265
     Nil is returned for an unknown host or if its not an internet host.
b6860c3660c8 Fix address sizes when calling gethostbyaddr
Stefan Vogel <sv@exept.de>
parents: 819
diff changeset
  1266
     This is the reverse operation to #ipV6AddressOfHost:."
b6860c3660c8 Fix address sizes when calling gethostbyaddr
Stefan Vogel <sv@exept.de>
parents: 819
diff changeset
  1267
1485
d8578cf3504b gcc3.3.1 insn-scheduler bug workaround
Claus Gittinger <cg@exept.de>
parents: 1474
diff changeset
  1268
    NameLookupError
d8578cf3504b gcc3.3.1 insn-scheduler bug workaround
Claus Gittinger <cg@exept.de>
parents: 1474
diff changeset
  1269
	handle:[:ex |
1343
cc3bed115c0a definitions cleanup with stxOSDefs.h
penk
parents: 1342
diff changeset
  1270
	    ^ nil
cc3bed115c0a definitions cleanup with stxOSDefs.h
penk
parents: 1342
diff changeset
  1271
	]
cc3bed115c0a definitions cleanup with stxOSDefs.h
penk
parents: 1342
diff changeset
  1272
	do:[
cc3bed115c0a definitions cleanup with stxOSDefs.h
penk
parents: 1342
diff changeset
  1273
	    ^ (IPv6SocketAddress hostAddress:addrByteArray) hostName
cc3bed115c0a definitions cleanup with stxOSDefs.h
penk
parents: 1342
diff changeset
  1274
	]
820
b6860c3660c8 Fix address sizes when calling gethostbyaddr
Stefan Vogel <sv@exept.de>
parents: 819
diff changeset
  1275
b6860c3660c8 Fix address sizes when calling gethostbyaddr
Stefan Vogel <sv@exept.de>
parents: 819
diff changeset
  1276
    "
1485
d8578cf3504b gcc3.3.1 insn-scheduler bug workaround
Claus Gittinger <cg@exept.de>
parents: 1474
diff changeset
  1277
     Socket ipV6AddressOfHost:'clam'
d8578cf3504b gcc3.3.1 insn-scheduler bug workaround
Claus Gittinger <cg@exept.de>
parents: 1474
diff changeset
  1278
     Socket hostWithIpV6Address:(Socket ipAddressOfHost:'clam')
d8578cf3504b gcc3.3.1 insn-scheduler bug workaround
Claus Gittinger <cg@exept.de>
parents: 1474
diff changeset
  1279
     Socket ipV6AddressOfHost:'porty'
d8578cf3504b gcc3.3.1 insn-scheduler bug workaround
Claus Gittinger <cg@exept.de>
parents: 1474
diff changeset
  1280
     Socket hostWithIpV6Address:(Socket ipAddressOfHost:'porty')
d8578cf3504b gcc3.3.1 insn-scheduler bug workaround
Claus Gittinger <cg@exept.de>
parents: 1474
diff changeset
  1281
     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
  1282
     Socket ipV6AddressOfHost:'www.exept.de'
820
b6860c3660c8 Fix address sizes when calling gethostbyaddr
Stefan Vogel <sv@exept.de>
parents: 819
diff changeset
  1283
     "
b6860c3660c8 Fix address sizes when calling gethostbyaddr
Stefan Vogel <sv@exept.de>
parents: 819
diff changeset
  1284
!
b6860c3660c8 Fix address sizes when calling gethostbyaddr
Stefan Vogel <sv@exept.de>
parents: 819
diff changeset
  1285
6
claus
parents: 4
diff changeset
  1286
ipAddressOfHost:aHostName
1911
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
  1287
    <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
  1288
    "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
  1289
     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
  1290
     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
  1291
     This is the reverse operation to #hostWithIpAddress:."
6
claus
parents: 4
diff changeset
  1292
1485
d8578cf3504b gcc3.3.1 insn-scheduler bug workaround
Claus Gittinger <cg@exept.de>
parents: 1474
diff changeset
  1293
    NameLookupError
d8578cf3504b gcc3.3.1 insn-scheduler bug workaround
Claus Gittinger <cg@exept.de>
parents: 1474
diff changeset
  1294
	handle:[:ex |
1343
cc3bed115c0a definitions cleanup with stxOSDefs.h
penk
parents: 1342
diff changeset
  1295
	    ^ nil
cc3bed115c0a definitions cleanup with stxOSDefs.h
penk
parents: 1342
diff changeset
  1296
	]
cc3bed115c0a definitions cleanup with stxOSDefs.h
penk
parents: 1342
diff changeset
  1297
	do:[
cc3bed115c0a definitions cleanup with stxOSDefs.h
penk
parents: 1342
diff changeset
  1298
	    ^ (IPSocketAddress hostName:aHostName) address
cc3bed115c0a definitions cleanup with stxOSDefs.h
penk
parents: 1342
diff changeset
  1299
	]
21
33eb5ffad09d *** empty log message ***
claus
parents: 8
diff changeset
  1300
71
claus
parents: 63
diff changeset
  1301
    "
1485
d8578cf3504b gcc3.3.1 insn-scheduler bug workaround
Claus Gittinger <cg@exept.de>
parents: 1474
diff changeset
  1302
     Socket ipAddressOfHost:'localhost'
d8578cf3504b gcc3.3.1 insn-scheduler bug workaround
Claus Gittinger <cg@exept.de>
parents: 1474
diff changeset
  1303
     Socket ipAddressOfHost:'exept'
d8578cf3504b gcc3.3.1 insn-scheduler bug workaround
Claus Gittinger <cg@exept.de>
parents: 1474
diff changeset
  1304
     Socket ipAddressOfHost:'1.2.3.4'
1274
f257a1b16b4d use naemLookup from SocketAddress for ipv6
Claus Gittinger <cg@exept.de>
parents: 1263
diff changeset
  1305
     Socket ipAddressOfHost:'193.15.16.17'
1485
d8578cf3504b gcc3.3.1 insn-scheduler bug workaround
Claus Gittinger <cg@exept.de>
parents: 1474
diff changeset
  1306
     Socket ipAddressOfHost:'josef'
d8578cf3504b gcc3.3.1 insn-scheduler bug workaround
Claus Gittinger <cg@exept.de>
parents: 1474
diff changeset
  1307
     Socket ipAddressOfHost:'styx.com'
d8578cf3504b gcc3.3.1 insn-scheduler bug workaround
Claus Gittinger <cg@exept.de>
parents: 1474
diff changeset
  1308
     Socket hostWithIpAddress:(Socket ipAddressOfHost:'localhost')
d8578cf3504b gcc3.3.1 insn-scheduler bug workaround
Claus Gittinger <cg@exept.de>
parents: 1474
diff changeset
  1309
     Socket ipAddressOfHost:(Socket hostWithIpAddress:'127.0.0.1')
71
claus
parents: 63
diff changeset
  1310
    "
819
4cc15700d123 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 817
diff changeset
  1311
!
4cc15700d123 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 817
diff changeset
  1312
4cc15700d123 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 817
diff changeset
  1313
ipV6AddressOfHost:aHostName
1911
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
  1314
    <resource: #obsolete>
819
4cc15700d123 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 817
diff changeset
  1315
    "return the IPv6 (internet-) number for a hostname as a byteArray,
4cc15700d123 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 817
diff changeset
  1316
     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
  1317
     If the host is unknown, return nil.
4cc15700d123 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 817
diff changeset
  1318
     This is the reverse operation to #hostWithIpV6Address:."
4cc15700d123 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 817
diff changeset
  1319
1485
d8578cf3504b gcc3.3.1 insn-scheduler bug workaround
Claus Gittinger <cg@exept.de>
parents: 1474
diff changeset
  1320
    NameLookupError
d8578cf3504b gcc3.3.1 insn-scheduler bug workaround
Claus Gittinger <cg@exept.de>
parents: 1474
diff changeset
  1321
	handle:[:ex |
1343
cc3bed115c0a definitions cleanup with stxOSDefs.h
penk
parents: 1342
diff changeset
  1322
	    ^ nil
cc3bed115c0a definitions cleanup with stxOSDefs.h
penk
parents: 1342
diff changeset
  1323
	]
cc3bed115c0a definitions cleanup with stxOSDefs.h
penk
parents: 1342
diff changeset
  1324
	do:[
cc3bed115c0a definitions cleanup with stxOSDefs.h
penk
parents: 1342
diff changeset
  1325
	    ^ (IPv6SocketAddress hostName:aHostName) address
cc3bed115c0a definitions cleanup with stxOSDefs.h
penk
parents: 1342
diff changeset
  1326
	]
819
4cc15700d123 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 817
diff changeset
  1327
4cc15700d123 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 817
diff changeset
  1328
    "
1485
d8578cf3504b gcc3.3.1 insn-scheduler bug workaround
Claus Gittinger <cg@exept.de>
parents: 1474
diff changeset
  1329
     Socket ipV6AddressOfHost:'localhost'
d8578cf3504b gcc3.3.1 insn-scheduler bug workaround
Claus Gittinger <cg@exept.de>
parents: 1474
diff changeset
  1330
     Socket ipV6AddressOfHost:'exept'
d8578cf3504b gcc3.3.1 insn-scheduler bug workaround
Claus Gittinger <cg@exept.de>
parents: 1474
diff changeset
  1331
     Socket ipV6AddressOfHost:'exept.exept.de'
d8578cf3504b gcc3.3.1 insn-scheduler bug workaround
Claus Gittinger <cg@exept.de>
parents: 1474
diff changeset
  1332
     Socket ipV6AddressOfHost:'www.google.de'
d8578cf3504b gcc3.3.1 insn-scheduler bug workaround
Claus Gittinger <cg@exept.de>
parents: 1474
diff changeset
  1333
     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
  1334
     Socket ipV6AddressOfHost:'josef'
d8578cf3504b gcc3.3.1 insn-scheduler bug workaround
Claus Gittinger <cg@exept.de>
parents: 1474
diff changeset
  1335
     Socket ipV6AddressOfHost:'styx.com'
d8578cf3504b gcc3.3.1 insn-scheduler bug workaround
Claus Gittinger <cg@exept.de>
parents: 1474
diff changeset
  1336
     Socket hostWithIpV6Address:(Socket ipV6AddressOfHost:'localhost')
d8578cf3504b gcc3.3.1 insn-scheduler bug workaround
Claus Gittinger <cg@exept.de>
parents: 1474
diff changeset
  1337
     Socket ipV6AddressOfHost:(Socket hostV6WithIpAddress:'127.0.0.1')
819
4cc15700d123 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 817
diff changeset
  1338
    "
531
ca4c73813531 category changes
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
  1339
! !
ca4c73813531 category changes
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
  1340
ca4c73813531 category changes
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
  1341
!Socket class methodsFor:'queries'!
ca4c73813531 category changes
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
  1342
1260
9a8fb2391174 instance creation of peer refactored
Claus Gittinger <cg@exept.de>
parents: 1235
diff changeset
  1343
peerFromDomain:domain name:peerName port:port
9a8fb2391174 instance creation of peer refactored
Claus Gittinger <cg@exept.de>
parents: 1235
diff changeset
  1344
    |addrClass|
9a8fb2391174 instance creation of peer refactored
Claus Gittinger <cg@exept.de>
parents: 1235
diff changeset
  1345
9a8fb2391174 instance creation of peer refactored
Claus Gittinger <cg@exept.de>
parents: 1235
diff changeset
  1346
    addrClass := self socketAddressClassForDomain:domain.
1263
23161346a162 no longer callBack into sockets getHostName/getAddress code.
Claus Gittinger <cg@exept.de>
parents: 1260
diff changeset
  1347
    ^ 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
  1348
!
7e5f2f6b177d getHostByAddr - call is now done lazy, when the socket is asked for the peer
Claus Gittinger <cg@exept.de>
parents: 1186
diff changeset
  1349
7e5f2f6b177d getHostByAddr - call is now done lazy, when the socket is asked for the peer
Claus Gittinger <cg@exept.de>
parents: 1186
diff changeset
  1350
peerNameFromDomain:domain peer:peer
1260
9a8fb2391174 instance creation of peer refactored
Claus Gittinger <cg@exept.de>
parents: 1235
diff changeset
  1351
    |addrClass|
9a8fb2391174 instance creation of peer refactored
Claus Gittinger <cg@exept.de>
parents: 1235
diff changeset
  1352
9a8fb2391174 instance creation of peer refactored
Claus Gittinger <cg@exept.de>
parents: 1235
diff changeset
  1353
    addrClass := self socketAddressClassForDomain:domain.
9a8fb2391174 instance creation of peer refactored
Claus Gittinger <cg@exept.de>
parents: 1235
diff changeset
  1354
    ^ 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
  1355
!
7e5f2f6b177d getHostByAddr - call is now done lazy, when the socket is asked for the peer
Claus Gittinger <cg@exept.de>
parents: 1186
diff changeset
  1356
0
1cf8d1747859 Initial revision
claus
parents:
diff changeset
  1357
portOfService:aNameOrNumber
819
4cc15700d123 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 817
diff changeset
  1358
    "returns the port-number for a given IP-service
0
1cf8d1747859 Initial revision
claus
parents:
diff changeset
  1359
     or nil if no such service exists;
1cf8d1747859 Initial revision
claus
parents:
diff changeset
  1360
     - used to convert service names to portNumbers"
1cf8d1747859 Initial revision
claus
parents:
diff changeset
  1361
91
Claus Gittinger <cg@exept.de>
parents: 85
diff changeset
  1362
    ^ self portOfService:aNameOrNumber protocol:nil
Claus Gittinger <cg@exept.de>
parents: 85
diff changeset
  1363
28
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1364
    "
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1365
     Socket portOfService:'finger'
1485
d8578cf3504b gcc3.3.1 insn-scheduler bug workaround
Claus Gittinger <cg@exept.de>
parents: 1474
diff changeset
  1366
     Socket portOfService:'nntp'
d8578cf3504b gcc3.3.1 insn-scheduler bug workaround
Claus Gittinger <cg@exept.de>
parents: 1474
diff changeset
  1367
     Socket portOfService:'echo'
d8578cf3504b gcc3.3.1 insn-scheduler bug workaround
Claus Gittinger <cg@exept.de>
parents: 1474
diff changeset
  1368
     Socket portOfService:'snmp'
28
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1369
    "
0
1cf8d1747859 Initial revision
claus
parents:
diff changeset
  1370
!
1cf8d1747859 Initial revision
claus
parents:
diff changeset
  1371
91
Claus Gittinger <cg@exept.de>
parents: 85
diff changeset
  1372
portOfService:aNameOrNumber protocol:aProtocol
819
4cc15700d123 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 817
diff changeset
  1373
    "returns the port-number for a given IP-service
91
Claus Gittinger <cg@exept.de>
parents: 85
diff changeset
  1374
     or nil if no such service exists;
Claus Gittinger <cg@exept.de>
parents: 85
diff changeset
  1375
     - used to convert service names to portNumbers"
Claus Gittinger <cg@exept.de>
parents: 85
diff changeset
  1376
2909
aacef77a1697 64bit fixes
Claus Gittinger <cg@exept.de>
parents: 2904
diff changeset
  1377
%{ /* UNLIMITEDSTACK(noWIN32) */
418
317e55c6c281 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 403
diff changeset
  1378
#ifndef NO_SOCKET
91
Claus Gittinger <cg@exept.de>
parents: 85
diff changeset
  1379
    struct servent *servent = NULL;
Claus Gittinger <cg@exept.de>
parents: 85
diff changeset
  1380
    char *protocol;
Claus Gittinger <cg@exept.de>
parents: 85
diff changeset
  1381
    int tryBoth = 0;
524
8287da54eccf more empty code for other domains;
Claus Gittinger <cg@exept.de>
parents: 513
diff changeset
  1382
    short portNo;
91
Claus Gittinger <cg@exept.de>
parents: 85
diff changeset
  1383
604
b302a21afece Remove redundant code.
Stefan Vogel <sv@exept.de>
parents: 589
diff changeset
  1384
    if (__isSmallInteger(aNameOrNumber)) {
2340
2dc6e31f0142 handleType
Claus Gittinger <cg@exept.de>
parents: 2331
diff changeset
  1385
	RETURN ( aNameOrNumber );
92
Claus Gittinger <cg@exept.de>
parents: 91
diff changeset
  1386
    }
Claus Gittinger <cg@exept.de>
parents: 91
diff changeset
  1387
2331
b5280e1b3b9f changed:
Stefan Vogel <sv@exept.de>
parents: 2327
diff changeset
  1388
    if (__isStringLike(aProtocol)) {
2340
2dc6e31f0142 handleType
Claus Gittinger <cg@exept.de>
parents: 2331
diff changeset
  1389
	protocol = (char *)__stringVal(aProtocol);
604
b302a21afece Remove redundant code.
Stefan Vogel <sv@exept.de>
parents: 589
diff changeset
  1390
    } else {
2340
2dc6e31f0142 handleType
Claus Gittinger <cg@exept.de>
parents: 2331
diff changeset
  1391
	protocol = "tcp";
2dc6e31f0142 handleType
Claus Gittinger <cg@exept.de>
parents: 2331
diff changeset
  1392
	tryBoth = 1;
91
Claus Gittinger <cg@exept.de>
parents: 85
diff changeset
  1393
    }
524
8287da54eccf more empty code for other domains;
Claus Gittinger <cg@exept.de>
parents: 513
diff changeset
  1394
2331
b5280e1b3b9f changed:
Stefan Vogel <sv@exept.de>
parents: 2327
diff changeset
  1395
    if (__isStringLike(aNameOrNumber)) {
2340
2dc6e31f0142 handleType
Claus Gittinger <cg@exept.de>
parents: 2331
diff changeset
  1396
	servent = getservbyname((char *) __stringVal(aNameOrNumber), protocol);
2dc6e31f0142 handleType
Claus Gittinger <cg@exept.de>
parents: 2331
diff changeset
  1397
	if (servent != NULL) {
2dc6e31f0142 handleType
Claus Gittinger <cg@exept.de>
parents: 2331
diff changeset
  1398
	    RETURN ( __MKSMALLINT(ntohs(servent->s_port)) );
2dc6e31f0142 handleType
Claus Gittinger <cg@exept.de>
parents: 2331
diff changeset
  1399
	}
2dc6e31f0142 handleType
Claus Gittinger <cg@exept.de>
parents: 2331
diff changeset
  1400
	if (tryBoth) {
2dc6e31f0142 handleType
Claus Gittinger <cg@exept.de>
parents: 2331
diff changeset
  1401
	    servent = getservbyname((char *) __stringVal(aNameOrNumber), "udp");
2dc6e31f0142 handleType
Claus Gittinger <cg@exept.de>
parents: 2331
diff changeset
  1402
	    if (servent != NULL) {
2dc6e31f0142 handleType
Claus Gittinger <cg@exept.de>
parents: 2331
diff changeset
  1403
		RETURN ( __MKSMALLINT(ntohs(servent->s_port)) );
2dc6e31f0142 handleType
Claus Gittinger <cg@exept.de>
parents: 2331
diff changeset
  1404
	    }
2dc6e31f0142 handleType
Claus Gittinger <cg@exept.de>
parents: 2331
diff changeset
  1405
	}
2dc6e31f0142 handleType
Claus Gittinger <cg@exept.de>
parents: 2331
diff changeset
  1406
	RETURN ( nil );
91
Claus Gittinger <cg@exept.de>
parents: 85
diff changeset
  1407
    }
418
317e55c6c281 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 403
diff changeset
  1408
#endif
91
Claus Gittinger <cg@exept.de>
parents: 85
diff changeset
  1409
    RETURN ( nil );
Claus Gittinger <cg@exept.de>
parents: 85
diff changeset
  1410
%}
Claus Gittinger <cg@exept.de>
parents: 85
diff changeset
  1411
    "
Claus Gittinger <cg@exept.de>
parents: 85
diff changeset
  1412
     Socket portOfService:'echo' protocol:'udp'
Claus Gittinger <cg@exept.de>
parents: 85
diff changeset
  1413
     Socket portOfService:'echo' protocol:'tcp'
Claus Gittinger <cg@exept.de>
parents: 85
diff changeset
  1414
    "
Claus Gittinger <cg@exept.de>
parents: 85
diff changeset
  1415
!
Claus Gittinger <cg@exept.de>
parents: 85
diff changeset
  1416
0
1cf8d1747859 Initial revision
claus
parents:
diff changeset
  1417
protocolOfService:aNameOrNumber
819
4cc15700d123 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 817
diff changeset
  1418
    "returns the protocol (as string) for a given IP-service
28
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1419
     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
  1420
92005eec5c9d fixed moving-object-when-interrupted-with-scavenge bugs;
Claus Gittinger <cg@exept.de>
parents: 1503
diff changeset
  1421
%{  /* UNLIMITEDSTACK(noWIN32) */
418
317e55c6c281 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 403
diff changeset
  1422
#ifndef NO_SOCKET
0
1cf8d1747859 Initial revision
claus
parents:
diff changeset
  1423
    struct servent *servent = NULL;
524
8287da54eccf more empty code for other domains;
Claus Gittinger <cg@exept.de>
parents: 513
diff changeset
  1424
    short portNo;
0
1cf8d1747859 Initial revision
claus
parents:
diff changeset
  1425
58
bd6753bf0401 *** empty log message ***
claus
parents: 51
diff changeset
  1426
    if (__isSmallInteger(aNameOrNumber)) {
2340
2dc6e31f0142 handleType
Claus Gittinger <cg@exept.de>
parents: 2331
diff changeset
  1427
	portNo = __intVal(aNameOrNumber);
2dc6e31f0142 handleType
Claus Gittinger <cg@exept.de>
parents: 2331
diff changeset
  1428
	servent = getservbyport(htons(portNo), "tcp") ;
2dc6e31f0142 handleType
Claus Gittinger <cg@exept.de>
parents: 2331
diff changeset
  1429
	if (servent == NULL) {
2dc6e31f0142 handleType
Claus Gittinger <cg@exept.de>
parents: 2331
diff changeset
  1430
	    servent = getservbyport(htons(portNo), "udp") ;
2dc6e31f0142 handleType
Claus Gittinger <cg@exept.de>
parents: 2331
diff changeset
  1431
	    if (servent == NULL) {
2dc6e31f0142 handleType
Claus Gittinger <cg@exept.de>
parents: 2331
diff changeset
  1432
		RETURN ( nil );
2dc6e31f0142 handleType
Claus Gittinger <cg@exept.de>
parents: 2331
diff changeset
  1433
	    }
2dc6e31f0142 handleType
Claus Gittinger <cg@exept.de>
parents: 2331
diff changeset
  1434
	}
0
1cf8d1747859 Initial revision
claus
parents:
diff changeset
  1435
    } else {
2340
2dc6e31f0142 handleType
Claus Gittinger <cg@exept.de>
parents: 2331
diff changeset
  1436
	if (__isStringLike(aNameOrNumber)) {
2dc6e31f0142 handleType
Claus Gittinger <cg@exept.de>
parents: 2331
diff changeset
  1437
	    servent = getservbyname((char *) __stringVal(aNameOrNumber), "tcp");
2dc6e31f0142 handleType
Claus Gittinger <cg@exept.de>
parents: 2331
diff changeset
  1438
	    if (servent == NULL) {
2dc6e31f0142 handleType
Claus Gittinger <cg@exept.de>
parents: 2331
diff changeset
  1439
		servent = getservbyname((char *) __stringVal(aNameOrNumber), "udp");
2dc6e31f0142 handleType
Claus Gittinger <cg@exept.de>
parents: 2331
diff changeset
  1440
		if (servent == NULL) {
2dc6e31f0142 handleType
Claus Gittinger <cg@exept.de>
parents: 2331
diff changeset
  1441
		    RETURN ( nil );
2dc6e31f0142 handleType
Claus Gittinger <cg@exept.de>
parents: 2331
diff changeset
  1442
		}
2dc6e31f0142 handleType
Claus Gittinger <cg@exept.de>
parents: 2331
diff changeset
  1443
	    }
2dc6e31f0142 handleType
Claus Gittinger <cg@exept.de>
parents: 2331
diff changeset
  1444
	}
0
1cf8d1747859 Initial revision
claus
parents:
diff changeset
  1445
    }
1cf8d1747859 Initial revision
claus
parents:
diff changeset
  1446
    if (servent) {
2340
2dc6e31f0142 handleType
Claus Gittinger <cg@exept.de>
parents: 2331
diff changeset
  1447
	RETURN ( __MKSTRING(servent->s_proto) );
0
1cf8d1747859 Initial revision
claus
parents:
diff changeset
  1448
    }
1504
92005eec5c9d fixed moving-object-when-interrupted-with-scavenge bugs;
Claus Gittinger <cg@exept.de>
parents: 1503
diff changeset
  1449
#endif /* !NO_SOCKET */
0
1cf8d1747859 Initial revision
claus
parents:
diff changeset
  1450
    RETURN ( nil );
1cf8d1747859 Initial revision
claus
parents:
diff changeset
  1451
%}
28
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1452
    "
1485
d8578cf3504b gcc3.3.1 insn-scheduler bug workaround
Claus Gittinger <cg@exept.de>
parents: 1474
diff changeset
  1453
     Socket protocolOfService:'finger'
d8578cf3504b gcc3.3.1 insn-scheduler bug workaround
Claus Gittinger <cg@exept.de>
parents: 1474
diff changeset
  1454
     Socket protocolOfService:'nntp'
28
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1455
     Socket protocolOfService:'xxx'
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1456
     Socket protocolOfService:79
1485
d8578cf3504b gcc3.3.1 insn-scheduler bug workaround
Claus Gittinger <cg@exept.de>
parents: 1474
diff changeset
  1457
     Socket protocolOfService:'snmp'
28
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1458
    "
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1459
!
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1460
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
  1461
socketAddressClassForDomain:domain
1230
2cfb8c270cb5 more functionality moved to SocketAccessor
Claus Gittinger <cg@exept.de>
parents: 1224
diff changeset
  1462
    ^ SocketAddress knownClassFromCode:domain
2cfb8c270cb5 more functionality moved to SocketAccessor
Claus Gittinger <cg@exept.de>
parents: 1224
diff changeset
  1463
2cfb8c270cb5 more functionality moved to SocketAccessor
Claus Gittinger <cg@exept.de>
parents: 1224
diff changeset
  1464
    "
3059
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  1465
     self socketAddressClassForDomain:#AF_INET
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  1466
     self socketAddressClassForDomain:#AF_UNIX
1230
2cfb8c270cb5 more functionality moved to SocketAccessor
Claus Gittinger <cg@exept.de>
parents: 1224
diff changeset
  1467
    "
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
  1468
!
7e5f2f6b177d getHostByAddr - call is now done lazy, when the socket is asked for the peer
Claus Gittinger <cg@exept.de>
parents: 1186
diff changeset
  1469
532
f997c3873602 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 531
diff changeset
  1470
supportedProtocolFamilies
f997c3873602 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 531
diff changeset
  1471
    "return a collection of supported protocol families.
f997c3873602 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 531
diff changeset
  1472
     This list specifies what the Socket class supports -
f997c3873602 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 531
diff changeset
  1473
     socket creation may still fail, if your system was built
f997c3873602 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 531
diff changeset
  1474
     without it."
f997c3873602 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 531
diff changeset
  1475
1280
b973855bfe74 moved all socket constant queries from SocketHandle
Claus Gittinger <cg@exept.de>
parents: 1278
diff changeset
  1476
    ^ OperatingSystem supportedProtocolFamilies
532
f997c3873602 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 531
diff changeset
  1477
f997c3873602 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 531
diff changeset
  1478
    "
f997c3873602 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 531
diff changeset
  1479
     Socket supportedProtocolFamilies
f997c3873602 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 531
diff changeset
  1480
    "
559
61012867ebed cleanup if #connect is interrupted
Claus Gittinger <cg@exept.de>
parents: 551
diff changeset
  1481
!
61012867ebed cleanup if #connect is interrupted
Claus Gittinger <cg@exept.de>
parents: 551
diff changeset
  1482
61012867ebed cleanup if #connect is interrupted
Claus Gittinger <cg@exept.de>
parents: 551
diff changeset
  1483
typeOfProtocol:aProtocol
61012867ebed cleanup if #connect is interrupted
Claus Gittinger <cg@exept.de>
parents: 551
diff changeset
  1484
    "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
  1485
     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
  1486
61012867ebed cleanup if #connect is interrupted
Claus Gittinger <cg@exept.de>
parents: 551
diff changeset
  1487
    (aProtocol = 'tcp') ifTrue:[^ #stream].
61012867ebed cleanup if #connect is interrupted
Claus Gittinger <cg@exept.de>
parents: 551
diff changeset
  1488
    (aProtocol = 'udp') ifTrue:[^ #datagram].
61012867ebed cleanup if #connect is interrupted
Claus Gittinger <cg@exept.de>
parents: 551
diff changeset
  1489
    (aProtocol = 'ip')  ifTrue:[^ #raw].
61012867ebed cleanup if #connect is interrupted
Claus Gittinger <cg@exept.de>
parents: 551
diff changeset
  1490
    "
61012867ebed cleanup if #connect is interrupted
Claus Gittinger <cg@exept.de>
parents: 551
diff changeset
  1491
     unix domain
61012867ebed cleanup if #connect is interrupted
Claus Gittinger <cg@exept.de>
parents: 551
diff changeset
  1492
    "
61012867ebed cleanup if #connect is interrupted
Claus Gittinger <cg@exept.de>
parents: 551
diff changeset
  1493
    (aProtocol = 'ud')  ifTrue:[^ #stream].
61012867ebed cleanup if #connect is interrupted
Claus Gittinger <cg@exept.de>
parents: 551
diff changeset
  1494
    "
61012867ebed cleanup if #connect is interrupted
Claus Gittinger <cg@exept.de>
parents: 551
diff changeset
  1495
     add x25 stuff (if any) here ...
61012867ebed cleanup if #connect is interrupted
Claus Gittinger <cg@exept.de>
parents: 551
diff changeset
  1496
    "
61012867ebed cleanup if #connect is interrupted
Claus Gittinger <cg@exept.de>
parents: 551
diff changeset
  1497
    "
61012867ebed cleanup if #connect is interrupted
Claus Gittinger <cg@exept.de>
parents: 551
diff changeset
  1498
     add appletalk stuff (if any) here ...
61012867ebed cleanup if #connect is interrupted
Claus Gittinger <cg@exept.de>
parents: 551
diff changeset
  1499
    "
61012867ebed cleanup if #connect is interrupted
Claus Gittinger <cg@exept.de>
parents: 551
diff changeset
  1500
    "
61012867ebed cleanup if #connect is interrupted
Claus Gittinger <cg@exept.de>
parents: 551
diff changeset
  1501
     add other stuff (if any) here ...
61012867ebed cleanup if #connect is interrupted
Claus Gittinger <cg@exept.de>
parents: 551
diff changeset
  1502
    "
61012867ebed cleanup if #connect is interrupted
Claus Gittinger <cg@exept.de>
parents: 551
diff changeset
  1503
    ^ nil
61012867ebed cleanup if #connect is interrupted
Claus Gittinger <cg@exept.de>
parents: 551
diff changeset
  1504
61012867ebed cleanup if #connect is interrupted
Claus Gittinger <cg@exept.de>
parents: 551
diff changeset
  1505
    "
61012867ebed cleanup if #connect is interrupted
Claus Gittinger <cg@exept.de>
parents: 551
diff changeset
  1506
     Socket typeOfProtocol:'tcp'
61012867ebed cleanup if #connect is interrupted
Claus Gittinger <cg@exept.de>
parents: 551
diff changeset
  1507
     Socket typeOfProtocol:'ucp'
61012867ebed cleanup if #connect is interrupted
Claus Gittinger <cg@exept.de>
parents: 551
diff changeset
  1508
     Socket typeOfProtocol:(Socket protocolOfService:'nntp')
61012867ebed cleanup if #connect is interrupted
Claus Gittinger <cg@exept.de>
parents: 551
diff changeset
  1509
     Socket typeOfProtocol:(Socket protocolOfService:'echo')
61012867ebed cleanup if #connect is interrupted
Claus Gittinger <cg@exept.de>
parents: 551
diff changeset
  1510
    "
28
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1511
! !
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1512
1202
c52279df60d8 method category rename
Claus Gittinger <cg@exept.de>
parents: 1187
diff changeset
  1513
!Socket methodsFor:'Compatibility-Dolphin'!
1110
0876a3d30fd2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1035
diff changeset
  1514
0876a3d30fd2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1035
diff changeset
  1515
setReceiveTimeout: milliseconds
0876a3d30fd2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1035
diff changeset
  1516
    self receiveTimeout:(milliseconds / 1000)
0876a3d30fd2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1035
diff changeset
  1517
!
0876a3d30fd2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1035
diff changeset
  1518
0876a3d30fd2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1035
diff changeset
  1519
setSendTimeout: milliseconds
0876a3d30fd2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1035
diff changeset
  1520
    self sendTimeout:(milliseconds / 1000)
0876a3d30fd2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1035
diff changeset
  1521
! !
0876a3d30fd2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1035
diff changeset
  1522
1202
c52279df60d8 method category rename
Claus Gittinger <cg@exept.de>
parents: 1187
diff changeset
  1523
!Socket methodsFor:'Compatibility-ST80'!
28
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1524
887
2b2dc6b59b5a more VW compatibility
Claus Gittinger <cg@exept.de>
parents: 876
diff changeset
  1525
acceptNonBlock
2b2dc6b59b5a more VW compatibility
Claus Gittinger <cg@exept.de>
parents: 876
diff changeset
  1526
    ^ self accept
2b2dc6b59b5a more VW compatibility
Claus Gittinger <cg@exept.de>
parents: 876
diff changeset
  1527
!
2b2dc6b59b5a more VW compatibility
Claus Gittinger <cg@exept.de>
parents: 876
diff changeset
  1528
126
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
  1529
errorReporter
781
4d61e7588ff3 added #waitForNewConnectionOrDataOnAny:timeout:
Claus Gittinger <cg@exept.de>
parents: 776
diff changeset
  1530
    "ST-80 mimicry."
4d61e7588ff3 added #waitForNewConnectionOrDataOnAny:timeout:
Claus Gittinger <cg@exept.de>
parents: 776
diff changeset
  1531
1535
f6aa0fc8c3cc getSocketAddress
Claus Gittinger <cg@exept.de>
parents: 1533
diff changeset
  1532
    ^ self class
28
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1533
!
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1534
1485
d8578cf3504b gcc3.3.1 insn-scheduler bug workaround
Claus Gittinger <cg@exept.de>
parents: 1474
diff changeset
  1535
ioConnection
887
2b2dc6b59b5a more VW compatibility
Claus Gittinger <cg@exept.de>
parents: 876
diff changeset
  1536
    ^ self
2b2dc6b59b5a more VW compatibility
Claus Gittinger <cg@exept.de>
parents: 876
diff changeset
  1537
!
2b2dc6b59b5a more VW compatibility
Claus Gittinger <cg@exept.de>
parents: 876
diff changeset
  1538
126
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
  1539
notReadySignal
781
4d61e7588ff3 added #waitForNewConnectionOrDataOnAny:timeout:
Claus Gittinger <cg@exept.de>
parents: 776
diff changeset
  1540
    "ST-80 mimicry.
4d61e7588ff3 added #waitForNewConnectionOrDataOnAny:timeout:
Claus Gittinger <cg@exept.de>
parents: 776
diff changeset
  1541
     for now - this is not yet raised"
71
claus
parents: 63
diff changeset
  1542
126
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
  1543
    ^ Signal new
486
ed4e215e83ef ST-80 mimicry
Claus Gittinger <cg@exept.de>
parents: 470
diff changeset
  1544
!
ed4e215e83ef ST-80 mimicry
Claus Gittinger <cg@exept.de>
parents: 470
diff changeset
  1545
576
13acab81fad0 more ST80 compatibility
ca
parents: 572
diff changeset
  1546
readAppendStream
781
4d61e7588ff3 added #waitForNewConnectionOrDataOnAny:timeout:
Claus Gittinger <cg@exept.de>
parents: 776
diff changeset
  1547
    "ST-80 mimicry.
4d61e7588ff3 added #waitForNewConnectionOrDataOnAny:timeout:
Claus Gittinger <cg@exept.de>
parents: 776
diff changeset
  1548
     In ST-80, socket is not a stream, but referes to one.
4d61e7588ff3 added #waitForNewConnectionOrDataOnAny:timeout:
Claus Gittinger <cg@exept.de>
parents: 776
diff changeset
  1549
     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
  1550
     the actual stream.
781
4d61e7588ff3 added #waitForNewConnectionOrDataOnAny:timeout:
Claus Gittinger <cg@exept.de>
parents: 776
diff changeset
  1551
     In ST/X, sockets inherit from stream, so
4d61e7588ff3 added #waitForNewConnectionOrDataOnAny:timeout:
Claus Gittinger <cg@exept.de>
parents: 776
diff changeset
  1552
     this method returns the receiver, for transparency"
4d61e7588ff3 added #waitForNewConnectionOrDataOnAny:timeout:
Claus Gittinger <cg@exept.de>
parents: 776
diff changeset
  1553
576
13acab81fad0 more ST80 compatibility
ca
parents: 572
diff changeset
  1554
    ^ self
13acab81fad0 more ST80 compatibility
ca
parents: 572
diff changeset
  1555
!
13acab81fad0 more ST80 compatibility
ca
parents: 572
diff changeset
  1556
486
ed4e215e83ef ST-80 mimicry
Claus Gittinger <cg@exept.de>
parents: 470
diff changeset
  1557
readStream
ed4e215e83ef ST-80 mimicry
Claus Gittinger <cg@exept.de>
parents: 470
diff changeset
  1558
    "ST-80 mimicry.
ed4e215e83ef ST-80 mimicry
Claus Gittinger <cg@exept.de>
parents: 470
diff changeset
  1559
     In ST-80, socket is not a stream, but referes to one.
ed4e215e83ef ST-80 mimicry
Claus Gittinger <cg@exept.de>
parents: 470
diff changeset
  1560
     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
  1561
     the actual stream.
781
4d61e7588ff3 added #waitForNewConnectionOrDataOnAny:timeout:
Claus Gittinger <cg@exept.de>
parents: 776
diff changeset
  1562
     In ST/X, sockets inherit from stream, so
4d61e7588ff3 added #waitForNewConnectionOrDataOnAny:timeout:
Claus Gittinger <cg@exept.de>
parents: 776
diff changeset
  1563
     this method returns the receiver, for transparency"
486
ed4e215e83ef ST-80 mimicry
Claus Gittinger <cg@exept.de>
parents: 470
diff changeset
  1564
ed4e215e83ef ST-80 mimicry
Claus Gittinger <cg@exept.de>
parents: 470
diff changeset
  1565
    ^ self
ed4e215e83ef ST-80 mimicry
Claus Gittinger <cg@exept.de>
parents: 470
diff changeset
  1566
ed4e215e83ef ST-80 mimicry
Claus Gittinger <cg@exept.de>
parents: 470
diff changeset
  1567
    "Created: 24.1.1997 / 23:52:57 / cg"
ed4e215e83ef ST-80 mimicry
Claus Gittinger <cg@exept.de>
parents: 470
diff changeset
  1568
!
ed4e215e83ef ST-80 mimicry
Claus Gittinger <cg@exept.de>
parents: 470
diff changeset
  1569
ed4e215e83ef ST-80 mimicry
Claus Gittinger <cg@exept.de>
parents: 470
diff changeset
  1570
writeStream
ed4e215e83ef ST-80 mimicry
Claus Gittinger <cg@exept.de>
parents: 470
diff changeset
  1571
    "ST-80 mimicry.
ed4e215e83ef ST-80 mimicry
Claus Gittinger <cg@exept.de>
parents: 470
diff changeset
  1572
     In ST-80, socket is not a stream, but referes to one.
ed4e215e83ef ST-80 mimicry
Claus Gittinger <cg@exept.de>
parents: 470
diff changeset
  1573
     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
  1574
     the actual stream.
781
4d61e7588ff3 added #waitForNewConnectionOrDataOnAny:timeout:
Claus Gittinger <cg@exept.de>
parents: 776
diff changeset
  1575
     In ST/X, sockets inherit from stream, so
4d61e7588ff3 added #waitForNewConnectionOrDataOnAny:timeout:
Claus Gittinger <cg@exept.de>
parents: 776
diff changeset
  1576
     this method returns the receiver, for transparency"
486
ed4e215e83ef ST-80 mimicry
Claus Gittinger <cg@exept.de>
parents: 470
diff changeset
  1577
ed4e215e83ef ST-80 mimicry
Claus Gittinger <cg@exept.de>
parents: 470
diff changeset
  1578
    ^ self
ed4e215e83ef ST-80 mimicry
Claus Gittinger <cg@exept.de>
parents: 470
diff changeset
  1579
ed4e215e83ef ST-80 mimicry
Claus Gittinger <cg@exept.de>
parents: 470
diff changeset
  1580
    "Created: 24.1.1997 / 10:34:35 / cg"
ed4e215e83ef ST-80 mimicry
Claus Gittinger <cg@exept.de>
parents: 470
diff changeset
  1581
    "Modified: 24.1.1997 / 23:52:52 / cg"
71
claus
parents: 63
diff changeset
  1582
! !
claus
parents: 63
diff changeset
  1583
1202
c52279df60d8 method category rename
Claus Gittinger <cg@exept.de>
parents: 1187
diff changeset
  1584
!Socket methodsFor:'Compatibility-Squeak'!
771
74abb04ef57c checkin from browser
Claus Gittinger <cg@exept.de>
parents: 752
diff changeset
  1585
1462
5602fce52b42 squeak stuff
Claus Gittinger <cg@exept.de>
parents: 1413
diff changeset
  1586
address
5602fce52b42 squeak stuff
Claus Gittinger <cg@exept.de>
parents: 1413
diff changeset
  1587
    ^ self getSocketAddress
5602fce52b42 squeak stuff
Claus Gittinger <cg@exept.de>
parents: 1413
diff changeset
  1588
!
5602fce52b42 squeak stuff
Claus Gittinger <cg@exept.de>
parents: 1413
diff changeset
  1589
2308
d8b410a4f38b added: #connectToHostNamed:port:
Claus Gittinger <cg@exept.de>
parents: 2292
diff changeset
  1590
connectToHostNamed:hostName port:portNr
d8b410a4f38b added: #connectToHostNamed:port:
Claus Gittinger <cg@exept.de>
parents: 2292
diff changeset
  1591
    self connectTo:hostName port:portNr
d8b410a4f38b added: #connectToHostNamed:port:
Claus Gittinger <cg@exept.de>
parents: 2292
diff changeset
  1592
!
d8b410a4f38b added: #connectToHostNamed:port:
Claus Gittinger <cg@exept.de>
parents: 2292
diff changeset
  1593
1462
5602fce52b42 squeak stuff
Claus Gittinger <cg@exept.de>
parents: 1413
diff changeset
  1594
dataAvailable
5602fce52b42 squeak stuff
Claus Gittinger <cg@exept.de>
parents: 1413
diff changeset
  1595
    ^ self canReadWithoutBlocking
5602fce52b42 squeak stuff
Claus Gittinger <cg@exept.de>
parents: 1413
diff changeset
  1596
!
5602fce52b42 squeak stuff
Claus Gittinger <cg@exept.de>
parents: 1413
diff changeset
  1597
1886
e0d23764c809 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1885
diff changeset
  1598
destroy
e0d23764c809 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1885
diff changeset
  1599
    self close
e0d23764c809 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1885
diff changeset
  1600
e0d23764c809 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1885
diff changeset
  1601
    "Created: / 04-06-2007 / 21:29:03 / cg"
e0d23764c809 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1885
diff changeset
  1602
!
e0d23764c809 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1885
diff changeset
  1603
1462
5602fce52b42 squeak stuff
Claus Gittinger <cg@exept.de>
parents: 1413
diff changeset
  1604
listenOn:aPortNr
1882
6f818f33c85a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1863
diff changeset
  1605
    self listenOn:aPortNr backlogSize:5
6f818f33c85a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1863
diff changeset
  1606
6f818f33c85a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1863
diff changeset
  1607
    "Modified: / 31-05-2007 / 17:59:53 / cg"
6f818f33c85a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1863
diff changeset
  1608
!
6f818f33c85a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1863
diff changeset
  1609
6f818f33c85a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1863
diff changeset
  1610
listenOn:aPortNr backlogSize:aNumber
1462
5602fce52b42 squeak stuff
Claus Gittinger <cg@exept.de>
parents: 1413
diff changeset
  1611
    self bindTo:aPortNr address:nil.
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  1612
    self listenFor:aNumber
1882
6f818f33c85a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1863
diff changeset
  1613
6f818f33c85a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1863
diff changeset
  1614
    "Created: / 31-05-2007 / 17:59:47 / cg"
1462
5602fce52b42 squeak stuff
Claus Gittinger <cg@exept.de>
parents: 1413
diff changeset
  1615
!
5602fce52b42 squeak stuff
Claus Gittinger <cg@exept.de>
parents: 1413
diff changeset
  1616
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  1617
peerName
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  1618
    "return my peer (i.e. ipAddr + port);
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  1619
     May return nil if not yet setup completely."
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  1620
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  1621
    ^ self getPeer
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  1622
!
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  1623
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  1624
primSocketLocalPort:aSocket
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  1625
    ^ self port
1600
f3acd5382fa1 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1584
diff changeset
  1626
!
f3acd5382fa1 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1584
diff changeset
  1627
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  1628
sendData: aStringOrByteArray
3155
d1884a37375c Initialize in instance initialize method insted in #new
Stefan Vogel <sv@exept.de>
parents: 3152
diff changeset
  1629
    "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
  1630
     Return the number of bytes sent."
d1884a37375c Initialize in instance initialize method insted in #new
Stefan Vogel <sv@exept.de>
parents: 3152
diff changeset
  1631
d1884a37375c Initialize in instance initialize method insted in #new
Stefan Vogel <sv@exept.de>
parents: 3152
diff changeset
  1632
    ^ self nextPutBytes:aStringOrByteArray size from:aStringOrByteArray startingAt:1.
1600
f3acd5382fa1 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1584
diff changeset
  1633
!
f3acd5382fa1 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1584
diff changeset
  1634
1462
5602fce52b42 squeak stuff
Claus Gittinger <cg@exept.de>
parents: 1413
diff changeset
  1635
setOption: optionName value: optionValue
2899
a1f9a142d49b class: Socket
Claus Gittinger <cg@exept.de>
parents: 2891
diff changeset
  1636
    ^ self setSocketOption:(optionName asSymbol) argument:optionValue argument:nil
1887
f26d9b04244d changed #setOption:value:
Claus Gittinger <cg@exept.de>
parents: 1886
diff changeset
  1637
f26d9b04244d changed #setOption:value:
Claus Gittinger <cg@exept.de>
parents: 1886
diff changeset
  1638
    "Modified: / 04-06-2007 / 21:23:19 / cg"
1600
f3acd5382fa1 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1584
diff changeset
  1639
!
f3acd5382fa1 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1584
diff changeset
  1640
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  1641
socketHandle
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  1642
    ^ self
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  1643
!
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  1644
2904
d2e1eead2bfb class: Socket
Claus Gittinger <cg@exept.de>
parents: 2900
diff changeset
  1645
waitForConnectionUntil:aTimestamp
d2e1eead2bfb class: Socket
Claus Gittinger <cg@exept.de>
parents: 2900
diff changeset
  1646
    "return true if connected"
d2e1eead2bfb class: Socket
Claus Gittinger <cg@exept.de>
parents: 2900
diff changeset
  1647
d2e1eead2bfb class: Socket
Claus Gittinger <cg@exept.de>
parents: 2900
diff changeset
  1648
    self readWaitWithTimeoutMs: (aTimestamp millisecondDeltaFrom:Timestamp now).
d2e1eead2bfb class: Socket
Claus Gittinger <cg@exept.de>
parents: 2900
diff changeset
  1649
    ^ self isConnected
1886
e0d23764c809 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1885
diff changeset
  1650
!
e0d23764c809 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1885
diff changeset
  1651
e0d23764c809 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1885
diff changeset
  1652
waitForData
e0d23764c809 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1885
diff changeset
  1653
    self readWait
e0d23764c809 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1885
diff changeset
  1654
e0d23764c809 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1885
diff changeset
  1655
    "Created: / 04-06-2007 / 21:28:40 / cg"
771
74abb04ef57c checkin from browser
Claus Gittinger <cg@exept.de>
parents: 752
diff changeset
  1656
! !
74abb04ef57c checkin from browser
Claus Gittinger <cg@exept.de>
parents: 752
diff changeset
  1657
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  1658
!Socket methodsFor:'accepting connections'!
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  1659
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  1660
accept
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  1661
    "create a new TCP socket from accepting on the receiver.
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  1662
     This method will suspend the current process if no connection is waiting.
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  1663
     For ST-80 compatibility"
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  1664
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  1665
    |newSock|
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  1666
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  1667
    self readWait.
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  1668
    newSock := self class new.
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  1669
    (newSock primAcceptOn:self blocking:false) ifFalse:[
2321
6f4cc7b644db filePointer -> handle migration
Claus Gittinger <cg@exept.de>
parents: 2308
diff changeset
  1670
	"should raise an error here"
6f4cc7b644db filePointer -> handle migration
Claus Gittinger <cg@exept.de>
parents: 2308
diff changeset
  1671
	^ nil
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  1672
    ].
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  1673
    ^ newSock
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  1674
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  1675
    "
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  1676
     |sock newSock|
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  1677
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  1678
     sock := Socket provide:8004.
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  1679
     sock listenFor:5.
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  1680
     newSock := sock accept.
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  1681
    "
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  1682
!
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  1683
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  1684
blockingAccept
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  1685
    "create a new TCP socket from accepting on the receiver.
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  1686
     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
  1687
     For ST-80 compatibility"
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  1688
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  1689
    |newSock|
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  1690
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  1691
    newSock := self class new.
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  1692
    (newSock primAcceptOn:self blocking:true) ifFalse:[
2321
6f4cc7b644db filePointer -> handle migration
Claus Gittinger <cg@exept.de>
parents: 2308
diff changeset
  1693
	"should raise an error here"
6f4cc7b644db filePointer -> handle migration
Claus Gittinger <cg@exept.de>
parents: 2308
diff changeset
  1694
	^ nil
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  1695
    ].
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  1696
    ^ newSock
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  1697
! !
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  1698
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  1699
!Socket methodsFor:'binding'!
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  1700
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  1701
bindAnonymously
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  1702
    "bind to any address. A free port will be allocated.
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  1703
     Our own socket address will be determined after conection set up.
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  1704
     This is the default after the socket has been created"
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  1705
3059
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  1706
    ^ self bindTo:nil reuseAddress:false
2321
6f4cc7b644db filePointer -> handle migration
Claus Gittinger <cg@exept.de>
parents: 2308
diff changeset
  1707
6f4cc7b644db filePointer -> handle migration
Claus Gittinger <cg@exept.de>
parents: 2308
diff changeset
  1708
    "
1938
831af28cc848 comments
Stefan Vogel <sv@exept.de>
parents: 1935
diff changeset
  1709
      self newTCP bindAnonymously; listenFor:1; yourself
831af28cc848 comments
Stefan Vogel <sv@exept.de>
parents: 1935
diff changeset
  1710
    "
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  1711
!
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  1712
3059
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  1713
bindAnonymouslyToAddress:aSocketAddress
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  1714
    "bind to address addressString.
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  1715
     A free port will be allocated"
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  1716
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  1717
    ^ self
3217
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  1718
	bindTo:0
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  1719
	address:aSocketAddress
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  1720
	reuseAddress:false
2321
6f4cc7b644db filePointer -> handle migration
Claus Gittinger <cg@exept.de>
parents: 2308
diff changeset
  1721
6f4cc7b644db filePointer -> handle migration
Claus Gittinger <cg@exept.de>
parents: 2308
diff changeset
  1722
    "
3059
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  1723
      self newTCP bindAnonymouslyToAddress:IPSocketAddress localHost; listenFor:1; yourself
1938
831af28cc848 comments
Stefan Vogel <sv@exept.de>
parents: 1935
diff changeset
  1724
    "
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  1725
!
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  1726
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  1727
bindTo:aSocketAddress
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  1728
    "ST80 compatible bind, expecting a socketAddress argument.
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  1729
     The socketAddress object (an instance of SocketAddress)
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  1730
     is supposed to respond to #portOrName and #address requests."
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  1731
3059
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  1732
    ^ self bindTo:aSocketAddress reuseAddress:true
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  1733
!
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  1734
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  1735
bindTo:portNrOrNameString address:addressString
3059
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  1736
    "Old interface: bind the socket to an address
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  1737
     - returns true if ok, false otherwise.
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  1738
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  1739
     The interpretation of hostOrPathNameOrSocketAddrOrNil portNrOrName depends on the domain:
3217
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  1740
	Best use a SocketAddress
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  1741
	For backward compatibility:
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  1742
	    AF_INET domain can also use (4byte) byteArray like internet numbers,
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  1743
	    AF_UNIX domain cab use pathname strings."
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  1744
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  1745
    ^ self
3217
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  1746
	bindTo:portNrOrNameString
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  1747
	address:addressString
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  1748
	reuseAddress:true
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  1749
!
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  1750
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  1751
bindTo:portNrOrNameOrNil address:hostOrPathNameOrSocketAddrOrNil reuseAddress:reuse
3059
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  1752
    "Old interface: bind the socket to an address
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  1753
     - returns true if ok, false otherwise.
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  1754
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  1755
     The interpretation of hostOrPathNameOrSocketAddrOrNil portNrOrName depends on the domain:
3217
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  1756
	Best use a SocketAddress
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  1757
	For backward compatibility:
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  1758
	    AF_INET domain can also use (4byte) byteArray like internet numbers,
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  1759
	    AF_UNIX domain can use pathname strings.
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  1760
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  1761
     The reuse boolean argument controls if the SO_REUSEADDR socket option
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  1762
     is to be set (to avoid the 'bind: address in use' error).
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  1763
    "
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  1764
3059
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  1765
    |socketAddress|
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  1766
2321
6f4cc7b644db filePointer -> handle migration
Claus Gittinger <cg@exept.de>
parents: 2308
diff changeset
  1767
    handle isNil ifTrue:[
3217
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  1768
	^ self errorNotOpen
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  1769
    ].
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
    hostOrPathNameOrSocketAddrOrNil isNil ifTrue:[
3217
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  1772
	socketAddress := self socketAddressClass anyHost.
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  1773
    ] ifFalse:[
3217
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  1774
	(hostOrPathNameOrSocketAddrOrNil isSocketAddress) ifTrue:[
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  1775
	    socketAddress := hostOrPathNameOrSocketAddrOrNil.
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  1776
	] ifFalse:[
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  1777
	    "backward compatibility: support for byteArray and string arg"
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  1778
	    hostOrPathNameOrSocketAddrOrNil isString ifTrue:[
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  1779
		socketAddress := self socketAddressClass hostName:hostOrPathNameOrSocketAddrOrNil.
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  1780
	    ] ifFalse:[
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  1781
		hostOrPathNameOrSocketAddrOrNil isByteCollection ifFalse:[
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  1782
		    ^ self error:'bindTo: bad host (socketAddress) argument'
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  1783
		].
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  1784
		socketAddress := self socketAddressClass hostAddress:hostOrPathNameOrSocketAddrOrNil.
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  1785
	    ].
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  1786
	].
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  1787
    ].
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  1788
    portNrOrNameOrNil notNil ifTrue:[
3217
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  1789
	socketAddress port:portNrOrNameOrNil.
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  1790
    ].
3059
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  1791
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  1792
    ^ self bindTo:socketAddress reuseAddress:reuse.
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  1793
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  1794
    "
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  1795
     (Socket domain:#'AF_INET' type:#stream)
3217
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  1796
	 bindTo:2144 address:nil; yourself
3059
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  1797
    "
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  1798
!
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  1799
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  1800
bindTo:aSocketAddress reuseAddress:reuse
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  1801
    "Bind the socket to aSocketAddress - returns true if ok, false otherwise.
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  1802
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  1803
     The reuse boolean argument controls if the SO_REUSEADDR socket option
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  1804
     is to be set (to avoid the 'bind: address in use' error).
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  1805
3137
df3e9cebf52c class: Socket
Stefan Vogel <sv@exept.de>
parents: 3127
diff changeset
  1806
     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
  1807
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  1808
    |ok error socketAddress|
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  1809
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  1810
    handle isNil ifTrue:[
3590
3487165a9cdf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3550
diff changeset
  1811
	^ self errorNotOpen
3059
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  1812
    ].
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  1813
    socketAddress := aSocketAddress.
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  1814
    socketAddress isNil ifTrue:[
3590
3487165a9cdf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3550
diff changeset
  1815
	"ok, get a all zero socket address, so it is for anyHost
3487165a9cdf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3550
diff changeset
  1816
	 and the port will be assigned"
3487165a9cdf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3550
diff changeset
  1817
	socketAddress := self socketAddressClass new.
3513
8105bf370769 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3485
diff changeset
  1818
    ].
8105bf370769 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3485
diff changeset
  1819
    domain == #'AF_INET6' ifTrue:[
3590
3487165a9cdf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3550
diff changeset
  1820
	"accept also IPv4 connections on IPv6 sockets (this is off by default fow windows"
3487165a9cdf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3550
diff changeset
  1821
	self setSocketOption:#'IPV6_V6ONLY' argument:false argument:nil.
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  1822
    ].
2321
6f4cc7b644db filePointer -> handle migration
Claus Gittinger <cg@exept.de>
parents: 2308
diff changeset
  1823
    ok := false.
1935
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
%{  /* STACK: 100000 */
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  1826
#ifndef NO_SOCKET
2321
6f4cc7b644db filePointer -> handle migration
Claus Gittinger <cg@exept.de>
parents: 2308
diff changeset
  1827
    OBJ fp = __INST(handle);
6f4cc7b644db filePointer -> handle migration
Claus Gittinger <cg@exept.de>
parents: 2308
diff changeset
  1828
    SOCKET sock;
6f4cc7b644db filePointer -> handle migration
Claus Gittinger <cg@exept.de>
parents: 2308
diff changeset
  1829
    union sockaddr_u sa;
6f4cc7b644db filePointer -> handle migration
Claus Gittinger <cg@exept.de>
parents: 2308
diff changeset
  1830
    int sockaddr_size;
2909
aacef77a1697 64bit fixes
Claus Gittinger <cg@exept.de>
parents: 2904
diff changeset
  1831
    INT ret;
2321
6f4cc7b644db filePointer -> handle migration
Claus Gittinger <cg@exept.de>
parents: 2308
diff changeset
  1832
    int sockAddrOffs;
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  1833
3059
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  1834
    if (fp == nil) {
3590
3487165a9cdf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3550
diff changeset
  1835
	goto getOutOfHere;
2321
6f4cc7b644db filePointer -> handle migration
Claus Gittinger <cg@exept.de>
parents: 2308
diff changeset
  1836
    }
3059
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  1837
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  1838
    if (! __isBytes(socketAddress)) {
3590
3487165a9cdf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3550
diff changeset
  1839
	error = __mkSmallInteger(-1);
3487165a9cdf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3550
diff changeset
  1840
	goto getOutOfHere;
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  1841
    }
2321
6f4cc7b644db filePointer -> handle migration
Claus Gittinger <cg@exept.de>
parents: 2308
diff changeset
  1842
    /* get the socket-address */
3059
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  1843
    if (__isNonNilObject(socketAddress)){
3590
3487165a9cdf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3550
diff changeset
  1844
	int nIndex;
3487165a9cdf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3550
diff changeset
  1845
	OBJ cls = __qClass(socketAddress);
3487165a9cdf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3550
diff changeset
  1846
3487165a9cdf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3550
diff changeset
  1847
	sockAddrOffs = __OBJS2BYTES__(__intVal(__ClassInstPtr(cls)->c_ninstvars));
3487165a9cdf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3550
diff changeset
  1848
	nIndex = __qSize(socketAddress) - OHDR_SIZE;
3487165a9cdf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3550
diff changeset
  1849
	sockaddr_size = nIndex - sockAddrOffs;
3487165a9cdf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3550
diff changeset
  1850
	if (sockaddr_size > sizeof(sa)) {
3487165a9cdf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3550
diff changeset
  1851
	    error=__mkSmallInteger(-2);
3487165a9cdf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3550
diff changeset
  1852
	    goto getOutOfHere;
3487165a9cdf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3550
diff changeset
  1853
	}
3487165a9cdf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3550
diff changeset
  1854
	memcpy(&sa, __byteArrayVal(socketAddress) + sockAddrOffs, sockaddr_size);
2321
6f4cc7b644db filePointer -> handle migration
Claus Gittinger <cg@exept.de>
parents: 2308
diff changeset
  1855
    }
6f4cc7b644db filePointer -> handle migration
Claus Gittinger <cg@exept.de>
parents: 2308
diff changeset
  1856
6f4cc7b644db filePointer -> handle migration
Claus Gittinger <cg@exept.de>
parents: 2308
diff changeset
  1857
    sock = SOCKET_FROM_FILE_OBJECT(fp);
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  1858
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  1859
# ifdef SO_REUSEADDR
2321
6f4cc7b644db filePointer -> handle migration
Claus Gittinger <cg@exept.de>
parents: 2308
diff changeset
  1860
    if (reuse == true) {
3590
3487165a9cdf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3550
diff changeset
  1861
	int on = 1;
3487165a9cdf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3550
diff changeset
  1862
	if (setsockopt(sock, SOL_SOCKET, SO_REUSEADDR, (char *) &on, sizeof (on)) < 0) {
3487165a9cdf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3550
diff changeset
  1863
	    DBGPRINTF(("SOCKET: setsockopt - SO_REUSEADDR failed\n"));
3487165a9cdf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3550
diff changeset
  1864
	}
2321
6f4cc7b644db filePointer -> handle migration
Claus Gittinger <cg@exept.de>
parents: 2308
diff changeset
  1865
    }
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  1866
# endif /* SO_REUSEADDR */
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  1867
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  1868
# ifdef BIND_BLOCKS
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  1869
#  ifdef DO_WRAP_CALLS
2321
6f4cc7b644db filePointer -> handle migration
Claus Gittinger <cg@exept.de>
parents: 2308
diff changeset
  1870
    do {
3590
3487165a9cdf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3550
diff changeset
  1871
	__threadErrno = 0;
3487165a9cdf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3550
diff changeset
  1872
	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
  1873
    } while ((ret < 0) && (__threadErrno == EINTR));
3126
d95cc55a4fb5 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3123
diff changeset
  1874
    if (ret < 0) {
3590
3487165a9cdf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3550
diff changeset
  1875
	errno = __threadErrno;
3126
d95cc55a4fb5 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3123
diff changeset
  1876
    }
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  1877
#  else
2321
6f4cc7b644db filePointer -> handle migration
Claus Gittinger <cg@exept.de>
parents: 2308
diff changeset
  1878
    __BEGIN_INTERRUPTABLE__
6f4cc7b644db filePointer -> handle migration
Claus Gittinger <cg@exept.de>
parents: 2308
diff changeset
  1879
    do {
3590
3487165a9cdf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3550
diff changeset
  1880
	ret = bind(sock, (struct sockaddr *)&sa, sockaddr_size);
2321
6f4cc7b644db filePointer -> handle migration
Claus Gittinger <cg@exept.de>
parents: 2308
diff changeset
  1881
    } while ((ret < 0) && (errno == EINTR));
6f4cc7b644db filePointer -> handle migration
Claus Gittinger <cg@exept.de>
parents: 2308
diff changeset
  1882
    __END_INTERRUPTABLE__
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  1883
#  endif
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  1884
# else
3126
d95cc55a4fb5 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3123
diff changeset
  1885
    errno = 0;
2321
6f4cc7b644db filePointer -> handle migration
Claus Gittinger <cg@exept.de>
parents: 2308
diff changeset
  1886
    ret = bind(sock, (struct sockaddr *)&sa, sockaddr_size);
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  1887
# endif
2321
6f4cc7b644db filePointer -> handle migration
Claus Gittinger <cg@exept.de>
parents: 2308
diff changeset
  1888
    if (ret < 0) {
3126
d95cc55a4fb5 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3123
diff changeset
  1889
# ifdef WIN32
3590
3487165a9cdf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3550
diff changeset
  1890
	if (errno == 0) {
3487165a9cdf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3550
diff changeset
  1891
	    errno = WSAGetLastError();
3487165a9cdf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3550
diff changeset
  1892
	}
3126
d95cc55a4fb5 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3123
diff changeset
  1893
# endif
3590
3487165a9cdf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3550
diff changeset
  1894
	DBGPRINTF(("SOCKET: bind failed errno=%d\n", errno));
3487165a9cdf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3550
diff changeset
  1895
	error = __INST(lastErrorNumber) = __MKSMALLINT(errno);
3487165a9cdf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3550
diff changeset
  1896
	goto getOutOfHere;
2321
6f4cc7b644db filePointer -> handle migration
Claus Gittinger <cg@exept.de>
parents: 2308
diff changeset
  1897
    } else {
3590
3487165a9cdf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3550
diff changeset
  1898
	ok = true;
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
#endif /* NO_SOCKET */
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  1901
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  1902
getOutOfHere: ;
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  1903
%}.
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  1904
    ok ~~ true ifTrue:[
3590
3487165a9cdf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3550
diff changeset
  1905
	|errorHolder errorString|
3487165a9cdf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3550
diff changeset
  1906
3487165a9cdf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3550
diff changeset
  1907
	error isInteger ifTrue:[
3487165a9cdf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3550
diff changeset
  1908
	    errorHolder := OperatingSystem errorHolderForNumber:error.
3487165a9cdf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3550
diff changeset
  1909
	    errorString := errorHolder errorString.
3487165a9cdf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3550
diff changeset
  1910
	] ifFalse:[
3487165a9cdf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3550
diff changeset
  1911
	    errorString := error.
3487165a9cdf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3550
diff changeset
  1912
	].
3487165a9cdf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3550
diff changeset
  1913
	OpenError newException
3487165a9cdf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3550
diff changeset
  1914
	    errorString:('cannot bind socket to address: %1 (%2)'
3487165a9cdf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3550
diff changeset
  1915
			    bindWith:socketAddress
3487165a9cdf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3550
diff changeset
  1916
			    with:errorString);
3487165a9cdf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3550
diff changeset
  1917
	    errorCode:error;
3487165a9cdf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3550
diff changeset
  1918
	    osErrorHolder:errorHolder;
3487165a9cdf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3550
diff changeset
  1919
	    parameter:self;
3487165a9cdf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3550
diff changeset
  1920
	    raiseRequest.
3487165a9cdf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3550
diff changeset
  1921
	"maybe someone catches the error and binds to some other port..."
3487165a9cdf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3550
diff changeset
  1922
	^ true.
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  1923
    ].
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  1924
3059
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  1925
    port := socketAddress port.
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  1926
    port == 0 ifTrue:[
3590
3487165a9cdf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3550
diff changeset
  1927
	"this is a bind to a random port, now we can get the real port"
3487165a9cdf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3550
diff changeset
  1928
	port := self getFullSocketAddress port.
3059
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  1929
    ].
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  1930
    ^ true
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  1931
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  1932
    "
3059
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  1933
     (Socket domain:#'AF_INET' type:#stream)
3590
3487165a9cdf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3550
diff changeset
  1934
	bindTo:(IPSocketAddress anyHost port:445) reuseAddress:false;
3487165a9cdf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3550
diff changeset
  1935
	yourself.
3059
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  1936
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  1937
     (Socket domain:#'AF_INET' type:#stream)
3590
3487165a9cdf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3550
diff changeset
  1938
	bindTo:139 reuseAddress:false;
3487165a9cdf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3550
diff changeset
  1939
	yourself.
3059
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  1940
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  1941
     (Socket domain:#'AF_INET6' type:#stream)
3590
3487165a9cdf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3550
diff changeset
  1942
	bindTo:nil reuseAddress:false;
3487165a9cdf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3550
diff changeset
  1943
	yourself.
3059
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  1944
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  1945
     (Socket domain:#'AF_INET' type:#stream)
3590
3487165a9cdf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3550
diff changeset
  1946
	bindTo:(IPSocketAddress localHost port:2122) reuseAddress:false;
3487165a9cdf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3550
diff changeset
  1947
	yourself.
3059
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  1948
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  1949
     (Socket domain:#'AF_UNIX' type:#stream)
3590
3487165a9cdf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3550
diff changeset
  1950
	bindTo:nil reuseAddress:false;
3487165a9cdf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3550
diff changeset
  1951
	yourself.
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  1952
    "
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  1953
!
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  1954
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  1955
listenFor:aNumber
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  1956
    "start listening; return true if ok, false on error
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  1957
     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
  1958
2321
6f4cc7b644db filePointer -> handle migration
Claus Gittinger <cg@exept.de>
parents: 2308
diff changeset
  1959
    handle isNil ifTrue:[
3217
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  1960
	^ self errorNotOpen
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  1961
    ].
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  1962
%{
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  1963
#ifndef NO_SOCKET
2321
6f4cc7b644db filePointer -> handle migration
Claus Gittinger <cg@exept.de>
parents: 2308
diff changeset
  1964
    OBJ fp = __INST(handle);
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  1965
    SOCKET sock;
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  1966
    int ret;
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  1967
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  1968
    if (! __isSmallInteger(aNumber)) {
3217
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  1969
	DBGPRINTF(("SOCKET: invalid arg\n"));
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  1970
	RETURN (false);
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  1971
    }
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  1972
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  1973
    sock = SOCKET_FROM_FILE_OBJECT(fp);
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  1974
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  1975
#ifdef LISTEN_BLOCKS
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  1976
# ifdef DO_WRAP_CALLS
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  1977
    do {
3217
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  1978
	__threadErrno = 0;
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  1979
	ret = STX_WSA_NOINT_CALL2("listen", listen, sock, __intVal(aNumber));
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  1980
    } while ((ret < 0) && (__threadErrno == EINTR));
3126
d95cc55a4fb5 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3123
diff changeset
  1981
    if (ret < 0) {
3217
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  1982
	errno = __threadErrno;
3126
d95cc55a4fb5 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3123
diff changeset
  1983
    }
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  1984
# else
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  1985
    __BEGIN_INTERRUPTABLE__
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  1986
    do {
3217
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  1987
	ret = listen(sock, __intVal(aNumber));
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  1988
    } while ((ret < 0) && (errno == EINTR));
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  1989
    __END_INTERRUPTABLE__
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  1990
# endif
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  1991
#else
3126
d95cc55a4fb5 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3123
diff changeset
  1992
    errno = 0;
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  1993
    ret = listen(sock, __intVal(aNumber));
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  1994
#endif
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  1995
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  1996
    if (ret < 0) {
3126
d95cc55a4fb5 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3123
diff changeset
  1997
# ifdef WIN32
3217
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  1998
	if (errno == 0) {
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  1999
	    errno = WSAGetLastError();
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  2000
	}
3126
d95cc55a4fb5 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3123
diff changeset
  2001
# endif
3217
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  2002
	DBGPRINTF(("SOCKET: listen call failed errno=%d\n", errno));
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  2003
	__INST(lastErrorNumber) = __MKSMALLINT(errno);
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  2004
	RETURN (false);
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2005
    }
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2006
#else
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2007
    RETURN (false);
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2008
#endif
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2009
%}.
3157
44f5f9f79256 initialize methods
Stefan Vogel <sv@exept.de>
parents: 3155
diff changeset
  2010
    listening := aNumber.
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2011
    ^ true
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2012
! !
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2013
1576
a2ffb22c5f5e New: #shutDownInput #shutDownOutput
Stefan Vogel <sv@exept.de>
parents: 1568
diff changeset
  2014
!Socket methodsFor:'closing'!
a2ffb22c5f5e New: #shutDownInput #shutDownOutput
Stefan Vogel <sv@exept.de>
parents: 1568
diff changeset
  2015
3224
bad706c50347 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3223
diff changeset
  2016
finalize
bad706c50347 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3223
diff changeset
  2017
    self linger:0.      "/ discard buffered data
bad706c50347 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3223
diff changeset
  2018
    super finalize.
bad706c50347 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3223
diff changeset
  2019
!
bad706c50347 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3223
diff changeset
  2020
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2021
shutDown
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2022
    "shutDown and close the socket"
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2023
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2024
    self shutdown:2.
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2025
    self close
1576
a2ffb22c5f5e New: #shutDownInput #shutDownOutput
Stefan Vogel <sv@exept.de>
parents: 1568
diff changeset
  2026
!
a2ffb22c5f5e New: #shutDownInput #shutDownOutput
Stefan Vogel <sv@exept.de>
parents: 1568
diff changeset
  2027
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2028
shutDownInput
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2029
    "shutDown the input side of the socket.
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2030
     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
  2031
     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
  2032
     (e.g. setting the TCP-Windowsize to 0)"
a2ffb22c5f5e New: #shutDownInput #shutDownOutput
Stefan Vogel <sv@exept.de>
parents: 1568
diff changeset
  2033
a2ffb22c5f5e New: #shutDownInput #shutDownOutput
Stefan Vogel <sv@exept.de>
parents: 1568
diff changeset
  2034
    self shutdown:0.
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2035
!
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2036
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2037
shutDownOutput
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2038
    "shutDown the output side of the socket.
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2039
     Any write to the socket will signal end-of-file from now on.
2825
e5b7d2005351 fixed for compilability
Claus Gittinger <cg@exept.de>
parents: 2824
diff changeset
  2040
     An orderly realease (TCP FIN) will be initiated after the last buffered data
2823
10179ccfae5d Default for close - linger in background instead 30s in foreground
Stefan Vogel <sv@exept.de>
parents: 2818
diff changeset
  2041
     has been sent, so the other side will get a end-of-file condition eventually."
1343
cc3bed115c0a definitions cleanup with stxOSDefs.h
penk
parents: 1342
diff changeset
  2042
1884
ee0d640a25a7 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1882
diff changeset
  2043
    self shutdown:1.
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2044
! !
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2045
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2046
!Socket methodsFor:'connecting'!
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
connectTo:aSocketAddress
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  2049
    ^ self connectTo:aSocketAddress withTimeout:nil
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  2050
!
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  2051
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2052
connectTo:hostOrPathName port:portNrOrName
3059
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  2053
    "Backward compatibility connect; connect to port, portNrOrNameOrNil on host, hostOrPathNameOrSocketAddr.
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  2054
     For backward compatibility, hostOrPathNameOrSocketAddr may be also a string or a byteArray,
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  2055
     but it is recommended to pass SocketAddress instances.
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2056
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2057
     Return true if ok, false otherwise.
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2058
     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
  2059
     See also: #connectTo:port:withTimeout: for a somewhat nicer interface."
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2060
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2061
    ^ self connectTo:hostOrPathName port:portNrOrName withTimeout:nil
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2062
!
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2063
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2064
connectTo:hostOrPathNameOrSocketAddr port:portNrOrNameOrNil withTimeout:timeout
3059
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  2065
    "Backward compatibility connect; connect to port, portNrOrNameOrNil on host, hostOrPathNameOrSocketAddr.
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  2066
     For backward compatibility, hostOrPathNameOrSocketAddr may be also a string or a byteArray,
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  2067
     but it is recommended to pass SocketAddress instances.
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2068
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2069
     Return true if ok, false otherwise.
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2070
     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
  2071
     or timeout millliseconds have passed."
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2072
3059
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  2073
    |domainClass socketAddress|
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  2074
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  2075
    (hostOrPathNameOrSocketAddr isSocketAddress) ifTrue:[
3217
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  2076
	socketAddress := hostOrPathNameOrSocketAddr.
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  2077
	portNrOrNameOrNil notNil ifTrue:[
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  2078
	    socketAddress port:portNrOrNameOrNil.
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  2079
	].
3059
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  2080
    ] ifFalse:[
3217
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  2081
	"backward compatibility: support for byteArray and string arg"
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  2082
	domainClass := self class socketAddressClassForDomain:domain.
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  2083
	domainClass isNil ifTrue:[
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  2084
	    ^ self error:'invalid (unsupported) domain'.
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  2085
	].
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  2086
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  2087
	hostOrPathNameOrSocketAddr isString ifTrue:[
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  2088
	    socketAddress := domainClass hostName:hostOrPathNameOrSocketAddr serviceName:portNrOrNameOrNil type:#SOCK_STREAM.
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  2089
	    peerName := hostOrPathNameOrSocketAddr.
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  2090
	] ifFalse:[
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  2091
	    hostOrPathNameOrSocketAddr isByteCollection ifFalse:[
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  2092
		^ self error:'connectTo: bad host (socketAddress) argument'
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  2093
	    ].
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  2094
	    socketAddress := domainClass hostAddress:hostOrPathNameOrSocketAddr port:portNrOrNameOrNil.
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  2095
	].
3059
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  2096
    ].
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  2097
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  2098
    ^ self connectTo:socketAddress withTimeout:timeout.
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  2099
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  2100
    "
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  2101
       |sock|
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  2102
       sock := Socket newTCP.
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  2103
       sock connectTo:'localhost' port:21 withTimeout:1000.
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  2104
       sock
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  2105
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  2106
       |sock|
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  2107
       sock := Socket newTCP.
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  2108
       sock connectTo:'localhost' port:9876 withTimeout:2000.
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  2109
       sock
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  2110
    "
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  2111
!
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  2112
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  2113
connectTo:aSocketAddress withTimeout:timeout
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  2114
    "Connect to a SocketAddress.
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  2115
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  2116
     Return true if ok, false otherwise.
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  2117
     The current process will block (but not the whole Smalltalk) until the connection is established,
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  2118
     or timeout millliseconds have passed."
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  2119
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  2120
    |isAsync err|
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2121
2321
6f4cc7b644db filePointer -> handle migration
Claus Gittinger <cg@exept.de>
parents: 2308
diff changeset
  2122
    handle isNil ifTrue:[
3217
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  2123
	^ self errorNotOpen
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2124
    ].
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2125
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2126
%{  /* STACK: 100000 */
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2127
#ifndef NO_SOCKET
3123
55ef9ca4f09f class: Socket
Stefan Vogel <sv@exept.de>
parents: 3077
diff changeset
  2128
//#define DUMP_ADDRESS 1
2321
6f4cc7b644db filePointer -> handle migration
Claus Gittinger <cg@exept.de>
parents: 2308
diff changeset
  2129
    OBJ fp = __INST(handle);
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2130
    union sockaddr_u sa;
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2131
    SOCKET sock;
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2132
    int a;
2909
aacef77a1697 64bit fixes
Claus Gittinger <cg@exept.de>
parents: 2904
diff changeset
  2133
    INT ret;
aacef77a1697 64bit fixes
Claus Gittinger <cg@exept.de>
parents: 2904
diff changeset
  2134
    int oldFlags;
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2135
    int on = 1;
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2136
    int sockaddr_size;
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2137
3059
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  2138
    if (!__isNonNilObject(aSocketAddress) || !__isBytes(aSocketAddress)) {
3217
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  2139
	DBGPRINTF(("SOCKET: invalid socketAddress\n"));
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  2140
	err = @symbol(argumentError);
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  2141
	goto out;
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2142
    }
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2143
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2144
    {
3217
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  2145
	int sockAddrOffs = 0;
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  2146
	int nIndex =__byteArraySize(aSocketAddress);
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  2147
	OBJ cls = __qClass(aSocketAddress);
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  2148
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  2149
	//if (cls != @global(ByteArray))
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  2150
	//    sockAddrOffs = __OBJS2BYTES__(__intVal(__ClassInstPtr(cls)->c_ninstvars));
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  2151
	sockaddr_size = nIndex - sockAddrOffs;
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  2152
	if (sockaddr_size > sizeof(sa)) {
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  2153
	    DBGPRINTF(("SOCKET: invalid (short) socketAddress\n"));
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  2154
	    err = @symbol(argumentError);
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  2155
	    goto out;
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  2156
	}
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  2157
	memcpy(&sa, __byteArrayVal(aSocketAddress) + sockAddrOffs, sockaddr_size);
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2158
    }
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2159
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2160
    sock = SOCKET_FROM_FILE_OBJECT(fp);
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2161
3077
032905ddd57a class: Socket
Claus Gittinger <cg@exept.de>
parents: 3072
diff changeset
  2162
# if defined(O_NONBLOCK) && !defined(WIN32)
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2163
    /*
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2164
     * set to non-blocking and wait later
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2165
     */
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2166
    oldFlags = fcntl(sock, F_GETFL, 0);
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2167
    /* on SUNOS4.x, would use fcntl(osfd, F_SETFL, flags | FNDELAY); */
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2168
    fcntl(sock, F_SETFL, oldFlags | O_NONBLOCK);
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2169
# endif
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2170
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2171
    /*
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2172
     * connect
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2173
     */
3123
55ef9ca4f09f class: Socket
Stefan Vogel <sv@exept.de>
parents: 3077
diff changeset
  2174
3077
032905ddd57a class: Socket
Claus Gittinger <cg@exept.de>
parents: 3072
diff changeset
  2175
# if defined(DO_WRAP_CALLS)
3217
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  2176
    // __setWrapCallDebugging(1,1);
2414
886ecf4b36cd changed:
ab
parents: 2340
diff changeset
  2177
3123
55ef9ca4f09f class: Socket
Stefan Vogel <sv@exept.de>
parents: 3077
diff changeset
  2178
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2179
    do {
3217
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  2180
	DBGFPRINTF((stderr, "SOCKET: (sock=%d) connect...\n", sock));
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  2181
	ret = STX_WSA_NOINT_CALL3("connect", connect, sock, &sa, (INT)sockaddr_size);
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  2182
	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
  2183
    } while ((ret < 0) && (__threadErrno == EINTR));
3123
55ef9ca4f09f class: Socket
Stefan Vogel <sv@exept.de>
parents: 3077
diff changeset
  2184
3077
032905ddd57a class: Socket
Claus Gittinger <cg@exept.de>
parents: 3072
diff changeset
  2185
    if (ret < 0) {
3217
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  2186
	int optLen = sizeof(errno);
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  2187
	errno = __threadErrno;
3123
55ef9ca4f09f class: Socket
Stefan Vogel <sv@exept.de>
parents: 3077
diff changeset
  2188
#if 0
3217
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  2189
	if (getsockopt(sock, SOL_SOCKET, SO_ERROR, &errno, &optLen) == SOCKET_ERROR) {
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  2190
	    DBGFPRINTF((stderr, "SOCKET: getsockopt(SO_ERROR) failed: %d\n", WSAGetLastError()));
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  2191
	}
3123
55ef9ca4f09f class: Socket
Stefan Vogel <sv@exept.de>
parents: 3077
diff changeset
  2192
#endif
3077
032905ddd57a class: Socket
Claus Gittinger <cg@exept.de>
parents: 3072
diff changeset
  2193
    }
032905ddd57a class: Socket
Claus Gittinger <cg@exept.de>
parents: 3072
diff changeset
  2194
032905ddd57a class: Socket
Claus Gittinger <cg@exept.de>
parents: 3072
diff changeset
  2195
    // __setWrapCallDebugging(1,0);
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2196
# else
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2197
    __BEGIN_INTERRUPTABLE__
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2198
    do {
3217
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  2199
	ret = connect(sock, (struct sockaddr *)&sa, sockaddr_size);
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2200
    } while ((ret < 0)
3217
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  2201
	     && ((errno == EINTR)
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2202
# ifdef EAGAIN
3217
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  2203
		 || (errno == EAGAIN)
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2204
# endif
3217
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  2205
		));
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2206
    __END_INTERRUPTABLE__
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2207
#endif
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2208
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2209
    if (ret < 0) {
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2210
# if defined(EINPROGRESS) || defined(EALREADY)
3217
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  2211
	if (0
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2212
#  ifdef EINPROGRESS
3217
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  2213
	    || (errno == EINPROGRESS)
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2214
#  endif
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2215
#  ifdef EALREADY
3217
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  2216
	    || (errno == EALREADY)
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2217
#  endif
3217
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  2218
	) {
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  2219
	    /*
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  2220
	     * This was a nonblocking operation that will take some time.
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  2221
	     * Do a select on read to get informed when the operation is ready.
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  2222
	     */
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  2223
	    DBGFPRINTF((stderr, "SOCKET: isAsync is true\n"));
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  2224
	    isAsync = true;
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  2225
	} else
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2226
# endif /* EINPROGRESS or EALREADY */
3217
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  2227
	{
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  2228
	    DBGFPRINTF((stderr, "SOCKET: connect failed ret=%"_ld_" errno=%d __threadErrno=%d\n",
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  2229
			(INT)ret, errno, __threadErrno ));
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2230
# ifdef DUMP_ADDRESS
3217
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  2231
	    {
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  2232
		unsigned char *cp = (unsigned char *)(&sa);
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  2233
		int i;
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  2234
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  2235
		console_printf("address data:\n");
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  2236
		for (i=0; i<sockaddr_size; i++) {
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  2237
		    console_printf(" %02x\n", *cp++);
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  2238
		}
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  2239
	    }
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2240
# endif
3217
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  2241
	    err = __MKSMALLINT(errno);
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  2242
	}
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2243
    }
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2244
3077
032905ddd57a class: Socket
Claus Gittinger <cg@exept.de>
parents: 3072
diff changeset
  2245
# if defined(O_NONBLOCK) && !defined(WIN32)
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2246
    fcntl(sock, F_SETFL, oldFlags);
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2247
# endif
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2248
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2249
# else /* NO_SOCKET */
3077
032905ddd57a class: Socket
Claus Gittinger <cg@exept.de>
parents: 3072
diff changeset
  2250
    err = @symbol(notSupported);
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2251
# endif /* NO_SOCKET */
3077
032905ddd57a class: Socket
Claus Gittinger <cg@exept.de>
parents: 3072
diff changeset
  2252
out:;
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2253
%}.
3217
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  2254
3077
032905ddd57a class: Socket
Claus Gittinger <cg@exept.de>
parents: 3072
diff changeset
  2255
    err notNil ifTrue:[
3217
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  2256
	err isSymbol ifTrue:[
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  2257
	    self primitiveFailed:err.
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  2258
	].
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  2259
	lastErrorNumber := err.
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  2260
	^ false.
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  2261
	"/ Once we will raise an exception instead of returning false (and have to change some code above):
3077
032905ddd57a class: Socket
Claus Gittinger <cg@exept.de>
parents: 3072
diff changeset
  2262
"/        (OperatingSystem errorHolderForNumber:err) reportError.
032905ddd57a class: Socket
Claus Gittinger <cg@exept.de>
parents: 3072
diff changeset
  2263
    ].
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2264
    isAsync == true ifTrue:[
3217
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  2265
	(self writeWaitWithTimeoutMs:timeout) ifTrue:[
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  2266
	    "/ a timeout occured
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  2267
	    "/ should I cancel the connect?
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  2268
	    ^ false.
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  2269
	].
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  2270
	err := self getSocketError.
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  2271
	err ~~ 0 ifTrue:[
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  2272
	    lastErrorNumber := err.
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  2273
	    ^ false.
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  2274
	].
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2275
    ].
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2276
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
  2277
3059
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  2278
    peer := aSocketAddress.
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2279
    port isNil ifTrue:[
3217
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  2280
	"socket has not been explicitly bound,
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  2281
	 after connect it has been bound implicitly - fetch the port"
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  2282
	port := self getFullSocketAddress port.
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2283
    ].
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2284
    ^ true
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2285
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
       |sock|
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2288
       sock := Socket newTCP.
3059
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  2289
       sock connectTo:(IPSocketAddress localHost port:21) withTimeout:1000.
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2290
       sock
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2291
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2292
       |sock|
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2293
       sock := Socket newTCP.
3059
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  2294
       sock connectTo:(IPSocketAddress localHost port:9876) withTimeout:2000.
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2295
       sock
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2296
    "
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2297
! !
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2298
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2299
!Socket methodsFor:'datagram transmission'!
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2300
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2301
receiveBuffer:aDataBuffer start:startIndex for:nBytes
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2302
    "receive data
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2303
     Return the number of bytes received, or a negative number on error.
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2304
     On error, the unix error code is left in the lastErrorNumber
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2305
     instance variable.
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2306
     The thread blocks until data arrives - you may want to wait before
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2307
     receiving, using #readWait or #readWaitWithTimeout:."
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2308
3126
d95cc55a4fb5 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3123
diff changeset
  2309
    |nReceived error|
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2310
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2311
%{
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2312
#ifndef NO_SOCKET
2321
6f4cc7b644db filePointer -> handle migration
Claus Gittinger <cg@exept.de>
parents: 2308
diff changeset
  2313
    OBJ fp = __INST(handle);
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2314
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2315
    if (fp != nil) {
3614
a950d8f8c4ce #BUGFIX
Stefan Vogel <sv@exept.de>
parents: 3591
diff changeset
  2316
        SOCKET sock;
a950d8f8c4ce #BUGFIX
Stefan Vogel <sv@exept.de>
parents: 3591
diff changeset
  2317
        INT objSize, offs;
a950d8f8c4ce #BUGFIX
Stefan Vogel <sv@exept.de>
parents: 3591
diff changeset
  2318
        INT n;
a950d8f8c4ce #BUGFIX
Stefan Vogel <sv@exept.de>
parents: 3591
diff changeset
  2319
        char *extPtr;
a950d8f8c4ce #BUGFIX
Stefan Vogel <sv@exept.de>
parents: 3591
diff changeset
  2320
        unsigned char *buffer;
a950d8f8c4ce #BUGFIX
Stefan Vogel <sv@exept.de>
parents: 3591
diff changeset
  2321
        unsigned char *allocatedBuffer = NULL;
a950d8f8c4ce #BUGFIX
Stefan Vogel <sv@exept.de>
parents: 3591
diff changeset
  2322
        INT flags = 0;
a950d8f8c4ce #BUGFIX
Stefan Vogel <sv@exept.de>
parents: 3591
diff changeset
  2323
a950d8f8c4ce #BUGFIX
Stefan Vogel <sv@exept.de>
parents: 3591
diff changeset
  2324
        sock = SOCKET_FROM_FILE_OBJECT(fp);
a950d8f8c4ce #BUGFIX
Stefan Vogel <sv@exept.de>
parents: 3591
diff changeset
  2325
a950d8f8c4ce #BUGFIX
Stefan Vogel <sv@exept.de>
parents: 3591
diff changeset
  2326
        if (! setupBufferParameters(aDataBuffer, startIndex, &extPtr, &offs, &objSize)) goto bad;
a950d8f8c4ce #BUGFIX
Stefan Vogel <sv@exept.de>
parents: 3591
diff changeset
  2327
        if (__isSmallInteger(nBytes)) {
a950d8f8c4ce #BUGFIX
Stefan Vogel <sv@exept.de>
parents: 3591
diff changeset
  2328
            if (__intVal(nBytes) < objSize) {
a950d8f8c4ce #BUGFIX
Stefan Vogel <sv@exept.de>
parents: 3591
diff changeset
  2329
                objSize = __intVal(nBytes);
a950d8f8c4ce #BUGFIX
Stefan Vogel <sv@exept.de>
parents: 3591
diff changeset
  2330
            }
a950d8f8c4ce #BUGFIX
Stefan Vogel <sv@exept.de>
parents: 3591
diff changeset
  2331
        }
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2332
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2333
# ifdef DO_WRAP_CALLS
3614
a950d8f8c4ce #BUGFIX
Stefan Vogel <sv@exept.de>
parents: 3591
diff changeset
  2334
        if (extPtr) {
a950d8f8c4ce #BUGFIX
Stefan Vogel <sv@exept.de>
parents: 3591
diff changeset
  2335
            buffer = extPtr + offs;
a950d8f8c4ce #BUGFIX
Stefan Vogel <sv@exept.de>
parents: 3591
diff changeset
  2336
        } else {
a950d8f8c4ce #BUGFIX
Stefan Vogel <sv@exept.de>
parents: 3591
diff changeset
  2337
            allocatedBuffer = buffer = (char *)malloc(objSize);
a950d8f8c4ce #BUGFIX
Stefan Vogel <sv@exept.de>
parents: 3591
diff changeset
  2338
        }
a950d8f8c4ce #BUGFIX
Stefan Vogel <sv@exept.de>
parents: 3591
diff changeset
  2339
a950d8f8c4ce #BUGFIX
Stefan Vogel <sv@exept.de>
parents: 3591
diff changeset
  2340
        do {
a950d8f8c4ce #BUGFIX
Stefan Vogel <sv@exept.de>
parents: 3591
diff changeset
  2341
            __threadErrno = 0;
a950d8f8c4ce #BUGFIX
Stefan Vogel <sv@exept.de>
parents: 3591
diff changeset
  2342
            n = (INT)STX_WSA_NOINT_CALL4("recv", recv, sock, buffer, objSize, flags);
a950d8f8c4ce #BUGFIX
Stefan Vogel <sv@exept.de>
parents: 3591
diff changeset
  2343
        } while ((n < 0) && (__threadErrno == EINTR));
a950d8f8c4ce #BUGFIX
Stefan Vogel <sv@exept.de>
parents: 3591
diff changeset
  2344
        if (n < 0) {
a950d8f8c4ce #BUGFIX
Stefan Vogel <sv@exept.de>
parents: 3591
diff changeset
  2345
            errno = __threadErrno;
a950d8f8c4ce #BUGFIX
Stefan Vogel <sv@exept.de>
parents: 3591
diff changeset
  2346
        }
a950d8f8c4ce #BUGFIX
Stefan Vogel <sv@exept.de>
parents: 3591
diff changeset
  2347
a950d8f8c4ce #BUGFIX
Stefan Vogel <sv@exept.de>
parents: 3591
diff changeset
  2348
        if (allocatedBuffer) {
a950d8f8c4ce #BUGFIX
Stefan Vogel <sv@exept.de>
parents: 3591
diff changeset
  2349
            if (n > 0) {
a950d8f8c4ce #BUGFIX
Stefan Vogel <sv@exept.de>
parents: 3591
diff changeset
  2350
                bcopy(allocatedBuffer, (char *)__InstPtr(aDataBuffer) + offs, n);
a950d8f8c4ce #BUGFIX
Stefan Vogel <sv@exept.de>
parents: 3591
diff changeset
  2351
            }
a950d8f8c4ce #BUGFIX
Stefan Vogel <sv@exept.de>
parents: 3591
diff changeset
  2352
            free(allocatedBuffer);
a950d8f8c4ce #BUGFIX
Stefan Vogel <sv@exept.de>
parents: 3591
diff changeset
  2353
        }
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2354
# else
3614
a950d8f8c4ce #BUGFIX
Stefan Vogel <sv@exept.de>
parents: 3591
diff changeset
  2355
        __BEGIN_INTERRUPTABLE__
a950d8f8c4ce #BUGFIX
Stefan Vogel <sv@exept.de>
parents: 3591
diff changeset
  2356
        do {
a950d8f8c4ce #BUGFIX
Stefan Vogel <sv@exept.de>
parents: 3591
diff changeset
  2357
            if (extPtr) {
a950d8f8c4ce #BUGFIX
Stefan Vogel <sv@exept.de>
parents: 3591
diff changeset
  2358
                n = recv(sock, extPtr + offs, objSize, flags);
a950d8f8c4ce #BUGFIX
Stefan Vogel <sv@exept.de>
parents: 3591
diff changeset
  2359
            } else {
a950d8f8c4ce #BUGFIX
Stefan Vogel <sv@exept.de>
parents: 3591
diff changeset
  2360
                n = recv(sock, (char *)__InstPtr(aDataBuffer) + offs, objSize, flags);
a950d8f8c4ce #BUGFIX
Stefan Vogel <sv@exept.de>
parents: 3591
diff changeset
  2361
            }
a950d8f8c4ce #BUGFIX
Stefan Vogel <sv@exept.de>
parents: 3591
diff changeset
  2362
        } while ((n < 0) && (errno == EINTR));
a950d8f8c4ce #BUGFIX
Stefan Vogel <sv@exept.de>
parents: 3591
diff changeset
  2363
        __END_INTERRUPTABLE__
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2364
# endif
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2365
3614
a950d8f8c4ce #BUGFIX
Stefan Vogel <sv@exept.de>
parents: 3591
diff changeset
  2366
        if (n < 0) {
a950d8f8c4ce #BUGFIX
Stefan Vogel <sv@exept.de>
parents: 3591
diff changeset
  2367
            error = __INST(lastErrorNumber) = __MKSMALLINT(errno);
a950d8f8c4ce #BUGFIX
Stefan Vogel <sv@exept.de>
parents: 3591
diff changeset
  2368
        } else {
a950d8f8c4ce #BUGFIX
Stefan Vogel <sv@exept.de>
parents: 3591
diff changeset
  2369
            RETURN(__MKSMALLINT(n));
a950d8f8c4ce #BUGFIX
Stefan Vogel <sv@exept.de>
parents: 3591
diff changeset
  2370
        }
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2371
    }
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2372
#endif
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2373
bad: ;
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2374
%}.
3126
d95cc55a4fb5 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3123
diff changeset
  2375
    error notNil ifTrue:[
3614
a950d8f8c4ce #BUGFIX
Stefan Vogel <sv@exept.de>
parents: 3591
diff changeset
  2376
        ^ self readError:error.
915
3dc0e3cd838a added interface to send() and recv()
Claus Gittinger <cg@exept.de>
parents: 898
diff changeset
  2377
    ].
3dc0e3cd838a added interface to send() and recv()
Claus Gittinger <cg@exept.de>
parents: 898
diff changeset
  2378
    "
1282
7e4ffdfd19f6 remove historic leftover
Claus Gittinger <cg@exept.de>
parents: 1280
diff changeset
  2379
     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
  2380
    "
3dc0e3cd838a added interface to send() and recv()
Claus Gittinger <cg@exept.de>
parents: 898
diff changeset
  2381
    self primitiveFailed
3dc0e3cd838a added interface to send() and recv()
Claus Gittinger <cg@exept.de>
parents: 898
diff changeset
  2382
!
3dc0e3cd838a added interface to send() and recv()
Claus Gittinger <cg@exept.de>
parents: 898
diff changeset
  2383
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2384
receiveFrom:anAddressBuffer buffer:aDataBuffer
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2385
    "receive datagramm data - put address of originating host into
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2386
     anAddressBuffer, data into aBuffer.
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2387
     Both must be ByteArray-like. The addressBuffer must
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2388
     provide space for a valid address for my domain (i.e. for inet, a 4-byte byteArray).
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2389
     Return the number of bytes received, or a negative number on error.
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2390
     On error, the unix error code is left in the lastErrorNumber
126
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
  2391
     instance variable."
28
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  2392
3615
ffe86e1b14ed #BUGFIX
Stefan Vogel <sv@exept.de>
parents: 3614
diff changeset
  2393
    ^ self receiveFrom:anAddressBuffer buffer:aDataBuffer start:1 for:(aDataBuffer size) flags:0
99
7d016cc30052 fixed & moved pingWalk from SNMPSession to here;
Claus Gittinger <cg@exept.de>
parents: 98
diff changeset
  2394
!
7d016cc30052 fixed & moved pingWalk from SNMPSession to here;
Claus Gittinger <cg@exept.de>
parents: 98
diff changeset
  2395
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2396
receiveFrom:anAddressBuffer buffer:aDataBuffer start:startIndex for:nBytes
3615
ffe86e1b14ed #BUGFIX
Stefan Vogel <sv@exept.de>
parents: 3614
diff changeset
  2397
    ^ self receiveFrom:anAddressBuffer buffer:aDataBuffer start:startIndex for:nBytes flags:0
ffe86e1b14ed #BUGFIX
Stefan Vogel <sv@exept.de>
parents: 3614
diff changeset
  2398
!
ffe86e1b14ed #BUGFIX
Stefan Vogel <sv@exept.de>
parents: 3614
diff changeset
  2399
ffe86e1b14ed #BUGFIX
Stefan Vogel <sv@exept.de>
parents: 3614
diff changeset
  2400
receiveFrom:anAddressBuffer buffer:aDataBuffer start:startIndex for:nBytes flags:flags
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2401
    "receive datagramm data
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2402
     - put address of originating host into anAddressBuffer, data into aBuffer.
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2403
     For backward compatibility, the addressBuffer may be a non-SocketAddress;
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2404
     then, it must be a byteArray with appropriate size for the addressBytes.
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2405
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2406
     Return the number of bytes received, or a negative number on error.
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2407
     On error, the unix error code is left in the lastErrorNumber
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2408
     instance variable.
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2409
     The thread blocks until data arrives - you may want to wait before
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2410
     receiving, using #readWait or #readWaitWithTimeout:."
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2411
3126
d95cc55a4fb5 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3123
diff changeset
  2412
    |domainClass addr addrLen nReceived error|
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2413
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2414
    domainClass := self class socketAddressClassForDomain:domain.
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2415
    domainClass isNil ifTrue:[
3614
a950d8f8c4ce #BUGFIX
Stefan Vogel <sv@exept.de>
parents: 3591
diff changeset
  2416
        ^ self error:'invalid (unsupported) domain'.
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2417
    ].
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2418
    (anAddressBuffer isKindOf:SocketAddress) ifTrue:[
3614
a950d8f8c4ce #BUGFIX
Stefan Vogel <sv@exept.de>
parents: 3591
diff changeset
  2419
        anAddressBuffer class == domainClass ifFalse:[
a950d8f8c4ce #BUGFIX
Stefan Vogel <sv@exept.de>
parents: 3591
diff changeset
  2420
            ^ self error:'addressBuffer class mismatch (domain)'.
a950d8f8c4ce #BUGFIX
Stefan Vogel <sv@exept.de>
parents: 3591
diff changeset
  2421
        ].
a950d8f8c4ce #BUGFIX
Stefan Vogel <sv@exept.de>
parents: 3591
diff changeset
  2422
        addr := anAddressBuffer.
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2423
    ] ifFalse:[
3614
a950d8f8c4ce #BUGFIX
Stefan Vogel <sv@exept.de>
parents: 3591
diff changeset
  2424
        anAddressBuffer notNil ifTrue:[
a950d8f8c4ce #BUGFIX
Stefan Vogel <sv@exept.de>
parents: 3591
diff changeset
  2425
            addr := domainClass new.
a950d8f8c4ce #BUGFIX
Stefan Vogel <sv@exept.de>
parents: 3591
diff changeset
  2426
        ].
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2427
    ].
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2428
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2429
%{
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2430
#ifndef NO_SOCKET
2321
6f4cc7b644db filePointer -> handle migration
Claus Gittinger <cg@exept.de>
parents: 2308
diff changeset
  2431
    OBJ fp = __INST(handle);
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2432
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2433
    if (fp != nil) {
3614
a950d8f8c4ce #BUGFIX
Stefan Vogel <sv@exept.de>
parents: 3591
diff changeset
  2434
        SOCKET sock;
3616
Stefan Vogel <sv@exept.de>
parents: 3615
diff changeset
  2435
        size_t objSize;
3614
a950d8f8c4ce #BUGFIX
Stefan Vogel <sv@exept.de>
parents: 3591
diff changeset
  2436
        union sockaddr_u sa;
3615
ffe86e1b14ed #BUGFIX
Stefan Vogel <sv@exept.de>
parents: 3614
diff changeset
  2437
        socklen_t alen = 0;
3614
a950d8f8c4ce #BUGFIX
Stefan Vogel <sv@exept.de>
parents: 3591
diff changeset
  2438
        INT n, offs;
3615
ffe86e1b14ed #BUGFIX
Stefan Vogel <sv@exept.de>
parents: 3614
diff changeset
  2439
        int _flags = __longIntVal(flags);
3614
a950d8f8c4ce #BUGFIX
Stefan Vogel <sv@exept.de>
parents: 3591
diff changeset
  2440
        char *extPtr;
3616
Stefan Vogel <sv@exept.de>
parents: 3615
diff changeset
  2441
        unsigned char *allocatedBuffer = NULL, *buffer = NULL;
3614
a950d8f8c4ce #BUGFIX
Stefan Vogel <sv@exept.de>
parents: 3591
diff changeset
  2442
a950d8f8c4ce #BUGFIX
Stefan Vogel <sv@exept.de>
parents: 3591
diff changeset
  2443
        sock = SOCKET_FROM_FILE_OBJECT(fp);
a950d8f8c4ce #BUGFIX
Stefan Vogel <sv@exept.de>
parents: 3591
diff changeset
  2444
a950d8f8c4ce #BUGFIX
Stefan Vogel <sv@exept.de>
parents: 3591
diff changeset
  2445
        if (! setupBufferParameters(aDataBuffer, startIndex, &extPtr, &offs, &objSize)) goto bad;
a950d8f8c4ce #BUGFIX
Stefan Vogel <sv@exept.de>
parents: 3591
diff changeset
  2446
        if (__isSmallInteger(nBytes)) {
a950d8f8c4ce #BUGFIX
Stefan Vogel <sv@exept.de>
parents: 3591
diff changeset
  2447
            if (__intVal(nBytes) < objSize) {
a950d8f8c4ce #BUGFIX
Stefan Vogel <sv@exept.de>
parents: 3591
diff changeset
  2448
                objSize = __intVal(nBytes);
a950d8f8c4ce #BUGFIX
Stefan Vogel <sv@exept.de>
parents: 3591
diff changeset
  2449
            }
a950d8f8c4ce #BUGFIX
Stefan Vogel <sv@exept.de>
parents: 3591
diff changeset
  2450
        }
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2451
# ifdef DO_WRAP_CALLS
3614
a950d8f8c4ce #BUGFIX
Stefan Vogel <sv@exept.de>
parents: 3591
diff changeset
  2452
        if (extPtr) {
a950d8f8c4ce #BUGFIX
Stefan Vogel <sv@exept.de>
parents: 3591
diff changeset
  2453
            buffer = extPtr + offs;
a950d8f8c4ce #BUGFIX
Stefan Vogel <sv@exept.de>
parents: 3591
diff changeset
  2454
        } else {
a950d8f8c4ce #BUGFIX
Stefan Vogel <sv@exept.de>
parents: 3591
diff changeset
  2455
            allocatedBuffer = buffer = (char *)malloc(objSize);
a950d8f8c4ce #BUGFIX
Stefan Vogel <sv@exept.de>
parents: 3591
diff changeset
  2456
        }
a950d8f8c4ce #BUGFIX
Stefan Vogel <sv@exept.de>
parents: 3591
diff changeset
  2457
a950d8f8c4ce #BUGFIX
Stefan Vogel <sv@exept.de>
parents: 3591
diff changeset
  2458
        do {
a950d8f8c4ce #BUGFIX
Stefan Vogel <sv@exept.de>
parents: 3591
diff changeset
  2459
            __threadErrno = 0;
a950d8f8c4ce #BUGFIX
Stefan Vogel <sv@exept.de>
parents: 3591
diff changeset
  2460
            alen = sizeof(sa);
3615
ffe86e1b14ed #BUGFIX
Stefan Vogel <sv@exept.de>
parents: 3614
diff changeset
  2461
            n = (INT)STX_WSA_NOINT_CALL6("recvfrom", recvfrom, sock, buffer, objSize, _flags, (struct sockaddr *)&sa, &alen);
3614
a950d8f8c4ce #BUGFIX
Stefan Vogel <sv@exept.de>
parents: 3591
diff changeset
  2462
        } while ((n < 0) && (__threadErrno == EINTR));
a950d8f8c4ce #BUGFIX
Stefan Vogel <sv@exept.de>
parents: 3591
diff changeset
  2463
        if (n < 0) {
a950d8f8c4ce #BUGFIX
Stefan Vogel <sv@exept.de>
parents: 3591
diff changeset
  2464
            errno = __threadErrno;
a950d8f8c4ce #BUGFIX
Stefan Vogel <sv@exept.de>
parents: 3591
diff changeset
  2465
        }
a950d8f8c4ce #BUGFIX
Stefan Vogel <sv@exept.de>
parents: 3591
diff changeset
  2466
a950d8f8c4ce #BUGFIX
Stefan Vogel <sv@exept.de>
parents: 3591
diff changeset
  2467
        if (allocatedBuffer) {
a950d8f8c4ce #BUGFIX
Stefan Vogel <sv@exept.de>
parents: 3591
diff changeset
  2468
            if (n > 0) {
a950d8f8c4ce #BUGFIX
Stefan Vogel <sv@exept.de>
parents: 3591
diff changeset
  2469
                memcpy((char *)__InstPtr(aDataBuffer) + offs, allocatedBuffer, n);
a950d8f8c4ce #BUGFIX
Stefan Vogel <sv@exept.de>
parents: 3591
diff changeset
  2470
            }
a950d8f8c4ce #BUGFIX
Stefan Vogel <sv@exept.de>
parents: 3591
diff changeset
  2471
            free(allocatedBuffer);
a950d8f8c4ce #BUGFIX
Stefan Vogel <sv@exept.de>
parents: 3591
diff changeset
  2472
        }
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2473
# else
3614
a950d8f8c4ce #BUGFIX
Stefan Vogel <sv@exept.de>
parents: 3591
diff changeset
  2474
        __BEGIN_INTERRUPTABLE__
a950d8f8c4ce #BUGFIX
Stefan Vogel <sv@exept.de>
parents: 3591
diff changeset
  2475
        do {
a950d8f8c4ce #BUGFIX
Stefan Vogel <sv@exept.de>
parents: 3591
diff changeset
  2476
            alen = sizeof(sa);
a950d8f8c4ce #BUGFIX
Stefan Vogel <sv@exept.de>
parents: 3591
diff changeset
  2477
            if (extPtr) {
3615
ffe86e1b14ed #BUGFIX
Stefan Vogel <sv@exept.de>
parents: 3614
diff changeset
  2478
                n = recvfrom(sock, extPtr + offs, objSize, _flags, (struct sockaddr *) &sa, &alen);
3614
a950d8f8c4ce #BUGFIX
Stefan Vogel <sv@exept.de>
parents: 3591
diff changeset
  2479
            } else {
3615
ffe86e1b14ed #BUGFIX
Stefan Vogel <sv@exept.de>
parents: 3614
diff changeset
  2480
                n = recvfrom(sock, (char *)__InstPtr(aDataBuffer) + offs, objSize, _flags, (struct sockaddr *) &sa, &alen);
3614
a950d8f8c4ce #BUGFIX
Stefan Vogel <sv@exept.de>
parents: 3591
diff changeset
  2481
            }
a950d8f8c4ce #BUGFIX
Stefan Vogel <sv@exept.de>
parents: 3591
diff changeset
  2482
        } while ((n < 0) && (errno == EINTR));
a950d8f8c4ce #BUGFIX
Stefan Vogel <sv@exept.de>
parents: 3591
diff changeset
  2483
        __END_INTERRUPTABLE__
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2484
# endif
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2485
3614
a950d8f8c4ce #BUGFIX
Stefan Vogel <sv@exept.de>
parents: 3591
diff changeset
  2486
        if (n >= 0) {
a950d8f8c4ce #BUGFIX
Stefan Vogel <sv@exept.de>
parents: 3591
diff changeset
  2487
            if (__isNonNilObject(addr)) {
a950d8f8c4ce #BUGFIX
Stefan Vogel <sv@exept.de>
parents: 3591
diff changeset
  2488
                char *addrPtr;
a950d8f8c4ce #BUGFIX
Stefan Vogel <sv@exept.de>
parents: 3591
diff changeset
  2489
                OBJ oClass;
a950d8f8c4ce #BUGFIX
Stefan Vogel <sv@exept.de>
parents: 3591
diff changeset
  2490
                int nInstVars, nInstBytes, objSize;
a950d8f8c4ce #BUGFIX
Stefan Vogel <sv@exept.de>
parents: 3591
diff changeset
  2491
a950d8f8c4ce #BUGFIX
Stefan Vogel <sv@exept.de>
parents: 3591
diff changeset
  2492
                oClass = __qClass(addr);
a950d8f8c4ce #BUGFIX
Stefan Vogel <sv@exept.de>
parents: 3591
diff changeset
  2493
                if (! __isBytes(addr) )
a950d8f8c4ce #BUGFIX
Stefan Vogel <sv@exept.de>
parents: 3591
diff changeset
  2494
                    goto bad;
a950d8f8c4ce #BUGFIX
Stefan Vogel <sv@exept.de>
parents: 3591
diff changeset
  2495
                nInstVars = __intVal(__ClassInstPtr(oClass)->c_ninstvars);
a950d8f8c4ce #BUGFIX
Stefan Vogel <sv@exept.de>
parents: 3591
diff changeset
  2496
                nInstBytes = OHDR_SIZE + (nInstVars * sizeof(OBJ));
a950d8f8c4ce #BUGFIX
Stefan Vogel <sv@exept.de>
parents: 3591
diff changeset
  2497
                objSize = __qSize(addr) - nInstBytes;
a950d8f8c4ce #BUGFIX
Stefan Vogel <sv@exept.de>
parents: 3591
diff changeset
  2498
                addrPtr = (char *)__InstPtr(addr) + nInstBytes;
a950d8f8c4ce #BUGFIX
Stefan Vogel <sv@exept.de>
parents: 3591
diff changeset
  2499
                if (objSize < alen)
a950d8f8c4ce #BUGFIX
Stefan Vogel <sv@exept.de>
parents: 3591
diff changeset
  2500
                    goto bad;
a950d8f8c4ce #BUGFIX
Stefan Vogel <sv@exept.de>
parents: 3591
diff changeset
  2501
a950d8f8c4ce #BUGFIX
Stefan Vogel <sv@exept.de>
parents: 3591
diff changeset
  2502
                /*
a950d8f8c4ce #BUGFIX
Stefan Vogel <sv@exept.de>
parents: 3591
diff changeset
  2503
                 * extract the datagrams address
a950d8f8c4ce #BUGFIX
Stefan Vogel <sv@exept.de>
parents: 3591
diff changeset
  2504
                 */
a950d8f8c4ce #BUGFIX
Stefan Vogel <sv@exept.de>
parents: 3591
diff changeset
  2505
                memcpy(addrPtr, (char *)&sa, alen);
a950d8f8c4ce #BUGFIX
Stefan Vogel <sv@exept.de>
parents: 3591
diff changeset
  2506
                addrLen = __MKSMALLINT(alen);
a950d8f8c4ce #BUGFIX
Stefan Vogel <sv@exept.de>
parents: 3591
diff changeset
  2507
            }
a950d8f8c4ce #BUGFIX
Stefan Vogel <sv@exept.de>
parents: 3591
diff changeset
  2508
        }
a950d8f8c4ce #BUGFIX
Stefan Vogel <sv@exept.de>
parents: 3591
diff changeset
  2509
        if (n < 0) {
a950d8f8c4ce #BUGFIX
Stefan Vogel <sv@exept.de>
parents: 3591
diff changeset
  2510
            error = __INST(lastErrorNumber) = __MKSMALLINT(errno);
a950d8f8c4ce #BUGFIX
Stefan Vogel <sv@exept.de>
parents: 3591
diff changeset
  2511
        }
a950d8f8c4ce #BUGFIX
Stefan Vogel <sv@exept.de>
parents: 3591
diff changeset
  2512
        nReceived = __MKSMALLINT(n);
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2513
    }
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2514
#endif
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2515
bad: ;
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2516
%}.
3126
d95cc55a4fb5 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3123
diff changeset
  2517
    error notNil ifTrue:[
3614
a950d8f8c4ce #BUGFIX
Stefan Vogel <sv@exept.de>
parents: 3591
diff changeset
  2518
        ^ self readError:error.
3126
d95cc55a4fb5 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3123
diff changeset
  2519
    ].
d95cc55a4fb5 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3123
diff changeset
  2520
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2521
    nReceived notNil ifTrue:[
3614
a950d8f8c4ce #BUGFIX
Stefan Vogel <sv@exept.de>
parents: 3591
diff changeset
  2522
        addrLen notNil ifTrue:[
a950d8f8c4ce #BUGFIX
Stefan Vogel <sv@exept.de>
parents: 3591
diff changeset
  2523
            (addr == anAddressBuffer) ifFalse:[
a950d8f8c4ce #BUGFIX
Stefan Vogel <sv@exept.de>
parents: 3591
diff changeset
  2524
                self obsoleteFeatureWarning:'please use a socketAddress argument'.
a950d8f8c4ce #BUGFIX
Stefan Vogel <sv@exept.de>
parents: 3591
diff changeset
  2525
a950d8f8c4ce #BUGFIX
Stefan Vogel <sv@exept.de>
parents: 3591
diff changeset
  2526
                "can be a ByteArray for backward compatibility"
a950d8f8c4ce #BUGFIX
Stefan Vogel <sv@exept.de>
parents: 3591
diff changeset
  2527
                anAddressBuffer replaceFrom:1 to:addrLen with:(addr hostAddress).
a950d8f8c4ce #BUGFIX
Stefan Vogel <sv@exept.de>
parents: 3591
diff changeset
  2528
            ].
a950d8f8c4ce #BUGFIX
Stefan Vogel <sv@exept.de>
parents: 3591
diff changeset
  2529
        ].
a950d8f8c4ce #BUGFIX
Stefan Vogel <sv@exept.de>
parents: 3591
diff changeset
  2530
        ^ nReceived
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2531
    ].
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2532
    "
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2533
     arrive here if you try to receive into an invalid buffer
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2534
     (i.e. not ByteArray-like),
1485
d8578cf3504b gcc3.3.1 insn-scheduler bug workaround
Claus Gittinger <cg@exept.de>
parents: 1474
diff changeset
  2535
     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
  2536
     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
  2537
    "
126
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
  2538
    self primitiveFailed
116
7789fb1c9fa2 more UD socket fixes (at least client side seems to work now)
Claus Gittinger <cg@exept.de>
parents: 115
diff changeset
  2539
!
7789fb1c9fa2 more UD socket fixes (at least client side seems to work now)
Claus Gittinger <cg@exept.de>
parents: 115
diff changeset
  2540
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2541
sendBuffer:aDataBuffer start:startIndex for:nBytes flags:flags
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2542
    "send data.
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2543
     Both must be ByteArray-like. The bytes in the addressBuffer must
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2544
     be a valid address for my domain (i.e. for inet, a 4-byte byteArray).
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2545
     Return the number of bytes transmitted, or a negative number on error.
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2546
     On error, the unix error code is left in the lastErrorNumber
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2547
     instance variable."
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2548
3126
d95cc55a4fb5 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3123
diff changeset
  2549
    |error|
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2550
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2551
%{
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2552
#ifndef NO_SOCKET
2321
6f4cc7b644db filePointer -> handle migration
Claus Gittinger <cg@exept.de>
parents: 2308
diff changeset
  2553
    OBJ fp = __INST(handle);
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2554
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2555
    if ((fp != nil)
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2556
     && __isSmallInteger(startIndex)
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2557
     && __isSmallInteger(nBytes)) {
3615
ffe86e1b14ed #BUGFIX
Stefan Vogel <sv@exept.de>
parents: 3614
diff changeset
  2558
        SOCKET sock;
ffe86e1b14ed #BUGFIX
Stefan Vogel <sv@exept.de>
parents: 3614
diff changeset
  2559
        INT objSize, n, offs;
ffe86e1b14ed #BUGFIX
Stefan Vogel <sv@exept.de>
parents: 3614
diff changeset
  2560
        char *extPtr;
ffe86e1b14ed #BUGFIX
Stefan Vogel <sv@exept.de>
parents: 3614
diff changeset
  2561
        int _flags = __longIntVal(flags);
ffe86e1b14ed #BUGFIX
Stefan Vogel <sv@exept.de>
parents: 3614
diff changeset
  2562
        unsigned long norder;
ffe86e1b14ed #BUGFIX
Stefan Vogel <sv@exept.de>
parents: 3614
diff changeset
  2563
        unsigned char *buffer, *allocatedBuffer = NULL;
ffe86e1b14ed #BUGFIX
Stefan Vogel <sv@exept.de>
parents: 3614
diff changeset
  2564
ffe86e1b14ed #BUGFIX
Stefan Vogel <sv@exept.de>
parents: 3614
diff changeset
  2565
        sock = SOCKET_FROM_FILE_OBJECT(fp);
ffe86e1b14ed #BUGFIX
Stefan Vogel <sv@exept.de>
parents: 3614
diff changeset
  2566
ffe86e1b14ed #BUGFIX
Stefan Vogel <sv@exept.de>
parents: 3614
diff changeset
  2567
        if (! setupBufferParameters(aDataBuffer, startIndex, &extPtr, &offs, &objSize)) goto bad;
ffe86e1b14ed #BUGFIX
Stefan Vogel <sv@exept.de>
parents: 3614
diff changeset
  2568
        if (__isSmallInteger(nBytes)) {
ffe86e1b14ed #BUGFIX
Stefan Vogel <sv@exept.de>
parents: 3614
diff changeset
  2569
            if (__intVal(nBytes) < objSize) {
ffe86e1b14ed #BUGFIX
Stefan Vogel <sv@exept.de>
parents: 3614
diff changeset
  2570
                objSize = __intVal(nBytes);
ffe86e1b14ed #BUGFIX
Stefan Vogel <sv@exept.de>
parents: 3614
diff changeset
  2571
            }
ffe86e1b14ed #BUGFIX
Stefan Vogel <sv@exept.de>
parents: 3614
diff changeset
  2572
        }
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2573
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2574
# ifdef DGRAM_DEBUG
3615
ffe86e1b14ed #BUGFIX
Stefan Vogel <sv@exept.de>
parents: 3614
diff changeset
  2575
        console_printf("sending %d bytes ...\n", nBytes);
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2576
# endif
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2577
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2578
#ifdef DO_WRAP_CALLS
3615
ffe86e1b14ed #BUGFIX
Stefan Vogel <sv@exept.de>
parents: 3614
diff changeset
  2579
        if (extPtr) {
ffe86e1b14ed #BUGFIX
Stefan Vogel <sv@exept.de>
parents: 3614
diff changeset
  2580
            buffer = extPtr + offs;
ffe86e1b14ed #BUGFIX
Stefan Vogel <sv@exept.de>
parents: 3614
diff changeset
  2581
        } else {
ffe86e1b14ed #BUGFIX
Stefan Vogel <sv@exept.de>
parents: 3614
diff changeset
  2582
            allocatedBuffer = buffer = (char *)malloc(objSize);
ffe86e1b14ed #BUGFIX
Stefan Vogel <sv@exept.de>
parents: 3614
diff changeset
  2583
            bcopy((char *)__InstPtr(aDataBuffer) + offs, allocatedBuffer, objSize);
ffe86e1b14ed #BUGFIX
Stefan Vogel <sv@exept.de>
parents: 3614
diff changeset
  2584
        }
ffe86e1b14ed #BUGFIX
Stefan Vogel <sv@exept.de>
parents: 3614
diff changeset
  2585
ffe86e1b14ed #BUGFIX
Stefan Vogel <sv@exept.de>
parents: 3614
diff changeset
  2586
        do {
ffe86e1b14ed #BUGFIX
Stefan Vogel <sv@exept.de>
parents: 3614
diff changeset
  2587
            __threadErrno = 0;
ffe86e1b14ed #BUGFIX
Stefan Vogel <sv@exept.de>
parents: 3614
diff changeset
  2588
            n = (INT)STX_WSA_NOINT_CALL4("send", send, sock, buffer, objSize, _flags);
ffe86e1b14ed #BUGFIX
Stefan Vogel <sv@exept.de>
parents: 3614
diff changeset
  2589
        } while ((n < 0) && (__threadErrno == EINTR));
ffe86e1b14ed #BUGFIX
Stefan Vogel <sv@exept.de>
parents: 3614
diff changeset
  2590
        if (n < 0) {
ffe86e1b14ed #BUGFIX
Stefan Vogel <sv@exept.de>
parents: 3614
diff changeset
  2591
            errno = __threadErrno;
ffe86e1b14ed #BUGFIX
Stefan Vogel <sv@exept.de>
parents: 3614
diff changeset
  2592
        }
ffe86e1b14ed #BUGFIX
Stefan Vogel <sv@exept.de>
parents: 3614
diff changeset
  2593
ffe86e1b14ed #BUGFIX
Stefan Vogel <sv@exept.de>
parents: 3614
diff changeset
  2594
        if (allocatedBuffer) {
ffe86e1b14ed #BUGFIX
Stefan Vogel <sv@exept.de>
parents: 3614
diff changeset
  2595
            free(allocatedBuffer);
ffe86e1b14ed #BUGFIX
Stefan Vogel <sv@exept.de>
parents: 3614
diff changeset
  2596
        }
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2597
#else
3615
ffe86e1b14ed #BUGFIX
Stefan Vogel <sv@exept.de>
parents: 3614
diff changeset
  2598
        __BEGIN_INTERRUPTABLE__
ffe86e1b14ed #BUGFIX
Stefan Vogel <sv@exept.de>
parents: 3614
diff changeset
  2599
        do {
ffe86e1b14ed #BUGFIX
Stefan Vogel <sv@exept.de>
parents: 3614
diff changeset
  2600
            if (extPtr) {
ffe86e1b14ed #BUGFIX
Stefan Vogel <sv@exept.de>
parents: 3614
diff changeset
  2601
                n = send(sock, extPtr + offs, objSize, _flags);
ffe86e1b14ed #BUGFIX
Stefan Vogel <sv@exept.de>
parents: 3614
diff changeset
  2602
            } else {
ffe86e1b14ed #BUGFIX
Stefan Vogel <sv@exept.de>
parents: 3614
diff changeset
  2603
                n = send(sock, (char *)__InstPtr(aDataBuffer) + offs, objSize, _flags);
ffe86e1b14ed #BUGFIX
Stefan Vogel <sv@exept.de>
parents: 3614
diff changeset
  2604
            }
ffe86e1b14ed #BUGFIX
Stefan Vogel <sv@exept.de>
parents: 3614
diff changeset
  2605
        } while ((n < 0) && (errno == EINTR));
ffe86e1b14ed #BUGFIX
Stefan Vogel <sv@exept.de>
parents: 3614
diff changeset
  2606
        __END_INTERRUPTABLE__
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2607
#endif
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2608
3615
ffe86e1b14ed #BUGFIX
Stefan Vogel <sv@exept.de>
parents: 3614
diff changeset
  2609
        if (n < 0) {
ffe86e1b14ed #BUGFIX
Stefan Vogel <sv@exept.de>
parents: 3614
diff changeset
  2610
            error = __INST(lastErrorNumber) = __MKSMALLINT(errno);
ffe86e1b14ed #BUGFIX
Stefan Vogel <sv@exept.de>
parents: 3614
diff changeset
  2611
        } else {
ffe86e1b14ed #BUGFIX
Stefan Vogel <sv@exept.de>
parents: 3614
diff changeset
  2612
            RETURN (__MKSMALLINT(n));
ffe86e1b14ed #BUGFIX
Stefan Vogel <sv@exept.de>
parents: 3614
diff changeset
  2613
        }
915
3dc0e3cd838a added interface to send() and recv()
Claus Gittinger <cg@exept.de>
parents: 898
diff changeset
  2614
    }
3dc0e3cd838a added interface to send() and recv()
Claus Gittinger <cg@exept.de>
parents: 898
diff changeset
  2615
#endif
3dc0e3cd838a added interface to send() and recv()
Claus Gittinger <cg@exept.de>
parents: 898
diff changeset
  2616
bad: ;
3dc0e3cd838a added interface to send() and recv()
Claus Gittinger <cg@exept.de>
parents: 898
diff changeset
  2617
%}.
3126
d95cc55a4fb5 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3123
diff changeset
  2618
    error notNil ifTrue:[
3615
ffe86e1b14ed #BUGFIX
Stefan Vogel <sv@exept.de>
parents: 3614
diff changeset
  2619
        self writeError:error.
3126
d95cc55a4fb5 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3123
diff changeset
  2620
    ].
d95cc55a4fb5 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3123
diff changeset
  2621
915
3dc0e3cd838a added interface to send() and recv()
Claus Gittinger <cg@exept.de>
parents: 898
diff changeset
  2622
    "
1485
d8578cf3504b gcc3.3.1 insn-scheduler bug workaround
Claus Gittinger <cg@exept.de>
parents: 1474
diff changeset
  2623
     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
  2624
    "
3dc0e3cd838a added interface to send() and recv()
Claus Gittinger <cg@exept.de>
parents: 898
diff changeset
  2625
    self primitiveFailed
3dc0e3cd838a added interface to send() and recv()
Claus Gittinger <cg@exept.de>
parents: 898
diff changeset
  2626
!
3dc0e3cd838a added interface to send() and recv()
Claus Gittinger <cg@exept.de>
parents: 898
diff changeset
  2627
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2628
sendTo:anAddressBuffer buffer:buffer
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2629
    "send datagramm data - fetch address of destination host from
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2630
     anAddressBuffer, data from aDataBuffer.
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2631
     Both must be ByteArray-like. The bytes in the addressBuffer must
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2632
     be a valid address for my domain (i.e. for inet, a 4-byte byteArray).
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2633
     Return the number of bytes transmitted, or a negative number on error.
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2634
     On error, the unix error code is left in the lastErrorNumber
126
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
  2635
     instance variable.
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
  2636
     Flags is currently ignored; it is there for ST-80 compatibility."
116
7789fb1c9fa2 more UD socket fixes (at least client side seems to work now)
Claus Gittinger <cg@exept.de>
parents: 115
diff changeset
  2637
1485
d8578cf3504b gcc3.3.1 insn-scheduler bug workaround
Claus Gittinger <cg@exept.de>
parents: 1474
diff changeset
  2638
    ^ self sendTo:anAddressBuffer buffer:buffer start:1 for:buffer size flags:0
116
7789fb1c9fa2 more UD socket fixes (at least client side seems to work now)
Claus Gittinger <cg@exept.de>
parents: 115
diff changeset
  2639
!
7789fb1c9fa2 more UD socket fixes (at least client side seems to work now)
Claus Gittinger <cg@exept.de>
parents: 115
diff changeset
  2640
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2641
sendTo:anAddressBuffer buffer:buffer start:startIndex for:count
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2642
    "send datagramm data - fetch address of destination host from
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2643
     anAddressBuffer, data from aDataBuffer.
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2644
     Both must be ByteArray-like. The bytes in the addressBuffer must
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2645
     be a valid address for my domain (i.e. for inet, a 4-byte byteArray).
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2646
     Return the number of bytes transmitted, or a negative number on error.
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2647
     On error, the unix error code is left in the lastErrorNumber
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2648
     instance variable.
817
eda0065cbd47 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 814
diff changeset
  2649
     Flags is currently ignored; it is there for ST-80 compatibility."
eda0065cbd47 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 814
diff changeset
  2650
1485
d8578cf3504b gcc3.3.1 insn-scheduler bug workaround
Claus Gittinger <cg@exept.de>
parents: 1474
diff changeset
  2651
    ^ self sendTo:anAddressBuffer buffer:buffer start:startIndex for:count flags:0
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2652
!
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2653
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2654
sendTo:anAddressBuffer buffer:aDataBuffer start:startIndex for:nBytes flags:flags
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2655
    "send datagramm data - fetch address of destination host from
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2656
     anAddressBuffer, data from aDataBuffer starting at startIndex,
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2657
     sending count bytes.
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2658
     Both must be ByteArray-like. The bytes in the addressBuffer must
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2659
     be a valid address for my domain (i.e. for inet, a 4-byte byteArray).
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2660
     Return the number of bytes transmitted, or a negative number on error.
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2661
     On error, the unix error code is left in the lastErrorNumber
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2662
     instance variable."
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2663
3126
d95cc55a4fb5 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3123
diff changeset
  2664
    |domainClass addr error|
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2665
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2666
    (anAddressBuffer isKindOf:SocketAddress) ifTrue:[
3615
ffe86e1b14ed #BUGFIX
Stefan Vogel <sv@exept.de>
parents: 3614
diff changeset
  2667
        addr := anAddressBuffer.
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2668
    ] ifFalse:[
3615
ffe86e1b14ed #BUGFIX
Stefan Vogel <sv@exept.de>
parents: 3614
diff changeset
  2669
        anAddressBuffer isByteArray ifFalse:[
ffe86e1b14ed #BUGFIX
Stefan Vogel <sv@exept.de>
parents: 3614
diff changeset
  2670
            ^ self error:'bad socketAddress argument'
ffe86e1b14ed #BUGFIX
Stefan Vogel <sv@exept.de>
parents: 3614
diff changeset
  2671
        ].
ffe86e1b14ed #BUGFIX
Stefan Vogel <sv@exept.de>
parents: 3614
diff changeset
  2672
        domainClass := self class socketAddressClassForDomain:domain.
ffe86e1b14ed #BUGFIX
Stefan Vogel <sv@exept.de>
parents: 3614
diff changeset
  2673
        domainClass isNil ifTrue:[
ffe86e1b14ed #BUGFIX
Stefan Vogel <sv@exept.de>
parents: 3614
diff changeset
  2674
            ^ self error:'invalid (unsupported) domain'.
ffe86e1b14ed #BUGFIX
Stefan Vogel <sv@exept.de>
parents: 3614
diff changeset
  2675
        ].
ffe86e1b14ed #BUGFIX
Stefan Vogel <sv@exept.de>
parents: 3614
diff changeset
  2676
        addr := domainClass hostAddress:anAddressBuffer.
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2677
    ].
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2678
%{
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2679
#ifndef NO_SOCKET
2321
6f4cc7b644db filePointer -> handle migration
Claus Gittinger <cg@exept.de>
parents: 2308
diff changeset
  2680
    OBJ fp = __INST(handle);
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2681
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2682
    if ((fp != nil)
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2683
     && __isSmallInteger(startIndex)
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2684
     && __isSmallInteger(nBytes)) {
3615
ffe86e1b14ed #BUGFIX
Stefan Vogel <sv@exept.de>
parents: 3614
diff changeset
  2685
        SOCKET sock;
ffe86e1b14ed #BUGFIX
Stefan Vogel <sv@exept.de>
parents: 3614
diff changeset
  2686
        INT objSize;
ffe86e1b14ed #BUGFIX
Stefan Vogel <sv@exept.de>
parents: 3614
diff changeset
  2687
        struct sockaddr *sockaddr_ptr;
ffe86e1b14ed #BUGFIX
Stefan Vogel <sv@exept.de>
parents: 3614
diff changeset
  2688
        union sockaddr_u sa;
ffe86e1b14ed #BUGFIX
Stefan Vogel <sv@exept.de>
parents: 3614
diff changeset
  2689
        socklen_t sockaddr_size, alen = 0;
ffe86e1b14ed #BUGFIX
Stefan Vogel <sv@exept.de>
parents: 3614
diff changeset
  2690
        INT sockAddrOffs; 
ffe86e1b14ed #BUGFIX
Stefan Vogel <sv@exept.de>
parents: 3614
diff changeset
  2691
        INT n, offs;
ffe86e1b14ed #BUGFIX
Stefan Vogel <sv@exept.de>
parents: 3614
diff changeset
  2692
        char *extPtr;
ffe86e1b14ed #BUGFIX
Stefan Vogel <sv@exept.de>
parents: 3614
diff changeset
  2693
        int _flags = __longIntVal(flags);
ffe86e1b14ed #BUGFIX
Stefan Vogel <sv@exept.de>
parents: 3614
diff changeset
  2694
        unsigned long norder;
ffe86e1b14ed #BUGFIX
Stefan Vogel <sv@exept.de>
parents: 3614
diff changeset
  2695
        unsigned char *buffer;
ffe86e1b14ed #BUGFIX
Stefan Vogel <sv@exept.de>
parents: 3614
diff changeset
  2696
        unsigned char *allocatedBuffer = NULL;
ffe86e1b14ed #BUGFIX
Stefan Vogel <sv@exept.de>
parents: 3614
diff changeset
  2697
ffe86e1b14ed #BUGFIX
Stefan Vogel <sv@exept.de>
parents: 3614
diff changeset
  2698
        sock = SOCKET_FROM_FILE_OBJECT(fp);
ffe86e1b14ed #BUGFIX
Stefan Vogel <sv@exept.de>
parents: 3614
diff changeset
  2699
ffe86e1b14ed #BUGFIX
Stefan Vogel <sv@exept.de>
parents: 3614
diff changeset
  2700
        if (! __isBytes(addr)) {
ffe86e1b14ed #BUGFIX
Stefan Vogel <sv@exept.de>
parents: 3614
diff changeset
  2701
            sockaddr_size = 0;
ffe86e1b14ed #BUGFIX
Stefan Vogel <sv@exept.de>
parents: 3614
diff changeset
  2702
            sockaddr_ptr = (struct sockaddr *)0;
ffe86e1b14ed #BUGFIX
Stefan Vogel <sv@exept.de>
parents: 3614
diff changeset
  2703
        } else {
ffe86e1b14ed #BUGFIX
Stefan Vogel <sv@exept.de>
parents: 3614
diff changeset
  2704
            int nIndex;
ffe86e1b14ed #BUGFIX
Stefan Vogel <sv@exept.de>
parents: 3614
diff changeset
  2705
            OBJ cls;
ffe86e1b14ed #BUGFIX
Stefan Vogel <sv@exept.de>
parents: 3614
diff changeset
  2706
ffe86e1b14ed #BUGFIX
Stefan Vogel <sv@exept.de>
parents: 3614
diff changeset
  2707
            sockAddrOffs = 0;
ffe86e1b14ed #BUGFIX
Stefan Vogel <sv@exept.de>
parents: 3614
diff changeset
  2708
            if ((cls = __qClass(addr)) != @global(ByteArray))
ffe86e1b14ed #BUGFIX
Stefan Vogel <sv@exept.de>
parents: 3614
diff changeset
  2709
                sockAddrOffs += __OBJS2BYTES__(__intVal(__ClassInstPtr(cls)->c_ninstvars));
ffe86e1b14ed #BUGFIX
Stefan Vogel <sv@exept.de>
parents: 3614
diff changeset
  2710
            nIndex = __qSize(addr) - OHDR_SIZE;
ffe86e1b14ed #BUGFIX
Stefan Vogel <sv@exept.de>
parents: 3614
diff changeset
  2711
            sockaddr_size = nIndex - sockAddrOffs;
ffe86e1b14ed #BUGFIX
Stefan Vogel <sv@exept.de>
parents: 3614
diff changeset
  2712
            if (sockaddr_size > sizeof(sa)) {
ffe86e1b14ed #BUGFIX
Stefan Vogel <sv@exept.de>
parents: 3614
diff changeset
  2713
                console_fprintf(stderr, "Socket [warning]: bad socketAddr\n");
ffe86e1b14ed #BUGFIX
Stefan Vogel <sv@exept.de>
parents: 3614
diff changeset
  2714
                goto bad;
ffe86e1b14ed #BUGFIX
Stefan Vogel <sv@exept.de>
parents: 3614
diff changeset
  2715
            }
ffe86e1b14ed #BUGFIX
Stefan Vogel <sv@exept.de>
parents: 3614
diff changeset
  2716
            memcpy(&sa, (__byteArrayVal(addr) + sockAddrOffs), sockaddr_size);
ffe86e1b14ed #BUGFIX
Stefan Vogel <sv@exept.de>
parents: 3614
diff changeset
  2717
            sockaddr_ptr = (struct sockaddr *)(&sa);
ffe86e1b14ed #BUGFIX
Stefan Vogel <sv@exept.de>
parents: 3614
diff changeset
  2718
        }
ffe86e1b14ed #BUGFIX
Stefan Vogel <sv@exept.de>
parents: 3614
diff changeset
  2719
ffe86e1b14ed #BUGFIX
Stefan Vogel <sv@exept.de>
parents: 3614
diff changeset
  2720
        if (! setupBufferParameters(aDataBuffer, startIndex, &extPtr, &offs, &objSize)) goto bad;
ffe86e1b14ed #BUGFIX
Stefan Vogel <sv@exept.de>
parents: 3614
diff changeset
  2721
        if (__isSmallInteger(nBytes)) {
ffe86e1b14ed #BUGFIX
Stefan Vogel <sv@exept.de>
parents: 3614
diff changeset
  2722
            if (__intVal(nBytes) < objSize) {
ffe86e1b14ed #BUGFIX
Stefan Vogel <sv@exept.de>
parents: 3614
diff changeset
  2723
                objSize = __intVal(nBytes);
ffe86e1b14ed #BUGFIX
Stefan Vogel <sv@exept.de>
parents: 3614
diff changeset
  2724
            }
ffe86e1b14ed #BUGFIX
Stefan Vogel <sv@exept.de>
parents: 3614
diff changeset
  2725
        }
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2726
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2727
#ifdef DO_WRAP_CALLS
3615
ffe86e1b14ed #BUGFIX
Stefan Vogel <sv@exept.de>
parents: 3614
diff changeset
  2728
        if (extPtr) {
ffe86e1b14ed #BUGFIX
Stefan Vogel <sv@exept.de>
parents: 3614
diff changeset
  2729
            buffer = extPtr + offs;
ffe86e1b14ed #BUGFIX
Stefan Vogel <sv@exept.de>
parents: 3614
diff changeset
  2730
        } else {
ffe86e1b14ed #BUGFIX
Stefan Vogel <sv@exept.de>
parents: 3614
diff changeset
  2731
            allocatedBuffer = buffer = (char *)malloc(objSize);
ffe86e1b14ed #BUGFIX
Stefan Vogel <sv@exept.de>
parents: 3614
diff changeset
  2732
            bcopy((char *)__InstPtr(aDataBuffer) + offs, allocatedBuffer, objSize);
ffe86e1b14ed #BUGFIX
Stefan Vogel <sv@exept.de>
parents: 3614
diff changeset
  2733
        }
ffe86e1b14ed #BUGFIX
Stefan Vogel <sv@exept.de>
parents: 3614
diff changeset
  2734
ffe86e1b14ed #BUGFIX
Stefan Vogel <sv@exept.de>
parents: 3614
diff changeset
  2735
        do {
ffe86e1b14ed #BUGFIX
Stefan Vogel <sv@exept.de>
parents: 3614
diff changeset
  2736
            __threadErrno = 0;
ffe86e1b14ed #BUGFIX
Stefan Vogel <sv@exept.de>
parents: 3614
diff changeset
  2737
            n = (INT)STX_WSA_NOINT_CALL6("sendto", sendto, sock, buffer, objSize, _flags, sockaddr_ptr, sockaddr_size);
ffe86e1b14ed #BUGFIX
Stefan Vogel <sv@exept.de>
parents: 3614
diff changeset
  2738
        } while ((n < 0) && (__threadErrno == EINTR));
ffe86e1b14ed #BUGFIX
Stefan Vogel <sv@exept.de>
parents: 3614
diff changeset
  2739
        if (n < 0) {
ffe86e1b14ed #BUGFIX
Stefan Vogel <sv@exept.de>
parents: 3614
diff changeset
  2740
            errno = __threadErrno;
ffe86e1b14ed #BUGFIX
Stefan Vogel <sv@exept.de>
parents: 3614
diff changeset
  2741
        }
ffe86e1b14ed #BUGFIX
Stefan Vogel <sv@exept.de>
parents: 3614
diff changeset
  2742
ffe86e1b14ed #BUGFIX
Stefan Vogel <sv@exept.de>
parents: 3614
diff changeset
  2743
        if (allocatedBuffer) {
ffe86e1b14ed #BUGFIX
Stefan Vogel <sv@exept.de>
parents: 3614
diff changeset
  2744
            free(allocatedBuffer);
ffe86e1b14ed #BUGFIX
Stefan Vogel <sv@exept.de>
parents: 3614
diff changeset
  2745
        }
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2746
#else
3615
ffe86e1b14ed #BUGFIX
Stefan Vogel <sv@exept.de>
parents: 3614
diff changeset
  2747
        __BEGIN_INTERRUPTABLE__
ffe86e1b14ed #BUGFIX
Stefan Vogel <sv@exept.de>
parents: 3614
diff changeset
  2748
        do {
ffe86e1b14ed #BUGFIX
Stefan Vogel <sv@exept.de>
parents: 3614
diff changeset
  2749
            if (extPtr) {
ffe86e1b14ed #BUGFIX
Stefan Vogel <sv@exept.de>
parents: 3614
diff changeset
  2750
                n = sendto(sock, extPtr + offs, objSize, _flags, sockaddr_ptr, sockaddr_size);
ffe86e1b14ed #BUGFIX
Stefan Vogel <sv@exept.de>
parents: 3614
diff changeset
  2751
            } else {
ffe86e1b14ed #BUGFIX
Stefan Vogel <sv@exept.de>
parents: 3614
diff changeset
  2752
                n = sendto(sock, (char *)__InstPtr(aDataBuffer) + offs, objSize, _flags, sockaddr_ptr, sockaddr_size);
ffe86e1b14ed #BUGFIX
Stefan Vogel <sv@exept.de>
parents: 3614
diff changeset
  2753
            }
ffe86e1b14ed #BUGFIX
Stefan Vogel <sv@exept.de>
parents: 3614
diff changeset
  2754
        } while ((n < 0) && (errno == EINTR));
ffe86e1b14ed #BUGFIX
Stefan Vogel <sv@exept.de>
parents: 3614
diff changeset
  2755
        __END_INTERRUPTABLE__
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2756
#endif
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2757
3615
ffe86e1b14ed #BUGFIX
Stefan Vogel <sv@exept.de>
parents: 3614
diff changeset
  2758
        if (n < 0) {
ffe86e1b14ed #BUGFIX
Stefan Vogel <sv@exept.de>
parents: 3614
diff changeset
  2759
            error = __INST(lastErrorNumber) = __MKSMALLINT(errno);
ffe86e1b14ed #BUGFIX
Stefan Vogel <sv@exept.de>
parents: 3614
diff changeset
  2760
        } else {
ffe86e1b14ed #BUGFIX
Stefan Vogel <sv@exept.de>
parents: 3614
diff changeset
  2761
            RETURN (__MKSMALLINT(n));
ffe86e1b14ed #BUGFIX
Stefan Vogel <sv@exept.de>
parents: 3614
diff changeset
  2762
        }
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2763
    }
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2764
#endif
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2765
bad: ;
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2766
%}.
3126
d95cc55a4fb5 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3123
diff changeset
  2767
    error notNil ifTrue:[
3615
ffe86e1b14ed #BUGFIX
Stefan Vogel <sv@exept.de>
parents: 3614
diff changeset
  2768
        self writeError:error.
3126
d95cc55a4fb5 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3123
diff changeset
  2769
    ].
d95cc55a4fb5 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3123
diff changeset
  2770
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2771
    "
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2772
     arrive here if you try to send from an invalid buffer
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2773
     (i.e. not ByteArray-like),
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2774
     or if the addressBuffer is nonNil AND not a ByteArray/String
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2775
     or if the addressBuffer is nonNil AND too small.
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2776
    "
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2777
    self primitiveFailed
0
1cf8d1747859 Initial revision
claus
parents:
diff changeset
  2778
! !
1cf8d1747859 Initial revision
claus
parents:
diff changeset
  2779
3484
ccd8683e4e7e class: Socket
Claus Gittinger <cg@exept.de>
parents: 3481
diff changeset
  2780
!Socket methodsFor:'initialization'!
ccd8683e4e7e class: Socket
Claus Gittinger <cg@exept.de>
parents: 3481
diff changeset
  2781
ccd8683e4e7e class: Socket
Claus Gittinger <cg@exept.de>
parents: 3481
diff changeset
  2782
initialize
ccd8683e4e7e class: Socket
Claus Gittinger <cg@exept.de>
parents: 3481
diff changeset
  2783
    super initialize.
ccd8683e4e7e class: Socket
Claus Gittinger <cg@exept.de>
parents: 3481
diff changeset
  2784
    "/ transparent
ccd8683e4e7e class: Socket
Claus Gittinger <cg@exept.de>
parents: 3481
diff changeset
  2785
    eolMode := nil.
ccd8683e4e7e class: Socket
Claus Gittinger <cg@exept.de>
parents: 3481
diff changeset
  2786
! !
ccd8683e4e7e class: Socket
Claus Gittinger <cg@exept.de>
parents: 3481
diff changeset
  2787
3246
c75a006f9a7a Win32 sockets use handles instead of file pointers
Stefan Vogel <sv@exept.de>
parents: 3224
diff changeset
  2788
!Socket protectedMethodsFor:'low level'!
c75a006f9a7a Win32 sockets use handles instead of file pointers
Stefan Vogel <sv@exept.de>
parents: 3224
diff changeset
  2789
c75a006f9a7a Win32 sockets use handles instead of file pointers
Stefan Vogel <sv@exept.de>
parents: 3224
diff changeset
  2790
closeFile
c75a006f9a7a Win32 sockets use handles instead of file pointers
Stefan Vogel <sv@exept.de>
parents: 3224
diff changeset
  2791
    "low level close - may be redefined in subclasses
c75a006f9a7a Win32 sockets use handles instead of file pointers
Stefan Vogel <sv@exept.de>
parents: 3224
diff changeset
  2792
     Don't send this message, send #close instead"
c75a006f9a7a Win32 sockets use handles instead of file pointers
Stefan Vogel <sv@exept.de>
parents: 3224
diff changeset
  2793
c75a006f9a7a Win32 sockets use handles instead of file pointers
Stefan Vogel <sv@exept.de>
parents: 3224
diff changeset
  2794
    |fp error|
c75a006f9a7a Win32 sockets use handles instead of file pointers
Stefan Vogel <sv@exept.de>
parents: 3224
diff changeset
  2795
c75a006f9a7a Win32 sockets use handles instead of file pointers
Stefan Vogel <sv@exept.de>
parents: 3224
diff changeset
  2796
    fp := handle.
c75a006f9a7a Win32 sockets use handles instead of file pointers
Stefan Vogel <sv@exept.de>
parents: 3224
diff changeset
  2797
c75a006f9a7a Win32 sockets use handles instead of file pointers
Stefan Vogel <sv@exept.de>
parents: 3224
diff changeset
  2798
%{
c75a006f9a7a Win32 sockets use handles instead of file pointers
Stefan Vogel <sv@exept.de>
parents: 3224
diff changeset
  2799
    int rslt;
c75a006f9a7a Win32 sockets use handles instead of file pointers
Stefan Vogel <sv@exept.de>
parents: 3224
diff changeset
  2800
c75a006f9a7a Win32 sockets use handles instead of file pointers
Stefan Vogel <sv@exept.de>
parents: 3224
diff changeset
  2801
    if (fp == nil) {
3467
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
  2802
	error = @symbol(errorNotOpen);
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
  2803
	goto out;
3246
c75a006f9a7a Win32 sockets use handles instead of file pointers
Stefan Vogel <sv@exept.de>
parents: 3224
diff changeset
  2804
    }
c75a006f9a7a Win32 sockets use handles instead of file pointers
Stefan Vogel <sv@exept.de>
parents: 3224
diff changeset
  2805
c75a006f9a7a Win32 sockets use handles instead of file pointers
Stefan Vogel <sv@exept.de>
parents: 3224
diff changeset
  2806
    if (__INST(handleType) == @symbol(socketHandle)) {
3467
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
  2807
	SOCKET socket = SOCKET_FROM_FILE_OBJECT(fp);
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
  2808
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
  2809
	if (@global(FileOpenTrace) == true) {
3591
71ce2d98b99d *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3590
diff changeset
  2810
	    console_fprintf(stderr, "close socket [ExternalStream] %"_lx_"\n", socket);
3467
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
  2811
	}
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
  2812
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
  2813
	// whether the close() will be successful or not - the handle is invalid now!
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
  2814
	__INST(handle) = nil;
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
  2815
	do {
3246
c75a006f9a7a Win32 sockets use handles instead of file pointers
Stefan Vogel <sv@exept.de>
parents: 3224
diff changeset
  2816
#ifdef WIN32
3467
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
  2817
	    rslt = __STX_WSA_NOINT_CALL1("closesocket", closesocket, socket);
3246
c75a006f9a7a Win32 sockets use handles instead of file pointers
Stefan Vogel <sv@exept.de>
parents: 3224
diff changeset
  2818
#else
3467
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
  2819
	    rslt = close(socket);
3246
c75a006f9a7a Win32 sockets use handles instead of file pointers
Stefan Vogel <sv@exept.de>
parents: 3224
diff changeset
  2820
#endif
3467
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
  2821
	} while((rslt < 0) && (__threadErrno == EINTR));
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
  2822
	if (rslt == 0) {
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
  2823
	    RETURN(self);
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
  2824
	}
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
  2825
	error = __mkSmallInteger(__threadErrno);
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
  2826
    }
3246
c75a006f9a7a Win32 sockets use handles instead of file pointers
Stefan Vogel <sv@exept.de>
parents: 3224
diff changeset
  2827
c75a006f9a7a Win32 sockets use handles instead of file pointers
Stefan Vogel <sv@exept.de>
parents: 3224
diff changeset
  2828
out:;
c75a006f9a7a Win32 sockets use handles instead of file pointers
Stefan Vogel <sv@exept.de>
parents: 3224
diff changeset
  2829
%}.
c75a006f9a7a Win32 sockets use handles instead of file pointers
Stefan Vogel <sv@exept.de>
parents: 3224
diff changeset
  2830
c75a006f9a7a Win32 sockets use handles instead of file pointers
Stefan Vogel <sv@exept.de>
parents: 3224
diff changeset
  2831
    error notNil ifTrue:[
3467
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
  2832
	error == #errorNotOpen ifTrue:[
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
  2833
	    self errorNotOpen.
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
  2834
	].
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
  2835
	error isInteger ifTrue:[
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
  2836
	    lastErrorNumber := error.
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
  2837
	    self writeError:error.
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
  2838
	    ^ self.
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
  2839
	].
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
  2840
	self primitiveFailed:error.
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
  2841
	^ self.
3246
c75a006f9a7a Win32 sockets use handles instead of file pointers
Stefan Vogel <sv@exept.de>
parents: 3224
diff changeset
  2842
    ].
c75a006f9a7a Win32 sockets use handles instead of file pointers
Stefan Vogel <sv@exept.de>
parents: 3224
diff changeset
  2843
c75a006f9a7a Win32 sockets use handles instead of file pointers
Stefan Vogel <sv@exept.de>
parents: 3224
diff changeset
  2844
    super closeFile.
c75a006f9a7a Win32 sockets use handles instead of file pointers
Stefan Vogel <sv@exept.de>
parents: 3224
diff changeset
  2845
c75a006f9a7a Win32 sockets use handles instead of file pointers
Stefan Vogel <sv@exept.de>
parents: 3224
diff changeset
  2846
    "/ fallback for rel5
c75a006f9a7a Win32 sockets use handles instead of file pointers
Stefan Vogel <sv@exept.de>
parents: 3224
diff changeset
  2847
c75a006f9a7a Win32 sockets use handles instead of file pointers
Stefan Vogel <sv@exept.de>
parents: 3224
diff changeset
  2848
    fp := handle.
c75a006f9a7a Win32 sockets use handles instead of file pointers
Stefan Vogel <sv@exept.de>
parents: 3224
diff changeset
  2849
    fp notNil ifTrue:[
3467
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
  2850
	handle := nil.
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
  2851
	self closeFile:fp
3246
c75a006f9a7a Win32 sockets use handles instead of file pointers
Stefan Vogel <sv@exept.de>
parents: 3224
diff changeset
  2852
    ]
c75a006f9a7a Win32 sockets use handles instead of file pointers
Stefan Vogel <sv@exept.de>
parents: 3224
diff changeset
  2853
! !
c75a006f9a7a Win32 sockets use handles instead of file pointers
Stefan Vogel <sv@exept.de>
parents: 3224
diff changeset
  2854
3123
55ef9ca4f09f class: Socket
Stefan Vogel <sv@exept.de>
parents: 3077
diff changeset
  2855
!Socket methodsFor:'low level'!
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2856
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2857
getSocketAdress
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2858
    "BAD SPELLING, of #getSocketAddress, kept for compatibility with swazoo"
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2859
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2860
    <resource: #obsolete>
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2861
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2862
    ^ self getSocketAddress
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2863
!
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2864
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2865
getSocketError
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2866
    "get the SO_ERROR form the socket, which indicates the
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2867
     result of an asynchronous operation"
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2868
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2869
%{
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2870
#ifndef NO_SOCKET
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2871
    OBJ fp;
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2872
    int err;
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2873
2321
6f4cc7b644db filePointer -> handle migration
Claus Gittinger <cg@exept.de>
parents: 2308
diff changeset
  2874
    fp = __INST(handle);
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2875
    if (fp == nil) {
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2876
	err = EBADF;
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2877
    } else {
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2878
	unsigned int sz;
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2879
	SOCKET sock;
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2880
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2881
	sock = SOCKET_FROM_FILE_OBJECT(fp);
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2882
	sz = sizeof(err);
2909
aacef77a1697 64bit fixes
Claus Gittinger <cg@exept.de>
parents: 2904
diff changeset
  2883
	if (getsockopt(sock, SOL_SOCKET, SO_ERROR, (char *)(&err), &sz) < 0) {
1558
a563aac90660 No need to ask Socket>>#networkXXXOrderIsMSB, because the return value is
Stefan Vogel <sv@exept.de>
parents: 1542
diff changeset
  2884
# ifdef WIN32
1568
3bca500e0c7a send and receiveTimeout fixed
Claus Gittinger <cg@exept.de>
parents: 1561
diff changeset
  2885
	    errno = WSAGetLastError();
1558
a563aac90660 No need to ask Socket>>#networkXXXOrderIsMSB, because the return value is
Stefan Vogel <sv@exept.de>
parents: 1542
diff changeset
  2886
# endif
1568
3bca500e0c7a send and receiveTimeout fixed
Claus Gittinger <cg@exept.de>
parents: 1561
diff changeset
  2887
	    err = errno;
3bca500e0c7a send and receiveTimeout fixed
Claus Gittinger <cg@exept.de>
parents: 1561
diff changeset
  2888
	}
1558
a563aac90660 No need to ask Socket>>#networkXXXOrderIsMSB, because the return value is
Stefan Vogel <sv@exept.de>
parents: 1542
diff changeset
  2889
    }
a563aac90660 No need to ask Socket>>#networkXXXOrderIsMSB, because the return value is
Stefan Vogel <sv@exept.de>
parents: 1542
diff changeset
  2890
a563aac90660 No need to ask Socket>>#networkXXXOrderIsMSB, because the return value is
Stefan Vogel <sv@exept.de>
parents: 1542
diff changeset
  2891
    RETURN(__MKSMALLINT(err));
a563aac90660 No need to ask Socket>>#networkXXXOrderIsMSB, because the return value is
Stefan Vogel <sv@exept.de>
parents: 1542
diff changeset
  2892
#endif
a563aac90660 No need to ask Socket>>#networkXXXOrderIsMSB, because the return value is
Stefan Vogel <sv@exept.de>
parents: 1542
diff changeset
  2893
%}
a563aac90660 No need to ask Socket>>#networkXXXOrderIsMSB, because the return value is
Stefan Vogel <sv@exept.de>
parents: 1542
diff changeset
  2894
!
a563aac90660 No need to ask Socket>>#networkXXXOrderIsMSB, because the return value is
Stefan Vogel <sv@exept.de>
parents: 1542
diff changeset
  2895
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2896
listenWithBacklog:aNumber
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2897
    <resource: #obsolete>
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2898
    "same as listenFor: - backward compatibility with old ST/X"
3059
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  2899
    self obsoleteMethodWarning.
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2900
    ^ self listenFor:aNumber
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2901
!
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2902
3246
c75a006f9a7a Win32 sockets use handles instead of file pointers
Stefan Vogel <sv@exept.de>
parents: 3224
diff changeset
  2903
primAcceptOn:aServerSocket blocking:blocking
3059
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  2904
    "accept a connection on a server port (created with:'Socket>>newTCP:')
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  2905
     usage is: (Socket basicNew acceptOn:(Socket newTCP:9999)).
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2906
     Return the true if ok; false if not.
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2907
     If blocking is true, the accept() syscall (and the whole smalltalk image)
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2908
     will block, until a connection is accepted.
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2909
     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
  2910
3246
c75a006f9a7a Win32 sockets use handles instead of file pointers
Stefan Vogel <sv@exept.de>
parents: 3224
diff changeset
  2911
    |serverSocketHandle addr domainClass newHandle|
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2912
2321
6f4cc7b644db filePointer -> handle migration
Claus Gittinger <cg@exept.de>
parents: 2308
diff changeset
  2913
    handle notNil ifTrue:[
3467
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
  2914
	^ self errorAlreadyOpen
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2915
    ].
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2916
3246
c75a006f9a7a Win32 sockets use handles instead of file pointers
Stefan Vogel <sv@exept.de>
parents: 3224
diff changeset
  2917
    domain := aServerSocket domain.
c75a006f9a7a Win32 sockets use handles instead of file pointers
Stefan Vogel <sv@exept.de>
parents: 3224
diff changeset
  2918
    socketType := aServerSocket type.
c75a006f9a7a Win32 sockets use handles instead of file pointers
Stefan Vogel <sv@exept.de>
parents: 3224
diff changeset
  2919
    handleType := aServerSocket handleType.
c75a006f9a7a Win32 sockets use handles instead of file pointers
Stefan Vogel <sv@exept.de>
parents: 3224
diff changeset
  2920
    serverSocketHandle := aServerSocket fileHandle.
c75a006f9a7a Win32 sockets use handles instead of file pointers
Stefan Vogel <sv@exept.de>
parents: 3224
diff changeset
  2921
    serverSocketHandle isNil ifTrue:[
3467
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
  2922
	^ self error:'invalid server socket'
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2923
    ].
3059
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  2924
    "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
  2925
    domainClass := self class socketAddressClassForDomain:domain.
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2926
    domainClass isNil ifTrue:[
3467
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
  2927
	^ self error:'invalid (unsupported) domain'.
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2928
    ].
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2929
    addr := domainClass new.
3246
c75a006f9a7a Win32 sockets use handles instead of file pointers
Stefan Vogel <sv@exept.de>
parents: 3224
diff changeset
  2930
    newHandle := OperatingSystem socketAccessor new.
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2931
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2932
%{  /* STACK: 100000 */
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2933
#ifndef NO_SOCKET
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2934
    FILE *fp;
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2935
    int flags;
3246
c75a006f9a7a Win32 sockets use handles instead of file pointers
Stefan Vogel <sv@exept.de>
parents: 3224
diff changeset
  2936
    SOCKET serverSocket, newSock;
c75a006f9a7a Win32 sockets use handles instead of file pointers
Stefan Vogel <sv@exept.de>
parents: 3224
diff changeset
  2937
    int _fd;
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2938
    union sockaddr_u sa;
3059
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  2939
    unsigned int alen;
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  2940
3247
259f71b89b6e class: Socket
Stefan Vogel <sv@exept.de>
parents: 3246
diff changeset
  2941
#ifdef WIN32
3246
c75a006f9a7a Win32 sockets use handles instead of file pointers
Stefan Vogel <sv@exept.de>
parents: 3224
diff changeset
  2942
    serverSocket = SOCKET_FROM_FILE_OBJECT(serverSocketHandle);
3247
259f71b89b6e class: Socket
Stefan Vogel <sv@exept.de>
parents: 3246
diff changeset
  2943
#else
259f71b89b6e class: Socket
Stefan Vogel <sv@exept.de>
parents: 3246
diff changeset
  2944
    serverSocket = __intVal(serverSocketHandle);
259f71b89b6e class: Socket
Stefan Vogel <sv@exept.de>
parents: 3246
diff changeset
  2945
#endif
3246
c75a006f9a7a Win32 sockets use handles instead of file pointers
Stefan Vogel <sv@exept.de>
parents: 3224
diff changeset
  2946
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2947
# 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
  2948
    if (blocking == false) {
3467
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
  2949
	flags = fcntl(serverSocket, F_GETFL);
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
  2950
	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
  2951
    }
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2952
# endif
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2953
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2954
# ifdef DO_WRAP_CALLS
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2955
    do {
3467
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
  2956
	__threadErrno = 0;
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
  2957
	alen = sizeof(sa);
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
  2958
	newSock = (SOCKET)STX_WSA_CALL3("accept", accept, serverSocket, &sa, &alen);
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2959
    } while ((newSock < 0) && (__threadErrno == EINTR));
3127
333e87ba225a class: Socket
Stefan Vogel <sv@exept.de>
parents: 3126
diff changeset
  2960
    if (newSock < 0) {
3467
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
  2961
	errno = __threadErrno;
3126
d95cc55a4fb5 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3123
diff changeset
  2962
    }
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2963
# else
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2964
    __BEGIN_INTERRUPTABLE__
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2965
    do {
3467
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
  2966
	alen = sizeof(sa);
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
  2967
	newSock = accept(serverSocket, (struct sockaddr *) &sa, &alen);
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2968
    } while ((newSock < 0) && (errno == EINTR));
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2969
    __END_INTERRUPTABLE__
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2970
# endif
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2971
    DBGFPRINTF((stderr, "SOCKET: accept newSock=%d\n", newSock));
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2972
3246
c75a006f9a7a Win32 sockets use handles instead of file pointers
Stefan Vogel <sv@exept.de>
parents: 3224
diff changeset
  2973
# if defined(O_NDELAY) && defined(SET_NDELAY)
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2974
    if (blocking == false) {
3467
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
  2975
	fcntl(serverSocket, F_SETFL, flags);
3246
c75a006f9a7a Win32 sockets use handles instead of file pointers
Stefan Vogel <sv@exept.de>
parents: 3224
diff changeset
  2976
    }
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2977
# endif
3246
c75a006f9a7a Win32 sockets use handles instead of file pointers
Stefan Vogel <sv@exept.de>
parents: 3224
diff changeset
  2978
c75a006f9a7a Win32 sockets use handles instead of file pointers
Stefan Vogel <sv@exept.de>
parents: 3224
diff changeset
  2979
    if (newSock == -1) {
3467
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
  2980
	DBGPRINTF(("SOCKET: accept call failed errno=%d\n", errno));
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
  2981
	__INST(lastErrorNumber) = __MKSMALLINT(errno);
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
  2982
	RETURN (false);
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2983
    }
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2984
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2985
    if (__isNonNilObject(addr)) {
3467
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
  2986
	OBJ oClass = __qClass(addr);
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
  2987
	int nInstVars, nInstBytes, objSize;
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
  2988
	char *addrP;
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
  2989
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
  2990
	if (! __isBytes(addr) ) {
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
  2991
	    DBGPRINTF(("SOCKET: bad addr\n"));
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
  2992
	    closesocket(newSock);
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
  2993
	    RETURN (false);
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
  2994
	}
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
  2995
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
  2996
	nInstVars = __intVal(__ClassInstPtr(oClass)->c_ninstvars);
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
  2997
	nInstBytes = OHDR_SIZE + (nInstVars * sizeof(OBJ));
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
  2998
	objSize = __qSize(addr) - nInstBytes;
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
  2999
	addrP = (char *)__InstPtr(addr) + nInstBytes;
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
  3000
	if (objSize < alen) {
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
  3001
	    DBGPRINTF(("SOCKET: bad addr\n"));
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
  3002
	    closesocket(newSock);
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
  3003
	    RETURN (false);
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
  3004
	}
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
  3005
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
  3006
	/*
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
  3007
	 * extract the partners address
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
  3008
	 */
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
  3009
	memcpy(addrP, (char *)&sa, alen);
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  3010
    }
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  3011
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  3012
    /*
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  3013
     * make it a FILE *
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  3014
     */
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  3015
# ifdef WIN32
3246
c75a006f9a7a Win32 sockets use handles instead of file pointers
Stefan Vogel <sv@exept.de>
parents: 3224
diff changeset
  3016
#  if 0 && (defined( __BORLANDC__ ) || defined( __MINGW__ ))
c75a006f9a7a Win32 sockets use handles instead of file pointers
Stefan Vogel <sv@exept.de>
parents: 3224
diff changeset
  3017
    __stxWrapApiEnterCritical();
c75a006f9a7a Win32 sockets use handles instead of file pointers
Stefan Vogel <sv@exept.de>
parents: 3224
diff changeset
  3018
    _fd = _open_osfhandle((long)newSock, 0);
c75a006f9a7a Win32 sockets use handles instead of file pointers
Stefan Vogel <sv@exept.de>
parents: 3224
diff changeset
  3019
    __stxWrapApiLeaveCritical();
c75a006f9a7a Win32 sockets use handles instead of file pointers
Stefan Vogel <sv@exept.de>
parents: 3224
diff changeset
  3020
    DBGPRINTF(("SOCKET: sock=%d fd=%d\n", newSock, _fd));
2773
ab3049f4a351 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2748
diff changeset
  3021
#  else
3246
c75a006f9a7a Win32 sockets use handles instead of file pointers
Stefan Vogel <sv@exept.de>
parents: 3224
diff changeset
  3022
    _fd = (int)newSock;
2773
ab3049f4a351 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2748
diff changeset
  3023
#  endif
3246
c75a006f9a7a Win32 sockets use handles instead of file pointers
Stefan Vogel <sv@exept.de>
parents: 3224
diff changeset
  3024
# else // ! WIN32
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  3025
    fp = fdopen(newSock, "r+");
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  3026
    if (! fp) {
3467
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
  3027
	DBGPRINTF(("SOCKET: fdopen call failed\n"));
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
  3028
	__INST(lastErrorNumber) = __MKSMALLINT(errno);
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
  3029
	closesocket(newSock);
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
  3030
	DBGFPRINTF((stderr, "SOCKET: close (fdopen failed) (%d)\n", newSock));
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
  3031
	RETURN (false);
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  3032
    }
3246
c75a006f9a7a Win32 sockets use handles instead of file pointers
Stefan Vogel <sv@exept.de>
parents: 3224
diff changeset
  3033
# endif // ! WIN32
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  3034
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  3035
    if ((@global(FileOpenTrace) == true) || __debugging__) {
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  3036
# ifdef WIN32
3467
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
  3037
	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
  3038
# else
3467
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
  3039
	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
  3040
# endif
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  3041
    }
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  3042
3246
c75a006f9a7a Win32 sockets use handles instead of file pointers
Stefan Vogel <sv@exept.de>
parents: 3224
diff changeset
  3043
# ifdef WIN32
c75a006f9a7a Win32 sockets use handles instead of file pointers
Stefan Vogel <sv@exept.de>
parents: 3224
diff changeset
  3044
    __externalAddressVal(newHandle) = _fd;
c75a006f9a7a Win32 sockets use handles instead of file pointers
Stefan Vogel <sv@exept.de>
parents: 3224
diff changeset
  3045
    __INST(handleType) = @symbol(socketHandle);
c75a006f9a7a Win32 sockets use handles instead of file pointers
Stefan Vogel <sv@exept.de>
parents: 3224
diff changeset
  3046
# else
c75a006f9a7a Win32 sockets use handles instead of file pointers
Stefan Vogel <sv@exept.de>
parents: 3224
diff changeset
  3047
    __externalAddressVal(newHandle) = fp;
c75a006f9a7a Win32 sockets use handles instead of file pointers
Stefan Vogel <sv@exept.de>
parents: 3224
diff changeset
  3048
    __INST(handleType) = @symbol(socketFilePointer);
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  3049
# endif
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  3050
#endif /* not NO_SOCKET */
1558
a563aac90660 No need to ask Socket>>#networkXXXOrderIsMSB, because the return value is
Stefan Vogel <sv@exept.de>
parents: 1542
diff changeset
  3051
%}.
3246
c75a006f9a7a Win32 sockets use handles instead of file pointers
Stefan Vogel <sv@exept.de>
parents: 3224
diff changeset
  3052
c75a006f9a7a Win32 sockets use handles instead of file pointers
Stefan Vogel <sv@exept.de>
parents: 3224
diff changeset
  3053
    handle := newHandle.
c75a006f9a7a Win32 sockets use handles instead of file pointers
Stefan Vogel <sv@exept.de>
parents: 3224
diff changeset
  3054
    buffered := false.
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  3055
    mode := #readwrite.
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  3056
    binary := false.
3246
c75a006f9a7a Win32 sockets use handles instead of file pointers
Stefan Vogel <sv@exept.de>
parents: 3224
diff changeset
  3057
    Lobby register:self.
3059
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  3058
    peer := addr.
3246
c75a006f9a7a Win32 sockets use handles instead of file pointers
Stefan Vogel <sv@exept.de>
parents: 3224
diff changeset
  3059
    port := aServerSocket port.
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  3060
1558
a563aac90660 No need to ask Socket>>#networkXXXOrderIsMSB, because the return value is
Stefan Vogel <sv@exept.de>
parents: 1542
diff changeset
  3061
    ^ true
2551
6da1bc89b74a changed:
Stefan Vogel <sv@exept.de>
parents: 2516
diff changeset
  3062
!
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3063
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3064
setSocketOption:option argument:arg1 argument:arg2
3513
8105bf370769 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3485
diff changeset
  3065
    |ok error|
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3066
2551
6da1bc89b74a changed:
Stefan Vogel <sv@exept.de>
parents: 2516
diff changeset
  3067
    handle isNil ifTrue:[
3590
3487165a9cdf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3550
diff changeset
  3068
	^ self errorNotOpen
2551
6da1bc89b74a changed:
Stefan Vogel <sv@exept.de>
parents: 2516
diff changeset
  3069
    ].
6da1bc89b74a changed:
Stefan Vogel <sv@exept.de>
parents: 2516
diff changeset
  3070
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3071
%{  /* STACK: 32000 */
2818
94d67df5c00d compilable with tcc
Claus Gittinger <cg@exept.de>
parents: 2773
diff changeset
  3072
#ifndef NO_SOCKET
2321
6f4cc7b644db filePointer -> handle migration
Claus Gittinger <cg@exept.de>
parents: 2308
diff changeset
  3073
    OBJ fp = __INST(handle);
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3074
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3075
    if (fp != nil) {
3590
3487165a9cdf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3550
diff changeset
  3076
	SOCKET sock = SOCKET_FROM_FILE_OBJECT(fp);
3487165a9cdf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3550
diff changeset
  3077
	int opt = -1;
3487165a9cdf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3550
diff changeset
  3078
	int level = -1;
3487165a9cdf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3550
diff changeset
  3079
	int usize = -1;
3487165a9cdf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3550
diff changeset
  3080
	int ret;
3487165a9cdf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3550
diff changeset
  3081
	union u {
3487165a9cdf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3550
diff changeset
  3082
	    BOOL        u_bool;
3487165a9cdf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3550
diff changeset
  3083
	    int         u_int;
3487165a9cdf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3550
diff changeset
  3084
	    struct linger  u_linger;
2516
592619f82885 Add setsockopt for Multicast stuff
Stefan Vogel <sv@exept.de>
parents: 2465
diff changeset
  3085
# ifdef IP_ADD_MEMBERSHIP
3590
3487165a9cdf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3550
diff changeset
  3086
	    struct ip_mreq u_ip_mreq;
2516
592619f82885 Add setsockopt for Multicast stuff
Stefan Vogel <sv@exept.de>
parents: 2465
diff changeset
  3087
# endif
3467
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
  3088
# if defined(SO_RCVTIMEO) || defined(SO_SNDTIMEO)
3590
3487165a9cdf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3550
diff changeset
  3089
	    struct timeval u_tv;
3467
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
  3090
# endif
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
  3091
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
  3092
3590
3487165a9cdf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3550
diff changeset
  3093
	} u;
2516
592619f82885 Add setsockopt for Multicast stuff
Stefan Vogel <sv@exept.de>
parents: 2465
diff changeset
  3094
592619f82885 Add setsockopt for Multicast stuff
Stefan Vogel <sv@exept.de>
parents: 2465
diff changeset
  3095
# ifdef IP_ADD_MEMBERSHIP
3590
3487165a9cdf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3550
diff changeset
  3096
	if (option == @symbol(IP_DROP_MEMBERSHIP)) {
3487165a9cdf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3550
diff changeset
  3097
	    opt = IP_DROP_MEMBERSHIP;
3487165a9cdf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3550
diff changeset
  3098
	    goto dropOrAdd;
3487165a9cdf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3550
diff changeset
  3099
	}
3487165a9cdf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3550
diff changeset
  3100
	if (option == @symbol(IP_ADD_MEMBERSHIP)) {
3487165a9cdf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3550
diff changeset
  3101
	    /* add membership to a multicast group */
3487165a9cdf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3550
diff changeset
  3102
	    opt = IP_ADD_MEMBERSHIP;
2516
592619f82885 Add setsockopt for Multicast stuff
Stefan Vogel <sv@exept.de>
parents: 2465
diff changeset
  3103
dropOrAdd:
3590
3487165a9cdf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3550
diff changeset
  3104
	    level = IPPROTO_IP;
3487165a9cdf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3550
diff changeset
  3105
	    usize = sizeof(u.u_ip_mreq);
3487165a9cdf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3550
diff changeset
  3106
	    if (__isByteArrayLike(arg1) && __isByteArrayLike(arg2)) {
3487165a9cdf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3550
diff changeset
  3107
		memcpy(&u.u_ip_mreq.imr_multiaddr, __byteArrayVal(arg1), sizeof(u.u_ip_mreq.imr_multiaddr));
3487165a9cdf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3550
diff changeset
  3108
		memcpy(&u.u_ip_mreq.imr_interface, __byteArrayVal(arg2), sizeof(u.u_ip_mreq.imr_interface));
3487165a9cdf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3550
diff changeset
  3109
	    }
3487165a9cdf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3550
diff changeset
  3110
	    else
3487165a9cdf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3550
diff changeset
  3111
		goto argError;
3487165a9cdf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3550
diff changeset
  3112
	}
2516
592619f82885 Add setsockopt for Multicast stuff
Stefan Vogel <sv@exept.de>
parents: 2465
diff changeset
  3113
# endif /* IP_ADD_MEMBERSHIP */
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3114
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3115
# ifdef SO_BROADCAST
3590
3487165a9cdf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3550
diff changeset
  3116
	if (option == @symbol(SO_BROADCAST)) {
3487165a9cdf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3550
diff changeset
  3117
	    /* Enables transmission and receipt of broadcast messages on the socket. */
3487165a9cdf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3550
diff changeset
  3118
	    opt = SO_BROADCAST;
3487165a9cdf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3550
diff changeset
  3119
	    level = SOL_SOCKET;
3487165a9cdf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3550
diff changeset
  3120
	    usize = sizeof(u.u_bool);
3487165a9cdf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3550
diff changeset
  3121
	    if (arg1 == true) u.u_bool = TRUE;
3487165a9cdf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3550
diff changeset
  3122
	    else if (arg1 == false) u.u_bool = FALSE;
3487165a9cdf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3550
diff changeset
  3123
	    else goto argError;
3487165a9cdf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3550
diff changeset
  3124
	}
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3125
# endif /* SO_BROADCAST */
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3126
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3127
# ifdef SO_CONDITIONAL
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3128
#  if 0
3590
3487165a9cdf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3550
diff changeset
  3129
	if (option == @symbol(SO_CONDITIONAL)) {
3487165a9cdf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3550
diff changeset
  3130
	    /* Enables sockets to delay the acknowledgment of a connection until after the WSAAccept condition function is called. */
3487165a9cdf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3550
diff changeset
  3131
	    opt = SO_CONDITIONAL;
3487165a9cdf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3550
diff changeset
  3132
	    level = SOL_SOCKET;
3487165a9cdf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3550
diff changeset
  3133
	    usize = sizeof(u.u_bool);
3487165a9cdf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3550
diff changeset
  3134
	    if (arg1 == true) u.u_bool = TRUE;
3487165a9cdf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3550
diff changeset
  3135
	    else if (arg1 == false) u.u_bool = FALSE;
3487165a9cdf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3550
diff changeset
  3136
	    else goto argError;
3487165a9cdf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3550
diff changeset
  3137
	}
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3138
#  endif
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3139
# endif /* SO_CONDITIONAL */
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3140
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3141
# ifdef SO_DEBUG
3590
3487165a9cdf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3550
diff changeset
  3142
	if (option == @symbol(SO_DEBUG)) {
3487165a9cdf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3550
diff changeset
  3143
	    /* Records debugging information. */
3487165a9cdf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3550
diff changeset
  3144
	    opt = SO_DEBUG;
3487165a9cdf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3550
diff changeset
  3145
	    level = SOL_SOCKET;
3487165a9cdf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3550
diff changeset
  3146
	    usize = sizeof(u.u_bool);
3487165a9cdf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3550
diff changeset
  3147
	    if (arg1 == true) u.u_bool = TRUE;
3487165a9cdf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3550
diff changeset
  3148
	    else if (arg1 == false) u.u_bool = FALSE;
3487165a9cdf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3550
diff changeset
  3149
	    else goto argError;
3487165a9cdf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3550
diff changeset
  3150
	}
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3151
# endif /* SO_DEBUG */
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3152
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3153
# ifdef SO_DONTLINGER
3590
3487165a9cdf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3550
diff changeset
  3154
	if (option == @symbol(SO_DONTLINGER)) {
3487165a9cdf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3550
diff changeset
  3155
	    /* Does not block close waiting for unsent data to be sent.
3487165a9cdf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3550
diff changeset
  3156
	       Setting this option is equivalent to setting SO_LINGER with l_onoff set to zero. */
3487165a9cdf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3550
diff changeset
  3157
	    opt = SO_DONTLINGER;
3487165a9cdf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3550
diff changeset
  3158
	    level = SOL_SOCKET;
3487165a9cdf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3550
diff changeset
  3159
	    usize = sizeof(u.u_bool);
3487165a9cdf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3550
diff changeset
  3160
	    if (arg1 == true) u.u_bool = TRUE;
3487165a9cdf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3550
diff changeset
  3161
	    else if (arg1 == false) u.u_bool = FALSE;
3487165a9cdf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3550
diff changeset
  3162
	    else goto argError;
3487165a9cdf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3550
diff changeset
  3163
	}
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3164
# endif /* SO_DONTLINGER */
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3165
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3166
# ifdef SO_DONTROUTE
3590
3487165a9cdf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3550
diff changeset
  3167
	if (option == @symbol(SO_DONTROUTE)) {
3487165a9cdf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3550
diff changeset
  3168
	    /* Does not route: sends directly to interface.
3487165a9cdf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3550
diff changeset
  3169
	       Succeeds but is ignored on AF_INET sockets;
3487165a9cdf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3550
diff changeset
  3170
	       fails on AF_INET6 sockets with WSAENOPROTOOPT.
3487165a9cdf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3550
diff changeset
  3171
	       Not supported on ATM sockets (results in an error). */
3487165a9cdf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3550
diff changeset
  3172
	    opt = SO_DONTROUTE;
3487165a9cdf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3550
diff changeset
  3173
	    level = SOL_SOCKET;
3487165a9cdf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3550
diff changeset
  3174
	    usize = sizeof(u.u_bool);
3487165a9cdf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3550
diff changeset
  3175
	    if (arg1 == true) u.u_bool = TRUE;
3487165a9cdf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3550
diff changeset
  3176
	    else if (arg1 == false) u.u_bool = FALSE;
3487165a9cdf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3550
diff changeset
  3177
	    else goto argError;
3487165a9cdf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3550
diff changeset
  3178
	}
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3179
# endif /* SO_DONTROUTE */
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3180
2516
592619f82885 Add setsockopt for Multicast stuff
Stefan Vogel <sv@exept.de>
parents: 2465
diff changeset
  3181
#if defined(IPPROTO_TCP) && defined(TCP_NODELAY)
3590
3487165a9cdf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3550
diff changeset
  3182
	if (option == @symbol(TCP_NODELAY)) {
3487165a9cdf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3550
diff changeset
  3183
	    /* enable/disable TCP_NODELAY (i.e. disable/enable the Nagle algorithm) */
3487165a9cdf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3550
diff changeset
  3184
	    opt = TCP_NODELAY;
3487165a9cdf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3550
diff changeset
  3185
	    level = IPPROTO_TCP;
3487165a9cdf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3550
diff changeset
  3186
	    usize = sizeof(u.u_bool);
3487165a9cdf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3550
diff changeset
  3187
	    if (arg1 == true) u.u_bool = TRUE;
3487165a9cdf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3550
diff changeset
  3188
	    else if (arg1 == false) u.u_bool = FALSE;
3487165a9cdf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3550
diff changeset
  3189
	    else goto argError;
3487165a9cdf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3550
diff changeset
  3190
	}
2516
592619f82885 Add setsockopt for Multicast stuff
Stefan Vogel <sv@exept.de>
parents: 2465
diff changeset
  3191
# endif /* TCP_NODELAY */
592619f82885 Add setsockopt for Multicast stuff
Stefan Vogel <sv@exept.de>
parents: 2465
diff changeset
  3192
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3193
# ifdef SO_KEEPALIVE
3590
3487165a9cdf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3550
diff changeset
  3194
	if (option == @symbol(SO_KEEPALIVE)) {
3487165a9cdf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3550
diff changeset
  3195
	    /* Sends keep-alives. Not supported on ATM sockets (results in an error). */
3487165a9cdf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3550
diff changeset
  3196
	    opt = SO_KEEPALIVE;
3487165a9cdf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3550
diff changeset
  3197
	    level = SOL_SOCKET;
3487165a9cdf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3550
diff changeset
  3198
	    usize = sizeof(u.u_bool);
3487165a9cdf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3550
diff changeset
  3199
	    if (arg1 == true) u.u_bool = TRUE;
3487165a9cdf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3550
diff changeset
  3200
	    else if (arg1 == false) u.u_bool = FALSE;
3487165a9cdf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3550
diff changeset
  3201
	    else goto argError;
3487165a9cdf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3550
diff changeset
  3202
	}
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3203
# endif /* SO_KEEPALIVE */
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3204
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3205
# ifdef SO_LINGER
3590
3487165a9cdf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3550
diff changeset
  3206
	if (option == @symbol(SO_LINGER)) {
3487165a9cdf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3550
diff changeset
  3207
	    /* Lingers on close if unsent data is present. */
3487165a9cdf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3550
diff changeset
  3208
	    opt = SO_LINGER;
3487165a9cdf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3550
diff changeset
  3209
	    level = SOL_SOCKET;
3487165a9cdf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3550
diff changeset
  3210
	    usize = sizeof(u.u_linger);
3487165a9cdf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3550
diff changeset
  3211
	    if (arg1 == true) u.u_linger.l_onoff = TRUE;
3487165a9cdf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3550
diff changeset
  3212
	    else if (arg1 == false) u.u_linger.l_onoff = FALSE;
3487165a9cdf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3550
diff changeset
  3213
	    else goto argError;
3487165a9cdf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3550
diff changeset
  3214
	    if (arg2 == nil) u.u_linger.l_linger = 0;
3487165a9cdf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3550
diff changeset
  3215
	    else if (__isSmallInteger(arg2))u.u_linger.l_linger = __intVal(arg2);
3487165a9cdf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3550
diff changeset
  3216
	    else goto argError;
3487165a9cdf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3550
diff changeset
  3217
	    DBGPRINTF(("SOCKET: SO_LINGER %d %d\n", u.u_linger.l_onoff, u.u_linger.l_linger));
3487165a9cdf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3550
diff changeset
  3218
	}
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3219
# endif /* SO_LINGER */
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3220
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3221
# ifdef SO_OOBINLINE
3590
3487165a9cdf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3550
diff changeset
  3222
	if (option == @symbol(SO_OOBINLINE)) {
3487165a9cdf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3550
diff changeset
  3223
	    /* Receives OOB data in the normal data stream. */
3487165a9cdf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3550
diff changeset
  3224
	    opt = SO_OOBINLINE;
3487165a9cdf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3550
diff changeset
  3225
	    level = SOL_SOCKET;
3487165a9cdf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3550
diff changeset
  3226
	    usize = sizeof(u.u_bool);
3487165a9cdf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3550
diff changeset
  3227
	    if (arg1 == true) u.u_bool = TRUE;
3487165a9cdf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3550
diff changeset
  3228
	    else if (arg1 == false) u.u_bool = FALSE;
3487165a9cdf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3550
diff changeset
  3229
	    else goto argError;
3487165a9cdf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3550
diff changeset
  3230
	}
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3231
# endif /* SO_OOBINLINE */
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3232
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3233
# ifdef SO_RCVBUF
3590
3487165a9cdf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3550
diff changeset
  3234
	if (option == @symbol(SO_RCVBUF)) {
3487165a9cdf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3550
diff changeset
  3235
	    /* Specifies the total per-socket buffer space reserved for receives.
3487165a9cdf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3550
diff changeset
  3236
	       This is unrelated to SO_MAX_MSG_SIZE or the size of a TCP window. */
3487165a9cdf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3550
diff changeset
  3237
	    opt = SO_RCVBUF;
3487165a9cdf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3550
diff changeset
  3238
	    level = SOL_SOCKET;
3487165a9cdf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3550
diff changeset
  3239
	    usize = sizeof(u.u_int);
3487165a9cdf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3550
diff changeset
  3240
	    if (__isSmallInteger(arg1))u.u_int = __intVal(arg1);
3487165a9cdf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3550
diff changeset
  3241
	    else goto argError;
3487165a9cdf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3550
diff changeset
  3242
	}
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3243
# endif /* SO_RCVBUF */
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3244
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3245
# ifdef SO_SNDBUF
3590
3487165a9cdf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3550
diff changeset
  3246
	if (option == @symbol(SO_SNDBUF)) {
3487165a9cdf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3550
diff changeset
  3247
	    /* Specifies the total per-socket buffer space reserved for sends.
3487165a9cdf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3550
diff changeset
  3248
	       This is unrelated to SO_MAX_MSG_SIZE or the size of a TCP window. */
3487165a9cdf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3550
diff changeset
  3249
	    opt = SO_SNDBUF;
3487165a9cdf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3550
diff changeset
  3250
	    level = SOL_SOCKET;
3487165a9cdf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3550
diff changeset
  3251
	    usize = sizeof(u.u_int);
3487165a9cdf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3550
diff changeset
  3252
	    if (__isSmallInteger(arg1))u.u_int = __intVal(arg1);
3487165a9cdf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3550
diff changeset
  3253
	    else goto argError;
3487165a9cdf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3550
diff changeset
  3254
	}
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3255
# endif /* SO_SNDBUF */
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3256
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3257
# ifdef SO_REUSEADDR
3590
3487165a9cdf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3550
diff changeset
  3258
	if (option == @symbol(SO_REUSEADDR)) {
3487165a9cdf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3550
diff changeset
  3259
	    /* Allows the socket to be bound to an address that is already in use.  */
3487165a9cdf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3550
diff changeset
  3260
	    opt = SO_REUSEADDR;
3487165a9cdf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3550
diff changeset
  3261
	    level = SOL_SOCKET;
3487165a9cdf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3550
diff changeset
  3262
	    usize = sizeof(u.u_bool);
3487165a9cdf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3550
diff changeset
  3263
	    if (arg1 == true) u.u_bool = TRUE;
3487165a9cdf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3550
diff changeset
  3264
	    else if (arg1 == false) u.u_bool = FALSE;
3487165a9cdf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3550
diff changeset
  3265
	    else goto argError;
3487165a9cdf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3550
diff changeset
  3266
	}
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3267
# endif /* SO_OOBINLINE */
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3268
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3269
# ifdef SO_EXCLUSIVEADDRUSE
3590
3487165a9cdf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3550
diff changeset
  3270
	if (option == @symbol(SO_EXCLUSIVEADDRUSE)) {
3487165a9cdf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3550
diff changeset
  3271
	    /* Enables a socket to be bound for exclusive access.
3487165a9cdf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3550
diff changeset
  3272
	       Does not require administrative privilege.  */
3487165a9cdf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3550
diff changeset
  3273
	    opt = SO_EXCLUSIVEADDRUSE;
3487165a9cdf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3550
diff changeset
  3274
	    level = SOL_SOCKET;
3487165a9cdf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3550
diff changeset
  3275
	    usize = sizeof(u.u_bool);
3487165a9cdf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3550
diff changeset
  3276
	    if (arg1 == true) u.u_bool = TRUE;
3487165a9cdf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3550
diff changeset
  3277
	    else if (arg1 == false) u.u_bool = FALSE;
3487165a9cdf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3550
diff changeset
  3278
	    else goto argError;
3487165a9cdf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3550
diff changeset
  3279
	}
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3280
# endif /* SO_OOBINLINE */
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3281
3467
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
  3282
# ifdef SO_RCVTIMEO
3590
3487165a9cdf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3550
diff changeset
  3283
	if ((option == @symbol(SO_RCVTIMEO))
3487165a9cdf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3550
diff changeset
  3284
	 && __isSmallInteger(arg1)
3487165a9cdf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3550
diff changeset
  3285
	 && __isSmallInteger(arg2)) {
3487165a9cdf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3550
diff changeset
  3286
	    opt = SO_RCVTIMEO;
3487165a9cdf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3550
diff changeset
  3287
	    level = SOL_SOCKET;
3487165a9cdf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3550
diff changeset
  3288
	    u.u_tv.tv_sec = __intVal(arg1);
3487165a9cdf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3550
diff changeset
  3289
	    u.u_tv.tv_usec = __intVal(arg2);
3487165a9cdf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3550
diff changeset
  3290
	    usize = sizeof(u.u_tv);
3487165a9cdf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3550
diff changeset
  3291
	}
3467
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
  3292
# endif /* SO_RCVTIMEO */
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
  3293
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
  3294
# ifdef SO_SNDTIMEO
3590
3487165a9cdf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3550
diff changeset
  3295
	if ((option == @symbol(SO_SNDTIMEO))
3487165a9cdf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3550
diff changeset
  3296
	 && __isSmallInteger(arg1)
3487165a9cdf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3550
diff changeset
  3297
	 && __isSmallInteger(arg2)) {
3487165a9cdf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3550
diff changeset
  3298
	    opt = SO_SNDTIMEO;
3487165a9cdf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3550
diff changeset
  3299
	    level = SOL_SOCKET;
3487165a9cdf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3550
diff changeset
  3300
	    u.u_tv.tv_sec = __intVal(arg1);
3487165a9cdf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3550
diff changeset
  3301
	    u.u_tv.tv_usec = __intVal(arg2);
3487165a9cdf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3550
diff changeset
  3302
	    usize = sizeof(u.u_tv);
3487165a9cdf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3550
diff changeset
  3303
	}
3467
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
  3304
# endif /* SO_SNDTIMEO */
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
  3305
3513
8105bf370769 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3485
diff changeset
  3306
# if !defined(IPV6_V6ONLY) && defined(WIN32)
8105bf370769 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3485
diff changeset
  3307
#  define IPPROTO_IPV6 41
8105bf370769 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3485
diff changeset
  3308
#  define IPV6_V6ONLY 27
8105bf370769 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3485
diff changeset
  3309
# endif
8105bf370769 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3485
diff changeset
  3310
8105bf370769 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3485
diff changeset
  3311
# if defined(IPV6_V6ONLY)
3590
3487165a9cdf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3550
diff changeset
  3312
	if (option == @symbol(IPV6_V6ONLY)) {
3487165a9cdf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3550
diff changeset
  3313
	    opt = IPV6_V6ONLY;
3487165a9cdf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3550
diff changeset
  3314
	    level = IPPROTO_IPV6;
3487165a9cdf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3550
diff changeset
  3315
	    usize = sizeof(u.u_bool);
3487165a9cdf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3550
diff changeset
  3316
	    if (arg1 == true) u.u_bool = TRUE;
3487165a9cdf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3550
diff changeset
  3317
	    else if (arg1 == false) u.u_bool = FALSE;
3487165a9cdf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3550
diff changeset
  3318
	    else goto argError;
3514
2d81c5ffa475 win32_printf is only avail in: guess what
Claus Gittinger <cg@exept.de>
parents: 3513
diff changeset
  3319
#  ifdef WIN32
3591
71ce2d98b99d *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3590
diff changeset
  3320
	    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
  3321
#  endif
3590
3487165a9cdf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3550
diff changeset
  3322
	}
3513
8105bf370769 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3485
diff changeset
  3323
# endif /* IPV6_V6ONLY */
8105bf370769 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3485
diff changeset
  3324
3590
3487165a9cdf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3550
diff changeset
  3325
	if (usize == -1) goto argError;
3487165a9cdf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3550
diff changeset
  3326
3487165a9cdf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3550
diff changeset
  3327
	ok = (setsockopt(sock, level, opt, (char *)&u, usize) >= 0) ? true : false;
3487165a9cdf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3550
diff changeset
  3328
	# ifdef WIN32
3487165a9cdf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3550
diff changeset
  3329
	if (ok == false) {
3513
8105bf370769 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3485
diff changeset
  3330
#  ifdef WIN32
3590
3487165a9cdf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3550
diff changeset
  3331
	    error = __mkSmallInteger(WSAGetLastError());
3513
8105bf370769 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3485
diff changeset
  3332
#  else
3590
3487165a9cdf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3550
diff changeset
  3333
	    error = __mkSmallInteger(errno);
3513
8105bf370769 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3485
diff changeset
  3334
#  endif
3590
3487165a9cdf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3550
diff changeset
  3335
	}
3513
8105bf370769 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3485
diff changeset
  3336
# endif
8105bf370769 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3485
diff changeset
  3337
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3338
    }
1529
911273d090c1 Re-unified Win32 and Unix code into single Socket.st.
Claus Gittinger <cg@exept.de>
parents: 1505
diff changeset
  3339
argError: ;
2818
94d67df5c00d compilable with tcc
Claus Gittinger <cg@exept.de>
parents: 2773
diff changeset
  3340
#endif /* NO_SOCKET */
1529
911273d090c1 Re-unified Win32 and Unix code into single Socket.st.
Claus Gittinger <cg@exept.de>
parents: 1505
diff changeset
  3341
%}.
911273d090c1 Re-unified Win32 and Unix code into single Socket.st.
Claus Gittinger <cg@exept.de>
parents: 1505
diff changeset
  3342
    ok isNil ifTrue:[
3590
3487165a9cdf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3550
diff changeset
  3343
	self primitiveFailed
1529
911273d090c1 Re-unified Win32 and Unix code into single Socket.st.
Claus Gittinger <cg@exept.de>
parents: 1505
diff changeset
  3344
    ].
911273d090c1 Re-unified Win32 and Unix code into single Socket.st.
Claus Gittinger <cg@exept.de>
parents: 1505
diff changeset
  3345
    ok ifFalse:[
3590
3487165a9cdf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3550
diff changeset
  3346
	'++++ 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
  3347
    ].
2551
6da1bc89b74a changed:
Stefan Vogel <sv@exept.de>
parents: 2516
diff changeset
  3348
!
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3349
2823
10179ccfae5d Default for close - linger in background instead 30s in foreground
Stefan Vogel <sv@exept.de>
parents: 2818
diff changeset
  3350
shutdown:howNum
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3351
    "shutDown the socket - inform it that no more I/O will be performed.
3467
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
  3352
	 0 - read side   (no further reads)
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
  3353
	     the tcp receive window is closed, so the peer cannot send more data.
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
  3354
	 1 - write side  (no further writes)
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
  3355
	     first, all queued data will be delivered to the peer.
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
  3356
	     Then, an orderly release (TCP FIN) is sent to signal the peer,
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
  3357
	     that we will not send more data.
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
  3358
	 2 - both read side and write side."
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3359
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3360
%{
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3361
#ifndef NO_SOCKET
2823
10179ccfae5d Default for close - linger in background instead 30s in foreground
Stefan Vogel <sv@exept.de>
parents: 2818
diff changeset
  3362
    OBJ __handle = __INST(handle);
3246
c75a006f9a7a Win32 sockets use handles instead of file pointers
Stefan Vogel <sv@exept.de>
parents: 3224
diff changeset
  3363
2823
10179ccfae5d Default for close - linger in background instead 30s in foreground
Stefan Vogel <sv@exept.de>
parents: 2818
diff changeset
  3364
    if ((__handle != nil) && __isSmallInteger(howNum)) {
3467
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
  3365
	SOCKET sock = SOCKET_FROM_FILE_OBJECT(__handle);
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
  3366
	INT how = __intVal(howNum);
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
  3367
	INT ret;
2823
10179ccfae5d Default for close - linger in background instead 30s in foreground
Stefan Vogel <sv@exept.de>
parents: 2818
diff changeset
  3368
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3369
# ifdef DO_WRAP_CALLS
3467
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
  3370
	do {
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
  3371
	    __threadErrno = 0;
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
  3372
	    DBGFPRINTF((stderr, "SOCKET: shutDown...\n"));
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
  3373
	    ret = (INT)STX_WSA_NOINT_CALL2("shutdown", shutdown, sock, how);
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
  3374
	    DBGFPRINTF((stderr, "SOCKET: shutDown -> %d (%d)\n", ret, __threadErrno));
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
  3375
	} 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
  3376
# else
3467
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
  3377
	__BEGIN_INTERRUPTABLE__
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
  3378
	shutdown(sock, how);
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
  3379
	__END_INTERRUPTABLE__
1529
911273d090c1 Re-unified Win32 and Unix code into single Socket.st.
Claus Gittinger <cg@exept.de>
parents: 1505
diff changeset
  3380
# endif
781
4d61e7588ff3 added #waitForNewConnectionOrDataOnAny:timeout:
Claus Gittinger <cg@exept.de>
parents: 776
diff changeset
  3381
    }
4d61e7588ff3 added #waitForNewConnectionOrDataOnAny:timeout:
Claus Gittinger <cg@exept.de>
parents: 776
diff changeset
  3382
#endif
1339
cc973a42aa54 shutdown: added
Claus Gittinger <cg@exept.de>
parents: 1338
diff changeset
  3383
%}.
781
4d61e7588ff3 added #waitForNewConnectionOrDataOnAny:timeout:
Claus Gittinger <cg@exept.de>
parents: 776
diff changeset
  3384
! !
4d61e7588ff3 added #waitForNewConnectionOrDataOnAny:timeout:
Claus Gittinger <cg@exept.de>
parents: 776
diff changeset
  3385
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3386
!Socket methodsFor:'printing & storing'!
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3387
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3388
printOn:aStream
3530
ce2171c0fe57 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3514
diff changeset
  3389
    aStream nextPutAll:self className; nextPutAll:'('.
ce2171c0fe57 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3514
diff changeset
  3390
    domain printOn:aStream.
ce2171c0fe57 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3514
diff changeset
  3391
    aStream nextPutAll:' protocol='.
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3392
    protocol printOn:aStream.
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3393
    aStream nextPutAll:' port='.
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  3394
    self port printOn:aStream.
1462
5602fce52b42 squeak stuff
Claus Gittinger <cg@exept.de>
parents: 1413
diff changeset
  3395
    aStream nextPutAll:' peer='.
5602fce52b42 squeak stuff
Claus Gittinger <cg@exept.de>
parents: 1413
diff changeset
  3396
    peer printOn:aStream.
1842
88c04d1e9e6b changed #printOn:
Stefan Vogel <sv@exept.de>
parents: 1839
diff changeset
  3397
    aStream nextPut:$).
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3398
! !
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3399
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3400
!Socket methodsFor:'queries'!
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3401
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3402
domain
3059
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  3403
    "return the sockets addressing domain (i.e. #AF_INET, #AF_INET6, #AF_UNIX, ...)"
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3404
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3405
    ^ domain
126
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
  3406
!
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
  3407
3059
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  3408
getFullPeerAddress
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  3409
    "implemented for swazoo project (primitive code can't be loaded as extension)
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3410
     Answer my own address (I am bound to this address).
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3411
     Note that this address may change after a connect or accept."
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3412
3059
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  3413
    |error domainClass addr|
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3414
2321
6f4cc7b644db filePointer -> handle migration
Claus Gittinger <cg@exept.de>
parents: 2308
diff changeset
  3415
    handle isNil ifTrue:[
3217
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  3416
	^ self errorNotOpen
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3417
    ].
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3418
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3419
    domainClass := self class socketAddressClassForDomain:domain.
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3420
    domainClass isNil ifTrue:[
3217
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  3421
	^ self error:'invalid (unsupported) domain'.
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3422
    ].
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3423
    addr := domainClass new.
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3424
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3425
%{
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3426
#ifndef NO_SOCKET
2321
6f4cc7b644db filePointer -> handle migration
Claus Gittinger <cg@exept.de>
parents: 2308
diff changeset
  3427
    OBJ fp = __INST(handle);
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3428
    SOCKET sock;
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3429
    int ret;
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3430
    union sockaddr_u sa;
3059
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  3431
    unsigned int alen = sizeof(sa);
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3432
    char *addrP;
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3433
    int addrObjSize, nAddrInstBytes;
3059
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  3434
    OBJ addrClass;
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  3435
    int nAddrInstVars;
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3436
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3437
    if (!__isNonNilObject(addr) || !__isBytes(addr)) {
3217
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  3438
	DBGPRINTF(("SOCKET: bad addr\n"));
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  3439
	error = @symbol(badArgument);
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  3440
	goto err;
3059
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  3441
    }
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  3442
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  3443
    addrClass = __qClass(addr);
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  3444
    nAddrInstVars = __intVal(__ClassInstPtr(addrClass)->c_ninstvars);
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  3445
    nAddrInstBytes = OHDR_SIZE + (nAddrInstVars * sizeof(OBJ));
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  3446
    addrObjSize = __qSize(addr) - nAddrInstBytes;
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  3447
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  3448
    sock = SOCKET_FROM_FILE_OBJECT(fp);
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  3449
    ret = getpeername(sock, (struct sockaddr *)&sa, &alen);
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  3450
    if (ret < 0) {
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  3451
# ifdef WIN32
3217
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  3452
	errno = WSAGetLastError();
3059
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  3453
# endif
3217
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  3454
	DBGPRINTF(("SOCKET: getsocketname failed ret=%d errno=%d\n", ret, errno));
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  3455
	error = __MKSMALLINT(errno);
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  3456
	goto err;
3059
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  3457
    }
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  3458
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  3459
    if (addrObjSize < alen) {
3217
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  3460
	DBGPRINTF(("SOCKET: bad addr\n"));
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  3461
	error = @symbol(badArgument);
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  3462
	goto err;
3059
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  3463
    }
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  3464
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  3465
    addrP = (char *)__InstPtr(addr) + nAddrInstBytes;
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  3466
    memcpy(addrP, (char *)&sa, alen);
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  3467
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  3468
err:;
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  3469
#else /* NO_SOCKET */
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  3470
    error = @symbol(notImplemented);
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  3471
#endif /* NO_SOCKET */
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  3472
%}.
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  3473
    error notNil ifTrue:[
3217
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  3474
	^ self errorReporter reportOn:error
3059
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  3475
    ].
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  3476
    ^ addr
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  3477
!
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  3478
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  3479
getFullSocketAddress
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  3480
    "implemented for swazoo project (primitive code can't be loaded as extension)
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  3481
     Answer my own address (I am bound to this address).
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  3482
     Note that this address may change after a connect or accept."
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  3483
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  3484
    |error domainClass addr|
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  3485
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  3486
    handle isNil ifTrue:[
3217
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  3487
	^ self errorNotOpen
3059
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  3488
    ].
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  3489
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  3490
    domainClass := self class socketAddressClassForDomain:domain.
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  3491
    domainClass isNil ifTrue:[
3217
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  3492
	^ self error:'invalid (unsupported) domain'.
3059
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  3493
    ].
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  3494
    addr := domainClass new.
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  3495
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  3496
%{
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  3497
#ifndef NO_SOCKET
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  3498
    OBJ fp = __INST(handle);
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  3499
    SOCKET sock;
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  3500
    int ret;
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  3501
    union sockaddr_u sa;
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  3502
    unsigned int alen = sizeof(sa);
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  3503
    char *addrP;
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  3504
    int addrObjSize, nAddrInstBytes;
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  3505
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  3506
    if (!__isNonNilObject(addr) || !__isBytes(addr)) {
3217
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  3507
	DBGPRINTF(("SOCKET: bad addr\n"));
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  3508
	error = @symbol(badArgument);
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  3509
	goto err;
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3510
    }
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3511
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3512
    {
3217
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  3513
	OBJ addrClass;
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  3514
	int nAddrInstVars;
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  3515
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  3516
	addrClass = __qClass(addr);
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  3517
	nAddrInstVars = __intVal(__ClassInstPtr(addrClass)->c_ninstvars);
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  3518
	nAddrInstBytes = OHDR_SIZE + (nAddrInstVars * sizeof(OBJ));
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  3519
	addrObjSize = __qSize(addr) - nAddrInstBytes;
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3520
    }
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3521
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3522
    sock = SOCKET_FROM_FILE_OBJECT(fp);
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3523
    ret = getsockname(sock, (struct sockaddr *)&sa, &alen);
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3524
    if (ret < 0) {
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3525
# ifdef WIN32
3217
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  3526
	errno = WSAGetLastError();
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3527
# endif
3217
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  3528
	DBGPRINTF(("SOCKET: getsocketname failed ret=%d errno=%d\n", ret, errno));
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  3529
	error = __MKSMALLINT(errno);
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  3530
	goto err;
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3531
    }
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3532
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3533
    if (addrObjSize < alen) {
3217
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  3534
	DBGPRINTF(("SOCKET: bad addr\n"));
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  3535
	error = @symbol(badArgument);
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  3536
	goto err;
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3537
    }
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3538
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3539
    addrP = (char *)__InstPtr(addr) + nAddrInstBytes;
3059
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  3540
    memcpy(addrP, (char *)&sa, alen);
1535
f6aa0fc8c3cc getSocketAddress
Claus Gittinger <cg@exept.de>
parents: 1533
diff changeset
  3541
f6aa0fc8c3cc getSocketAddress
Claus Gittinger <cg@exept.de>
parents: 1533
diff changeset
  3542
err:;
f6aa0fc8c3cc getSocketAddress
Claus Gittinger <cg@exept.de>
parents: 1533
diff changeset
  3543
#else /* NO_SOCKET */
f6aa0fc8c3cc getSocketAddress
Claus Gittinger <cg@exept.de>
parents: 1533
diff changeset
  3544
    error = @symbol(notImplemented);
f6aa0fc8c3cc getSocketAddress
Claus Gittinger <cg@exept.de>
parents: 1533
diff changeset
  3545
#endif /* NO_SOCKET */
f6aa0fc8c3cc getSocketAddress
Claus Gittinger <cg@exept.de>
parents: 1533
diff changeset
  3546
%}.
f6aa0fc8c3cc getSocketAddress
Claus Gittinger <cg@exept.de>
parents: 1533
diff changeset
  3547
    error notNil ifTrue:[
3217
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  3548
	^ self errorReporter reportOn:error
1535
f6aa0fc8c3cc getSocketAddress
Claus Gittinger <cg@exept.de>
parents: 1533
diff changeset
  3549
    ].
f6aa0fc8c3cc getSocketAddress
Claus Gittinger <cg@exept.de>
parents: 1533
diff changeset
  3550
    ^ addr
f6aa0fc8c3cc getSocketAddress
Claus Gittinger <cg@exept.de>
parents: 1533
diff changeset
  3551
!
f6aa0fc8c3cc getSocketAddress
Claus Gittinger <cg@exept.de>
parents: 1533
diff changeset
  3552
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3553
getName
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3554
    "return the name; here, we return the ports name"
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3555
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  3556
    ^ self port printString
126
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
  3557
!
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
  3558
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3559
getPeer
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3560
    "ST-80 compatibility: return an IPSocketAddress instance representing
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3561
     my hostname/port combination.
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3562
     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
  3563
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
  3564
    ^ peer
102
5dc264007513 added getPeer for ST-80 compatibility
Claus Gittinger <cg@exept.de>
parents: 99
diff changeset
  3565
!
5dc264007513 added getPeer for ST-80 compatibility
Claus Gittinger <cg@exept.de>
parents: 99
diff changeset
  3566
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3567
getPeerName
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3568
    "return the peer name; thats the hostname (or dotted name) of the
25
996051271ce9 *** empty log message ***
claus
parents: 21
diff changeset
  3569
     partners host after an accept."
996051271ce9 *** empty log message ***
claus
parents: 21
diff changeset
  3570
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
  3571
    peerName isNil ifTrue:[
1343
cc3bed115c0a definitions cleanup with stxOSDefs.h
penk
parents: 1342
diff changeset
  3572
	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
  3573
    ].
25
996051271ce9 *** empty log message ***
claus
parents: 21
diff changeset
  3574
    ^ peerName
28
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  3575
!
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  3576
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3577
getSocketAddress
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3578
    "implemented for swazoo project primitive code cant load as extension
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3579
     answer my own address (I am bound to this address).
1146
71a9df78ba9e bad spelling
Stefan Vogel <sv@exept.de>
parents: 1136
diff changeset
  3580
     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
  3581
1535
f6aa0fc8c3cc getSocketAddress
Claus Gittinger <cg@exept.de>
parents: 1533
diff changeset
  3582
    ^ self getFullSocketAddress hostAddress
1146
71a9df78ba9e bad spelling
Stefan Vogel <sv@exept.de>
parents: 1136
diff changeset
  3583
!
71a9df78ba9e bad spelling
Stefan Vogel <sv@exept.de>
parents: 1136
diff changeset
  3584
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3585
isActive
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3586
    "return true, if the receiver has a connection"
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3587
2321
6f4cc7b644db filePointer -> handle migration
Claus Gittinger <cg@exept.de>
parents: 2308
diff changeset
  3588
    ^ handle notNil
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3589
!
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3590
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3591
isConnected
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3592
    "return true, if the receiver has a connection"
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3593
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3594
    ^ self isActive
2321
6f4cc7b644db filePointer -> handle migration
Claus Gittinger <cg@exept.de>
parents: 2308
diff changeset
  3595
	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
  3596
!
a563aac90660 No need to ask Socket>>#networkXXXOrderIsMSB, because the return value is
Stefan Vogel <sv@exept.de>
parents: 1542
diff changeset
  3597
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3598
port
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  3599
    "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
  3600
     - so this is the local port."
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  3601
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  3602
"/    port isNil ifTrue:[
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  3603
"/        port := self getFullSocketAddress port.
1505
Stefan Vogel <sv@exept.de>
parents: 1504
diff changeset
  3604
"/    ].
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  3605
71
claus
parents: 63
diff changeset
  3606
    ^ port
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3607
!
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3608
3059
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  3609
socketAddressClass
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  3610
    "get the matchon SocketAddress class for this socket"
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  3611
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  3612
    |domainClass|
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  3613
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  3614
    domainClass := self class socketAddressClassForDomain:domain.
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  3615
    domainClass isNil ifTrue:[
3217
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  3616
	^ self error:'invalid (unsupported) domain'.
3059
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  3617
    ].
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  3618
    ^ domainClass.
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  3619
!
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  3620
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3621
type
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3622
    "return the sockets connection type (i.e. #datagram, #stream etc)"
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3623
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3624
    ^ socketType
81
claus
parents: 79
diff changeset
  3625
! !
claus
parents: 79
diff changeset
  3626
126
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
  3627
!Socket methodsFor:'socket setup'!
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
  3628
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3629
domain:domainArg type:typeArg
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3630
    "set up socket with domain and type.
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3631
     This is a low level entry; no binding, listening or connect
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3632
     is done. Both arguments must be symbols from one of
3059
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  3633
      #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
  3634
3137
df3e9cebf52c class: Socket
Stefan Vogel <sv@exept.de>
parents: 3127
diff changeset
  3635
    ^ self domain:domainArg type:typeArg protocol:nil
126
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
  3636
!
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
  3637
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3638
domain:domainArg type:typeArg protocol:protocolNumber
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3639
    "set up socket with domain, type and protocol number.
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3640
     This is a low level entry; no binding, listening or connect
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3641
     is done. Both arguments must be symbols from one of
3059
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  3642
     #AF_INET, #AF_INET6, #AF_UNIX ... and #stream, #datagram, #raw resp."
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3643
3246
c75a006f9a7a Win32 sockets use handles instead of file pointers
Stefan Vogel <sv@exept.de>
parents: 3224
diff changeset
  3644
    |domainName domainCode typeCode error newHandle|
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3645
2321
6f4cc7b644db filePointer -> handle migration
Claus Gittinger <cg@exept.de>
parents: 2308
diff changeset
  3646
    handle notNil ifTrue:[
3467
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
  3647
	^ self errorAlreadyOpen
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3648
    ].
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3649
    domainName := SocketAddress domainCodeFromName:domainArg.
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3650
    domainCode := OperatingSystem domainCodeOf:domainName.
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3651
    typeCode := OperatingSystem socketTypeCodeOf:typeArg.
3246
c75a006f9a7a Win32 sockets use handles instead of file pointers
Stefan Vogel <sv@exept.de>
parents: 3224
diff changeset
  3652
    newHandle := OperatingSystem socketAccessor new.
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3653
%{
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3654
#ifndef NO_SOCKET
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3655
    FILE *fp;
3137
df3e9cebf52c class: Socket
Stefan Vogel <sv@exept.de>
parents: 3127
diff changeset
  3656
    int dom, typ, proto = 0;
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3657
    int on = 1;
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3658
    SOCKET sock;
3246
c75a006f9a7a Win32 sockets use handles instead of file pointers
Stefan Vogel <sv@exept.de>
parents: 3224
diff changeset
  3659
    int _fd;
c75a006f9a7a Win32 sockets use handles instead of file pointers
Stefan Vogel <sv@exept.de>
parents: 3224
diff changeset
  3660
3123
55ef9ca4f09f class: Socket
Stefan Vogel <sv@exept.de>
parents: 3077
diff changeset
  3661
# ifdef WIN32
55ef9ca4f09f class: Socket
Stefan Vogel <sv@exept.de>
parents: 3077
diff changeset
  3662
#  ifndef WSA_FLAG_NO_HANDLE_INHERIT
55ef9ca4f09f class: Socket
Stefan Vogel <sv@exept.de>
parents: 3077
diff changeset
  3663
#   define WSA_FLAG_NO_HANDLE_INHERIT 0x80
55ef9ca4f09f class: Socket
Stefan Vogel <sv@exept.de>
parents: 3077
diff changeset
  3664
#  endif
55ef9ca4f09f class: Socket
Stefan Vogel <sv@exept.de>
parents: 3077
diff changeset
  3665
    static int noInheritFlag = WSA_FLAG_NO_HANDLE_INHERIT;
55ef9ca4f09f class: Socket
Stefan Vogel <sv@exept.de>
parents: 3077
diff changeset
  3666
# endif
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3667
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3668
    if (! __isSmallInteger(domainCode)) {
3467
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
  3669
	error = @symbol(badArgument1);
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
  3670
	goto out;
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3671
    }
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3672
    if (! __isSmallInteger(typeCode)) {
3467
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
  3673
	error = @symbol(badArgument2);
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
  3674
	goto out;
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3675
    }
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3676
    if (protocolNumber != nil) {
3467
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
  3677
	if (!__isSmallInteger(protocolNumber)) {
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
  3678
	    error = @symbol(badArgument3);
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
  3679
	    goto out;
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
  3680
	}
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
  3681
	proto = __intVal(protocolNumber);
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3682
    }
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3683
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3684
    /*
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3685
     * get address and protocol-family
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3686
     */
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3687
    dom = __intVal(domainCode);
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3688
    typ = __intVal(typeCode);
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3689
3123
55ef9ca4f09f class: Socket
Stefan Vogel <sv@exept.de>
parents: 3077
diff changeset
  3690
# ifdef WIN32
55ef9ca4f09f class: Socket
Stefan Vogel <sv@exept.de>
parents: 3077
diff changeset
  3691
    sock = WSASocket(dom, typ, proto, 0, 0, noInheritFlag);
55ef9ca4f09f class: Socket
Stefan Vogel <sv@exept.de>
parents: 3077
diff changeset
  3692
    if (sock == INVALID_SOCKET && noInheritFlag) {
3467
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
  3693
	// tried to open socket with WSA_FLAG_NO_HANDLE_INHERIT
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
  3694
	// This fails on older windows versions, e.g. Windows XP
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
  3695
	sock = WSASocket(dom, typ, proto, 0, 0, 0);
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
  3696
	if (sock != INVALID_SOCKET) {
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
  3697
	    // no error without WSA_FLAG_NO_HANDLE_INHERIT,
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
  3698
	    // never use this flag again!
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
  3699
	    noInheritFlag = 0;
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
  3700
	}
3123
55ef9ca4f09f class: Socket
Stefan Vogel <sv@exept.de>
parents: 3077
diff changeset
  3701
    }
55ef9ca4f09f class: Socket
Stefan Vogel <sv@exept.de>
parents: 3077
diff changeset
  3702
    if (sock == INVALID_SOCKET) {
3467
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
  3703
	errno = WSAGetLastError();
3123
55ef9ca4f09f class: Socket
Stefan Vogel <sv@exept.de>
parents: 3077
diff changeset
  3704
55ef9ca4f09f class: Socket
Stefan Vogel <sv@exept.de>
parents: 3077
diff changeset
  3705
# else  // !WIN32
55ef9ca4f09f class: Socket
Stefan Vogel <sv@exept.de>
parents: 3077
diff changeset
  3706
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3707
    sock = socket(dom, typ, proto);
3123
55ef9ca4f09f class: Socket
Stefan Vogel <sv@exept.de>
parents: 3077
diff changeset
  3708
# if defined(EPROTONOSUPPORT) /* for SGI */
55ef9ca4f09f class: Socket
Stefan Vogel <sv@exept.de>
parents: 3077
diff changeset
  3709
    if ((sock < 0) && (proto != 0) && (errno == EPROTONOSUPPORT)) {
3467
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
  3710
	DBGPRINTF(("SOCKET: retry with UNSPEC protocol\n"));
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
  3711
	proto = 0;
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
  3712
	sock = socket(dom, typ, 0);
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3713
    }
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3714
# endif
3123
55ef9ca4f09f class: Socket
Stefan Vogel <sv@exept.de>
parents: 3077
diff changeset
  3715
    if (sock < 0) {
55ef9ca4f09f class: Socket
Stefan Vogel <sv@exept.de>
parents: 3077
diff changeset
  3716
# endif // !WIN32
55ef9ca4f09f class: Socket
Stefan Vogel <sv@exept.de>
parents: 3077
diff changeset
  3717
3467
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
  3718
	DBGPRINTF(("SOCKET: socket(dom=%d typ=%d proto=%d) call failed errno=%d\n", dom, typ, proto, errno));
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
  3719
	error = __MKSMALLINT(errno);
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3720
    } else {
3123
55ef9ca4f09f class: Socket
Stefan Vogel <sv@exept.de>
parents: 3077
diff changeset
  3721
# if defined(SET_LINGER_WHEN_CREATING_SOCKET) && defined(SO_LINGER)
3467
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
  3722
	{
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
  3723
	    struct linger l;
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
  3724
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
  3725
	    l.l_onoff = 1;
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
  3726
	    l.l_linger = 30;
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
  3727
	    setsockopt( sock, SOL_SOCKET, SO_LINGER, &l, sizeof(l));
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
  3728
	}
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3729
# endif
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3730
# ifdef WIN32
3467
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
  3731
	/*
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
  3732
	 * make it blocking
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
  3733
	 */
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
  3734
	{
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
  3735
	    unsigned long zero = 0;
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
  3736
	    ioctlsocket(sock, FIONBIO, &zero);
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
  3737
	}
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
  3738
	{
3246
c75a006f9a7a Win32 sockets use handles instead of file pointers
Stefan Vogel <sv@exept.de>
parents: 3224
diff changeset
  3739
#  if 0 && (defined( __BORLANDC__ ) || defined( __MINGW__ ))
3467
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
  3740
	    /*
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
  3741
	     * make it a FILE *
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
  3742
	     */
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
  3743
	    __stxWrapApiEnterCritical();
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
  3744
	    _fd = _open_osfhandle((long)sock, 0);
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
  3745
	    __stxWrapApiLeaveCritical();
2773
ab3049f4a351 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2748
diff changeset
  3746
#  else
3467
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
  3747
	    _fd = (int)sock;
2773
ab3049f4a351 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2748
diff changeset
  3748
#  endif
3467
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
  3749
	    DBGPRINTF(("SOCKET: sock=%d fd=%d\n", sock, _fd));
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
  3750
	}
3246
c75a006f9a7a Win32 sockets use handles instead of file pointers
Stefan Vogel <sv@exept.de>
parents: 3224
diff changeset
  3751
# else  // !WIN32
3467
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
  3752
	fp = fdopen(sock, "r+");
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
  3753
	if (! fp) {
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
  3754
	    DBGPRINTF(("SOCKET: fdopen call failed\n"));
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
  3755
	    error = __MKSMALLINT(errno);
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
  3756
	    __BEGIN_INTERRUPTABLE__
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
  3757
	    closesocket(sock);
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
  3758
	    DBGFPRINTF((stderr, "SOCKET: fdopen failed (%d)\n", sock));
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
  3759
	    __END_INTERRUPTABLE__
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
  3760
	    goto out;
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
  3761
	}
3246
c75a006f9a7a Win32 sockets use handles instead of file pointers
Stefan Vogel <sv@exept.de>
parents: 3224
diff changeset
  3762
# endif // !WIN32
c75a006f9a7a Win32 sockets use handles instead of file pointers
Stefan Vogel <sv@exept.de>
parents: 3224
diff changeset
  3763
3467
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
  3764
	if (@global(FileOpenTrace) == true) {
3223
b126729a904b class: Socket
Stefan Vogel <sv@exept.de>
parents: 3218
diff changeset
  3765
# ifdef WIN32
3467
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
  3766
	    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
  3767
# else
3467
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
  3768
	    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
  3769
# endif
3467
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
  3770
	}
3246
c75a006f9a7a Win32 sockets use handles instead of file pointers
Stefan Vogel <sv@exept.de>
parents: 3224
diff changeset
  3771
c75a006f9a7a Win32 sockets use handles instead of file pointers
Stefan Vogel <sv@exept.de>
parents: 3224
diff changeset
  3772
# ifdef WIN32
3467
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
  3773
	__externalAddressVal(newHandle) = _fd;
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
  3774
	__INST(handleType) = @symbol(socketHandle);
3246
c75a006f9a7a Win32 sockets use handles instead of file pointers
Stefan Vogel <sv@exept.de>
parents: 3224
diff changeset
  3775
# else
3467
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
  3776
	__externalAddressVal(newHandle) = fp;
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
  3777
	__INST(handleType) = @symbol(socketFilePointer);
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3778
# endif
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3779
    }
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3780
#endif
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3781
out:;
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3782
%}.
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3783
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3784
    "all ok?"
3246
c75a006f9a7a Win32 sockets use handles instead of file pointers
Stefan Vogel <sv@exept.de>
parents: 3224
diff changeset
  3785
    handleType notNil ifTrue:[
3467
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
  3786
	handle := newHandle.
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
  3787
	domain := domainArg.
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
  3788
	socketType := typeArg.
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
  3789
	Lobby register:self.
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
  3790
	^ self.
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3791
    ].
3217
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  3792
    error isInteger ifTrue:[
3467
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
  3793
	lastErrorNumber := error.
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
  3794
	^ self openError:error.
3217
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  3795
    ].
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  3796
    ^ self primitiveFailed:error.
126
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
  3797
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
  3798
    "
3059
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  3799
     Socket new domain:#AF_INET type:#stream
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  3800
     Socket new domain:#AF_UNIX type:#stream
126
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
  3801
    "
28
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  3802
! !
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  3803
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  3804
!Socket methodsFor:'specials'!
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  3805
3467
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
  3806
linger:anIntegerOrNil
3224
bad706c50347 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3223
diff changeset
  3807
    "set the linger behavior on close:
bad706c50347 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3223
diff changeset
  3808
      anIntegerOrNil == nil: close returns immediately, socket tries
3467
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
  3809
			     to send buffered data in background.
3224
bad706c50347 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3223
diff changeset
  3810
      anIntegerOrNil == 0:   close returns immediately, bufferd data is discarded.
bad706c50347 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3223
diff changeset
  3811
      anIntegerOrNil > 0:    close waits this many seconds for buffered data
3467
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
  3812
			     to be delivered, after this time buffered data is
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
  3813
			     discarded and close returns"
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
  3814
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
  3815
    ^ self
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
  3816
	setSocketOption:#'SO_LINGER'
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
  3817
	argument:anIntegerOrNil notNil
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
  3818
	argument:anIntegerOrNil.
3224
bad706c50347 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3223
diff changeset
  3819
!
bad706c50347 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3223
diff changeset
  3820
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3821
receiveBufferSize
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3822
    "get the send buffer size - for special applications only.
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3823
     Not all operatingSystems offer this functionality
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3824
     (returns nil, if unsupported)"
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3825
2321
6f4cc7b644db filePointer -> handle migration
Claus Gittinger <cg@exept.de>
parents: 2308
diff changeset
  3826
    handle isNil ifTrue:[
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3827
	^ self errorNotOpen
1335
0fafb78d7a80 sockopt utilities added
Claus Gittinger <cg@exept.de>
parents: 1316
diff changeset
  3828
    ].
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3829
%{
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3830
#if defined(SO_RCVBUF) && defined(SOL_SOCKET)
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3831
    {
2321
6f4cc7b644db filePointer -> handle migration
Claus Gittinger <cg@exept.de>
parents: 2308
diff changeset
  3832
	OBJ fp = __INST(handle);
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3833
	SOCKET sock;
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3834
	int opt;
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3835
	unsigned int size;
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3836
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3837
	sock = SOCKET_FROM_FILE_OBJECT(fp);
1568
3bca500e0c7a send and receiveTimeout fixed
Claus Gittinger <cg@exept.de>
parents: 1561
diff changeset
  3838
	if (getsockopt(sock, SOL_SOCKET, SO_RCVBUF, (char *)&opt, &size) >= 0) {
3bca500e0c7a send and receiveTimeout fixed
Claus Gittinger <cg@exept.de>
parents: 1561
diff changeset
  3839
	    RETURN( __MKSMALLINT(opt) );
3bca500e0c7a send and receiveTimeout fixed
Claus Gittinger <cg@exept.de>
parents: 1561
diff changeset
  3840
	}
1335
0fafb78d7a80 sockopt utilities added
Claus Gittinger <cg@exept.de>
parents: 1316
diff changeset
  3841
    }
0fafb78d7a80 sockopt utilities added
Claus Gittinger <cg@exept.de>
parents: 1316
diff changeset
  3842
#endif
0fafb78d7a80 sockopt utilities added
Claus Gittinger <cg@exept.de>
parents: 1316
diff changeset
  3843
%}.
0fafb78d7a80 sockopt utilities added
Claus Gittinger <cg@exept.de>
parents: 1316
diff changeset
  3844
    ^ nil
0fafb78d7a80 sockopt utilities added
Claus Gittinger <cg@exept.de>
parents: 1316
diff changeset
  3845
!
0fafb78d7a80 sockopt utilities added
Claus Gittinger <cg@exept.de>
parents: 1316
diff changeset
  3846
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3847
receiveBufferSize:size
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3848
    "set the receive buffer size - for special applications only.
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3849
     Not all operatingSystems offer this functionality
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3850
     (returns false, if unsupported)"
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3851
2321
6f4cc7b644db filePointer -> handle migration
Claus Gittinger <cg@exept.de>
parents: 2308
diff changeset
  3852
    handle isNil ifTrue:[
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3853
	^ self errorNotOpen
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3854
    ].
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3855
%{
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3856
#if defined(SO_RCVBUF) && defined(SOL_SOCKET)
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3857
    if (__isSmallInteger(size)) {
2321
6f4cc7b644db filePointer -> handle migration
Claus Gittinger <cg@exept.de>
parents: 2308
diff changeset
  3858
	OBJ fp = __INST(handle);
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3859
	SOCKET sock;
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3860
	int opt;
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3861
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3862
	sock = SOCKET_FROM_FILE_OBJECT(fp);
1343
cc3bed115c0a definitions cleanup with stxOSDefs.h
penk
parents: 1342
diff changeset
  3863
	opt = __intVal(size);
1529
911273d090c1 Re-unified Win32 and Unix code into single Socket.st.
Claus Gittinger <cg@exept.de>
parents: 1505
diff changeset
  3864
	if (setsockopt(sock, SOL_SOCKET, SO_RCVBUF, (char *)&opt, sizeof(int)) >= 0 ) {
911273d090c1 Re-unified Win32 and Unix code into single Socket.st.
Claus Gittinger <cg@exept.de>
parents: 1505
diff changeset
  3865
	    RETURN(true);
911273d090c1 Re-unified Win32 and Unix code into single Socket.st.
Claus Gittinger <cg@exept.de>
parents: 1505
diff changeset
  3866
	}
1335
0fafb78d7a80 sockopt utilities added
Claus Gittinger <cg@exept.de>
parents: 1316
diff changeset
  3867
    }
0fafb78d7a80 sockopt utilities added
Claus Gittinger <cg@exept.de>
parents: 1316
diff changeset
  3868
#endif
0fafb78d7a80 sockopt utilities added
Claus Gittinger <cg@exept.de>
parents: 1316
diff changeset
  3869
%}.
0fafb78d7a80 sockopt utilities added
Claus Gittinger <cg@exept.de>
parents: 1316
diff changeset
  3870
    ^ false
0fafb78d7a80 sockopt utilities added
Claus Gittinger <cg@exept.de>
parents: 1316
diff changeset
  3871
!
0fafb78d7a80 sockopt utilities added
Claus Gittinger <cg@exept.de>
parents: 1316
diff changeset
  3872
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3873
receiveTimeout
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3874
    "get the receive timeout in millis - for special applications only.
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3875
     Not all operatingSystems offer this functionality
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3876
     (returns nil, if unsupported)"
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3877
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3878
    |millis|
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3879
2321
6f4cc7b644db filePointer -> handle migration
Claus Gittinger <cg@exept.de>
parents: 2308
diff changeset
  3880
    handle isNil ifTrue:[
3467
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
  3881
	^ self errorNotOpen
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3882
    ].
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3883
%{
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3884
#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
  3885
    OBJ fp = __INST(handle);
c75a006f9a7a Win32 sockets use handles instead of file pointers
Stefan Vogel <sv@exept.de>
parents: 3224
diff changeset
  3886
    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
  3887
    int len;
c75a006f9a7a Win32 sockets use handles instead of file pointers
Stefan Vogel <sv@exept.de>
parents: 3224
diff changeset
  3888
    int __millis;
c75a006f9a7a Win32 sockets use handles instead of file pointers
Stefan Vogel <sv@exept.de>
parents: 3224
diff changeset
  3889
    struct timeval tv = {0, 0};
c75a006f9a7a Win32 sockets use handles instead of file pointers
Stefan Vogel <sv@exept.de>
parents: 3224
diff changeset
  3890
c75a006f9a7a Win32 sockets use handles instead of file pointers
Stefan Vogel <sv@exept.de>
parents: 3224
diff changeset
  3891
    len = sizeof(struct timeval);
c75a006f9a7a Win32 sockets use handles instead of file pointers
Stefan Vogel <sv@exept.de>
parents: 3224
diff changeset
  3892
    if (getsockopt(sock, SOL_SOCKET, SO_RCVTIMEO, (void *)&tv, &len) == 0) {
3467
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
  3893
	__millis = (tv.tv_sec * 1000) + (tv.tv_usec / 1000);
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
  3894
	millis = __mkSmallInteger(__millis);
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3895
# if 0
3467
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
  3896
	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
  3897
# endif
3246
c75a006f9a7a Win32 sockets use handles instead of file pointers
Stefan Vogel <sv@exept.de>
parents: 3224
diff changeset
  3898
    } else {
3467
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
  3899
	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
  3900
    }
3bca500e0c7a send and receiveTimeout fixed
Claus Gittinger <cg@exept.de>
parents: 1561
diff changeset
  3901
#endif
3bca500e0c7a send and receiveTimeout fixed
Claus Gittinger <cg@exept.de>
parents: 1561
diff changeset
  3902
%}.
3bca500e0c7a send and receiveTimeout fixed
Claus Gittinger <cg@exept.de>
parents: 1561
diff changeset
  3903
    millis notNil ifTrue:[^ millis / 1000 ].
3bca500e0c7a send and receiveTimeout fixed
Claus Gittinger <cg@exept.de>
parents: 1561
diff changeset
  3904
    ^ nil
3bca500e0c7a send and receiveTimeout fixed
Claus Gittinger <cg@exept.de>
parents: 1561
diff changeset
  3905
!
3bca500e0c7a send and receiveTimeout fixed
Claus Gittinger <cg@exept.de>
parents: 1561
diff changeset
  3906
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3907
receiveTimeout:seconds
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3908
    "set the receive timeout - for special applications only.
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3909
     Not all operatingSystems offer this functionality
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3910
     (returns false, if unsupported)"
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3911
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3912
    |millis|
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3913
2321
6f4cc7b644db filePointer -> handle migration
Claus Gittinger <cg@exept.de>
parents: 2308
diff changeset
  3914
    handle isNil ifTrue:[
3467
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
  3915
	^ self errorNotOpen
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3916
    ].
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3917
    millis := (seconds * 1000) rounded.
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3918
%{
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3919
#if defined(SO_RCVTIMEO) && defined(SOL_SOCKET)
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3920
    if (__isSmallInteger(millis)) {
3467
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
  3921
	OBJ fp = __INST(handle);
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
  3922
	SOCKET sock = SOCKET_FROM_FILE_OBJECT(fp);
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
  3923
	int __millis = __intVal(millis);
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
  3924
	struct timeval tv = {0, 0};
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
  3925
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
  3926
	tv.tv_sec = __millis / 1000;
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
  3927
	tv.tv_usec = (__millis % 1000) * 1000;
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3928
# if 0
3467
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
  3929
	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
  3930
# endif
3467
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
  3931
	if (setsockopt(sock, SOL_SOCKET, SO_RCVTIMEO, (void *)&tv, sizeof(struct timeval)) == 0) {
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
  3932
	    RETURN(true);
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
  3933
	}
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
  3934
	console_fprintf(stderr, "Socket [warning]: setsockopt %d failed; errno=%d\n", sock, errno);
28
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  3935
    }
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  3936
#endif
71
claus
parents: 63
diff changeset
  3937
%}.
28
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  3938
    ^ false
81
claus
parents: 79
diff changeset
  3939
!
claus
parents: 79
diff changeset
  3940
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3941
sendBufferSize
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3942
    "get the send buffer size - for special applications only.
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3943
     Not all operatingSystems offer this functionality
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3944
     (returns nil, if unsupported)"
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3945
2321
6f4cc7b644db filePointer -> handle migration
Claus Gittinger <cg@exept.de>
parents: 2308
diff changeset
  3946
    handle isNil ifTrue:[
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3947
	^ self errorNotOpen
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3948
    ].
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3949
%{
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3950
#if defined(SO_SNDBUF) && defined(SOL_SOCKET)
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3951
    {
2321
6f4cc7b644db filePointer -> handle migration
Claus Gittinger <cg@exept.de>
parents: 2308
diff changeset
  3952
	OBJ fp = __INST(handle);
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3953
	SOCKET sock;
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3954
	int opt;
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3955
	unsigned int size;
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3956
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3957
	sock = SOCKET_FROM_FILE_OBJECT(fp);
1568
3bca500e0c7a send and receiveTimeout fixed
Claus Gittinger <cg@exept.de>
parents: 1561
diff changeset
  3958
	if (getsockopt(sock, SOL_SOCKET, SO_SNDBUF, (char *)&opt, &size) >= 0) {
3bca500e0c7a send and receiveTimeout fixed
Claus Gittinger <cg@exept.de>
parents: 1561
diff changeset
  3959
	    RETURN( __MKSMALLINT(opt) );
3bca500e0c7a send and receiveTimeout fixed
Claus Gittinger <cg@exept.de>
parents: 1561
diff changeset
  3960
	}
1335
0fafb78d7a80 sockopt utilities added
Claus Gittinger <cg@exept.de>
parents: 1316
diff changeset
  3961
    }
0fafb78d7a80 sockopt utilities added
Claus Gittinger <cg@exept.de>
parents: 1316
diff changeset
  3962
#endif
0fafb78d7a80 sockopt utilities added
Claus Gittinger <cg@exept.de>
parents: 1316
diff changeset
  3963
%}.
0fafb78d7a80 sockopt utilities added
Claus Gittinger <cg@exept.de>
parents: 1316
diff changeset
  3964
    ^ nil
0fafb78d7a80 sockopt utilities added
Claus Gittinger <cg@exept.de>
parents: 1316
diff changeset
  3965
!
0fafb78d7a80 sockopt utilities added
Claus Gittinger <cg@exept.de>
parents: 1316
diff changeset
  3966
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3967
sendBufferSize:size
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3968
    "set the send buffer size - for special applications only.
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3969
     Not all operatingSystems offer this functionality
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3970
     (returns false, if unsupported)"
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3971
2321
6f4cc7b644db filePointer -> handle migration
Claus Gittinger <cg@exept.de>
parents: 2308
diff changeset
  3972
    handle isNil ifTrue:[
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3973
	^ self errorNotOpen
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3974
    ].
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3975
%{
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3976
#if defined(SO_SNDBUF) && defined(SOL_SOCKET)
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3977
    if (__isSmallInteger(size)) {
2321
6f4cc7b644db filePointer -> handle migration
Claus Gittinger <cg@exept.de>
parents: 2308
diff changeset
  3978
	OBJ fp = __INST(handle);
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3979
	SOCKET sock;
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3980
	int opt;
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3981
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3982
	sock = SOCKET_FROM_FILE_OBJECT(fp);
1343
cc3bed115c0a definitions cleanup with stxOSDefs.h
penk
parents: 1342
diff changeset
  3983
	opt = __intVal(size);
1529
911273d090c1 Re-unified Win32 and Unix code into single Socket.st.
Claus Gittinger <cg@exept.de>
parents: 1505
diff changeset
  3984
	if (setsockopt(sock, SOL_SOCKET, SO_SNDBUF, (char *)&opt, sizeof(int)) >= 0) {
911273d090c1 Re-unified Win32 and Unix code into single Socket.st.
Claus Gittinger <cg@exept.de>
parents: 1505
diff changeset
  3985
	    RETURN(true);
911273d090c1 Re-unified Win32 and Unix code into single Socket.st.
Claus Gittinger <cg@exept.de>
parents: 1505
diff changeset
  3986
	}
1335
0fafb78d7a80 sockopt utilities added
Claus Gittinger <cg@exept.de>
parents: 1316
diff changeset
  3987
    }
0fafb78d7a80 sockopt utilities added
Claus Gittinger <cg@exept.de>
parents: 1316
diff changeset
  3988
#endif
0fafb78d7a80 sockopt utilities added
Claus Gittinger <cg@exept.de>
parents: 1316
diff changeset
  3989
%}.
0fafb78d7a80 sockopt utilities added
Claus Gittinger <cg@exept.de>
parents: 1316
diff changeset
  3990
    ^ false
0fafb78d7a80 sockopt utilities added
Claus Gittinger <cg@exept.de>
parents: 1316
diff changeset
  3991
!
0fafb78d7a80 sockopt utilities added
Claus Gittinger <cg@exept.de>
parents: 1316
diff changeset
  3992
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3993
sendTimeout
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3994
    "get the send timeout in millis - for special applications only.
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3995
     Not all operatingSystems offer this functionality
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3996
     (returns nil, if unsupported)"
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3997
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3998
    |millis|
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3999
2321
6f4cc7b644db filePointer -> handle migration
Claus Gittinger <cg@exept.de>
parents: 2308
diff changeset
  4000
    handle isNil ifTrue:[
3467
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
  4001
	^ self errorNotOpen
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  4002
    ].
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  4003
%{
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  4004
#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
  4005
    OBJ fp = __INST(handle);
c75a006f9a7a Win32 sockets use handles instead of file pointers
Stefan Vogel <sv@exept.de>
parents: 3224
diff changeset
  4006
    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
  4007
    int len;
c75a006f9a7a Win32 sockets use handles instead of file pointers
Stefan Vogel <sv@exept.de>
parents: 3224
diff changeset
  4008
    int __millis;
c75a006f9a7a Win32 sockets use handles instead of file pointers
Stefan Vogel <sv@exept.de>
parents: 3224
diff changeset
  4009
    struct timeval tv = {0, 0};
c75a006f9a7a Win32 sockets use handles instead of file pointers
Stefan Vogel <sv@exept.de>
parents: 3224
diff changeset
  4010
c75a006f9a7a Win32 sockets use handles instead of file pointers
Stefan Vogel <sv@exept.de>
parents: 3224
diff changeset
  4011
    len = sizeof(struct timeval);
c75a006f9a7a Win32 sockets use handles instead of file pointers
Stefan Vogel <sv@exept.de>
parents: 3224
diff changeset
  4012
    if (getsockopt(sock, SOL_SOCKET, SO_SNDTIMEO, (void *)&tv, &len) == 0) {
3467
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
  4013
	__millis = (tv.tv_sec * 1000) + (tv.tv_usec / 1000);
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
  4014
	millis = __mkSmallInteger(__millis);
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  4015
# if 0
3467
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
  4016
	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
  4017
# endif
3246
c75a006f9a7a Win32 sockets use handles instead of file pointers
Stefan Vogel <sv@exept.de>
parents: 3224
diff changeset
  4018
    } else {
3467
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
  4019
	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
  4020
    }
3bca500e0c7a send and receiveTimeout fixed
Claus Gittinger <cg@exept.de>
parents: 1561
diff changeset
  4021
#endif
3bca500e0c7a send and receiveTimeout fixed
Claus Gittinger <cg@exept.de>
parents: 1561
diff changeset
  4022
%}.
3bca500e0c7a send and receiveTimeout fixed
Claus Gittinger <cg@exept.de>
parents: 1561
diff changeset
  4023
    millis notNil ifTrue:[^ millis / 1000 ].
3bca500e0c7a send and receiveTimeout fixed
Claus Gittinger <cg@exept.de>
parents: 1561
diff changeset
  4024
    ^ nil
3bca500e0c7a send and receiveTimeout fixed
Claus Gittinger <cg@exept.de>
parents: 1561
diff changeset
  4025
!
3bca500e0c7a send and receiveTimeout fixed
Claus Gittinger <cg@exept.de>
parents: 1561
diff changeset
  4026
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  4027
sendTimeout:seconds
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  4028
    "set the send timeout - for special applications only.
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  4029
     Not all operatingSystems offer this functionality
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  4030
     (returns false, if unsupported)"
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  4031
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  4032
    |millis|
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  4033
2321
6f4cc7b644db filePointer -> handle migration
Claus Gittinger <cg@exept.de>
parents: 2308
diff changeset
  4034
    handle isNil ifTrue:[
3467
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
  4035
	^ self errorNotOpen
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  4036
    ].
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  4037
    millis := (seconds * 1000) rounded.
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  4038
%{
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  4039
#if defined(SO_SNDTIMEO) && defined(SOL_SOCKET)
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  4040
    if (__isSmallInteger(millis)) {
3467
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
  4041
	OBJ fp = __INST(handle);
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
  4042
	SOCKET sock = SOCKET_FROM_FILE_OBJECT(fp);
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
  4043
	int __millis = __intVal(millis);
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
  4044
	struct timeval tv = {0, 0};
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
  4045
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
  4046
	tv.tv_sec = __millis / 1000;
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
  4047
	tv.tv_usec = (__millis % 1000) * 1000;
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  4048
# if 0
3467
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
  4049
	console_fprintf(stderr, "setsockopt -> millis:%d -> s:%d us:%d \n", __millis, tv.tv_sec, tv.tv_usec);
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  4050
# endif
3467
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
  4051
	if (setsockopt(sock, SOL_SOCKET, SO_SNDTIMEO, (void *)&tv, sizeof(struct timeval)) == 0) {
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
  4052
	    RETURN(true);
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
  4053
	}
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
  4054
	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
  4055
    }
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
  4056
#endif
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
  4057
%}.
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
  4058
    ^ false
1340
eb9b1f1340e5 setTCP_NODELAY
Claus Gittinger <cg@exept.de>
parents: 1339
diff changeset
  4059
!
eb9b1f1340e5 setTCP_NODELAY
Claus Gittinger <cg@exept.de>
parents: 1339
diff changeset
  4060
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  4061
setTCPCork:aBoolean
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  4062
    "enable/disable TCP_CORK (do-not-send-partial-frames)
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  4063
     For special applications only.
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  4064
     Not all OperatingSystems offer this functionality
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  4065
     (returns false, if unsupported)"
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  4066
2551
6da1bc89b74a changed:
Stefan Vogel <sv@exept.de>
parents: 2516
diff changeset
  4067
    ^ self setSocketOption:#'TCP_CORK' argument:aBoolean argument:nil.
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  4068
!
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  4069
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  4070
setTCPNoDelay:aBoolean
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  4071
    "enable/disable TCP_NODELAY (i.e. disable/enable the Nagle algorithm)
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  4072
     For special applications only.
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  4073
     Not all OperatingSystems offer this functionality
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  4074
     (returns false, if unsupported)"
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  4075
2551
6da1bc89b74a changed:
Stefan Vogel <sv@exept.de>
parents: 2516
diff changeset
  4076
    ^ self setSocketOption:#'TCP_NODELAY' argument:aBoolean argument:nil.
126
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
  4077
! !
82
claus
parents: 81
diff changeset
  4078
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  4079
!Socket methodsFor:'waiting'!
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  4080
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  4081
waitForNewConnectionOrDataOnAny:otherConnections timeout:timeoutSeconds
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  4082
    "suspend the current process, until either a new connection comes
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  4083
     in at the receiver, or data arrives on any of the otherConnections.
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  4084
     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
  4085
     For an old connection, that socket is returned.
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  4086
     In any case, the caller gets a socket to operate on as return value,
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  4087
     or nil, if a timeout occured.
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  4088
     This method implements the inner wait-primitive of a multi-connection
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  4089
     server application."
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  4090
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  4091
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  4092
    |wasBlocked sema|
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  4093
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  4094
    "first, a quick check if data is already available"
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  4095
    self canReadWithoutBlocking ifTrue:[
3467
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
  4096
	^ self accept.
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  4097
    ].
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  4098
    otherConnections do:[:aConnection |
3467
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
  4099
	aConnection canReadWithoutBlocking ifTrue:[
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
  4100
	    ^ aConnection
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
  4101
	]
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  4102
    ].
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  4103
3281
bd9392932db1 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3247
diff changeset
  4104
    "check again - prevent incoming interrupts from disturbing our setup"
bd9392932db1 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3247
diff changeset
  4105
    wasBlocked := OperatingSystem blockInterrupts.
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  4106
    [
3467
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
  4107
	sema := Semaphore new name:'multiReadWait'.
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
  4108
	otherConnections do:[:aConnection |
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
  4109
	    Processor signal:sema onInput:(aConnection fileDescriptor).
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
  4110
	].
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
  4111
	Processor signal:sema onInput:(self fileDescriptor).
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
  4112
	timeoutSeconds notNil ifTrue:[
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
  4113
	    Processor signal:sema afterSeconds:timeoutSeconds
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
  4114
	].
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
  4115
	Processor activeProcess state:#ioWait.
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
  4116
	sema wait.
3281
bd9392932db1 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3247
diff changeset
  4117
    ] ifCurtailed:[
3467
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
  4118
	sema notNil ifTrue:[Processor disableSemaphore:sema].
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
  4119
	wasBlocked ifFalse:[OperatingSystem unblockInterrupts].
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  4120
    ].
3281
bd9392932db1 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3247
diff changeset
  4121
    wasBlocked ifFalse:[OperatingSystem unblockInterrupts].
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  4122
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  4123
    "see who it was ..."
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  4124
    self canReadWithoutBlocking ifTrue:[
3467
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
  4125
	^ self accept.
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  4126
    ].
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  4127
    otherConnections do:[:aConnection |
3467
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
  4128
	aConnection canReadWithoutBlocking ifTrue:[
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
  4129
	    ^ aConnection
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
  4130
	]
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  4131
    ].
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  4132
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  4133
    "none - a timeout"
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  4134
    ^ nil
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  4135
!
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  4136
3550
58fab5f59ee8 class: Socket
Claus Gittinger <cg@exept.de>
parents: 3530
diff changeset
  4137
waitForNewConnectionWithTimeout:timeoutSecondsOrNil
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  4138
    "suspend the current process, until a new connection comes
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  4139
     in at the receiver or a timeout occurs.
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  4140
     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
  4141
     Returns nil, if a timeout occured.
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  4142
     This method implements the inner wait-primitive of a single-connection
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  4143
     server application."
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  4144
3550
58fab5f59ee8 class: Socket
Claus Gittinger <cg@exept.de>
parents: 3530
diff changeset
  4145
    (self readWaitWithTimeout:timeoutSecondsOrNil) ifTrue:[
3590
3487165a9cdf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3550
diff changeset
  4146
	"a timeout occurred - no connection within timeout"
3487165a9cdf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3550
diff changeset
  4147
	^ nil
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  4148
    ].
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  4149
    ^ self accept.
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  4150
! !
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  4151
464
600b101a7035 alen in accept
Claus Gittinger <cg@exept.de>
parents: 463
diff changeset
  4152
!Socket class methodsFor:'documentation'!
206
77166a6b3ee6 For ST80 style socket creation: register socket in Lobby.
Stefan Vogel <sv@exept.de>
parents: 203
diff changeset
  4153
77166a6b3ee6 For ST80 style socket creation: register socket in Lobby.
Stefan Vogel <sv@exept.de>
parents: 203
diff changeset
  4154
version
3590
3487165a9cdf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3550
diff changeset
  4155
    ^ '$Header$'
2292
c4b0b901278e added: #standardTimeout
Claus Gittinger <cg@exept.de>
parents: 1940
diff changeset
  4156
!
c4b0b901278e added: #standardTimeout
Claus Gittinger <cg@exept.de>
parents: 1940
diff changeset
  4157
c4b0b901278e added: #standardTimeout
Claus Gittinger <cg@exept.de>
parents: 1940
diff changeset
  4158
version_CVS
3590
3487165a9cdf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3550
diff changeset
  4159
    ^ '$Header$'
206
77166a6b3ee6 For ST80 style socket creation: register socket in Lobby.
Stefan Vogel <sv@exept.de>
parents: 203
diff changeset
  4160
! !
3481
b28077459fde class: Socket
Claus Gittinger <cg@exept.de>
parents: 3467
diff changeset
  4161