Socket.st
author chzeiher
Mon, 19 Nov 2018 12:33:42 +0100
changeset 4765 62ddeead622b
parent 4764 358345478edc
child 4770 ff398f221e71
permissions -rw-r--r--
#OTHER by chzeiher Added version checking for JavaBridge.
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
0
1cf8d1747859 Initial revision
claus
parents:
diff changeset
     1
"
4
1f66800df351 *** empty log message ***
claus
parents: 3
diff changeset
     2
 COPYRIGHT (c) 1992 by Claus Gittinger
42
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
     3
	      All Rights Reserved
0
1cf8d1747859 Initial revision
claus
parents:
diff changeset
     4
1cf8d1747859 Initial revision
claus
parents:
diff changeset
     5
 This software is furnished under a license and may be used
1cf8d1747859 Initial revision
claus
parents:
diff changeset
     6
 only in accordance with the terms of that license and with the
1cf8d1747859 Initial revision
claus
parents:
diff changeset
     7
 inclusion of the above copyright notice.   This software may not
1cf8d1747859 Initial revision
claus
parents:
diff changeset
     8
 be provided or otherwise made available to, or used by, any
1cf8d1747859 Initial revision
claus
parents:
diff changeset
     9
 other person.  No title to or ownership of the software is
1cf8d1747859 Initial revision
claus
parents:
diff changeset
    10
 hereby transferred.
1cf8d1747859 Initial revision
claus
parents:
diff changeset
    11
"
888
a868b0e54a2b ipAddress stuff
Claus Gittinger <cg@exept.de>
parents: 887
diff changeset
    12
"{ Package: 'stx:libbasic2' }"
a868b0e54a2b ipAddress stuff
Claus Gittinger <cg@exept.de>
parents: 887
diff changeset
    13
3462
cfdc47761d0f class: Socket
Claus Gittinger <cg@exept.de>
parents: 3281
diff changeset
    14
"{ NameSpace: Smalltalk }"
cfdc47761d0f class: Socket
Claus Gittinger <cg@exept.de>
parents: 3281
diff changeset
    15
63
7dd3d5b7877e *** empty log message ***
claus
parents: 58
diff changeset
    16
NonPositionableExternalStream subclass:#Socket
4234
eb1b470a27ee #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 4206
diff changeset
    17
	instanceVariableNames:'domain socketType protocol port peer peerName listening'
206
77166a6b3ee6 For ST80 style socket creation: register socket in Lobby.
Stefan Vogel <sv@exept.de>
parents: 203
diff changeset
    18
	classVariableNames:''
77166a6b3ee6 For ST80 style socket creation: register socket in Lobby.
Stefan Vogel <sv@exept.de>
parents: 203
diff changeset
    19
	poolDictionaries:''
77166a6b3ee6 For ST80 style socket creation: register socket in Lobby.
Stefan Vogel <sv@exept.de>
parents: 203
diff changeset
    20
	category:'Streams-External'
0
1cf8d1747859 Initial revision
claus
parents:
diff changeset
    21
!
1cf8d1747859 Initial revision
claus
parents:
diff changeset
    22
126
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
    23
!Socket primitiveDefinitions!
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
    24
%{
1009
e0839f923a3c double underlines;
Claus Gittinger <cg@exept.de>
parents: 1007
diff changeset
    25
/* #define DGRAM_DEBUG /* */
e0839f923a3c double underlines;
Claus Gittinger <cg@exept.de>
parents: 1007
diff changeset
    26
3590
3487165a9cdf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3550
diff changeset
    27
#ifdef __MINGW__
3487165a9cdf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3550
diff changeset
    28
# include <stdio.h>
3487165a9cdf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3550
diff changeset
    29
#endif
1343
cc3bed115c0a definitions cleanup with stxOSDefs.h
penk
parents: 1342
diff changeset
    30
#include "stxOSDefs.h"
126
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
    31
3843
fbced69597a7 oops - error check was disabled
Claus Gittinger <cg@exept.de>
parents: 3742
diff changeset
    32
#ifdef __win32__
3123
55ef9ca4f09f class: Socket
Stefan Vogel <sv@exept.de>
parents: 3077
diff changeset
    33
//#define DEBUG 1
2818
94d67df5c00d compilable with tcc
Claus Gittinger <cg@exept.de>
parents: 2773
diff changeset
    34
/* this is to catch uses of those - there should be none */
1503
4d97e4191d04 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1499
diff changeset
    35
# undef __BEGIN_INTERRUPTABLE__
4d97e4191d04 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1499
diff changeset
    36
# undef __END_INTERRUPTABLE__
2818
94d67df5c00d compilable with tcc
Claus Gittinger <cg@exept.de>
parents: 2773
diff changeset
    37
# ifdef __TCC__
94d67df5c00d compilable with tcc
Claus Gittinger <cg@exept.de>
parents: 2773
diff changeset
    38
#  define __BEGIN_INTERRUPTABLE__ xxxx
94d67df5c00d compilable with tcc
Claus Gittinger <cg@exept.de>
parents: 2773
diff changeset
    39
#  define __END_INTERRUPTABLE__ yyyy
94d67df5c00d compilable with tcc
Claus Gittinger <cg@exept.de>
parents: 2773
diff changeset
    40
# else
94d67df5c00d compilable with tcc
Claus Gittinger <cg@exept.de>
parents: 2773
diff changeset
    41
#  define __BEGIN_INTERRUPTABLE__ ..
94d67df5c00d compilable with tcc
Claus Gittinger <cg@exept.de>
parents: 2773
diff changeset
    42
#  define __END_INTERRUPTABLE__ ..
94d67df5c00d compilable with tcc
Claus Gittinger <cg@exept.de>
parents: 2773
diff changeset
    43
# endif
1503
4d97e4191d04 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1499
diff changeset
    44
1504
92005eec5c9d fixed moving-object-when-interrupted-with-scavenge bugs;
Claus Gittinger <cg@exept.de>
parents: 1503
diff changeset
    45
# define WRAP_STDIO
2823
10179ccfae5d Default for close - linger in background instead 30s in foreground
Stefan Vogel <sv@exept.de>
parents: 2818
diff changeset
    46
// The default is linger until all data is sent in background
10179ccfae5d Default for close - linger in background instead 30s in foreground
Stefan Vogel <sv@exept.de>
parents: 2818
diff changeset
    47
// so the close on the socket is non-blocking
10179ccfae5d Default for close - linger in background instead 30s in foreground
Stefan Vogel <sv@exept.de>
parents: 2818
diff changeset
    48
// linger.onoff=off linger.time= *irrelevant*
10179ccfae5d Default for close - linger in background instead 30s in foreground
Stefan Vogel <sv@exept.de>
parents: 2818
diff changeset
    49
//# define SET_LINGER_WHEN_CREATING_SOCKET
1529
911273d090c1 Re-unified Win32 and Unix code into single Socket.st.
Claus Gittinger <cg@exept.de>
parents: 1505
diff changeset
    50
3742
a12020350fa0 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3741
diff changeset
    51
# ifdef __xxMINGW__
2909
aacef77a1697 64bit fixes
Claus Gittinger <cg@exept.de>
parents: 2904
diff changeset
    52
extern HANDLE _get_osfhandle();
1845
df4d79bfba9d closesocket is still tricky
Claus Gittinger <cg@exept.de>
parents: 1844
diff changeset
    53
# endif
df4d79bfba9d closesocket is still tricky
Claus Gittinger <cg@exept.de>
parents: 1844
diff changeset
    54
3620
c648d063bccc #REFACTORING
Stefan Vogel <sv@exept.de>
parents: 3617
diff changeset
    55
# if defined(__BORLANDC__)
c648d063bccc #REFACTORING
Stefan Vogel <sv@exept.de>
parents: 3617
diff changeset
    56
// not defined in borland headers
c648d063bccc #REFACTORING
Stefan Vogel <sv@exept.de>
parents: 3617
diff changeset
    57
typedef unsigned int socklen_t;
c648d063bccc #REFACTORING
Stefan Vogel <sv@exept.de>
parents: 3617
diff changeset
    58
# endif
c648d063bccc #REFACTORING
Stefan Vogel <sv@exept.de>
parents: 3617
diff changeset
    59
3246
c75a006f9a7a Win32 sockets use handles instead of file pointers
Stefan Vogel <sv@exept.de>
parents: 3224
diff changeset
    60
# if 0 && (defined( __BORLANDC__ ) || defined( __MINGW__ ))
2915
896fffb0f02e mingw64
Claus Gittinger <cg@exept.de>
parents: 2909
diff changeset
    61
#  define SOCKET_FROM_FD(fd)               (SOCKET)(_get_osfhandle(fd))
2909
aacef77a1697 64bit fixes
Claus Gittinger <cg@exept.de>
parents: 2904
diff changeset
    62
# else
3246
c75a006f9a7a Win32 sockets use handles instead of file pointers
Stefan Vogel <sv@exept.de>
parents: 3224
diff changeset
    63
#  define SOCKET_FROM_FD(fd)               (SOCKET)(fd)
2909
aacef77a1697 64bit fixes
Claus Gittinger <cg@exept.de>
parents: 2904
diff changeset
    64
# endif
3843
fbced69597a7 oops - error check was disabled
Claus Gittinger <cg@exept.de>
parents: 3742
diff changeset
    65
#else /* not __win32__ */
3215
342d793d938c class: Socket
Stefan Vogel <sv@exept.de>
parents: 3214
diff changeset
    66
# define SOCKET_FROM_FD(fd)   (fd)
342d793d938c class: Socket
Stefan Vogel <sv@exept.de>
parents: 3214
diff changeset
    67
# define closesocket(sock)    close(sock)
342d793d938c class: Socket
Stefan Vogel <sv@exept.de>
parents: 3214
diff changeset
    68
# define SOCKET               int
3843
fbced69597a7 oops - error check was disabled
Claus Gittinger <cg@exept.de>
parents: 3742
diff changeset
    69
#endif /* ! __win32__ */
1503
4d97e4191d04 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1499
diff changeset
    70
1843
8ee90d243b49 closeSocket after fclose: no longer (Q: is this the right thing)
Claus Gittinger <cg@exept.de>
parents: 1842
diff changeset
    71
#define SOCKET_FROM_FILE(f)             (SOCKET_FROM_FD(fileno(f)))
3246
c75a006f9a7a Win32 sockets use handles instead of file pointers
Stefan Vogel <sv@exept.de>
parents: 3224
diff changeset
    72
#define SOCKET_FROM_FILE_OBJECT(f)      (__INST(handleType) == @symbol(socketHandle) ? SOCKET_FROM_FD(__FILEVal(f)) : SOCKET_FROM_FILE(__FILEVal(f)))
1539
c0e89dcb58b3 non blocking stuff done right here;
Claus Gittinger <cg@exept.de>
parents: 1538
diff changeset
    73
3590
3487165a9cdf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3550
diff changeset
    74
#ifndef __MINGW__
3487165a9cdf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3550
diff changeset
    75
# include <stdio.h>
3487165a9cdf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3550
diff changeset
    76
#endif
126
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
    77
#include <errno.h>
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
    78
1343
cc3bed115c0a definitions cleanup with stxOSDefs.h
penk
parents: 1342
diff changeset
    79
#ifdef WANT__TCP_DOT_H
cc3bed115c0a definitions cleanup with stxOSDefs.h
penk
parents: 1342
diff changeset
    80
# include <netinet/tcp.h>
cc3bed115c0a definitions cleanup with stxOSDefs.h
penk
parents: 1342
diff changeset
    81
#endif
cc3bed115c0a definitions cleanup with stxOSDefs.h
penk
parents: 1342
diff changeset
    82
1344
70d73917ac78 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1343
diff changeset
    83
#ifdef WANT__NETDB_DOT_H
70d73917ac78 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1343
diff changeset
    84
# include <netdb.h>
1343
cc3bed115c0a definitions cleanup with stxOSDefs.h
penk
parents: 1342
diff changeset
    85
#endif
cc3bed115c0a definitions cleanup with stxOSDefs.h
penk
parents: 1342
diff changeset
    86
739
eb3878300c3b removed WIN32 ifdef's - win32 uses Socket_win32.st anyway.
Claus Gittinger <cg@exept.de>
parents: 726
diff changeset
    87
#if defined(TRY_AGAIN) || defined(HOST_NOT_FOUND)
eb3878300c3b removed WIN32 ifdef's - win32 uses Socket_win32.st anyway.
Claus Gittinger <cg@exept.de>
parents: 726
diff changeset
    88
# define USE_H_ERRNO
eb3878300c3b removed WIN32 ifdef's - win32 uses Socket_win32.st anyway.
Claus Gittinger <cg@exept.de>
parents: 726
diff changeset
    89
#endif
eb3878300c3b removed WIN32 ifdef's - win32 uses Socket_win32.st anyway.
Claus Gittinger <cg@exept.de>
parents: 726
diff changeset
    90
126
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
    91
/*
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
    92
 * on some systems errno is a macro ... check for it here
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
    93
 */
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
    94
#ifndef errno
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
    95
 extern errno;
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
    96
#endif
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
    97
648
58e11a70ddaf gethostbyname behaves strange, if a name-server lookup is involved.
Claus Gittinger <cg@exept.de>
parents: 617
diff changeset
    98
#ifdef USE_H_ERRNO
58e11a70ddaf gethostbyname behaves strange, if a name-server lookup is involved.
Claus Gittinger <cg@exept.de>
parents: 617
diff changeset
    99
# ifndef h_errno
58e11a70ddaf gethostbyname behaves strange, if a name-server lookup is involved.
Claus Gittinger <cg@exept.de>
parents: 617
diff changeset
   100
 extern h_errno;
58e11a70ddaf gethostbyname behaves strange, if a name-server lookup is involved.
Claus Gittinger <cg@exept.de>
parents: 617
diff changeset
   101
# endif
58e11a70ddaf gethostbyname behaves strange, if a name-server lookup is involved.
Claus Gittinger <cg@exept.de>
parents: 617
diff changeset
   102
#endif
58e11a70ddaf gethostbyname behaves strange, if a name-server lookup is involved.
Claus Gittinger <cg@exept.de>
parents: 617
diff changeset
   103
126
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
   104
#ifdef DEBUG
1839
c10cd58ec334 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1781
diff changeset
   105
# define DBGPRINTF(x)    { if (__debugging__) console_printf x; }
c10cd58ec334 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1781
diff changeset
   106
# define DBGFPRINTF(x)   { if (__debugging__) console_fprintf x; }
126
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
   107
#else
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
   108
# define DBGPRINTF(x)    /* as nothing */
821
40b0b69bf4b5 more debugs; fixed at-addresses
Claus Gittinger <cg@exept.de>
parents: 820
diff changeset
   109
# define DBGFPRINTF(x)   /* as nothing */
126
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
   110
#endif
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
   111
1531
ec98158988ca compilable under unix
Claus Gittinger <cg@exept.de>
parents: 1529
diff changeset
   112
#ifndef TRUE
1535
f6aa0fc8c3cc getSocketAddress
Claus Gittinger <cg@exept.de>
parents: 1533
diff changeset
   113
# define TRUE   1
1531
ec98158988ca compilable under unix
Claus Gittinger <cg@exept.de>
parents: 1529
diff changeset
   114
#endif
ec98158988ca compilable under unix
Claus Gittinger <cg@exept.de>
parents: 1529
diff changeset
   115
#ifndef FALSE
1535
f6aa0fc8c3cc getSocketAddress
Claus Gittinger <cg@exept.de>
parents: 1533
diff changeset
   116
# define FALSE  0
1531
ec98158988ca compilable under unix
Claus Gittinger <cg@exept.de>
parents: 1529
diff changeset
   117
#endif
3843
fbced69597a7 oops - error check was disabled
Claus Gittinger <cg@exept.de>
parents: 3742
diff changeset
   118
#ifndef __win32__
1531
ec98158988ca compilable under unix
Claus Gittinger <cg@exept.de>
parents: 1529
diff changeset
   119
typedef int BOOL;
ec98158988ca compilable under unix
Claus Gittinger <cg@exept.de>
parents: 1529
diff changeset
   120
#endif
ec98158988ca compilable under unix
Claus Gittinger <cg@exept.de>
parents: 1529
diff changeset
   121
3843
fbced69597a7 oops - error check was disabled
Claus Gittinger <cg@exept.de>
parents: 3742
diff changeset
   122
#ifdef __win32__
1843
8ee90d243b49 closeSocket after fclose: no longer (Q: is this the right thing)
Claus Gittinger <cg@exept.de>
parents: 1842
diff changeset
   123
# undef stdout
8ee90d243b49 closeSocket after fclose: no longer (Q: is this the right thing)
Claus Gittinger <cg@exept.de>
parents: 1842
diff changeset
   124
# undef stderr
8ee90d243b49 closeSocket after fclose: no longer (Q: is this the right thing)
Claus Gittinger <cg@exept.de>
parents: 1842
diff changeset
   125
# define stdout __win32_stdout()
8ee90d243b49 closeSocket after fclose: no longer (Q: is this the right thing)
Claus Gittinger <cg@exept.de>
parents: 1842
diff changeset
   126
# define stderr __win32_stderr()
8ee90d243b49 closeSocket after fclose: no longer (Q: is this the right thing)
Claus Gittinger <cg@exept.de>
parents: 1842
diff changeset
   127
#endif
126
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
   128
%}
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
   129
! !
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
   130
511
c071e228cb24 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 510
diff changeset
   131
!Socket primitiveVariables!
c071e228cb24 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 510
diff changeset
   132
%{
1844
decc9d62520d oops - debug
Claus Gittinger <cg@exept.de>
parents: 1843
diff changeset
   133
static int __debugging__ = 0;
511
c071e228cb24 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 510
diff changeset
   134
%}
c071e228cb24 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 510
diff changeset
   135
! !
c071e228cb24 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 510
diff changeset
   136
1504
92005eec5c9d fixed moving-object-when-interrupted-with-scavenge bugs;
Claus Gittinger <cg@exept.de>
parents: 1503
diff changeset
   137
!Socket primitiveFunctions!
92005eec5c9d fixed moving-object-when-interrupted-with-scavenge bugs;
Claus Gittinger <cg@exept.de>
parents: 1503
diff changeset
   138
%{
92005eec5c9d fixed moving-object-when-interrupted-with-scavenge bugs;
Claus Gittinger <cg@exept.de>
parents: 1503
diff changeset
   139
1529
911273d090c1 Re-unified Win32 and Unix code into single Socket.st.
Claus Gittinger <cg@exept.de>
parents: 1505
diff changeset
   140
static int
3616
Stefan Vogel <sv@exept.de>
parents: 3615
diff changeset
   141
setupBufferParameters(OBJ aDataBuffer, OBJ startIndex, char **p_extPtr, INT *p_offs, size_t *p_objSize)
1504
92005eec5c9d fixed moving-object-when-interrupted-with-scavenge bugs;
Claus Gittinger <cg@exept.de>
parents: 1503
diff changeset
   142
{
3657
Stefan Vogel <sv@exept.de>
parents: 3655
diff changeset
   143
	char *extPtr = 0;
Stefan Vogel <sv@exept.de>
parents: 3655
diff changeset
   144
	int sIdx = 0, objSize = 0, offs = 0;
Stefan Vogel <sv@exept.de>
parents: 3655
diff changeset
   145
Stefan Vogel <sv@exept.de>
parents: 3655
diff changeset
   146
	sIdx = 0;
Stefan Vogel <sv@exept.de>
parents: 3655
diff changeset
   147
	if (__isSmallInteger(startIndex)) {
Stefan Vogel <sv@exept.de>
parents: 3655
diff changeset
   148
	    sIdx = __intVal(startIndex) - 1;
Stefan Vogel <sv@exept.de>
parents: 3655
diff changeset
   149
	}
Stefan Vogel <sv@exept.de>
parents: 3655
diff changeset
   150
Stefan Vogel <sv@exept.de>
parents: 3655
diff changeset
   151
	if (__isExternalBytesLike(aDataBuffer)) {
Stefan Vogel <sv@exept.de>
parents: 3655
diff changeset
   152
	    OBJ sz;
Stefan Vogel <sv@exept.de>
parents: 3655
diff changeset
   153
Stefan Vogel <sv@exept.de>
parents: 3655
diff changeset
   154
	    extPtr = (char *)(__externalBytesAddress(aDataBuffer));
Stefan Vogel <sv@exept.de>
parents: 3655
diff changeset
   155
	    sz = __externalBytesSize(aDataBuffer);
Stefan Vogel <sv@exept.de>
parents: 3655
diff changeset
   156
	    if (__isSmallInteger(sz)) {
Stefan Vogel <sv@exept.de>
parents: 3655
diff changeset
   157
		objSize = __intVal(sz);
Stefan Vogel <sv@exept.de>
parents: 3655
diff changeset
   158
	    } else {
Stefan Vogel <sv@exept.de>
parents: 3655
diff changeset
   159
		objSize = 0; /* unknown */
Stefan Vogel <sv@exept.de>
parents: 3655
diff changeset
   160
	    }
Stefan Vogel <sv@exept.de>
parents: 3655
diff changeset
   161
	    offs = sIdx;
Stefan Vogel <sv@exept.de>
parents: 3655
diff changeset
   162
	} else {
Stefan Vogel <sv@exept.de>
parents: 3655
diff changeset
   163
	    OBJ oClass;
Stefan Vogel <sv@exept.de>
parents: 3655
diff changeset
   164
	    int nInstVars, nInstBytes;
Stefan Vogel <sv@exept.de>
parents: 3655
diff changeset
   165
Stefan Vogel <sv@exept.de>
parents: 3655
diff changeset
   166
	    extPtr = (char *)0;
Stefan Vogel <sv@exept.de>
parents: 3655
diff changeset
   167
	    oClass = __Class(aDataBuffer);
Stefan Vogel <sv@exept.de>
parents: 3655
diff changeset
   168
	    switch (__intVal(__ClassInstPtr(oClass)->c_flags) & ARRAYMASK) {
Stefan Vogel <sv@exept.de>
parents: 3655
diff changeset
   169
		case BYTEARRAY:
Stefan Vogel <sv@exept.de>
parents: 3655
diff changeset
   170
		    offs = sIdx;
Stefan Vogel <sv@exept.de>
parents: 3655
diff changeset
   171
		    break;
Stefan Vogel <sv@exept.de>
parents: 3655
diff changeset
   172
		case WORDARRAY:
Stefan Vogel <sv@exept.de>
parents: 3655
diff changeset
   173
		case SWORDARRAY:
Stefan Vogel <sv@exept.de>
parents: 3655
diff changeset
   174
		    offs = sIdx * 2;
Stefan Vogel <sv@exept.de>
parents: 3655
diff changeset
   175
		    break;
Stefan Vogel <sv@exept.de>
parents: 3655
diff changeset
   176
		case LONGARRAY:
Stefan Vogel <sv@exept.de>
parents: 3655
diff changeset
   177
		case SLONGARRAY:
Stefan Vogel <sv@exept.de>
parents: 3655
diff changeset
   178
		    offs = sIdx * 4;
Stefan Vogel <sv@exept.de>
parents: 3655
diff changeset
   179
		    break;
Stefan Vogel <sv@exept.de>
parents: 3655
diff changeset
   180
		case LONGLONGARRAY:
Stefan Vogel <sv@exept.de>
parents: 3655
diff changeset
   181
		case SLONGLONGARRAY:
Stefan Vogel <sv@exept.de>
parents: 3655
diff changeset
   182
		    offs = sIdx * 8;
1504
92005eec5c9d fixed moving-object-when-interrupted-with-scavenge bugs;
Claus Gittinger <cg@exept.de>
parents: 1503
diff changeset
   183
# ifdef __NEED_LONGLONG_ALIGN
3657
Stefan Vogel <sv@exept.de>
parents: 3655
diff changeset
   184
		    offs += 4;
1504
92005eec5c9d fixed moving-object-when-interrupted-with-scavenge bugs;
Claus Gittinger <cg@exept.de>
parents: 1503
diff changeset
   185
# endif
3657
Stefan Vogel <sv@exept.de>
parents: 3655
diff changeset
   186
		    break;
Stefan Vogel <sv@exept.de>
parents: 3655
diff changeset
   187
		case FLOATARRAY:
Stefan Vogel <sv@exept.de>
parents: 3655
diff changeset
   188
		    offs = sIdx * sizeof(float);
Stefan Vogel <sv@exept.de>
parents: 3655
diff changeset
   189
		    break;
Stefan Vogel <sv@exept.de>
parents: 3655
diff changeset
   190
		case DOUBLEARRAY:
Stefan Vogel <sv@exept.de>
parents: 3655
diff changeset
   191
		    offs = sIdx * sizeof(double);
1504
92005eec5c9d fixed moving-object-when-interrupted-with-scavenge bugs;
Claus Gittinger <cg@exept.de>
parents: 1503
diff changeset
   192
# ifdef __NEED_DOUBLE_ALIGN
3657
Stefan Vogel <sv@exept.de>
parents: 3655
diff changeset
   193
		    offs += 4;
1504
92005eec5c9d fixed moving-object-when-interrupted-with-scavenge bugs;
Claus Gittinger <cg@exept.de>
parents: 1503
diff changeset
   194
# endif
3657
Stefan Vogel <sv@exept.de>
parents: 3655
diff changeset
   195
		    break;
Stefan Vogel <sv@exept.de>
parents: 3655
diff changeset
   196
		default:
Stefan Vogel <sv@exept.de>
parents: 3655
diff changeset
   197
		    *p_objSize = -1;
Stefan Vogel <sv@exept.de>
parents: 3655
diff changeset
   198
		    return 0;
Stefan Vogel <sv@exept.de>
parents: 3655
diff changeset
   199
	    }
Stefan Vogel <sv@exept.de>
parents: 3655
diff changeset
   200
	    nInstVars = __intVal(__ClassInstPtr(oClass)->c_ninstvars);
Stefan Vogel <sv@exept.de>
parents: 3655
diff changeset
   201
	    nInstBytes = OHDR_SIZE + nInstVars * sizeof(OBJ);
Stefan Vogel <sv@exept.de>
parents: 3655
diff changeset
   202
	    offs = offs + nInstBytes;
Stefan Vogel <sv@exept.de>
parents: 3655
diff changeset
   203
	    objSize = __Size(aDataBuffer) - offs;
Stefan Vogel <sv@exept.de>
parents: 3655
diff changeset
   204
	}
Stefan Vogel <sv@exept.de>
parents: 3655
diff changeset
   205
	*p_extPtr = extPtr;
Stefan Vogel <sv@exept.de>
parents: 3655
diff changeset
   206
	*p_objSize = objSize;
Stefan Vogel <sv@exept.de>
parents: 3655
diff changeset
   207
	*p_offs = offs;
Stefan Vogel <sv@exept.de>
parents: 3655
diff changeset
   208
	return 1;
1504
92005eec5c9d fixed moving-object-when-interrupted-with-scavenge bugs;
Claus Gittinger <cg@exept.de>
parents: 1503
diff changeset
   209
}
92005eec5c9d fixed moving-object-when-interrupted-with-scavenge bugs;
Claus Gittinger <cg@exept.de>
parents: 1503
diff changeset
   210
%}
92005eec5c9d fixed moving-object-when-interrupted-with-scavenge bugs;
Claus Gittinger <cg@exept.de>
parents: 1503
diff changeset
   211
! !
92005eec5c9d fixed moving-object-when-interrupted-with-scavenge bugs;
Claus Gittinger <cg@exept.de>
parents: 1503
diff changeset
   212
464
600b101a7035 alen in accept
Claus Gittinger <cg@exept.de>
parents: 463
diff changeset
   213
!Socket class methodsFor:'documentation'!
25
996051271ce9 *** empty log message ***
claus
parents: 21
diff changeset
   214
31
e223f3cf2995 *** empty log message ***
claus
parents: 28
diff changeset
   215
copyright
e223f3cf2995 *** empty log message ***
claus
parents: 28
diff changeset
   216
"
e223f3cf2995 *** empty log message ***
claus
parents: 28
diff changeset
   217
 COPYRIGHT (c) 1992 by Claus Gittinger
42
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   218
	      All Rights Reserved
31
e223f3cf2995 *** empty log message ***
claus
parents: 28
diff changeset
   219
e223f3cf2995 *** empty log message ***
claus
parents: 28
diff changeset
   220
 This software is furnished under a license and may be used
e223f3cf2995 *** empty log message ***
claus
parents: 28
diff changeset
   221
 only in accordance with the terms of that license and with the
e223f3cf2995 *** empty log message ***
claus
parents: 28
diff changeset
   222
 inclusion of the above copyright notice.   This software may not
e223f3cf2995 *** empty log message ***
claus
parents: 28
diff changeset
   223
 be provided or otherwise made available to, or used by, any
e223f3cf2995 *** empty log message ***
claus
parents: 28
diff changeset
   224
 other person.  No title to or ownership of the software is
e223f3cf2995 *** empty log message ***
claus
parents: 28
diff changeset
   225
 hereby transferred.
e223f3cf2995 *** empty log message ***
claus
parents: 28
diff changeset
   226
"
e223f3cf2995 *** empty log message ***
claus
parents: 28
diff changeset
   227
!
e223f3cf2995 *** empty log message ***
claus
parents: 28
diff changeset
   228
25
996051271ce9 *** empty log message ***
claus
parents: 21
diff changeset
   229
documentation
996051271ce9 *** empty log message ***
claus
parents: 21
diff changeset
   230
"
524
8287da54eccf more empty code for other domains;
Claus Gittinger <cg@exept.de>
parents: 513
diff changeset
   231
    This class provides access to sockets for interprocess communication.
25
996051271ce9 *** empty log message ***
claus
parents: 21
diff changeset
   232
1529
911273d090c1 Re-unified Win32 and Unix code into single Socket.st.
Claus Gittinger <cg@exept.de>
parents: 1505
diff changeset
   233
    Currently, only IP and UNIX domain sockets are really fully
911273d090c1 Re-unified Win32 and Unix code into single Socket.st.
Claus Gittinger <cg@exept.de>
parents: 1505
diff changeset
   234
    tested and supported.
525
5891518d17a3 appletalk support - untested
Claus Gittinger <cg@exept.de>
parents: 524
diff changeset
   235
    Code for appletalk is included, but was never tested ...
5891518d17a3 appletalk support - untested
Claus Gittinger <cg@exept.de>
parents: 524
diff changeset
   236
    More may be added in the future.
5891518d17a3 appletalk support - untested
Claus Gittinger <cg@exept.de>
parents: 524
diff changeset
   237
    (the code is prepared for things like SNA or decNet;
5891518d17a3 appletalk support - untested
Claus Gittinger <cg@exept.de>
parents: 524
diff changeset
   238
     however, right now, this code is empty and needs a little work.
3989
d99b5df54e27 #DOCUMENTATION by mawalch
mawalch
parents: 3988
diff changeset
   239
     Implementing those is pretty straightforward, once the address
525
5891518d17a3 appletalk support - untested
Claus Gittinger <cg@exept.de>
parents: 524
diff changeset
   240
     data structures are known.)
524
8287da54eccf more empty code for other domains;
Claus Gittinger <cg@exept.de>
parents: 513
diff changeset
   241
28
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   242
    Due to historic reasons (I started this class, before I got hold of some
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   243
    code using ST-80 Sockets i.e. RemoteInvocation), there is some old interface
3481
b28077459fde class: Socket
Claus Gittinger <cg@exept.de>
parents: 3467
diff changeset
   244
    which is still supported.
b28077459fde class: Socket
Claus Gittinger <cg@exept.de>
parents: 3467
diff changeset
   245
    This may vanish; use the #family:type: or #newTCPxxx and #newUDPxxx interfaces,
71
claus
parents: 63
diff changeset
   246
    together with the bind/listen and accept calls,
claus
parents: 63
diff changeset
   247
    which are meant to be compatible to ST-80's UnixSocketAccessor interface.
claus
parents: 63
diff changeset
   248
3481
b28077459fde class: Socket
Claus Gittinger <cg@exept.de>
parents: 3467
diff changeset
   249
    TODO: cleanup historic leftovers,
4414
42edc97b2323 bcopy -> memcpy
Claus Gittinger <cg@exept.de>
parents: 4341
diff changeset
   250
	  change to raise more signals on errors.
259
6d36f3ac42a2 documentation
Claus Gittinger <cg@exept.de>
parents: 220
diff changeset
   251
6d36f3ac42a2 documentation
Claus Gittinger <cg@exept.de>
parents: 220
diff changeset
   252
    [author:]
4414
42edc97b2323 bcopy -> memcpy
Claus Gittinger <cg@exept.de>
parents: 4341
diff changeset
   253
	Claus Gittinger
48
18b9353c9d07 *** empty log message ***
claus
parents: 44
diff changeset
   254
"
18b9353c9d07 *** empty log message ***
claus
parents: 44
diff changeset
   255
!
28
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   256
48
18b9353c9d07 *** empty log message ***
claus
parents: 44
diff changeset
   257
examples
18b9353c9d07 *** empty log message ***
claus
parents: 44
diff changeset
   258
"
28
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   259
    example (get help info from an nntp server):
4738
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
   260
                                                                        [exBegin]
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
   261
        |sock|
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
   262
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
   263
        sock := Socket newTCPclientToHost:'smtp.exept.de' port:'smtp'.
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
   264
        sock isNil ifTrue:[
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
   265
            self warn:'no smtp daemon is running'.
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
   266
            ^ self
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
   267
        ].
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
   268
        Transcript showCR:sock nextLine.
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
   269
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
   270
        sock nextPutAll:'HELO STX socket test'; cr.
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
   271
        Transcript showCR:sock nextLine.
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
   272
        sock close
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
   273
                                                                        [exEnd]
209
2152fceba563 finger example
Claus Gittinger <cg@exept.de>
parents: 208
diff changeset
   274
28
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   275
209
2152fceba563 finger example
Claus Gittinger <cg@exept.de>
parents: 208
diff changeset
   276
    example (connect to finger daemon, get users entry):
4738
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
   277
                                                                        [exBegin]
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
   278
        |sock entry|
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
   279
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
   280
        sock := Socket newTCPclientToHost:'localhost' port:'finger'.
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
   281
        sock isNil ifTrue:[
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
   282
            self warn:'no finger daemon is running'.
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
   283
            ^ self
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
   284
        ].
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
   285
        sock useCRLF:true.
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
   286
        sock buffered:false.
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
   287
        sock isNil ifTrue:[
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
   288
            Transcript showCR:'cannot connect to local finger daemon'
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
   289
        ] ifFalse:[
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
   290
            sock nextPutAll:(OperatingSystem getLoginName).
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
   291
            sock cr.
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
   292
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
   293
            entry := sock nextLine.
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
   294
            Transcript showCR:entry.
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
   295
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
   296
            sock close
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
   297
        ]
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
   298
                                                                        [exEnd]
99
7d016cc30052 fixed & moved pingWalk from SNMPSession to here;
Claus Gittinger <cg@exept.de>
parents: 98
diff changeset
   299
28
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   300
    example (connect to an ftp server):
4738
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
   301
                                                                        [exBegin]
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
   302
        |sock|
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
   303
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
   304
        sock := Socket newTCPclientToHost:'www.exept.de' port:'ftp'.
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
   305
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
   306
        sock buffered:false.
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
   307
        Transcript showCR:sock nextLine.
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
   308
        sock nextPutAll:('USER ' , 'anonymous'); cr.
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
   309
        Transcript showCR:sock nextLine.
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
   310
        sock nextPutAll:('PASS ' , 'fooBar'); cr.
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
   311
        Transcript showCR:sock nextLine.
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
   312
        sock nextPutAll:'HELP'; cr.
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
   313
        [
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
   314
            |line|
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
   315
            line := sock nextLine.
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
   316
            Transcript showCR:line.
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
   317
            (line at:4) = $-
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
   318
        ] whileTrue.
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
   319
        sock close.
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
   320
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
   321
        'don't know enough of the ftp protocol to continue here ...'
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
   322
                                                                        [exEnd]
28
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   323
99
7d016cc30052 fixed & moved pingWalk from SNMPSession to here;
Claus Gittinger <cg@exept.de>
parents: 98
diff changeset
   324
93
Claus Gittinger <cg@exept.de>
parents: 92
diff changeset
   325
    example (connect to an snmp server [UDP]):
3985
f4df11cffecf #OTHER by mawalch
mawalch
parents: 3843
diff changeset
   326
    Note: this is not a real connection, only the destination address is
4738
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
   327
          being fixed.
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
   328
                                                                        [exBegin]
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
   329
        |sock port|
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
   330
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
   331
        sock := Socket newUDP.
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
   332
        port := Socket portOfService:'snmp'.
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
   333
        sock connectTo:'224.1.2.3' port:port.
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
   334
        sock buffered:false.
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
   335
        Transcript showCR:'got it'.
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
   336
        sock close.
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
   337
                                                                        [exEnd]
42
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   338
99
7d016cc30052 fixed & moved pingWalk from SNMPSession to here;
Claus Gittinger <cg@exept.de>
parents: 98
diff changeset
   339
42
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   340
    example (await connection from a client and read some data):
4738
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
   341
                                                                        [exBegin]
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
   342
        |connectSock sock|
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
   343
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
   344
        connectSock := Socket newTCPserverAtPort:9998.
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
   345
        connectSock isNil ifTrue:[
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
   346
            Transcript showCR:'socket setup failed.'.
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
   347
        ] ifFalse:[
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
   348
            Transcript showCR:'listen ..'.
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
   349
            (connectSock listenFor:5) ifFalse:[
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
   350
                Transcript showCR:'listen failed.'.
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
   351
            ] ifTrue:[
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
   352
                Transcript showCR:'wait'.
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
   353
                connectSock readWait.
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
   354
                Transcript showCR:'accept'.
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
   355
                sock := connectSock accept.
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
   356
                sock isNil ifTrue:[
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
   357
                    Transcript showCR:'accept failed.'.
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
   358
                ] ifFalse:[
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
   359
                    sock buffered:false.
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
   360
                    Transcript showCR:'server: got it'.
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
   361
                    'can now do transfer via sock'.
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
   362
                    Transcript showCR:'read'.
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
   363
                    Transcript showCR:('got: ' , sock nextLine).
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
   364
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
   365
                    Transcript showCR:'close'.
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
   366
                    sock close
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
   367
                ].
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
   368
                connectSock close.
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
   369
            ]
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
   370
        ]
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
   371
                                                                        [exEnd]
42
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   372
99
7d016cc30052 fixed & moved pingWalk from SNMPSession to here;
Claus Gittinger <cg@exept.de>
parents: 98
diff changeset
   373
42
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   374
    example (connect to above server and send some data):
4738
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
   375
                                                                        [exBegin]
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
   376
        |sock|
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
   377
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
   378
        sock := Socket newTCPclientToHost:'localhost' port:9998.
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
   379
        sock isNil ifTrue:[
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
   380
            Transcript showCR:'nope'
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
   381
        ] ifFalse:[
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
   382
            sock buffered:false.
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
   383
            Transcript showCR:'client: got it'.
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
   384
            'can now do transfer via sock'.
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
   385
            Transcript showCR:'sending <hello>'.
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
   386
            sock nextPutLine:'hello'.
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
   387
            sock close
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
   388
        ]
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
   389
                                                                        [exEnd]
117
03cefad7e40b UD socket example & interruptable bind
Claus Gittinger <cg@exept.de>
parents: 116
diff changeset
   390
03cefad7e40b UD socket example & interruptable bind
Claus Gittinger <cg@exept.de>
parents: 116
diff changeset
   391
    example: UNIX domain socket (await connection from a client and read some data):
1009
e0839f923a3c double underlines;
Claus Gittinger <cg@exept.de>
parents: 1007
diff changeset
   392
4738
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
   393
        |connectSock sock|
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
   394
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
   395
        '/tmp/ud_socket' asFilename remove.
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
   396
        connectSock := Socket newUNIXserverAt:'/tmp/ud_socket'.
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
   397
        connectSock isNil ifTrue:[
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
   398
            Transcript showCR:'socket setup failed.'.
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
   399
        ] ifFalse:[
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
   400
            Transcript showCR:'listen ..'.
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
   401
            (connectSock listenFor:5) ifFalse:[
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
   402
                Transcript showCR:'listen failed.'.
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
   403
            ] ifTrue:[
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
   404
                Transcript showCR:'wait'.
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
   405
                connectSock buffered:false.
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
   406
                connectSock readWait.
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
   407
                Transcript showCR:'accept'.
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
   408
                sock := connectSock accept.
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
   409
                sock isNil ifTrue:[
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
   410
                    Transcript showCR:'accept failed.'.
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
   411
                ] ifFalse:[
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
   412
                    sock buffered:false.
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
   413
                    Transcript showCR:'server: got it'.
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
   414
                    'can now do transfer via sock'.
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
   415
                    Transcript showCR:'read'.
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
   416
                    Transcript showCR:('got: ' , sock nextLine).
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
   417
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
   418
                    Transcript showCR:'close'.
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
   419
                    sock close
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
   420
                ].
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
   421
                connectSock close.
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
   422
            ]
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
   423
        ]
117
03cefad7e40b UD socket example & interruptable bind
Claus Gittinger <cg@exept.de>
parents: 116
diff changeset
   424
03cefad7e40b UD socket example & interruptable bind
Claus Gittinger <cg@exept.de>
parents: 116
diff changeset
   425
118
142d5c273454 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 117
diff changeset
   426
    example (connect to above server and send some data;
4738
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
   427
             Notice, this fails, if above server code is executed in the same ST/X image
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
   428
                     (at least on LINUX), since the OS does not correctly handle
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
   429
                     a connect from within an interrupted accept system call
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
   430
                     On SGI's SVR4, this works ok
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
   431
                                                                        [exBegin]
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
   432
        |sock|
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
   433
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
   434
        sock := Socket newUNIXclientTo:'/tmp/ud_socket'.
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
   435
        sock isNil ifTrue:[
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
   436
            Transcript showCR:'nope'
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
   437
        ] ifFalse:[
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
   438
            sock buffered:false.
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
   439
            Transcript showCR:'client: got it'.
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
   440
            'can now do transfer via sock'.
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
   441
            Transcript showCR:'sending <hello>'.
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
   442
            sock nextPutLine:'hello'.
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
   443
            sock close
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
   444
        ]
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
   445
                                                                        [exEnd]
1007
5267b5738779 UDP examples
Claus Gittinger <cg@exept.de>
parents: 1004
diff changeset
   446
5267b5738779 UDP examples
Claus Gittinger <cg@exept.de>
parents: 1004
diff changeset
   447
5267b5738779 UDP examples
Claus Gittinger <cg@exept.de>
parents: 1004
diff changeset
   448
    example (UDP await packet from a client and read some data):
4738
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
   449
                                                                        [exBegin]
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
   450
        |udpSock sock addr n dataBuffer|
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
   451
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
   452
        udpSock := Socket newUDPserverAtPort:9999.
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
   453
        udpSock isNil ifTrue:[
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
   454
            Transcript showCR:'socket setup failed.'.
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
   455
        ] ifFalse:[
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
   456
            Transcript showCR:'wait'.
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
   457
            udpSock readWait.
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
   458
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
   459
            addr := IPSocketAddress new.
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
   460
            dataBuffer := ByteArray new:1000.
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
   461
            n := udpSock receiveFrom:addr buffer:dataBuffer start:1 for:dataBuffer size.
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
   462
            n > 0 ifTrue:[
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
   463
                Transcript showCR:('got: ' , n printString , 'bytes  from ' , addr printString).
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
   464
                Transcript showCR:('data: ' , (dataBuffer copyTo:n) printString).
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
   465
            ] ifFalse:[
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
   466
                Transcript showCR:'read failed'.
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
   467
            ].
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
   468
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
   469
            Transcript showCR:'close'.
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
   470
            udpSock close
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
   471
        ]
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
   472
                                                                        [exEnd]
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
   473
1007
5267b5738779 UDP examples
Claus Gittinger <cg@exept.de>
parents: 1004
diff changeset
   474
    example (connect to above UDP server and send some data;
4738
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
   475
                                                                        [exBegin]
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
   476
        |sock|
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
   477
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
   478
        sock := Socket newUDP.
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
   479
        sock isNil ifTrue:[
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
   480
            Transcript showCR:'nope'
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
   481
        ] ifFalse:[
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
   482
            sock 
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
   483
                sendTo:(IPSocketAddress hostName:'127.0.0.1' port:9999) buffer:'hello world'.
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
   484
            sock close
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
   485
        ]
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
   486
                                                                        [exEnd]
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
   487
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
   488
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
   489
    example (UDP await packet from a client and read some multicast data):
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
   490
                                                                        [exBegin]
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
   491
        |udpSock sock addr n dataBuffer|
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
   492
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
   493
        udpSock := Socket newUDPserverAtPort:9999.
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
   494
        udpSock isNil ifTrue:[
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
   495
            Transcript showCR:'socket setup failed.'.
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
   496
        ] ifFalse:[
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
   497
            udpSock setSocketOption:#'IP_ADD_MEMBERSHIP' argument:#[224 1 2 3] argument:#[0 0 0 0].
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
   498
            Transcript showCR:'wait'.
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
   499
            udpSock readWait.
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
   500
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
   501
            addr := IPSocketAddress new.
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
   502
            dataBuffer := ByteArray new:1000.
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
   503
            n := udpSock receiveFrom:addr buffer:dataBuffer start:1 for:dataBuffer size.
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
   504
            n > 0 ifTrue:[
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
   505
                Transcript showCR:('got: ' , n printString , 'bytes  from ' , addr printString).
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
   506
                Transcript showCR:('data: ' , (dataBuffer copyTo:n) printString).
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
   507
            ] ifFalse:[
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
   508
                Transcript showCR:'read failed'.
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
   509
            ].
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
   510
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
   511
            Transcript showCR:'close'.
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
   512
            udpSock close
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
   513
        ]
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
   514
                                                                        [exEnd]
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
   515
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
   516
    example (connect to above UDP server and send some multicast data):
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
   517
                                                                        [exBegin]
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
   518
        |sock|
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
   519
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
   520
        sock := Socket newUDP.
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
   521
        sock isNil ifTrue:[
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
   522
            Transcript showCR:'nope'
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
   523
        ] ifFalse:[
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
   524
            sock 
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
   525
                setSocketOption:#'IP_MULTICAST_TTL' argument:3 argument:nil;
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
   526
                sendTo:(IPSocketAddress hostName:'224.1.2.3' port:9999) buffer:'hello world'.
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
   527
            sock close
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
   528
        ]
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
   529
                                                                        [exEnd]
99
7d016cc30052 fixed & moved pingWalk from SNMPSession to here;
Claus Gittinger <cg@exept.de>
parents: 98
diff changeset
   530
7d016cc30052 fixed & moved pingWalk from SNMPSession to here;
Claus Gittinger <cg@exept.de>
parents: 98
diff changeset
   531
    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
   532
    Note: it dosen't use ICMP ping, but tries to reache the echo service,
4738
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
   533
          which is disabled on most OS.
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
   534
                                                                        [exBegin]
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
   535
        |myAddress list top hosts walkProcess port|
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
   536
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
   537
        myAddress := OperatingSystem getNetworkAddresses
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
   538
                        keysAndValuesSelect:[:eachIFName :eachAddress|
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
   539
                            eachAddress isLocal not
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
   540
                            and:[eachIFName = 'wlan0']
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
   541
                        ].
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
   542
        myAddress := myAddress first hostAddress.
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
   543
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
   544
        port := Socket portOfService:'echo'.
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
   545
        port isNil ifTrue:[
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
   546
            self error:'dont know echo port'.
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
   547
            ^ self
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
   548
        ].
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
   549
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
   550
        top := StandardSystemView new.
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
   551
        top label:'PING net walk'.
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
   552
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
   553
        list := ScrollableView for:ListView in:top.
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
   554
        list origin:0.0@0.0 corner:1.0@1.0.
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
   555
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
   556
        top openAndWait.
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
   557
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
   558
        walkProcess := [
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
   559
            |l low hi direction tryHostID dottedName hostName conn addr|
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
   560
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
   561
            l := SortedCollection new.
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
   562
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
   563
            ' only works with type C-net
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
   564
              the code below could simply do 1 to:254 do:[:hostID }
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
   565
              but, to probe likely hosts earlier, the probing is done
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
   566
              ping-pong like around my ip-address (assuming, that other machines
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
   567
              have numbers around my own)'.
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
   568
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
   569
            low := hi := (myAddress at:4).
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
   570
            direction := 1.
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
   571
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
   572
            [low > 0 or:[hi < 255]] whileTrue:[
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
   573
                direction > 0 ifTrue:[
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
   574
                    hi := hi + 1.
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
   575
                    tryHostID := hi.
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
   576
                    direction := -1.
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
   577
                ] ifFalse:[
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
   578
                    low := low - 1.
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
   579
                    tryHostID := low.
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
   580
                    direction := 1.
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
   581
                ].
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
   582
                (tryHostID between:1 and:254) ifTrue:[
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
   583
                    dottedName := (myAddress at:1) printString
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
   584
                                  , '.' , (myAddress at:2) printString
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
   585
                                  , '.' , (myAddress at:3) printString
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
   586
                                  , '.' , tryHostID printString.
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
   587
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
   588
                    top label:'PING net walk - trying ' , dottedName.
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
   589
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
   590
                    top windowGroup withCursor:Cursor wait do:[
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
   591
                        conn := Socket newTCPclientToHost:dottedName port:port withTimeout:1000.
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
   592
                        conn notNil ifTrue:[
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
   593
                            addr := Socket ipAddressOfHost:dottedName.
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
   594
                            hostName := Socket hostWithIpAddress:addr.
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
   595
                            hostName isNil ifTrue:[
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
   596
                                hostName :='?'
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
   597
                            ].
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
   598
                            l add:(dottedName paddedTo:15 with:Character space)
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
   599
                                   , ' '
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
   600
                                   , (hostName paddedTo:15 with:Character space)
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
   601
                                   , ' up & reachable'.
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
   602
                            list list:l.
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
   603
                            conn close.
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
   604
                        ]
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
   605
                    ].
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
   606
                ].
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
   607
            ].
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
   608
            top label:'PING reachable hosts'.
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
   609
        ] forkAt:(Processor userBackgroundPriority).
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
   610
        walkProcess name:'ping net walker'.
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
   611
                                                                        [exEnd]
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
   612
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
   613
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
   614
        This example creates a simple UDP server that accepts
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
   615
        single packets from anybody and broadcasts them to all
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
   616
        clients that have connected so far.
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
   617
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
   618
                                                                        [exBegin]
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
   619
        | socket address buffer msgSize clients |
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
   620
        clients := Set new.
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
   621
        address := IPSocketAddress new.
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
   622
        buffer := String new: 1024.
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
   623
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
   624
        socket := self newUDPserverAtPort: 6666.
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
   625
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
   626
        Transcript showCR: 'server starting'.
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
   627
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
   628
        [
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
   629
            [true] whileTrue: [
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
   630
                (socket readWaitWithTimeoutMs: 200) ifFalse: [
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
   631
                    msgSize := socket
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
   632
                            receiveFrom: address
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
   633
                            buffer: buffer
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
   634
                            start: 1
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
   635
                            for: buffer size.
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
   636
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
   637
                    clients add: address copy.
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
   638
                    clients do: [ :clientAddress |
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
   639
                            socket
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
   640
                                    sendTo: clientAddress
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
   641
                                    buffer: buffer
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
   642
                                    start: 1
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
   643
                                    for: msgSize]]
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
   644
            ]
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
   645
        ] ensure:[
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
   646
            Transcript showCR: 'server shutting down'.
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
   647
            socket close
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
   648
        ]
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
   649
                                                                        [exEnd]
817
eda0065cbd47 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 814
diff changeset
   650
eda0065cbd47 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 814
diff changeset
   651
   send a datagram to above server:
4738
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
   652
                                                                        [exBegin]
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
   653
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
   654
        | socket address buffer host msg |
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
   655
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
   656
        host := Dialog
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
   657
                request: 'What is the name of the server''s host?'
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
   658
                initialAnswer: 'localhost'.
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
   659
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
   660
        socket := self newUDP.
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
   661
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
   662
        address := IPSocketAddress hostName: host port: 6666.
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
   663
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
   664
        buffer := ByteArray new: 1000.
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
   665
        [
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
   666
            [(msg := Dialog request: 'Say something') isEmpty] whileFalse:[
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
   667
                | replySize stream |
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
   668
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
   669
                socket writeWait.
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
   670
                stream := buffer writeStream.
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
   671
                stream nextPutAll: msg.
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
   672
                socket sendTo:address buffer:buffer start:1 for:stream position.
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
   673
                socket readWait.
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
   674
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
   675
                replySize := socket receiveFrom:address buffer:buffer.
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
   676
                replySize > 0 ifTrue: [
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
   677
                    Transcript cr; nextPutAll: 'Server acknowledged: '.
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
   678
                    Transcript show: ((buffer copyFrom: 1 to: replySize) asString)
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
   679
                ]
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
   680
            ]
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
   681
        ] ensure: [socket close].
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
   682
        Transcript cr
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
   683
                                                                        [exEnd]
1316
ffe05bfee9b5 example
Claus Gittinger <cg@exept.de>
parents: 1313
diff changeset
   684
ffe05bfee9b5 example
Claus Gittinger <cg@exept.de>
parents: 1313
diff changeset
   685
ffe05bfee9b5 example
Claus Gittinger <cg@exept.de>
parents: 1313
diff changeset
   686
   loopBack:
4738
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
   687
                                                                        [exBegin]
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
   688
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
   689
        |readerTask readingSocket writingSocket|
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
   690
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
   691
        readingSocket := self newTCPserverAtPort:9999.
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
   692
        readerTask :=
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
   693
            [
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
   694
                |connection|
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
   695
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
   696
                readingSocket listenFor:1.
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
   697
                connection := readingSocket accept.
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
   698
                readingSocket close.
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
   699
                [connection atEnd] whileFalse:[
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
   700
                    Transcript showCR:(connection nextLine).
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
   701
                ].
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
   702
                connection close.
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
   703
            ] fork.
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
   704
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
   705
        Delay waitForSeconds:1.
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
   706
        writingSocket := self newTCPclientToHost:'localhost' port:9999.
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
   707
        writingSocket nextPutLine:'Hello'.
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
   708
        writingSocket nextPutLine:'World'.
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
   709
        writingSocket close.
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
   710
                                                                        [exEnd]
25
996051271ce9 *** empty log message ***
claus
parents: 21
diff changeset
   711
"
996051271ce9 *** empty log message ***
claus
parents: 21
diff changeset
   712
! !
996051271ce9 *** empty log message ***
claus
parents: 21
diff changeset
   713
1462
5602fce52b42 squeak stuff
Claus Gittinger <cg@exept.de>
parents: 1413
diff changeset
   714
!Socket class methodsFor:'instance creation'!
126
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
   715
3059
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
   716
bindTo:aSocketAddress type:aTypeSymbol
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
   717
    "create a socket for a specific type
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
   718
     and bind it to aSocketAddress.
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
   719
     Type must be:
3217
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
   720
	#stream, #datagram or #raw
3059
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
   721
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
   722
     Neither connect nor connect-wait is done."
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
   723
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
   724
    |newSock|
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
   725
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
   726
    newSock := self domain:aSocketAddress domain type:aTypeSymbol.
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
   727
    [
3217
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
   728
	newSock bindTo:aSocketAddress reuseAddress:true.
3059
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
   729
    ] ifCurtailed:[
3217
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
   730
	newSock close.
3059
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
   731
    ].
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
   732
    ^ newSock
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
   733
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
   734
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
   735
    "
3217
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
   736
	Socket bindTo:(IPSocketAddress anyHost port:8081) type:#stream.
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
   737
	Socket bindTo:(IPv6SocketAddress anyHost port:8081) type:#datagram.
3059
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
   738
    "
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
   739
!
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
   740
126
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
   741
domain:domainSymbol type:type
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
   742
    "create a socket for domain and type -
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
   743
     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
   744
     Domain must be one of the symbols:
3217
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
   745
	#inet, #unix, #appletalk, #decnet, #xns, ...;
819
4cc15700d123 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 817
diff changeset
   746
     Type must be:
3217
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
   747
	#stream, #datagram or #raw
3059
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
   748
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
   749
     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
   750
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
   751
    ^ self new domain:domainSymbol type:type
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
   752
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
   753
    "
3059
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
   754
     Socket domain:#AF_INET type:#stream
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
   755
     Socket domain:#AF_INET type:#datagram
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
   756
     Socket domain:#AF_INET6 type:#stream
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
   757
     Socket domain:#AF_INET6 type:#datagram
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
   758
     Socket domain:#AF_UNIX type:#stream
126
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
   759
    "
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
   760
!
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
   761
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
   762
newTCP
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
   763
    "create a TCP socket - no binding or other setup is done,
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
   764
     neither connect nor connect-wait is done."
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
   765
3059
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
   766
    ^ self new domain:#'AF_INET' type:#stream
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
    "
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
   769
      Socket newTCP
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
   770
    "
126
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
   771
!
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
   772
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
   773
newTCP:aServiceOrNil
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
   774
    "create a TCP socket for a service -
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
   775
     neither connect nor connect-wait is done."
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
   776
3059
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
   777
    |newSock socketAddress socketAddressClass|
126
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
   778
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
   779
    newSock := self newTCP.
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
   780
    (newSock notNil and:[aServiceOrNil notNil]) ifTrue:[
3217
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
   781
	[
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
   782
	    socketAddressClass := newSock socketAddressClass.
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
   783
	    socketAddress := socketAddressClass hostName:nil serviceName:aServiceOrNil type:#stream.
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
   784
	    socketAddress hostAddress:socketAddressClass anyAddress.
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
   785
	    newSock bindTo:socketAddress reuseAddress:true.
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
   786
	] ifCurtailed:[
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
   787
	    newSock close.
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
   788
	]
126
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
   789
    ].
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
   790
    ^ newSock
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
   791
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
   792
1911
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
   793
    "
3217
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
   794
	Socket newTCP:'http-alt'.
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
   795
	Socket newTCP:9996.
1911
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
   796
    "
126
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
   797
!
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
   798
576
13acab81fad0 more ST80 compatibility
ca
parents: 572
diff changeset
   799
newTCPclientToAddress:aHostAddress port:aService
13acab81fad0 more ST80 compatibility
ca
parents: 572
diff changeset
   800
    "create a new TCP client socket connecting to a service.
13acab81fad0 more ST80 compatibility
ca
parents: 572
diff changeset
   801
     Return a socket instance if ok, nil on failure.
13acab81fad0 more ST80 compatibility
ca
parents: 572
diff changeset
   802
     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
   803
     not the whole smalltalk).
576
13acab81fad0 more ST80 compatibility
ca
parents: 572
diff changeset
   804
     See also: #newTCPclientToAddress:port:withTimeout:"
13acab81fad0 more ST80 compatibility
ca
parents: 572
diff changeset
   805
13acab81fad0 more ST80 compatibility
ca
parents: 572
diff changeset
   806
    ^ self newTCPclientToAddress:aHostAddress port:aService withTimeout:nil
13acab81fad0 more ST80 compatibility
ca
parents: 572
diff changeset
   807
!
13acab81fad0 more ST80 compatibility
ca
parents: 572
diff changeset
   808
4570
39e965ca8d06 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4568
diff changeset
   809
newTCPclientToAddress:aSocketAddressOrByteArray port:aService withTimeout:milliSecondsOrTimeDuration
576
13acab81fad0 more ST80 compatibility
ca
parents: 572
diff changeset
   810
    "create a new TCP client socket connecting to a service.
13acab81fad0 more ST80 compatibility
ca
parents: 572
diff changeset
   811
     Return a socket instance if ok, nil on failure.
13acab81fad0 more ST80 compatibility
ca
parents: 572
diff changeset
   812
     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
   813
     and return nil."
576
13acab81fad0 more ST80 compatibility
ca
parents: 572
diff changeset
   814
3059
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
   815
    |port socketAddress|
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
   816
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
   817
    aService isString ifTrue:[
4570
39e965ca8d06 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4568
diff changeset
   818
        port := self portOfService:aService protocol:#tcp.
3059
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
   819
    ] ifFalse:[
4570
39e965ca8d06 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4568
diff changeset
   820
        port := aService.
3059
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
   821
    ].
3217
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
   822
    socketAddress := aSocketAddressOrByteArray isSocketAddress
4570
39e965ca8d06 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4568
diff changeset
   823
                        ifTrue:[aSocketAddressOrByteArray]
39e965ca8d06 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4568
diff changeset
   824
                        ifFalse:[
39e965ca8d06 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4568
diff changeset
   825
                            "Passing ByteArrays is obsolete and only supported for IPv4"
39e965ca8d06 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4568
diff changeset
   826
                            IPSocketAddress hostAddress:aSocketAddressOrByteArray
39e965ca8d06 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4568
diff changeset
   827
                        ].
3059
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
   828
    port notNil ifTrue:[
4570
39e965ca8d06 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4568
diff changeset
   829
        socketAddress port:port.
3059
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
   830
    ].
4570
39e965ca8d06 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4568
diff changeset
   831
    ^ self newTCPclientToAddress:socketAddress withTimeout:milliSecondsOrTimeDuration
39e965ca8d06 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4568
diff changeset
   832
39e965ca8d06 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4568
diff changeset
   833
    "Modified (format): / 19-01-2018 / 18:26:51 / stefan"
576
13acab81fad0 more ST80 compatibility
ca
parents: 572
diff changeset
   834
!
13acab81fad0 more ST80 compatibility
ca
parents: 572
diff changeset
   835
4570
39e965ca8d06 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4568
diff changeset
   836
newTCPclientToAddress:aSocketAddress withTimeout:milliSecondsOrTimeDuration
126
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
   837
    "create a new TCP client socket connecting to a service.
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
   838
     Return a socket instance if ok, nil on failure.
3059
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
   839
     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
   840
     and return nil."
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
   841
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
   842
    |socket|
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
   843
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
   844
    socket := self domain:aSocketAddress domain type:#stream.
4570
39e965ca8d06 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4568
diff changeset
   845
    ^ [
39e965ca8d06 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4568
diff changeset
   846
        (socket connectTo:aSocketAddress withTimeout:milliSecondsOrTimeDuration) 
39e965ca8d06 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4568
diff changeset
   847
        ifTrue:[socket] ifFalse:[socket close. nil]
39e965ca8d06 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4568
diff changeset
   848
    ] ifCurtailed:[
39e965ca8d06 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4568
diff changeset
   849
        socket close.
3059
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
   850
    ].
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
   851
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
   852
    "
4570
39e965ca8d06 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4568
diff changeset
   853
        self newTCPclientToAddress:(IPv6SocketAddress hostName:'www.exept.de' port:80) withTimeout:nil
3059
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
   854
    "
4570
39e965ca8d06 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4568
diff changeset
   855
39e965ca8d06 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4568
diff changeset
   856
    "Modified (format): / 19-01-2018 / 18:22:30 / stefan"
3059
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
   857
!
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
   858
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
   859
newTCPclientToHost:hostNameOrAddress port:aPortOrServiceName
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
   860
    "create a new TCP client socket connecting to a service.
3985
f4df11cffecf #OTHER by mawalch
mawalch
parents: 3843
diff changeset
   861
     If hostNameOrAddress is a string, try all the resolved addresses regardless
3988
7bf762b79544 #DOCUMENTATION by mawalch
mawalch
parents: 3985
diff changeset
   862
     whether for IPv4 or IPv6.
3059
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
   863
     Return a socket instance if ok, nil on failure.
126
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
   864
     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
   865
     not the whole smalltalk).
126
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
   866
     See also: #newTCPclientToHost:port:withTimeout:"
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
   867
3590
3487165a9cdf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3550
diff changeset
   868
    ^ self
4414
42edc97b2323 bcopy -> memcpy
Claus Gittinger <cg@exept.de>
parents: 4341
diff changeset
   869
	newTCPclientToHost:hostNameOrAddress
42edc97b2323 bcopy -> memcpy
Claus Gittinger <cg@exept.de>
parents: 4341
diff changeset
   870
	port:aPortOrServiceName
42edc97b2323 bcopy -> memcpy
Claus Gittinger <cg@exept.de>
parents: 4341
diff changeset
   871
	domain:self defaultIpDomainForConnect
42edc97b2323 bcopy -> memcpy
Claus Gittinger <cg@exept.de>
parents: 4341
diff changeset
   872
	withTimeout:nil
126
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
   873
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
   874
    "
4239
827d8755965f #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4234
diff changeset
   875
      Socket newTCPclientToHost:'www.exept.de' port:'https'
126
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
   876
    "
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
   877
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
   878
    "Created: 31.10.1995 / 18:54:11 / cg"
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
   879
!
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
   880
4570
39e965ca8d06 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4568
diff changeset
   881
newTCPclientToHost:hostNameOrAddress port:aPortOrServiceName domain:aDomainSymbolOrNil withTimeout:milliSecondsOrTimeDuration
3059
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
   882
    "create a new TCP client socket connecting to a service on hostNameOrAddress.
3985
f4df11cffecf #OTHER by mawalch
mawalch
parents: 3843
diff changeset
   883
     If hostNameOrAddress is a string, try all the resolved addresses.
126
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
   884
     Return a socket instance if ok, nil on failure.
3059
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
   885
     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
   886
     Set aDomainSymbolOrNil to nil, to try all protocols.
4570
39e965ca8d06 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4568
diff changeset
   887
     If the milliSecondsOrTimeDuration arg is nonNil, stop trying to connect after that many milliSecondsOrTimeDurationeconds
3059
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
   888
     and return nil."
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
   889
4570
39e965ca8d06 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4568
diff changeset
   890
    |socket addressList lastDomainSymbol lastNotification|
3059
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
   891
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
   892
    hostNameOrAddress isString ifFalse:[
4570
39e965ca8d06 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4568
diff changeset
   893
        ^ self newTCPclientToAddress:hostNameOrAddress port:aPortOrServiceName withTimeout:milliSecondsOrTimeDuration.
126
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
   894
    ].
3059
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
   895
4341
2b08cb3ff1a3 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 4320
diff changeset
   896
    addressList := SocketAddress
4570
39e965ca8d06 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4568
diff changeset
   897
                        allForHostName:hostNameOrAddress
39e965ca8d06 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4568
diff changeset
   898
                        serviceName:aPortOrServiceName
39e965ca8d06 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4568
diff changeset
   899
                        domain:aDomainSymbolOrNil
39e965ca8d06 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4568
diff changeset
   900
                        type:#stream.
4341
2b08cb3ff1a3 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 4320
diff changeset
   901
2b08cb3ff1a3 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 4320
diff changeset
   902
    addressList do:[:eachAddress|
4570
39e965ca8d06 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4568
diff changeset
   903
        |domainSymbol|
39e965ca8d06 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4568
diff changeset
   904
39e965ca8d06 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4568
diff changeset
   905
        domainSymbol := eachAddress domain.
39e965ca8d06 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4568
diff changeset
   906
        domainSymbol ~~ lastDomainSymbol ifTrue:[
39e965ca8d06 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4568
diff changeset
   907
            socket notNil ifTrue:[
39e965ca8d06 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4568
diff changeset
   908
                socket close.
39e965ca8d06 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4568
diff changeset
   909
            ].
39e965ca8d06 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4568
diff changeset
   910
            socket := self new domain:domainSymbol type:#stream.
39e965ca8d06 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4568
diff changeset
   911
            lastDomainSymbol := domainSymbol.
39e965ca8d06 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4568
diff changeset
   912
        ].
39e965ca8d06 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4568
diff changeset
   913
        [
39e965ca8d06 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4568
diff changeset
   914
            (socket connectTo:eachAddress withTimeout:milliSecondsOrTimeDuration) ifTrue:[
39e965ca8d06 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4568
diff changeset
   915
                ^ socket.
39e965ca8d06 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4568
diff changeset
   916
            ].
39e965ca8d06 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4568
diff changeset
   917
        ] on:SocketErrorNotification do:[:ex|
39e965ca8d06 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4568
diff changeset
   918
            lastNotification := ex.
39e965ca8d06 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4568
diff changeset
   919
        ].
3059
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
   920
    ].
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
   921
    socket notNil ifTrue:[
4570
39e965ca8d06 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4568
diff changeset
   922
        socket close.
39e965ca8d06 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4568
diff changeset
   923
    ].
39e965ca8d06 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4568
diff changeset
   924
    lastNotification notNil ifTrue:[
39e965ca8d06 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4568
diff changeset
   925
        "if someone is interested in the notification - raise the last one"
39e965ca8d06 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4568
diff changeset
   926
        lastNotification raiseRequest.
3059
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
   927
    ].
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
   928
    ^ nil.
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
   929
126
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
   930
    "
3059
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
   931
      Socket newTCPclientToHost:'www.exept.de' port:80 domain:#'AF_INET' withTimeout:1000.
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
   932
      Socket newTCPclientToHost:'www.exept.de' port:80 domain:#'AF_INET6' withTimeout:1000.
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
   933
      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
   934
      Socket newTCPclientToHost:'localhost' port:'nntp' withTimeout:1000
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
   935
    "
604
b302a21afece Remove redundant code.
Stefan Vogel <sv@exept.de>
parents: 589
diff changeset
   936
4570
39e965ca8d06 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4568
diff changeset
   937
    "Modified: / 19-01-2018 / 18:12:29 / stefan"
126
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
   938
!
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
   939
4570
39e965ca8d06 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4568
diff changeset
   940
newTCPclientToHost:hostNameOrAddress port:aPortOrServiceName withTimeout:milliSecondsOrTimeDuration
3059
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
   941
    "create a new TCP client socket connecting to a service on hostNameOrAddress.
3985
f4df11cffecf #OTHER by mawalch
mawalch
parents: 3843
diff changeset
   942
     If hostNameOrAddress is a string, try all the resolved addresses regardless
3988
7bf762b79544 #DOCUMENTATION by mawalch
mawalch
parents: 3985
diff changeset
   943
     whether for IPv4 or IPv6.
3059
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
   944
     Return a socket instance if ok, nil on failure.
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
   945
     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
   946
     and return nil."
3217
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
   947
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
   948
    ^ self
4570
39e965ca8d06 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4568
diff changeset
   949
        newTCPclientToHost:hostNameOrAddress
39e965ca8d06 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4568
diff changeset
   950
        port:aPortOrServiceName
39e965ca8d06 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4568
diff changeset
   951
        domain:self defaultIpDomainForConnect
39e965ca8d06 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4568
diff changeset
   952
        withTimeout:milliSecondsOrTimeDuration
39e965ca8d06 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4568
diff changeset
   953
39e965ca8d06 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4568
diff changeset
   954
    "Modified (format): / 19-01-2018 / 18:24:57 / stefan"
3059
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
   955
!
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
   956
506
11ef93d12870 support anonymous (OS_specified) ports. (for FTP-protocol)
Claus Gittinger <cg@exept.de>
parents: 486
diff changeset
   957
newTCPserverAtAnonymousPort
11ef93d12870 support anonymous (OS_specified) ports. (for FTP-protocol)
Claus Gittinger <cg@exept.de>
parents: 486
diff changeset
   958
    "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
   959
     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
   960
811
72d9ac1a7f95 comments
Claus Gittinger <cg@exept.de>
parents: 809
diff changeset
   961
    ^ self newTCPserverAtPort:0
506
11ef93d12870 support anonymous (OS_specified) ports. (for FTP-protocol)
Claus Gittinger <cg@exept.de>
parents: 486
diff changeset
   962
11ef93d12870 support anonymous (OS_specified) ports. (for FTP-protocol)
Claus Gittinger <cg@exept.de>
parents: 486
diff changeset
   963
!
11ef93d12870 support anonymous (OS_specified) ports. (for FTP-protocol)
Claus Gittinger <cg@exept.de>
parents: 486
diff changeset
   964
126
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
   965
newTCPserverAtPort:aService
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
   966
    "create a new TCP server socket providing service."
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
   967
1911
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
   968
    ^ self newTCP:aService
126
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
   969
!
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
newUDP
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
   972
    "create a UDP socket - no binding or other setup is done,
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
   973
     neither connect nor connect-wait is done."
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
   974
3059
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
   975
    ^ self new domain:#'AF_INET' type:#datagram
126
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
   976
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
   977
    "Socket newUDP"
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
   978
!
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
   979
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
   980
newUDP:aServiceOrNil
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
   981
    "create a UDP socket for a service -
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
   982
     neither connect nor connect-wait is done."
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
   983
3059
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
   984
    |newSock socketAddressClass socketAddress|
126
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
   985
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
   986
    newSock := self newUDP.
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
   987
    (newSock notNil and:[aServiceOrNil notNil]) ifTrue:[
3217
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
   988
	[
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
   989
	    socketAddressClass := newSock socketAddressClass.
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
   990
	    socketAddress := socketAddressClass hostName:nil serviceName:aServiceOrNil type:#stream.
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
   991
	    socketAddress hostAddress:socketAddressClass anyAddress.
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
   992
	    newSock bindTo:socketAddress reuseAddress:true.
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
   993
	] ifCurtailed:[
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
   994
	    newSock close.
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
   995
	]
126
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
   996
    ].
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
   997
    ^ newSock
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
   998
1911
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
   999
    "
3217
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  1000
	Socket newUDP:4444.
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  1001
	Socket newUDP:'activesync'.
1911
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
  1002
    "
126
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
  1003
!
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
  1004
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
  1005
newUDPserverAtPort:aService
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
  1006
    "create a new UDP server socket providing service."
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
  1007
1911
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
  1008
    ^ self newUDP:aService
126
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
  1009
!
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
  1010
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
  1011
newUNIX
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
  1012
    "create a UNIX domain socket - no binding or other setup is done,
811
72d9ac1a7f95 comments
Claus Gittinger <cg@exept.de>
parents: 809
diff changeset
  1013
     neither connect nor connect-wait is done.
72d9ac1a7f95 comments
Claus Gittinger <cg@exept.de>
parents: 809
diff changeset
  1014
     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
  1015
     return nil."
126
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
  1016
3059
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  1017
    ^ self new domain:#'AF_UNIX' type:#stream
126
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
  1018
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
  1019
    "
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
  1020
     Socket newUNIX
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
  1021
    "
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
  1022
!
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
  1023
1485
d8578cf3504b gcc3.3.1 insn-scheduler bug workaround
Claus Gittinger <cg@exept.de>
parents: 1474
diff changeset
  1024
newUNIXclientTo:pathName
126
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
  1025
    "create a new UNIX client socket connecting to a pathname.
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
  1026
     Return a socket instance if ok, nil on failure.
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
  1027
     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
  1028
     not the whole smalltalk).
811
72d9ac1a7f95 comments
Claus Gittinger <cg@exept.de>
parents: 809
diff changeset
  1029
     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
  1030
     return nil.
126
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
  1031
     See also: #newUNIXclientTo:withTimeout:"
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
  1032
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
  1033
    ^ self newUNIXclientTo:pathName withTimeout:nil
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
  1034
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
  1035
!
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
  1036
4570
39e965ca8d06 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4568
diff changeset
  1037
newUNIXclientTo:pathName withTimeout:milliSecondsOrTimeDuration
126
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
  1038
    "create a new UNIX client socket connecting to a pathname.
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
  1039
     Return a socket instance if ok, nil on failure.
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
  1040
     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
  1041
     and return nil.
72d9ac1a7f95 comments
Claus Gittinger <cg@exept.de>
parents: 809
diff changeset
  1042
     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
  1043
     return nil."
126
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
  1044
4570
39e965ca8d06 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4568
diff changeset
  1045
    |socket|
39e965ca8d06 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4568
diff changeset
  1046
39e965ca8d06 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4568
diff changeset
  1047
    socket := self newUNIX.
39e965ca8d06 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4568
diff changeset
  1048
    socket isNil ifTrue:[
39e965ca8d06 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4568
diff changeset
  1049
        ^ nil.
126
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
  1050
    ].
4570
39e965ca8d06 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4568
diff changeset
  1051
    ^ [
39e965ca8d06 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4568
diff changeset
  1052
        (socket connectTo:(UDSocketAddress name:pathName) withTimeout:milliSecondsOrTimeDuration)
39e965ca8d06 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4568
diff changeset
  1053
        ifTrue:[socket] ifFalse:[socket close. nil]
39e965ca8d06 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4568
diff changeset
  1054
    ] ifCurtailed:[
39e965ca8d06 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4568
diff changeset
  1055
        socket close.
39e965ca8d06 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4568
diff changeset
  1056
    ].
126
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
  1057
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
  1058
    "
4570
39e965ca8d06 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4568
diff changeset
  1059
        Socket newUNIXclientTo:'/tmp/foo'
39e965ca8d06 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4568
diff changeset
  1060
39e965ca8d06 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4568
diff changeset
  1061
        [
39e965ca8d06 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4568
diff changeset
  1062
            Socket newUNIXclientTo:'/tmp/foo'
39e965ca8d06 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4568
diff changeset
  1063
        ] on:SocketErrorNotification do:[:ex|
39e965ca8d06 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4568
diff changeset
  1064
            ex halt.
39e965ca8d06 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4568
diff changeset
  1065
        ]
126
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
  1066
    "
4570
39e965ca8d06 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4568
diff changeset
  1067
39e965ca8d06 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4568
diff changeset
  1068
    "Modified (format): / 19-01-2018 / 18:23:24 / stefan"
126
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
  1069
!
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
  1070
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
  1071
newUNIXserverAt:pathName
811
72d9ac1a7f95 comments
Claus Gittinger <cg@exept.de>
parents: 809
diff changeset
  1072
    "create a new UNIX server socket providing service at a pathname.
72d9ac1a7f95 comments
Claus Gittinger <cg@exept.de>
parents: 809
diff changeset
  1073
     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
  1074
     return nil."
126
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
  1075
3059
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  1076
    ^ self bindTo:(UDSocketAddress name:pathName) type:#stream.
126
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
  1077
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
  1078
    "
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
  1079
     |s s2|
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
  1080
3059
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  1081
    '/tmp/foo' asFilename remove.
126
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
  1082
     s := Socket newUNIXserverAt:'/tmp/foo'.
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
  1083
     s listenFor:5.
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
  1084
     s2 := s accept.
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
  1085
    "
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
  1086
! !
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
  1087
1462
5602fce52b42 squeak stuff
Claus Gittinger <cg@exept.de>
parents: 1413
diff changeset
  1088
!Socket class methodsFor:'Compatibility-ST80'!
5602fce52b42 squeak stuff
Claus Gittinger <cg@exept.de>
parents: 1413
diff changeset
  1089
5602fce52b42 squeak stuff
Claus Gittinger <cg@exept.de>
parents: 1413
diff changeset
  1090
family:domainSymbol type:typeSymbol
5602fce52b42 squeak stuff
Claus Gittinger <cg@exept.de>
parents: 1413
diff changeset
  1091
    "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
  1092
     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
  1093
     Type must be #stream, #datagram or #raw."
1462
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
    ^ self domain:domainSymbol type:typeSymbol
5602fce52b42 squeak stuff
Claus Gittinger <cg@exept.de>
parents: 1413
diff changeset
  1096
5602fce52b42 squeak stuff
Claus Gittinger <cg@exept.de>
parents: 1413
diff changeset
  1097
    "
3059
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  1098
     Socket family:#AF_INET type:#stream
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  1099
     Socket family:#AF_INET type:#datagram
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  1100
     Socket family:#AF_UNIX type:#stream
1462
5602fce52b42 squeak stuff
Claus Gittinger <cg@exept.de>
parents: 1413
diff changeset
  1101
    "
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
5602fce52b42 squeak stuff
Claus Gittinger <cg@exept.de>
parents: 1413
diff changeset
  1104
getHostname
3462
cfdc47761d0f class: Socket
Claus Gittinger <cg@exept.de>
parents: 3281
diff changeset
  1105
    "return the computer's hostname string"
1462
5602fce52b42 squeak stuff
Claus Gittinger <cg@exept.de>
parents: 1413
diff changeset
  1106
5602fce52b42 squeak stuff
Claus Gittinger <cg@exept.de>
parents: 1413
diff changeset
  1107
    ^ OperatingSystem getHostName
5602fce52b42 squeak stuff
Claus Gittinger <cg@exept.de>
parents: 1413
diff changeset
  1108
5602fce52b42 squeak stuff
Claus Gittinger <cg@exept.de>
parents: 1413
diff changeset
  1109
    "Created: / 27.2.1998 / 02:32:17 / cg"
5602fce52b42 squeak stuff
Claus Gittinger <cg@exept.de>
parents: 1413
diff changeset
  1110
!
5602fce52b42 squeak stuff
Claus Gittinger <cg@exept.de>
parents: 1413
diff changeset
  1111
5602fce52b42 squeak stuff
Claus Gittinger <cg@exept.de>
parents: 1413
diff changeset
  1112
sockStream
5602fce52b42 squeak stuff
Claus Gittinger <cg@exept.de>
parents: 1413
diff changeset
  1113
    "return the type code for stream sockets"
5602fce52b42 squeak stuff
Claus Gittinger <cg@exept.de>
parents: 1413
diff changeset
  1114
5602fce52b42 squeak stuff
Claus Gittinger <cg@exept.de>
parents: 1413
diff changeset
  1115
    ^ #stream
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
1600
f3acd5382fa1 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1584
diff changeset
  1118
!Socket class methodsFor:'Compatibility-Squeak'!
f3acd5382fa1 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1584
diff changeset
  1119
2900
0e8b305e9a98 class: Socket
Claus Gittinger <cg@exept.de>
parents: 2899
diff changeset
  1120
deadlineSecs:seconds
0e8b305e9a98 class: Socket
Claus Gittinger <cg@exept.de>
parents: 2899
diff changeset
  1121
    ^ Timestamp now addSeconds:seconds
0e8b305e9a98 class: Socket
Claus Gittinger <cg@exept.de>
parents: 2899
diff changeset
  1122
!
0e8b305e9a98 class: Socket
Claus Gittinger <cg@exept.de>
parents: 2899
diff changeset
  1123
1600
f3acd5382fa1 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1584
diff changeset
  1124
initializeNetwork
f3acd5382fa1 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1584
diff changeset
  1125
    "/ intentionally left blank here
f3acd5382fa1 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1584
diff changeset
  1126
!
f3acd5382fa1 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1584
diff changeset
  1127
4587
caa262d036d2 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4570
diff changeset
  1128
openConnectionToHostNamed:hostName port:portNr
caa262d036d2 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4570
diff changeset
  1129
    ^ self newTCPclientToHost:hostName port:portNr
caa262d036d2 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4570
diff changeset
  1130
!
caa262d036d2 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4570
diff changeset
  1131
3485
2afd6854bff9 class: Socket
Claus Gittinger <cg@exept.de>
parents: 3484
diff changeset
  1132
standardDeadline
2afd6854bff9 class: Socket
Claus Gittinger <cg@exept.de>
parents: 3484
diff changeset
  1133
    "a standard timeout in seconds for connection setup;
2afd6854bff9 class: Socket
Claus Gittinger <cg@exept.de>
parents: 3484
diff changeset
  1134
     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
  1135
2afd6854bff9 class: Socket
Claus Gittinger <cg@exept.de>
parents: 3484
diff changeset
  1136
    ^ 30
2afd6854bff9 class: Socket
Claus Gittinger <cg@exept.de>
parents: 3484
diff changeset
  1137
!
2afd6854bff9 class: Socket
Claus Gittinger <cg@exept.de>
parents: 3484
diff changeset
  1138
2292
c4b0b901278e added: #standardTimeout
Claus Gittinger <cg@exept.de>
parents: 1940
diff changeset
  1139
standardTimeout
3485
2afd6854bff9 class: Socket
Claus Gittinger <cg@exept.de>
parents: 3484
diff changeset
  1140
    "a standard timeout in seconds for transfers;
2afd6854bff9 class: Socket
Claus Gittinger <cg@exept.de>
parents: 3484
diff changeset
  1141
     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
  1142
2292
c4b0b901278e added: #standardTimeout
Claus Gittinger <cg@exept.de>
parents: 1940
diff changeset
  1143
    ^ 30
c4b0b901278e added: #standardTimeout
Claus Gittinger <cg@exept.de>
parents: 1940
diff changeset
  1144
!
c4b0b901278e added: #standardTimeout
Claus Gittinger <cg@exept.de>
parents: 1940
diff changeset
  1145
1600
f3acd5382fa1 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1584
diff changeset
  1146
wildcardPort
f3acd5382fa1 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1584
diff changeset
  1147
    ^ nil
f3acd5382fa1 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1584
diff changeset
  1148
! !
f3acd5382fa1 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1584
diff changeset
  1149
1462
5602fce52b42 squeak stuff
Claus Gittinger <cg@exept.de>
parents: 1413
diff changeset
  1150
!Socket class methodsFor:'Compatibility-VW'!
5602fce52b42 squeak stuff
Claus Gittinger <cg@exept.de>
parents: 1413
diff changeset
  1151
1485
d8578cf3504b gcc3.3.1 insn-scheduler bug workaround
Claus Gittinger <cg@exept.de>
parents: 1474
diff changeset
  1152
AF_INET
1462
5602fce52b42 squeak stuff
Claus Gittinger <cg@exept.de>
parents: 1413
diff changeset
  1153
    ^ #AF_INET
5602fce52b42 squeak stuff
Claus Gittinger <cg@exept.de>
parents: 1413
diff changeset
  1154
!
5602fce52b42 squeak stuff
Claus Gittinger <cg@exept.de>
parents: 1413
diff changeset
  1155
5602fce52b42 squeak stuff
Claus Gittinger <cg@exept.de>
parents: 1413
diff changeset
  1156
SOCK_STREAM
5602fce52b42 squeak stuff
Claus Gittinger <cg@exept.de>
parents: 1413
diff changeset
  1157
    ^ #SOCK_STREAM
5602fce52b42 squeak stuff
Claus Gittinger <cg@exept.de>
parents: 1413
diff changeset
  1158
! !
5602fce52b42 squeak stuff
Claus Gittinger <cg@exept.de>
parents: 1413
diff changeset
  1159
5602fce52b42 squeak stuff
Claus Gittinger <cg@exept.de>
parents: 1413
diff changeset
  1160
!Socket class methodsFor:'Signal constants'!
5602fce52b42 squeak stuff
Claus Gittinger <cg@exept.de>
parents: 1413
diff changeset
  1161
5602fce52b42 squeak stuff
Claus Gittinger <cg@exept.de>
parents: 1413
diff changeset
  1162
brokenConnectionSignal
5602fce52b42 squeak stuff
Claus Gittinger <cg@exept.de>
parents: 1413
diff changeset
  1163
    "return the signal used to tell broken connections.
5602fce52b42 squeak stuff
Claus Gittinger <cg@exept.de>
parents: 1413
diff changeset
  1164
     Since in unix, this is the same as the broken pipe signal,
5602fce52b42 squeak stuff
Claus Gittinger <cg@exept.de>
parents: 1413
diff changeset
  1165
     return that one.
5602fce52b42 squeak stuff
Claus Gittinger <cg@exept.de>
parents: 1413
diff changeset
  1166
     (for other Operatingsystems, this may change ..)"
5602fce52b42 squeak stuff
Claus Gittinger <cg@exept.de>
parents: 1413
diff changeset
  1167
5602fce52b42 squeak stuff
Claus Gittinger <cg@exept.de>
parents: 1413
diff changeset
  1168
    ^ PipeStream brokenPipeSignal
5602fce52b42 squeak stuff
Claus Gittinger <cg@exept.de>
parents: 1413
diff changeset
  1169
!
5602fce52b42 squeak stuff
Claus Gittinger <cg@exept.de>
parents: 1413
diff changeset
  1170
5602fce52b42 squeak stuff
Claus Gittinger <cg@exept.de>
parents: 1413
diff changeset
  1171
invalidArgumentsSignal
5602fce52b42 squeak stuff
Claus Gittinger <cg@exept.de>
parents: 1413
diff changeset
  1172
    "dummy for compatibility"
5602fce52b42 squeak stuff
Claus Gittinger <cg@exept.de>
parents: 1413
diff changeset
  1173
5602fce52b42 squeak stuff
Claus Gittinger <cg@exept.de>
parents: 1413
diff changeset
  1174
    ^ self errorSignal
5602fce52b42 squeak stuff
Claus Gittinger <cg@exept.de>
parents: 1413
diff changeset
  1175
! !
5602fce52b42 squeak stuff
Claus Gittinger <cg@exept.de>
parents: 1413
diff changeset
  1176
5602fce52b42 squeak stuff
Claus Gittinger <cg@exept.de>
parents: 1413
diff changeset
  1177
!Socket class methodsFor:'debugging'!
5602fce52b42 squeak stuff
Claus Gittinger <cg@exept.de>
parents: 1413
diff changeset
  1178
5602fce52b42 squeak stuff
Claus Gittinger <cg@exept.de>
parents: 1413
diff changeset
  1179
debug:aBoolean
5602fce52b42 squeak stuff
Claus Gittinger <cg@exept.de>
parents: 1413
diff changeset
  1180
    "turn on/off internal debugprints.
5602fce52b42 squeak stuff
Claus Gittinger <cg@exept.de>
parents: 1413
diff changeset
  1181
     This method is for ST/X debugging only and
5602fce52b42 squeak stuff
Claus Gittinger <cg@exept.de>
parents: 1413
diff changeset
  1182
     may  be removed in later versions"
5602fce52b42 squeak stuff
Claus Gittinger <cg@exept.de>
parents: 1413
diff changeset
  1183
5602fce52b42 squeak stuff
Claus Gittinger <cg@exept.de>
parents: 1413
diff changeset
  1184
%{  /* NOCONTEXT */
5602fce52b42 squeak stuff
Claus Gittinger <cg@exept.de>
parents: 1413
diff changeset
  1185
5602fce52b42 squeak stuff
Claus Gittinger <cg@exept.de>
parents: 1413
diff changeset
  1186
    __debugging__ = (aBoolean == true);
5602fce52b42 squeak stuff
Claus Gittinger <cg@exept.de>
parents: 1413
diff changeset
  1187
%}
5602fce52b42 squeak stuff
Claus Gittinger <cg@exept.de>
parents: 1413
diff changeset
  1188
    "
5602fce52b42 squeak stuff
Claus Gittinger <cg@exept.de>
parents: 1413
diff changeset
  1189
     Socket debug:true
5602fce52b42 squeak stuff
Claus Gittinger <cg@exept.de>
parents: 1413
diff changeset
  1190
     Socket debug:false
5602fce52b42 squeak stuff
Claus Gittinger <cg@exept.de>
parents: 1413
diff changeset
  1191
    "
5602fce52b42 squeak stuff
Claus Gittinger <cg@exept.de>
parents: 1413
diff changeset
  1192
! !
5602fce52b42 squeak stuff
Claus Gittinger <cg@exept.de>
parents: 1413
diff changeset
  1193
3059
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  1194
!Socket class methodsFor:'defaults'!
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  1195
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  1196
defaultIpDomainForConnect
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  1197
    "answer the domain used to look up host names for connect:
4414
42edc97b2323 bcopy -> memcpy
Claus Gittinger <cg@exept.de>
parents: 4341
diff changeset
  1198
	#AF_INET    use only IPv4
42edc97b2323 bcopy -> memcpy
Claus Gittinger <cg@exept.de>
parents: 4341
diff changeset
  1199
	#AF_INET6   use only IPv6
42edc97b2323 bcopy -> memcpy
Claus Gittinger <cg@exept.de>
parents: 4341
diff changeset
  1200
	nil         use both IPv4 and IPv6"
4239
827d8755965f #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4234
diff changeset
  1201
827d8755965f #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4234
diff changeset
  1202
    ^ nil
3059
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  1203
! !
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  1204
1911
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
  1205
!Socket class methodsFor:'obsolete'!
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
  1206
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
  1207
connectTo:service on:host
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
  1208
    <resource: #obsolete>
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
  1209
    "standard & easy client setup:
2321
6f4cc7b644db filePointer -> handle migration
Claus Gittinger <cg@exept.de>
parents: 2308
diff changeset
  1210
	create new client tcp socket, bind and connect;
6f4cc7b644db filePointer -> handle migration
Claus Gittinger <cg@exept.de>
parents: 2308
diff changeset
  1211
	return the socket.
1911
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
  1212
     The thread blocks (interruptable), until the connection is established."
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
  1213
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
  1214
    ^ self newTCPclientToHost:host port:(self portOfService:service).
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
  1215
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
  1216
    "
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
  1217
     Socket connectTo:9995 on:'clam'
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
  1218
     Socket connectTo:4711 on:'exept'
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
  1219
     Socket connectTo:'finger' on:'clam'
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
  1220
     Socket connectTo:'ftp' on:'exept'
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
  1221
     Socket connectTo:'nntp' on:(OperatingSystem getEnvironment:'NNTPSERVER')
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
  1222
    "
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
  1223
!
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
  1224
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
  1225
networkLongOrderIsMSB
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
  1226
    "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
  1227
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
  1228
    <resource: #obsolete>
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
  1229
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
  1230
    ^ true
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
  1231
!
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
  1232
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
  1233
networkShortOrderIsMSB
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
  1234
    "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
  1235
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
  1236
    <resource: #obsolete>
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
  1237
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
  1238
    ^ true
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
  1239
!
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
  1240
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
  1241
provide:aService
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
  1242
    "standard & easy server setup:
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
  1243
     create a new TCP server socket providing a service."
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
  1244
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
  1245
    <resource:#obsolete>
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
  1246
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
  1247
    |newSock|
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
  1248
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
  1249
    self obsoleteMethodWarning:'use #newTCPserverAtPort: / #listen'.
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
  1250
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
  1251
    newSock := self newTCPserverAtPort:(self portOfService:aService).
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
  1252
    newSock notNil ifTrue:[
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
  1253
	newSock listenFor:5.
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
  1254
    ].
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
  1255
    ^ newSock
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
  1256
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
  1257
    "
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
  1258
     Socket provide:9995
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
  1259
     (Socket provide:9996) accept
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
  1260
     Socket provide:'nntp'
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
  1261
    "
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
  1262
! !
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
  1263
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
  1264
!Socket class methodsFor:'obsolete host queries'!
525
5891518d17a3 appletalk support - untested
Claus Gittinger <cg@exept.de>
parents: 524
diff changeset
  1265
5891518d17a3 appletalk support - untested
Claus Gittinger <cg@exept.de>
parents: 524
diff changeset
  1266
appletalkAddressOfHost:aHostName
1911
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
  1267
    <resource: #obsolete>
525
5891518d17a3 appletalk support - untested
Claus Gittinger <cg@exept.de>
parents: 524
diff changeset
  1268
    "return the APPLETALK address for a hostname as a byteArray,
819
4cc15700d123 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 817
diff changeset
  1269
     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
  1270
     followed by the node byte.
525
5891518d17a3 appletalk support - untested
Claus Gittinger <cg@exept.de>
parents: 524
diff changeset
  1271
     If the host is unknown, return nil.
812
c8101ea70e6c *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 811
diff changeset
  1272
     This is the reverse operation to #hostWithAppletalkAddress:.
c8101ea70e6c *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 811
diff changeset
  1273
     WARNING: untested code - I have no appletalk to test this."
525
5891518d17a3 appletalk support - untested
Claus Gittinger <cg@exept.de>
parents: 524
diff changeset
  1274
1485
d8578cf3504b gcc3.3.1 insn-scheduler bug workaround
Claus Gittinger <cg@exept.de>
parents: 1474
diff changeset
  1275
    NameLookupError
d8578cf3504b gcc3.3.1 insn-scheduler bug workaround
Claus Gittinger <cg@exept.de>
parents: 1474
diff changeset
  1276
	handle:[:ex |
1343
cc3bed115c0a definitions cleanup with stxOSDefs.h
penk
parents: 1342
diff changeset
  1277
	    ^ nil
cc3bed115c0a definitions cleanup with stxOSDefs.h
penk
parents: 1342
diff changeset
  1278
	]
cc3bed115c0a definitions cleanup with stxOSDefs.h
penk
parents: 1342
diff changeset
  1279
	do:[
cc3bed115c0a definitions cleanup with stxOSDefs.h
penk
parents: 1342
diff changeset
  1280
	    ^ (AppletalkSocketAddress hostName:aHostName) address
cc3bed115c0a definitions cleanup with stxOSDefs.h
penk
parents: 1342
diff changeset
  1281
	]
525
5891518d17a3 appletalk support - untested
Claus Gittinger <cg@exept.de>
parents: 524
diff changeset
  1282
!
5891518d17a3 appletalk support - untested
Claus Gittinger <cg@exept.de>
parents: 524
diff changeset
  1283
1278
7251c65b8d38 use nameLookup from SocketAddress for all addr-families
Claus Gittinger <cg@exept.de>
parents: 1274
diff changeset
  1284
hostWithAppletalkAddress:addrByteArray
1911
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
  1285
    <resource: #obsolete>
525
5891518d17a3 appletalk support - untested
Claus Gittinger <cg@exept.de>
parents: 524
diff changeset
  1286
    "return the hostname for an APPLETALK address.
5891518d17a3 appletalk support - untested
Claus Gittinger <cg@exept.de>
parents: 524
diff changeset
  1287
     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
  1288
     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
  1289
     The last byte is the node number.
4320
5b7848099dea #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 4293
diff changeset
  1290
     Nil is returned for an unknown host or if it's not an appletalk host.
812
c8101ea70e6c *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 811
diff changeset
  1291
     This is is the reverse operation to #appletalkAddressOfHost:.
c8101ea70e6c *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 811
diff changeset
  1292
     WARNING: untested code - I have no appletalk to test this."
525
5891518d17a3 appletalk support - untested
Claus Gittinger <cg@exept.de>
parents: 524
diff changeset
  1293
1485
d8578cf3504b gcc3.3.1 insn-scheduler bug workaround
Claus Gittinger <cg@exept.de>
parents: 1474
diff changeset
  1294
    NameLookupError
4414
42edc97b2323 bcopy -> memcpy
Claus Gittinger <cg@exept.de>
parents: 4341
diff changeset
  1295
	handle:[:ex |
42edc97b2323 bcopy -> memcpy
Claus Gittinger <cg@exept.de>
parents: 4341
diff changeset
  1296
	    ^ nil
42edc97b2323 bcopy -> memcpy
Claus Gittinger <cg@exept.de>
parents: 4341
diff changeset
  1297
	]
42edc97b2323 bcopy -> memcpy
Claus Gittinger <cg@exept.de>
parents: 4341
diff changeset
  1298
	do:[
42edc97b2323 bcopy -> memcpy
Claus Gittinger <cg@exept.de>
parents: 4341
diff changeset
  1299
	    ^ (AppletalkSocketAddress hostAddress:addrByteArray) hostName
42edc97b2323 bcopy -> memcpy
Claus Gittinger <cg@exept.de>
parents: 4341
diff changeset
  1300
	]
1278
7251c65b8d38 use nameLookup from SocketAddress for all addr-families
Claus Gittinger <cg@exept.de>
parents: 1274
diff changeset
  1301
525
5891518d17a3 appletalk support - untested
Claus Gittinger <cg@exept.de>
parents: 524
diff changeset
  1302
    "
1278
7251c65b8d38 use nameLookup from SocketAddress for all addr-families
Claus Gittinger <cg@exept.de>
parents: 1274
diff changeset
  1303
     Socket appletalkAddressOfHost:'yourAppleHere'
1485
d8578cf3504b gcc3.3.1 insn-scheduler bug workaround
Claus Gittinger <cg@exept.de>
parents: 1474
diff changeset
  1304
     Socket hostWithAppletalkAddress:#[1 2 3]
525
5891518d17a3 appletalk support - untested
Claus Gittinger <cg@exept.de>
parents: 524
diff changeset
  1305
     "
4320
5b7848099dea #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 4293
diff changeset
  1306
5b7848099dea #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 4293
diff changeset
  1307
    "Modified (comment): / 13-02-2017 / 20:30:56 / cg"
126
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
  1308
!
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
  1309
1278
7251c65b8d38 use nameLookup from SocketAddress for all addr-families
Claus Gittinger <cg@exept.de>
parents: 1274
diff changeset
  1310
hostWithIpAddress:addrByteArray
1911
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
  1311
    <resource: #obsolete>
126
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
  1312
    "return the hostname for an IP (internet-) address.
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
  1313
     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
  1314
     the network bytes come first (no matter what the local byteorder is).
4320
5b7848099dea #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 4293
diff changeset
  1315
     Nil is returned for an unknown host or if it's not an internet host.
126
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
  1316
     This is the reverse operation to #ipAddressOfHost:."
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
  1317
1485
d8578cf3504b gcc3.3.1 insn-scheduler bug workaround
Claus Gittinger <cg@exept.de>
parents: 1474
diff changeset
  1318
    NameLookupError
4414
42edc97b2323 bcopy -> memcpy
Claus Gittinger <cg@exept.de>
parents: 4341
diff changeset
  1319
	handle:[:ex |
42edc97b2323 bcopy -> memcpy
Claus Gittinger <cg@exept.de>
parents: 4341
diff changeset
  1320
	    ^ nil
42edc97b2323 bcopy -> memcpy
Claus Gittinger <cg@exept.de>
parents: 4341
diff changeset
  1321
	]
42edc97b2323 bcopy -> memcpy
Claus Gittinger <cg@exept.de>
parents: 4341
diff changeset
  1322
	do:[
42edc97b2323 bcopy -> memcpy
Claus Gittinger <cg@exept.de>
parents: 4341
diff changeset
  1323
	    ^ (IPSocketAddress hostAddress:addrByteArray) hostName
42edc97b2323 bcopy -> memcpy
Claus Gittinger <cg@exept.de>
parents: 4341
diff changeset
  1324
	]
126
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
  1325
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
  1326
    "
1485
d8578cf3504b gcc3.3.1 insn-scheduler bug workaround
Claus Gittinger <cg@exept.de>
parents: 1474
diff changeset
  1327
     Socket ipAddressOfHost:'clam'
d8578cf3504b gcc3.3.1 insn-scheduler bug workaround
Claus Gittinger <cg@exept.de>
parents: 1474
diff changeset
  1328
     Socket hostWithIpAddress:(Socket ipAddressOfHost:'clam')
d8578cf3504b gcc3.3.1 insn-scheduler bug workaround
Claus Gittinger <cg@exept.de>
parents: 1474
diff changeset
  1329
     Socket ipAddressOfHost:'porty'
1278
7251c65b8d38 use nameLookup from SocketAddress for all addr-families
Claus Gittinger <cg@exept.de>
parents: 1274
diff changeset
  1330
     Socket hostWithIpAddress:(Socket ipAddressOfHost:'porty')
1485
d8578cf3504b gcc3.3.1 insn-scheduler bug workaround
Claus Gittinger <cg@exept.de>
parents: 1474
diff changeset
  1331
     Socket hostWithIpAddress:#[1 2 3 4]
d8578cf3504b gcc3.3.1 insn-scheduler bug workaround
Claus Gittinger <cg@exept.de>
parents: 1474
diff changeset
  1332
     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
  1333
     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
  1334
     Socket hostWithIpAddress:(Socket ipAddressOfHost:'www.altavista.com')
126
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
  1335
     "
4320
5b7848099dea #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 4293
diff changeset
  1336
5b7848099dea #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 4293
diff changeset
  1337
    "Modified (comment): / 13-02-2017 / 20:31:01 / cg"
126
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
  1338
!
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
  1339
1278
7251c65b8d38 use nameLookup from SocketAddress for all addr-families
Claus Gittinger <cg@exept.de>
parents: 1274
diff changeset
  1340
hostWithIpV6Address:addrByteArray
1911
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
  1341
    <resource: #obsolete>
820
b6860c3660c8 Fix address sizes when calling gethostbyaddr
Stefan Vogel <sv@exept.de>
parents: 819
diff changeset
  1342
    "return the hostname for an IPv6 (internet-) address.
b6860c3660c8 Fix address sizes when calling gethostbyaddr
Stefan Vogel <sv@exept.de>
parents: 819
diff changeset
  1343
     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
  1344
     the network bytes come first (no matter what the local byteorder is).
4320
5b7848099dea #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 4293
diff changeset
  1345
     Nil is returned for an unknown host or if it's not an internet host.
820
b6860c3660c8 Fix address sizes when calling gethostbyaddr
Stefan Vogel <sv@exept.de>
parents: 819
diff changeset
  1346
     This is the reverse operation to #ipV6AddressOfHost:."
b6860c3660c8 Fix address sizes when calling gethostbyaddr
Stefan Vogel <sv@exept.de>
parents: 819
diff changeset
  1347
1485
d8578cf3504b gcc3.3.1 insn-scheduler bug workaround
Claus Gittinger <cg@exept.de>
parents: 1474
diff changeset
  1348
    NameLookupError
4414
42edc97b2323 bcopy -> memcpy
Claus Gittinger <cg@exept.de>
parents: 4341
diff changeset
  1349
	handle:[:ex |
42edc97b2323 bcopy -> memcpy
Claus Gittinger <cg@exept.de>
parents: 4341
diff changeset
  1350
	    ^ nil
42edc97b2323 bcopy -> memcpy
Claus Gittinger <cg@exept.de>
parents: 4341
diff changeset
  1351
	]
42edc97b2323 bcopy -> memcpy
Claus Gittinger <cg@exept.de>
parents: 4341
diff changeset
  1352
	do:[
42edc97b2323 bcopy -> memcpy
Claus Gittinger <cg@exept.de>
parents: 4341
diff changeset
  1353
	    ^ (IPv6SocketAddress hostAddress:addrByteArray) hostName
42edc97b2323 bcopy -> memcpy
Claus Gittinger <cg@exept.de>
parents: 4341
diff changeset
  1354
	]
820
b6860c3660c8 Fix address sizes when calling gethostbyaddr
Stefan Vogel <sv@exept.de>
parents: 819
diff changeset
  1355
b6860c3660c8 Fix address sizes when calling gethostbyaddr
Stefan Vogel <sv@exept.de>
parents: 819
diff changeset
  1356
    "
1485
d8578cf3504b gcc3.3.1 insn-scheduler bug workaround
Claus Gittinger <cg@exept.de>
parents: 1474
diff changeset
  1357
     Socket ipV6AddressOfHost:'clam'
d8578cf3504b gcc3.3.1 insn-scheduler bug workaround
Claus Gittinger <cg@exept.de>
parents: 1474
diff changeset
  1358
     Socket hostWithIpV6Address:(Socket ipAddressOfHost:'clam')
d8578cf3504b gcc3.3.1 insn-scheduler bug workaround
Claus Gittinger <cg@exept.de>
parents: 1474
diff changeset
  1359
     Socket ipV6AddressOfHost:'porty'
d8578cf3504b gcc3.3.1 insn-scheduler bug workaround
Claus Gittinger <cg@exept.de>
parents: 1474
diff changeset
  1360
     Socket hostWithIpV6Address:(Socket ipAddressOfHost:'porty')
d8578cf3504b gcc3.3.1 insn-scheduler bug workaround
Claus Gittinger <cg@exept.de>
parents: 1474
diff changeset
  1361
     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
  1362
     Socket ipV6AddressOfHost:'www.exept.de'
820
b6860c3660c8 Fix address sizes when calling gethostbyaddr
Stefan Vogel <sv@exept.de>
parents: 819
diff changeset
  1363
     "
4320
5b7848099dea #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 4293
diff changeset
  1364
5b7848099dea #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 4293
diff changeset
  1365
    "Modified (comment): / 13-02-2017 / 20:31:08 / cg"
820
b6860c3660c8 Fix address sizes when calling gethostbyaddr
Stefan Vogel <sv@exept.de>
parents: 819
diff changeset
  1366
!
b6860c3660c8 Fix address sizes when calling gethostbyaddr
Stefan Vogel <sv@exept.de>
parents: 819
diff changeset
  1367
6
claus
parents: 4
diff changeset
  1368
ipAddressOfHost:aHostName
1911
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
  1369
    <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
  1370
    "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
  1371
     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
  1372
     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
  1373
     This is the reverse operation to #hostWithIpAddress:."
6
claus
parents: 4
diff changeset
  1374
1485
d8578cf3504b gcc3.3.1 insn-scheduler bug workaround
Claus Gittinger <cg@exept.de>
parents: 1474
diff changeset
  1375
    NameLookupError
d8578cf3504b gcc3.3.1 insn-scheduler bug workaround
Claus Gittinger <cg@exept.de>
parents: 1474
diff changeset
  1376
	handle:[:ex |
1343
cc3bed115c0a definitions cleanup with stxOSDefs.h
penk
parents: 1342
diff changeset
  1377
	    ^ nil
cc3bed115c0a definitions cleanup with stxOSDefs.h
penk
parents: 1342
diff changeset
  1378
	]
cc3bed115c0a definitions cleanup with stxOSDefs.h
penk
parents: 1342
diff changeset
  1379
	do:[
cc3bed115c0a definitions cleanup with stxOSDefs.h
penk
parents: 1342
diff changeset
  1380
	    ^ (IPSocketAddress hostName:aHostName) address
cc3bed115c0a definitions cleanup with stxOSDefs.h
penk
parents: 1342
diff changeset
  1381
	]
21
33eb5ffad09d *** empty log message ***
claus
parents: 8
diff changeset
  1382
71
claus
parents: 63
diff changeset
  1383
    "
1485
d8578cf3504b gcc3.3.1 insn-scheduler bug workaround
Claus Gittinger <cg@exept.de>
parents: 1474
diff changeset
  1384
     Socket ipAddressOfHost:'localhost'
d8578cf3504b gcc3.3.1 insn-scheduler bug workaround
Claus Gittinger <cg@exept.de>
parents: 1474
diff changeset
  1385
     Socket ipAddressOfHost:'exept'
d8578cf3504b gcc3.3.1 insn-scheduler bug workaround
Claus Gittinger <cg@exept.de>
parents: 1474
diff changeset
  1386
     Socket ipAddressOfHost:'1.2.3.4'
1274
f257a1b16b4d use naemLookup from SocketAddress for ipv6
Claus Gittinger <cg@exept.de>
parents: 1263
diff changeset
  1387
     Socket ipAddressOfHost:'193.15.16.17'
1485
d8578cf3504b gcc3.3.1 insn-scheduler bug workaround
Claus Gittinger <cg@exept.de>
parents: 1474
diff changeset
  1388
     Socket ipAddressOfHost:'josef'
d8578cf3504b gcc3.3.1 insn-scheduler bug workaround
Claus Gittinger <cg@exept.de>
parents: 1474
diff changeset
  1389
     Socket ipAddressOfHost:'styx.com'
d8578cf3504b gcc3.3.1 insn-scheduler bug workaround
Claus Gittinger <cg@exept.de>
parents: 1474
diff changeset
  1390
     Socket hostWithIpAddress:(Socket ipAddressOfHost:'localhost')
d8578cf3504b gcc3.3.1 insn-scheduler bug workaround
Claus Gittinger <cg@exept.de>
parents: 1474
diff changeset
  1391
     Socket ipAddressOfHost:(Socket hostWithIpAddress:'127.0.0.1')
71
claus
parents: 63
diff changeset
  1392
    "
819
4cc15700d123 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 817
diff changeset
  1393
!
4cc15700d123 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 817
diff changeset
  1394
4cc15700d123 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 817
diff changeset
  1395
ipV6AddressOfHost:aHostName
1911
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
  1396
    <resource: #obsolete>
819
4cc15700d123 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 817
diff changeset
  1397
    "return the IPv6 (internet-) number for a hostname as a byteArray,
4cc15700d123 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 817
diff changeset
  1398
     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
  1399
     If the host is unknown, return nil.
4cc15700d123 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 817
diff changeset
  1400
     This is the reverse operation to #hostWithIpV6Address:."
4cc15700d123 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 817
diff changeset
  1401
1485
d8578cf3504b gcc3.3.1 insn-scheduler bug workaround
Claus Gittinger <cg@exept.de>
parents: 1474
diff changeset
  1402
    NameLookupError
d8578cf3504b gcc3.3.1 insn-scheduler bug workaround
Claus Gittinger <cg@exept.de>
parents: 1474
diff changeset
  1403
	handle:[:ex |
1343
cc3bed115c0a definitions cleanup with stxOSDefs.h
penk
parents: 1342
diff changeset
  1404
	    ^ nil
cc3bed115c0a definitions cleanup with stxOSDefs.h
penk
parents: 1342
diff changeset
  1405
	]
cc3bed115c0a definitions cleanup with stxOSDefs.h
penk
parents: 1342
diff changeset
  1406
	do:[
cc3bed115c0a definitions cleanup with stxOSDefs.h
penk
parents: 1342
diff changeset
  1407
	    ^ (IPv6SocketAddress hostName:aHostName) address
cc3bed115c0a definitions cleanup with stxOSDefs.h
penk
parents: 1342
diff changeset
  1408
	]
819
4cc15700d123 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 817
diff changeset
  1409
4cc15700d123 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 817
diff changeset
  1410
    "
1485
d8578cf3504b gcc3.3.1 insn-scheduler bug workaround
Claus Gittinger <cg@exept.de>
parents: 1474
diff changeset
  1411
     Socket ipV6AddressOfHost:'localhost'
d8578cf3504b gcc3.3.1 insn-scheduler bug workaround
Claus Gittinger <cg@exept.de>
parents: 1474
diff changeset
  1412
     Socket ipV6AddressOfHost:'exept'
d8578cf3504b gcc3.3.1 insn-scheduler bug workaround
Claus Gittinger <cg@exept.de>
parents: 1474
diff changeset
  1413
     Socket ipV6AddressOfHost:'exept.exept.de'
d8578cf3504b gcc3.3.1 insn-scheduler bug workaround
Claus Gittinger <cg@exept.de>
parents: 1474
diff changeset
  1414
     Socket ipV6AddressOfHost:'www.google.de'
d8578cf3504b gcc3.3.1 insn-scheduler bug workaround
Claus Gittinger <cg@exept.de>
parents: 1474
diff changeset
  1415
     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
  1416
     Socket ipV6AddressOfHost:'josef'
d8578cf3504b gcc3.3.1 insn-scheduler bug workaround
Claus Gittinger <cg@exept.de>
parents: 1474
diff changeset
  1417
     Socket ipV6AddressOfHost:'styx.com'
d8578cf3504b gcc3.3.1 insn-scheduler bug workaround
Claus Gittinger <cg@exept.de>
parents: 1474
diff changeset
  1418
     Socket hostWithIpV6Address:(Socket ipV6AddressOfHost:'localhost')
d8578cf3504b gcc3.3.1 insn-scheduler bug workaround
Claus Gittinger <cg@exept.de>
parents: 1474
diff changeset
  1419
     Socket ipV6AddressOfHost:(Socket hostV6WithIpAddress:'127.0.0.1')
819
4cc15700d123 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 817
diff changeset
  1420
    "
531
ca4c73813531 category changes
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
  1421
! !
ca4c73813531 category changes
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
  1422
ca4c73813531 category changes
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
  1423
!Socket class methodsFor:'queries'!
ca4c73813531 category changes
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
  1424
4764
358345478edc #FEATURE by chzeiher
chzeiher
parents: 4738
diff changeset
  1425
getRandomAvailablePortOnHost:aHostnameOrAdress
358345478edc #FEATURE by chzeiher
chzeiher
parents: 4738
diff changeset
  1426
"Attempts binding to port 0 on a specified host, thereby getting assigned a random available port which we return. We then release the socket."
358345478edc #FEATURE by chzeiher
chzeiher
parents: 4738
diff changeset
  1427
|socket freePort hostAdress|
358345478edc #FEATURE by chzeiher
chzeiher
parents: 4738
diff changeset
  1428
aHostnameOrAdress = nil ifTrue: [ hostAdress := '0.0.0.0' ] ifFalse: [ hostAdress := aHostnameOrAdress ].
358345478edc #FEATURE by chzeiher
chzeiher
parents: 4738
diff changeset
  1429
socket := Socket newTCP.
358345478edc #FEATURE by chzeiher
chzeiher
parents: 4738
diff changeset
  1430
socket bindTo:0 address:hostAdress reuseAddress:true.
358345478edc #FEATURE by chzeiher
chzeiher
parents: 4738
diff changeset
  1431
    freePort := socket port.
358345478edc #FEATURE by chzeiher
chzeiher
parents: 4738
diff changeset
  1432
socket abortAndClose.
358345478edc #FEATURE by chzeiher
chzeiher
parents: 4738
diff changeset
  1433
^freePort                          
358345478edc #FEATURE by chzeiher
chzeiher
parents: 4738
diff changeset
  1434
358345478edc #FEATURE by chzeiher
chzeiher
parents: 4738
diff changeset
  1435
358345478edc #FEATURE by chzeiher
chzeiher
parents: 4738
diff changeset
  1436
358345478edc #FEATURE by chzeiher
chzeiher
parents: 4738
diff changeset
  1437
358345478edc #FEATURE by chzeiher
chzeiher
parents: 4738
diff changeset
  1438
358345478edc #FEATURE by chzeiher
chzeiher
parents: 4738
diff changeset
  1439
!
358345478edc #FEATURE by chzeiher
chzeiher
parents: 4738
diff changeset
  1440
1260
9a8fb2391174 instance creation of peer refactored
Claus Gittinger <cg@exept.de>
parents: 1235
diff changeset
  1441
peerFromDomain:domain name:peerName port:port
9a8fb2391174 instance creation of peer refactored
Claus Gittinger <cg@exept.de>
parents: 1235
diff changeset
  1442
    |addrClass|
9a8fb2391174 instance creation of peer refactored
Claus Gittinger <cg@exept.de>
parents: 1235
diff changeset
  1443
9a8fb2391174 instance creation of peer refactored
Claus Gittinger <cg@exept.de>
parents: 1235
diff changeset
  1444
    addrClass := self socketAddressClassForDomain:domain.
1263
23161346a162 no longer callBack into sockets getHostName/getAddress code.
Claus Gittinger <cg@exept.de>
parents: 1260
diff changeset
  1445
    ^ 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
  1446
!
7e5f2f6b177d getHostByAddr - call is now done lazy, when the socket is asked for the peer
Claus Gittinger <cg@exept.de>
parents: 1186
diff changeset
  1447
7e5f2f6b177d getHostByAddr - call is now done lazy, when the socket is asked for the peer
Claus Gittinger <cg@exept.de>
parents: 1186
diff changeset
  1448
peerNameFromDomain:domain peer:peer
1260
9a8fb2391174 instance creation of peer refactored
Claus Gittinger <cg@exept.de>
parents: 1235
diff changeset
  1449
    |addrClass|
9a8fb2391174 instance creation of peer refactored
Claus Gittinger <cg@exept.de>
parents: 1235
diff changeset
  1450
9a8fb2391174 instance creation of peer refactored
Claus Gittinger <cg@exept.de>
parents: 1235
diff changeset
  1451
    addrClass := self socketAddressClassForDomain:domain.
9a8fb2391174 instance creation of peer refactored
Claus Gittinger <cg@exept.de>
parents: 1235
diff changeset
  1452
    ^ 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
  1453
!
7e5f2f6b177d getHostByAddr - call is now done lazy, when the socket is asked for the peer
Claus Gittinger <cg@exept.de>
parents: 1186
diff changeset
  1454
0
1cf8d1747859 Initial revision
claus
parents:
diff changeset
  1455
portOfService:aNameOrNumber
819
4cc15700d123 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 817
diff changeset
  1456
    "returns the port-number for a given IP-service
0
1cf8d1747859 Initial revision
claus
parents:
diff changeset
  1457
     or nil if no such service exists;
1cf8d1747859 Initial revision
claus
parents:
diff changeset
  1458
     - used to convert service names to portNumbers"
1cf8d1747859 Initial revision
claus
parents:
diff changeset
  1459
91
Claus Gittinger <cg@exept.de>
parents: 85
diff changeset
  1460
    ^ self portOfService:aNameOrNumber protocol:nil
Claus Gittinger <cg@exept.de>
parents: 85
diff changeset
  1461
28
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1462
    "
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1463
     Socket portOfService:'finger'
1485
d8578cf3504b gcc3.3.1 insn-scheduler bug workaround
Claus Gittinger <cg@exept.de>
parents: 1474
diff changeset
  1464
     Socket portOfService:'nntp'
d8578cf3504b gcc3.3.1 insn-scheduler bug workaround
Claus Gittinger <cg@exept.de>
parents: 1474
diff changeset
  1465
     Socket portOfService:'echo'
d8578cf3504b gcc3.3.1 insn-scheduler bug workaround
Claus Gittinger <cg@exept.de>
parents: 1474
diff changeset
  1466
     Socket portOfService:'snmp'
28
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1467
    "
0
1cf8d1747859 Initial revision
claus
parents:
diff changeset
  1468
!
1cf8d1747859 Initial revision
claus
parents:
diff changeset
  1469
91
Claus Gittinger <cg@exept.de>
parents: 85
diff changeset
  1470
portOfService:aNameOrNumber protocol:aProtocol
819
4cc15700d123 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 817
diff changeset
  1471
    "returns the port-number for a given IP-service
91
Claus Gittinger <cg@exept.de>
parents: 85
diff changeset
  1472
     or nil if no such service exists;
Claus Gittinger <cg@exept.de>
parents: 85
diff changeset
  1473
     - used to convert service names to portNumbers"
Claus Gittinger <cg@exept.de>
parents: 85
diff changeset
  1474
2909
aacef77a1697 64bit fixes
Claus Gittinger <cg@exept.de>
parents: 2904
diff changeset
  1475
%{ /* UNLIMITEDSTACK(noWIN32) */
418
317e55c6c281 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 403
diff changeset
  1476
#ifndef NO_SOCKET
91
Claus Gittinger <cg@exept.de>
parents: 85
diff changeset
  1477
    struct servent *servent = NULL;
Claus Gittinger <cg@exept.de>
parents: 85
diff changeset
  1478
    char *protocol;
Claus Gittinger <cg@exept.de>
parents: 85
diff changeset
  1479
    int tryBoth = 0;
524
8287da54eccf more empty code for other domains;
Claus Gittinger <cg@exept.de>
parents: 513
diff changeset
  1480
    short portNo;
91
Claus Gittinger <cg@exept.de>
parents: 85
diff changeset
  1481
604
b302a21afece Remove redundant code.
Stefan Vogel <sv@exept.de>
parents: 589
diff changeset
  1482
    if (__isSmallInteger(aNameOrNumber)) {
2340
2dc6e31f0142 handleType
Claus Gittinger <cg@exept.de>
parents: 2331
diff changeset
  1483
	RETURN ( aNameOrNumber );
92
Claus Gittinger <cg@exept.de>
parents: 91
diff changeset
  1484
    }
Claus Gittinger <cg@exept.de>
parents: 91
diff changeset
  1485
2331
b5280e1b3b9f changed:
Stefan Vogel <sv@exept.de>
parents: 2327
diff changeset
  1486
    if (__isStringLike(aProtocol)) {
2340
2dc6e31f0142 handleType
Claus Gittinger <cg@exept.de>
parents: 2331
diff changeset
  1487
	protocol = (char *)__stringVal(aProtocol);
604
b302a21afece Remove redundant code.
Stefan Vogel <sv@exept.de>
parents: 589
diff changeset
  1488
    } else {
2340
2dc6e31f0142 handleType
Claus Gittinger <cg@exept.de>
parents: 2331
diff changeset
  1489
	protocol = "tcp";
2dc6e31f0142 handleType
Claus Gittinger <cg@exept.de>
parents: 2331
diff changeset
  1490
	tryBoth = 1;
91
Claus Gittinger <cg@exept.de>
parents: 85
diff changeset
  1491
    }
524
8287da54eccf more empty code for other domains;
Claus Gittinger <cg@exept.de>
parents: 513
diff changeset
  1492
2331
b5280e1b3b9f changed:
Stefan Vogel <sv@exept.de>
parents: 2327
diff changeset
  1493
    if (__isStringLike(aNameOrNumber)) {
2340
2dc6e31f0142 handleType
Claus Gittinger <cg@exept.de>
parents: 2331
diff changeset
  1494
	servent = getservbyname((char *) __stringVal(aNameOrNumber), protocol);
2dc6e31f0142 handleType
Claus Gittinger <cg@exept.de>
parents: 2331
diff changeset
  1495
	if (servent != NULL) {
2dc6e31f0142 handleType
Claus Gittinger <cg@exept.de>
parents: 2331
diff changeset
  1496
	    RETURN ( __MKSMALLINT(ntohs(servent->s_port)) );
2dc6e31f0142 handleType
Claus Gittinger <cg@exept.de>
parents: 2331
diff changeset
  1497
	}
2dc6e31f0142 handleType
Claus Gittinger <cg@exept.de>
parents: 2331
diff changeset
  1498
	if (tryBoth) {
2dc6e31f0142 handleType
Claus Gittinger <cg@exept.de>
parents: 2331
diff changeset
  1499
	    servent = getservbyname((char *) __stringVal(aNameOrNumber), "udp");
2dc6e31f0142 handleType
Claus Gittinger <cg@exept.de>
parents: 2331
diff changeset
  1500
	    if (servent != NULL) {
2dc6e31f0142 handleType
Claus Gittinger <cg@exept.de>
parents: 2331
diff changeset
  1501
		RETURN ( __MKSMALLINT(ntohs(servent->s_port)) );
2dc6e31f0142 handleType
Claus Gittinger <cg@exept.de>
parents: 2331
diff changeset
  1502
	    }
2dc6e31f0142 handleType
Claus Gittinger <cg@exept.de>
parents: 2331
diff changeset
  1503
	}
2dc6e31f0142 handleType
Claus Gittinger <cg@exept.de>
parents: 2331
diff changeset
  1504
	RETURN ( nil );
91
Claus Gittinger <cg@exept.de>
parents: 85
diff changeset
  1505
    }
418
317e55c6c281 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 403
diff changeset
  1506
#endif
91
Claus Gittinger <cg@exept.de>
parents: 85
diff changeset
  1507
    RETURN ( nil );
Claus Gittinger <cg@exept.de>
parents: 85
diff changeset
  1508
%}
Claus Gittinger <cg@exept.de>
parents: 85
diff changeset
  1509
    "
Claus Gittinger <cg@exept.de>
parents: 85
diff changeset
  1510
     Socket portOfService:'echo' protocol:'udp'
Claus Gittinger <cg@exept.de>
parents: 85
diff changeset
  1511
     Socket portOfService:'echo' protocol:'tcp'
Claus Gittinger <cg@exept.de>
parents: 85
diff changeset
  1512
    "
Claus Gittinger <cg@exept.de>
parents: 85
diff changeset
  1513
!
Claus Gittinger <cg@exept.de>
parents: 85
diff changeset
  1514
0
1cf8d1747859 Initial revision
claus
parents:
diff changeset
  1515
protocolOfService:aNameOrNumber
819
4cc15700d123 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 817
diff changeset
  1516
    "returns the protocol (as string) for a given IP-service
28
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1517
     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
  1518
92005eec5c9d fixed moving-object-when-interrupted-with-scavenge bugs;
Claus Gittinger <cg@exept.de>
parents: 1503
diff changeset
  1519
%{  /* UNLIMITEDSTACK(noWIN32) */
418
317e55c6c281 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 403
diff changeset
  1520
#ifndef NO_SOCKET
0
1cf8d1747859 Initial revision
claus
parents:
diff changeset
  1521
    struct servent *servent = NULL;
524
8287da54eccf more empty code for other domains;
Claus Gittinger <cg@exept.de>
parents: 513
diff changeset
  1522
    short portNo;
0
1cf8d1747859 Initial revision
claus
parents:
diff changeset
  1523
58
bd6753bf0401 *** empty log message ***
claus
parents: 51
diff changeset
  1524
    if (__isSmallInteger(aNameOrNumber)) {
2340
2dc6e31f0142 handleType
Claus Gittinger <cg@exept.de>
parents: 2331
diff changeset
  1525
	portNo = __intVal(aNameOrNumber);
2dc6e31f0142 handleType
Claus Gittinger <cg@exept.de>
parents: 2331
diff changeset
  1526
	servent = getservbyport(htons(portNo), "tcp") ;
2dc6e31f0142 handleType
Claus Gittinger <cg@exept.de>
parents: 2331
diff changeset
  1527
	if (servent == NULL) {
2dc6e31f0142 handleType
Claus Gittinger <cg@exept.de>
parents: 2331
diff changeset
  1528
	    servent = getservbyport(htons(portNo), "udp") ;
2dc6e31f0142 handleType
Claus Gittinger <cg@exept.de>
parents: 2331
diff changeset
  1529
	    if (servent == NULL) {
2dc6e31f0142 handleType
Claus Gittinger <cg@exept.de>
parents: 2331
diff changeset
  1530
		RETURN ( nil );
2dc6e31f0142 handleType
Claus Gittinger <cg@exept.de>
parents: 2331
diff changeset
  1531
	    }
2dc6e31f0142 handleType
Claus Gittinger <cg@exept.de>
parents: 2331
diff changeset
  1532
	}
0
1cf8d1747859 Initial revision
claus
parents:
diff changeset
  1533
    } else {
2340
2dc6e31f0142 handleType
Claus Gittinger <cg@exept.de>
parents: 2331
diff changeset
  1534
	if (__isStringLike(aNameOrNumber)) {
2dc6e31f0142 handleType
Claus Gittinger <cg@exept.de>
parents: 2331
diff changeset
  1535
	    servent = getservbyname((char *) __stringVal(aNameOrNumber), "tcp");
2dc6e31f0142 handleType
Claus Gittinger <cg@exept.de>
parents: 2331
diff changeset
  1536
	    if (servent == NULL) {
2dc6e31f0142 handleType
Claus Gittinger <cg@exept.de>
parents: 2331
diff changeset
  1537
		servent = getservbyname((char *) __stringVal(aNameOrNumber), "udp");
2dc6e31f0142 handleType
Claus Gittinger <cg@exept.de>
parents: 2331
diff changeset
  1538
		if (servent == NULL) {
2dc6e31f0142 handleType
Claus Gittinger <cg@exept.de>
parents: 2331
diff changeset
  1539
		    RETURN ( nil );
2dc6e31f0142 handleType
Claus Gittinger <cg@exept.de>
parents: 2331
diff changeset
  1540
		}
2dc6e31f0142 handleType
Claus Gittinger <cg@exept.de>
parents: 2331
diff changeset
  1541
	    }
2dc6e31f0142 handleType
Claus Gittinger <cg@exept.de>
parents: 2331
diff changeset
  1542
	}
0
1cf8d1747859 Initial revision
claus
parents:
diff changeset
  1543
    }
1cf8d1747859 Initial revision
claus
parents:
diff changeset
  1544
    if (servent) {
2340
2dc6e31f0142 handleType
Claus Gittinger <cg@exept.de>
parents: 2331
diff changeset
  1545
	RETURN ( __MKSTRING(servent->s_proto) );
0
1cf8d1747859 Initial revision
claus
parents:
diff changeset
  1546
    }
1504
92005eec5c9d fixed moving-object-when-interrupted-with-scavenge bugs;
Claus Gittinger <cg@exept.de>
parents: 1503
diff changeset
  1547
#endif /* !NO_SOCKET */
0
1cf8d1747859 Initial revision
claus
parents:
diff changeset
  1548
    RETURN ( nil );
1cf8d1747859 Initial revision
claus
parents:
diff changeset
  1549
%}
28
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1550
    "
1485
d8578cf3504b gcc3.3.1 insn-scheduler bug workaround
Claus Gittinger <cg@exept.de>
parents: 1474
diff changeset
  1551
     Socket protocolOfService:'finger'
d8578cf3504b gcc3.3.1 insn-scheduler bug workaround
Claus Gittinger <cg@exept.de>
parents: 1474
diff changeset
  1552
     Socket protocolOfService:'nntp'
28
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1553
     Socket protocolOfService:'xxx'
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1554
     Socket protocolOfService:79
1485
d8578cf3504b gcc3.3.1 insn-scheduler bug workaround
Claus Gittinger <cg@exept.de>
parents: 1474
diff changeset
  1555
     Socket protocolOfService:'snmp'
28
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1556
    "
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1557
!
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1558
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
  1559
socketAddressClassForDomain:domain
1230
2cfb8c270cb5 more functionality moved to SocketAccessor
Claus Gittinger <cg@exept.de>
parents: 1224
diff changeset
  1560
    ^ SocketAddress knownClassFromCode:domain
2cfb8c270cb5 more functionality moved to SocketAccessor
Claus Gittinger <cg@exept.de>
parents: 1224
diff changeset
  1561
2cfb8c270cb5 more functionality moved to SocketAccessor
Claus Gittinger <cg@exept.de>
parents: 1224
diff changeset
  1562
    "
3059
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  1563
     self socketAddressClassForDomain:#AF_INET
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  1564
     self socketAddressClassForDomain:#AF_UNIX
1230
2cfb8c270cb5 more functionality moved to SocketAccessor
Claus Gittinger <cg@exept.de>
parents: 1224
diff changeset
  1565
    "
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
  1566
!
7e5f2f6b177d getHostByAddr - call is now done lazy, when the socket is asked for the peer
Claus Gittinger <cg@exept.de>
parents: 1186
diff changeset
  1567
532
f997c3873602 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 531
diff changeset
  1568
supportedProtocolFamilies
f997c3873602 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 531
diff changeset
  1569
    "return a collection of supported protocol families.
f997c3873602 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 531
diff changeset
  1570
     This list specifies what the Socket class supports -
f997c3873602 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 531
diff changeset
  1571
     socket creation may still fail, if your system was built
f997c3873602 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 531
diff changeset
  1572
     without it."
f997c3873602 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 531
diff changeset
  1573
1280
b973855bfe74 moved all socket constant queries from SocketHandle
Claus Gittinger <cg@exept.de>
parents: 1278
diff changeset
  1574
    ^ OperatingSystem supportedProtocolFamilies
532
f997c3873602 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 531
diff changeset
  1575
f997c3873602 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 531
diff changeset
  1576
    "
f997c3873602 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 531
diff changeset
  1577
     Socket supportedProtocolFamilies
f997c3873602 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 531
diff changeset
  1578
    "
559
61012867ebed cleanup if #connect is interrupted
Claus Gittinger <cg@exept.de>
parents: 551
diff changeset
  1579
!
61012867ebed cleanup if #connect is interrupted
Claus Gittinger <cg@exept.de>
parents: 551
diff changeset
  1580
61012867ebed cleanup if #connect is interrupted
Claus Gittinger <cg@exept.de>
parents: 551
diff changeset
  1581
typeOfProtocol:aProtocol
61012867ebed cleanup if #connect is interrupted
Claus Gittinger <cg@exept.de>
parents: 551
diff changeset
  1582
    "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
  1583
     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
  1584
61012867ebed cleanup if #connect is interrupted
Claus Gittinger <cg@exept.de>
parents: 551
diff changeset
  1585
    (aProtocol = 'tcp') ifTrue:[^ #stream].
61012867ebed cleanup if #connect is interrupted
Claus Gittinger <cg@exept.de>
parents: 551
diff changeset
  1586
    (aProtocol = 'udp') ifTrue:[^ #datagram].
61012867ebed cleanup if #connect is interrupted
Claus Gittinger <cg@exept.de>
parents: 551
diff changeset
  1587
    (aProtocol = 'ip')  ifTrue:[^ #raw].
61012867ebed cleanup if #connect is interrupted
Claus Gittinger <cg@exept.de>
parents: 551
diff changeset
  1588
    "
61012867ebed cleanup if #connect is interrupted
Claus Gittinger <cg@exept.de>
parents: 551
diff changeset
  1589
     unix domain
61012867ebed cleanup if #connect is interrupted
Claus Gittinger <cg@exept.de>
parents: 551
diff changeset
  1590
    "
61012867ebed cleanup if #connect is interrupted
Claus Gittinger <cg@exept.de>
parents: 551
diff changeset
  1591
    (aProtocol = 'ud')  ifTrue:[^ #stream].
61012867ebed cleanup if #connect is interrupted
Claus Gittinger <cg@exept.de>
parents: 551
diff changeset
  1592
    "
61012867ebed cleanup if #connect is interrupted
Claus Gittinger <cg@exept.de>
parents: 551
diff changeset
  1593
     add x25 stuff (if any) here ...
61012867ebed cleanup if #connect is interrupted
Claus Gittinger <cg@exept.de>
parents: 551
diff changeset
  1594
    "
61012867ebed cleanup if #connect is interrupted
Claus Gittinger <cg@exept.de>
parents: 551
diff changeset
  1595
    "
61012867ebed cleanup if #connect is interrupted
Claus Gittinger <cg@exept.de>
parents: 551
diff changeset
  1596
     add appletalk stuff (if any) here ...
61012867ebed cleanup if #connect is interrupted
Claus Gittinger <cg@exept.de>
parents: 551
diff changeset
  1597
    "
61012867ebed cleanup if #connect is interrupted
Claus Gittinger <cg@exept.de>
parents: 551
diff changeset
  1598
    "
61012867ebed cleanup if #connect is interrupted
Claus Gittinger <cg@exept.de>
parents: 551
diff changeset
  1599
     add other stuff (if any) here ...
61012867ebed cleanup if #connect is interrupted
Claus Gittinger <cg@exept.de>
parents: 551
diff changeset
  1600
    "
61012867ebed cleanup if #connect is interrupted
Claus Gittinger <cg@exept.de>
parents: 551
diff changeset
  1601
    ^ nil
61012867ebed cleanup if #connect is interrupted
Claus Gittinger <cg@exept.de>
parents: 551
diff changeset
  1602
61012867ebed cleanup if #connect is interrupted
Claus Gittinger <cg@exept.de>
parents: 551
diff changeset
  1603
    "
61012867ebed cleanup if #connect is interrupted
Claus Gittinger <cg@exept.de>
parents: 551
diff changeset
  1604
     Socket typeOfProtocol:'tcp'
61012867ebed cleanup if #connect is interrupted
Claus Gittinger <cg@exept.de>
parents: 551
diff changeset
  1605
     Socket typeOfProtocol:'ucp'
61012867ebed cleanup if #connect is interrupted
Claus Gittinger <cg@exept.de>
parents: 551
diff changeset
  1606
     Socket typeOfProtocol:(Socket protocolOfService:'nntp')
61012867ebed cleanup if #connect is interrupted
Claus Gittinger <cg@exept.de>
parents: 551
diff changeset
  1607
     Socket typeOfProtocol:(Socket protocolOfService:'echo')
61012867ebed cleanup if #connect is interrupted
Claus Gittinger <cg@exept.de>
parents: 551
diff changeset
  1608
    "
28
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1609
! !
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1610
1202
c52279df60d8 method category rename
Claus Gittinger <cg@exept.de>
parents: 1187
diff changeset
  1611
!Socket methodsFor:'Compatibility-Dolphin'!
1110
0876a3d30fd2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1035
diff changeset
  1612
0876a3d30fd2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1035
diff changeset
  1613
setReceiveTimeout: milliseconds
0876a3d30fd2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1035
diff changeset
  1614
    self receiveTimeout:(milliseconds / 1000)
0876a3d30fd2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1035
diff changeset
  1615
!
0876a3d30fd2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1035
diff changeset
  1616
0876a3d30fd2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1035
diff changeset
  1617
setSendTimeout: milliseconds
0876a3d30fd2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1035
diff changeset
  1618
    self sendTimeout:(milliseconds / 1000)
0876a3d30fd2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1035
diff changeset
  1619
! !
0876a3d30fd2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1035
diff changeset
  1620
1202
c52279df60d8 method category rename
Claus Gittinger <cg@exept.de>
parents: 1187
diff changeset
  1621
!Socket methodsFor:'Compatibility-ST80'!
28
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1622
887
2b2dc6b59b5a more VW compatibility
Claus Gittinger <cg@exept.de>
parents: 876
diff changeset
  1623
acceptNonBlock
2b2dc6b59b5a more VW compatibility
Claus Gittinger <cg@exept.de>
parents: 876
diff changeset
  1624
    ^ self accept
2b2dc6b59b5a more VW compatibility
Claus Gittinger <cg@exept.de>
parents: 876
diff changeset
  1625
!
2b2dc6b59b5a more VW compatibility
Claus Gittinger <cg@exept.de>
parents: 876
diff changeset
  1626
1485
d8578cf3504b gcc3.3.1 insn-scheduler bug workaround
Claus Gittinger <cg@exept.de>
parents: 1474
diff changeset
  1627
ioConnection
887
2b2dc6b59b5a more VW compatibility
Claus Gittinger <cg@exept.de>
parents: 876
diff changeset
  1628
    ^ self
2b2dc6b59b5a more VW compatibility
Claus Gittinger <cg@exept.de>
parents: 876
diff changeset
  1629
!
2b2dc6b59b5a more VW compatibility
Claus Gittinger <cg@exept.de>
parents: 876
diff changeset
  1630
126
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
  1631
notReadySignal
781
4d61e7588ff3 added #waitForNewConnectionOrDataOnAny:timeout:
Claus Gittinger <cg@exept.de>
parents: 776
diff changeset
  1632
    "ST-80 mimicry.
4d61e7588ff3 added #waitForNewConnectionOrDataOnAny:timeout:
Claus Gittinger <cg@exept.de>
parents: 776
diff changeset
  1633
     for now - this is not yet raised"
71
claus
parents: 63
diff changeset
  1634
126
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
  1635
    ^ Signal new
486
ed4e215e83ef ST-80 mimicry
Claus Gittinger <cg@exept.de>
parents: 470
diff changeset
  1636
!
ed4e215e83ef ST-80 mimicry
Claus Gittinger <cg@exept.de>
parents: 470
diff changeset
  1637
576
13acab81fad0 more ST80 compatibility
ca
parents: 572
diff changeset
  1638
readAppendStream
781
4d61e7588ff3 added #waitForNewConnectionOrDataOnAny:timeout:
Claus Gittinger <cg@exept.de>
parents: 776
diff changeset
  1639
    "ST-80 mimicry.
4293
82b9928ddcae #OTHER by mawalch
mawalch
parents: 4288
diff changeset
  1640
     In ST-80, socket is not a stream, but refers to one.
781
4d61e7588ff3 added #waitForNewConnectionOrDataOnAny:timeout:
Claus Gittinger <cg@exept.de>
parents: 776
diff changeset
  1641
     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
  1642
     the actual stream.
781
4d61e7588ff3 added #waitForNewConnectionOrDataOnAny:timeout:
Claus Gittinger <cg@exept.de>
parents: 776
diff changeset
  1643
     In ST/X, sockets inherit from stream, so
4d61e7588ff3 added #waitForNewConnectionOrDataOnAny:timeout:
Claus Gittinger <cg@exept.de>
parents: 776
diff changeset
  1644
     this method returns the receiver, for transparency"
4d61e7588ff3 added #waitForNewConnectionOrDataOnAny:timeout:
Claus Gittinger <cg@exept.de>
parents: 776
diff changeset
  1645
576
13acab81fad0 more ST80 compatibility
ca
parents: 572
diff changeset
  1646
    ^ self
13acab81fad0 more ST80 compatibility
ca
parents: 572
diff changeset
  1647
!
13acab81fad0 more ST80 compatibility
ca
parents: 572
diff changeset
  1648
486
ed4e215e83ef ST-80 mimicry
Claus Gittinger <cg@exept.de>
parents: 470
diff changeset
  1649
readStream
ed4e215e83ef ST-80 mimicry
Claus Gittinger <cg@exept.de>
parents: 470
diff changeset
  1650
    "ST-80 mimicry.
4293
82b9928ddcae #OTHER by mawalch
mawalch
parents: 4288
diff changeset
  1651
     In ST-80, socket is not a stream, but refers to one.
486
ed4e215e83ef ST-80 mimicry
Claus Gittinger <cg@exept.de>
parents: 470
diff changeset
  1652
     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
  1653
     the actual stream.
781
4d61e7588ff3 added #waitForNewConnectionOrDataOnAny:timeout:
Claus Gittinger <cg@exept.de>
parents: 776
diff changeset
  1654
     In ST/X, sockets inherit from stream, so
4d61e7588ff3 added #waitForNewConnectionOrDataOnAny:timeout:
Claus Gittinger <cg@exept.de>
parents: 776
diff changeset
  1655
     this method returns the receiver, for transparency"
486
ed4e215e83ef ST-80 mimicry
Claus Gittinger <cg@exept.de>
parents: 470
diff changeset
  1656
ed4e215e83ef ST-80 mimicry
Claus Gittinger <cg@exept.de>
parents: 470
diff changeset
  1657
    ^ self
ed4e215e83ef ST-80 mimicry
Claus Gittinger <cg@exept.de>
parents: 470
diff changeset
  1658
ed4e215e83ef ST-80 mimicry
Claus Gittinger <cg@exept.de>
parents: 470
diff changeset
  1659
    "Created: 24.1.1997 / 23:52:57 / cg"
ed4e215e83ef ST-80 mimicry
Claus Gittinger <cg@exept.de>
parents: 470
diff changeset
  1660
!
ed4e215e83ef ST-80 mimicry
Claus Gittinger <cg@exept.de>
parents: 470
diff changeset
  1661
ed4e215e83ef ST-80 mimicry
Claus Gittinger <cg@exept.de>
parents: 470
diff changeset
  1662
writeStream
ed4e215e83ef ST-80 mimicry
Claus Gittinger <cg@exept.de>
parents: 470
diff changeset
  1663
    "ST-80 mimicry.
4293
82b9928ddcae #OTHER by mawalch
mawalch
parents: 4288
diff changeset
  1664
     In ST-80, socket is not a stream, but refers to one.
486
ed4e215e83ef ST-80 mimicry
Claus Gittinger <cg@exept.de>
parents: 470
diff changeset
  1665
     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
  1666
     the actual stream.
781
4d61e7588ff3 added #waitForNewConnectionOrDataOnAny:timeout:
Claus Gittinger <cg@exept.de>
parents: 776
diff changeset
  1667
     In ST/X, sockets inherit from stream, so
4d61e7588ff3 added #waitForNewConnectionOrDataOnAny:timeout:
Claus Gittinger <cg@exept.de>
parents: 776
diff changeset
  1668
     this method returns the receiver, for transparency"
486
ed4e215e83ef ST-80 mimicry
Claus Gittinger <cg@exept.de>
parents: 470
diff changeset
  1669
ed4e215e83ef ST-80 mimicry
Claus Gittinger <cg@exept.de>
parents: 470
diff changeset
  1670
    ^ self
ed4e215e83ef ST-80 mimicry
Claus Gittinger <cg@exept.de>
parents: 470
diff changeset
  1671
ed4e215e83ef ST-80 mimicry
Claus Gittinger <cg@exept.de>
parents: 470
diff changeset
  1672
    "Created: 24.1.1997 / 10:34:35 / cg"
ed4e215e83ef ST-80 mimicry
Claus Gittinger <cg@exept.de>
parents: 470
diff changeset
  1673
    "Modified: 24.1.1997 / 23:52:52 / cg"
71
claus
parents: 63
diff changeset
  1674
! !
claus
parents: 63
diff changeset
  1675
1202
c52279df60d8 method category rename
Claus Gittinger <cg@exept.de>
parents: 1187
diff changeset
  1676
!Socket methodsFor:'Compatibility-Squeak'!
771
74abb04ef57c checkin from browser
Claus Gittinger <cg@exept.de>
parents: 752
diff changeset
  1677
1462
5602fce52b42 squeak stuff
Claus Gittinger <cg@exept.de>
parents: 1413
diff changeset
  1678
address
5602fce52b42 squeak stuff
Claus Gittinger <cg@exept.de>
parents: 1413
diff changeset
  1679
    ^ self getSocketAddress
5602fce52b42 squeak stuff
Claus Gittinger <cg@exept.de>
parents: 1413
diff changeset
  1680
!
5602fce52b42 squeak stuff
Claus Gittinger <cg@exept.de>
parents: 1413
diff changeset
  1681
2308
d8b410a4f38b added: #connectToHostNamed:port:
Claus Gittinger <cg@exept.de>
parents: 2292
diff changeset
  1682
connectToHostNamed:hostName port:portNr
d8b410a4f38b added: #connectToHostNamed:port:
Claus Gittinger <cg@exept.de>
parents: 2292
diff changeset
  1683
    self connectTo:hostName port:portNr
d8b410a4f38b added: #connectToHostNamed:port:
Claus Gittinger <cg@exept.de>
parents: 2292
diff changeset
  1684
!
d8b410a4f38b added: #connectToHostNamed:port:
Claus Gittinger <cg@exept.de>
parents: 2292
diff changeset
  1685
1462
5602fce52b42 squeak stuff
Claus Gittinger <cg@exept.de>
parents: 1413
diff changeset
  1686
dataAvailable
5602fce52b42 squeak stuff
Claus Gittinger <cg@exept.de>
parents: 1413
diff changeset
  1687
    ^ self canReadWithoutBlocking
5602fce52b42 squeak stuff
Claus Gittinger <cg@exept.de>
parents: 1413
diff changeset
  1688
!
5602fce52b42 squeak stuff
Claus Gittinger <cg@exept.de>
parents: 1413
diff changeset
  1689
1886
e0d23764c809 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1885
diff changeset
  1690
destroy
e0d23764c809 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1885
diff changeset
  1691
    self close
e0d23764c809 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1885
diff changeset
  1692
e0d23764c809 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1885
diff changeset
  1693
    "Created: / 04-06-2007 / 21:29:03 / cg"
e0d23764c809 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1885
diff changeset
  1694
!
e0d23764c809 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1885
diff changeset
  1695
1462
5602fce52b42 squeak stuff
Claus Gittinger <cg@exept.de>
parents: 1413
diff changeset
  1696
listenOn:aPortNr
1882
6f818f33c85a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1863
diff changeset
  1697
    self listenOn:aPortNr backlogSize:5
6f818f33c85a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1863
diff changeset
  1698
6f818f33c85a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1863
diff changeset
  1699
    "Modified: / 31-05-2007 / 17:59:53 / cg"
6f818f33c85a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1863
diff changeset
  1700
!
6f818f33c85a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1863
diff changeset
  1701
6f818f33c85a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1863
diff changeset
  1702
listenOn:aPortNr backlogSize:aNumber
1462
5602fce52b42 squeak stuff
Claus Gittinger <cg@exept.de>
parents: 1413
diff changeset
  1703
    self bindTo:aPortNr address:nil.
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  1704
    self listenFor:aNumber
1882
6f818f33c85a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1863
diff changeset
  1705
6f818f33c85a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1863
diff changeset
  1706
    "Created: / 31-05-2007 / 17:59:47 / cg"
1462
5602fce52b42 squeak stuff
Claus Gittinger <cg@exept.de>
parents: 1413
diff changeset
  1707
!
5602fce52b42 squeak stuff
Claus Gittinger <cg@exept.de>
parents: 1413
diff changeset
  1708
4587
caa262d036d2 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4570
diff changeset
  1709
noTimeout
caa262d036d2 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4570
diff changeset
  1710
    "disable timeouts - dummy for now"
caa262d036d2 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4570
diff changeset
  1711
caa262d036d2 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4570
diff changeset
  1712
    ^ self 
caa262d036d2 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4570
diff changeset
  1713
!
caa262d036d2 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4570
diff changeset
  1714
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  1715
peerName
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  1716
    "return my peer (i.e. ipAddr + port);
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  1717
     May return nil if not yet setup completely."
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  1718
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  1719
    ^ self getPeer
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  1720
!
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  1721
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  1722
sendData: aStringOrByteArray
3155
d1884a37375c Initialize in instance initialize method insted in #new
Stefan Vogel <sv@exept.de>
parents: 3152
diff changeset
  1723
    "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
  1724
     Return the number of bytes sent."
d1884a37375c Initialize in instance initialize method insted in #new
Stefan Vogel <sv@exept.de>
parents: 3152
diff changeset
  1725
d1884a37375c Initialize in instance initialize method insted in #new
Stefan Vogel <sv@exept.de>
parents: 3152
diff changeset
  1726
    ^ self nextPutBytes:aStringOrByteArray size from:aStringOrByteArray startingAt:1.
1600
f3acd5382fa1 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1584
diff changeset
  1727
!
f3acd5382fa1 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1584
diff changeset
  1728
2904
d2e1eead2bfb class: Socket
Claus Gittinger <cg@exept.de>
parents: 2900
diff changeset
  1729
waitForConnectionUntil:aTimestamp
d2e1eead2bfb class: Socket
Claus Gittinger <cg@exept.de>
parents: 2900
diff changeset
  1730
    "return true if connected"
d2e1eead2bfb class: Socket
Claus Gittinger <cg@exept.de>
parents: 2900
diff changeset
  1731
d2e1eead2bfb class: Socket
Claus Gittinger <cg@exept.de>
parents: 2900
diff changeset
  1732
    self readWaitWithTimeoutMs: (aTimestamp millisecondDeltaFrom:Timestamp now).
d2e1eead2bfb class: Socket
Claus Gittinger <cg@exept.de>
parents: 2900
diff changeset
  1733
    ^ self isConnected
771
74abb04ef57c checkin from browser
Claus Gittinger <cg@exept.de>
parents: 752
diff changeset
  1734
! !
74abb04ef57c checkin from browser
Claus Gittinger <cg@exept.de>
parents: 752
diff changeset
  1735
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  1736
!Socket methodsFor:'accepting connections'!
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  1737
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  1738
accept
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  1739
    "create a new TCP socket from accepting on the receiver.
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  1740
     This method will suspend the current process if no connection is waiting.
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  1741
     For ST-80 compatibility"
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  1742
3633
3a21f142432e #REFACTORING
Stefan Vogel <sv@exept.de>
parents: 3620
diff changeset
  1743
    ^ self waitForNewConnectionWithTimeout:nil
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  1744
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  1745
    "
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  1746
     |sock newSock|
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  1747
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  1748
     sock := Socket provide:8004.
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  1749
     sock listenFor:5.
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  1750
     newSock := sock accept.
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  1751
    "
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  1752
!
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  1753
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  1754
blockingAccept
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  1755
    "create a new TCP socket from accepting on the receiver.
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  1756
     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
  1757
     For ST-80 compatibility"
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  1758
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  1759
    |newSock|
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
    newSock := self class new.
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  1762
    (newSock primAcceptOn:self blocking:true) ifFalse:[
4568
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  1763
        "should raise an error here - primitive code raises a notification"
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  1764
        ^ nil
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  1765
    ].
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  1766
    ^ newSock
4568
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  1767
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  1768
    "Modified (format): / 19-01-2018 / 13:32:25 / stefan"
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
!Socket methodsFor:'binding'!
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  1772
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  1773
bindAnonymously
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  1774
    "bind to any address. A free port will be allocated.
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  1775
     Our own socket address will be determined after conection set up.
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  1776
     This is the default after the socket has been created"
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  1777
3059
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  1778
    ^ self bindTo:nil reuseAddress:false
2321
6f4cc7b644db filePointer -> handle migration
Claus Gittinger <cg@exept.de>
parents: 2308
diff changeset
  1779
6f4cc7b644db filePointer -> handle migration
Claus Gittinger <cg@exept.de>
parents: 2308
diff changeset
  1780
    "
1938
831af28cc848 comments
Stefan Vogel <sv@exept.de>
parents: 1935
diff changeset
  1781
      self newTCP bindAnonymously; listenFor:1; yourself
4206
ac9a6e096796 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4203
diff changeset
  1782
      self newTCP bindAnonymously; port
1938
831af28cc848 comments
Stefan Vogel <sv@exept.de>
parents: 1935
diff changeset
  1783
    "
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  1784
!
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  1785
3059
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  1786
bindAnonymouslyToAddress:aSocketAddress
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  1787
    "bind to address addressString.
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  1788
     A free port will be allocated"
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  1789
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  1790
    ^ self
3217
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  1791
	bindTo:0
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  1792
	address:aSocketAddress
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  1793
	reuseAddress:false
2321
6f4cc7b644db filePointer -> handle migration
Claus Gittinger <cg@exept.de>
parents: 2308
diff changeset
  1794
6f4cc7b644db filePointer -> handle migration
Claus Gittinger <cg@exept.de>
parents: 2308
diff changeset
  1795
    "
3059
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  1796
      self newTCP bindAnonymouslyToAddress:IPSocketAddress localHost; listenFor:1; yourself
1938
831af28cc848 comments
Stefan Vogel <sv@exept.de>
parents: 1935
diff changeset
  1797
    "
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  1798
!
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  1799
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  1800
bindTo:aSocketAddress
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  1801
    "ST80 compatible bind, expecting a socketAddress argument.
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  1802
     The socketAddress object (an instance of SocketAddress)
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  1803
     is supposed to respond to #portOrName and #address requests."
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  1804
3059
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  1805
    ^ self bindTo:aSocketAddress reuseAddress:true
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  1806
!
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  1807
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  1808
bindTo:portNrOrNameString address:addressString
3059
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  1809
    "Old interface: bind the socket to an address
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  1810
     - returns true if ok, false otherwise.
4568
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  1811
     Notify with a SocketErrorNotification on error.
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
     The interpretation of hostOrPathNameOrSocketAddrOrNil portNrOrName depends on the domain:
4568
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  1814
        Best use a SocketAddress
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  1815
        For backward compatibility:
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  1816
            AF_INET domain can also use (4byte) byteArray like internet numbers,
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  1817
            AF_UNIX domain cab use pathname strings."
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  1818
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  1819
    ^ self
4568
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  1820
        bindTo:portNrOrNameString
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  1821
        address:addressString
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  1822
        reuseAddress:true
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  1823
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  1824
    "Modified (comment): / 19-01-2018 / 13:36:54 / stefan"
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  1825
!
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  1826
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  1827
bindTo:portNrOrNameOrNil address:hostOrPathNameOrSocketAddrOrNil reuseAddress:reuse
3059
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  1828
    "Old interface: bind the socket to an address
4568
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  1829
     Notify with a SocketErrorNotification on error.
3059
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  1830
     - returns true if ok, false otherwise.
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  1831
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  1832
     The interpretation of hostOrPathNameOrSocketAddrOrNil portNrOrName depends on the domain:
4568
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  1833
        Best use a SocketAddress
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  1834
        For backward compatibility:
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  1835
            AF_INET domain can also use (4byte) byteArray like internet numbers,
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  1836
            AF_UNIX domain can use pathname strings.
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  1837
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  1838
     The reuse boolean argument controls if the SO_REUSEADDR socket option
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  1839
     is to be set (to avoid the 'bind: address in use' error).
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  1840
    "
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  1841
3059
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  1842
    |socketAddress|
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  1843
2321
6f4cc7b644db filePointer -> handle migration
Claus Gittinger <cg@exept.de>
parents: 2308
diff changeset
  1844
    handle isNil ifTrue:[
4568
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  1845
        ^ self errorNotOpen
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  1846
    ].
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  1847
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  1848
    hostOrPathNameOrSocketAddrOrNil isNil ifTrue:[
4568
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  1849
        socketAddress := self socketAddressClass anyHost.
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  1850
    ] ifFalse:[
4568
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  1851
        (hostOrPathNameOrSocketAddrOrNil isSocketAddress) ifTrue:[
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  1852
            socketAddress := hostOrPathNameOrSocketAddrOrNil.
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  1853
        ] ifFalse:[
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  1854
            "backward compatibility: support for byteArray and string arg"
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  1855
            hostOrPathNameOrSocketAddrOrNil isString ifTrue:[
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  1856
                socketAddress := self socketAddressClass hostName:hostOrPathNameOrSocketAddrOrNil.
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  1857
            ] ifFalse:[
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  1858
                hostOrPathNameOrSocketAddrOrNil isByteCollection ifFalse:[
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  1859
                    ^ self error:'bindTo: bad host (socketAddress) argument'
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  1860
                ].
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  1861
                socketAddress := self socketAddressClass hostAddress:hostOrPathNameOrSocketAddrOrNil.
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  1862
            ].
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  1863
        ].
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  1864
    ].
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  1865
    portNrOrNameOrNil notNil ifTrue:[
4568
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  1866
        socketAddress port:portNrOrNameOrNil.
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  1867
    ].
3059
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  1868
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  1869
    ^ self bindTo:socketAddress reuseAddress:reuse.
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  1870
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  1871
    "
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  1872
     (Socket domain:#'AF_INET' type:#stream)
4568
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  1873
         bindTo:2144 address:nil; yourself
3059
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  1874
    "
4568
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  1875
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  1876
    "Modified (comment): / 19-01-2018 / 13:37:13 / stefan"
3059
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  1877
!
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  1878
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  1879
bindTo:aSocketAddress reuseAddress:reuse
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  1880
    "Bind the socket to aSocketAddress - returns true if ok, false otherwise.
4568
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  1881
     Notify with a SocketErrorNotification on error.
3059
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  1882
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  1883
     The reuse boolean argument controls if the SO_REUSEADDR socket option
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  1884
     is to be set (to avoid the 'bind: address in use' error).
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  1885
3137
df3e9cebf52c class: Socket
Stefan Vogel <sv@exept.de>
parents: 3127
diff changeset
  1886
     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
  1887
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  1888
    |ok error socketAddress|
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  1889
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  1890
    handle isNil ifTrue:[
4568
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  1891
        ^ self errorNotOpen
3059
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  1892
    ].
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  1893
    socketAddress := aSocketAddress.
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  1894
    socketAddress isNil ifTrue:[
4568
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  1895
        "ok, get a all zero socket address, so it is for anyHost
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  1896
         and the port will be assigned"
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  1897
        socketAddress := self socketAddressClass new.
3513
8105bf370769 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3485
diff changeset
  1898
    ].
8105bf370769 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3485
diff changeset
  1899
    domain == #'AF_INET6' ifTrue:[
4568
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  1900
        "accept also IPv4 connections on IPv6 sockets (this is off by default for windows"
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  1901
        self setSocketOption:#'IPV6_V6ONLY' argument:false argument:nil.
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  1902
    ].
2321
6f4cc7b644db filePointer -> handle migration
Claus Gittinger <cg@exept.de>
parents: 2308
diff changeset
  1903
    ok := false.
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  1904
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  1905
%{  /* STACK: 100000 */
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  1906
#ifndef NO_SOCKET
2321
6f4cc7b644db filePointer -> handle migration
Claus Gittinger <cg@exept.de>
parents: 2308
diff changeset
  1907
    OBJ fp = __INST(handle);
6f4cc7b644db filePointer -> handle migration
Claus Gittinger <cg@exept.de>
parents: 2308
diff changeset
  1908
    SOCKET sock;
6f4cc7b644db filePointer -> handle migration
Claus Gittinger <cg@exept.de>
parents: 2308
diff changeset
  1909
    union sockaddr_u sa;
6f4cc7b644db filePointer -> handle migration
Claus Gittinger <cg@exept.de>
parents: 2308
diff changeset
  1910
    int sockaddr_size;
2909
aacef77a1697 64bit fixes
Claus Gittinger <cg@exept.de>
parents: 2904
diff changeset
  1911
    INT ret;
2321
6f4cc7b644db filePointer -> handle migration
Claus Gittinger <cg@exept.de>
parents: 2308
diff changeset
  1912
    int sockAddrOffs;
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  1913
3059
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  1914
    if (fp == nil) {
4568
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  1915
        goto getOutOfHere;
2321
6f4cc7b644db filePointer -> handle migration
Claus Gittinger <cg@exept.de>
parents: 2308
diff changeset
  1916
    }
3059
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  1917
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  1918
    if (! __isBytes(socketAddress)) {
4568
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  1919
        error = __mkSmallInteger(-1);
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  1920
        goto getOutOfHere;
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  1921
    }
2321
6f4cc7b644db filePointer -> handle migration
Claus Gittinger <cg@exept.de>
parents: 2308
diff changeset
  1922
    /* get the socket-address */
3059
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  1923
    if (__isNonNilObject(socketAddress)){
4568
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  1924
        int nIndex;
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  1925
        OBJ cls = __qClass(socketAddress);
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  1926
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  1927
        sockAddrOffs = __OBJS2BYTES__(__intVal(__ClassInstPtr(cls)->c_ninstvars));
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  1928
        nIndex = __qSize(socketAddress) - OHDR_SIZE;
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  1929
        sockaddr_size = nIndex - sockAddrOffs;
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  1930
        if (sockaddr_size > sizeof(sa)) {
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  1931
            error=__mkSmallInteger(-2);
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  1932
            goto getOutOfHere;
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  1933
        }
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  1934
        memcpy(&sa, __byteArrayVal(socketAddress) + sockAddrOffs, sockaddr_size);
2321
6f4cc7b644db filePointer -> handle migration
Claus Gittinger <cg@exept.de>
parents: 2308
diff changeset
  1935
    }
6f4cc7b644db filePointer -> handle migration
Claus Gittinger <cg@exept.de>
parents: 2308
diff changeset
  1936
6f4cc7b644db filePointer -> handle migration
Claus Gittinger <cg@exept.de>
parents: 2308
diff changeset
  1937
    sock = SOCKET_FROM_FILE_OBJECT(fp);
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  1938
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  1939
# ifdef SO_REUSEADDR
2321
6f4cc7b644db filePointer -> handle migration
Claus Gittinger <cg@exept.de>
parents: 2308
diff changeset
  1940
    if (reuse == true) {
4568
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  1941
        int on = 1;
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  1942
        if (setsockopt(sock, SOL_SOCKET, SO_REUSEADDR, (char *) &on, sizeof (on)) < 0) {
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  1943
            DBGPRINTF(("SOCKET: setsockopt - SO_REUSEADDR failed\n"));
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  1944
        }
2321
6f4cc7b644db filePointer -> handle migration
Claus Gittinger <cg@exept.de>
parents: 2308
diff changeset
  1945
    }
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  1946
# endif /* SO_REUSEADDR */
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  1947
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  1948
# ifdef BIND_BLOCKS
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  1949
#  ifdef DO_WRAP_CALLS
2321
6f4cc7b644db filePointer -> handle migration
Claus Gittinger <cg@exept.de>
parents: 2308
diff changeset
  1950
    do {
4568
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  1951
        __threadErrno = 0;
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  1952
        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
  1953
    } while ((ret < 0) && (__threadErrno == EINTR));
3126
d95cc55a4fb5 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3123
diff changeset
  1954
    if (ret < 0) {
4568
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  1955
        errno = __threadErrno;
3126
d95cc55a4fb5 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3123
diff changeset
  1956
    }
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  1957
#  else
2321
6f4cc7b644db filePointer -> handle migration
Claus Gittinger <cg@exept.de>
parents: 2308
diff changeset
  1958
    __BEGIN_INTERRUPTABLE__
6f4cc7b644db filePointer -> handle migration
Claus Gittinger <cg@exept.de>
parents: 2308
diff changeset
  1959
    do {
4568
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  1960
        ret = bind(sock, (struct sockaddr *)&sa, sockaddr_size);
2321
6f4cc7b644db filePointer -> handle migration
Claus Gittinger <cg@exept.de>
parents: 2308
diff changeset
  1961
    } while ((ret < 0) && (errno == EINTR));
6f4cc7b644db filePointer -> handle migration
Claus Gittinger <cg@exept.de>
parents: 2308
diff changeset
  1962
    __END_INTERRUPTABLE__
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  1963
#  endif
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  1964
# else
3126
d95cc55a4fb5 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3123
diff changeset
  1965
    errno = 0;
2321
6f4cc7b644db filePointer -> handle migration
Claus Gittinger <cg@exept.de>
parents: 2308
diff changeset
  1966
    ret = bind(sock, (struct sockaddr *)&sa, sockaddr_size);
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  1967
# endif
2321
6f4cc7b644db filePointer -> handle migration
Claus Gittinger <cg@exept.de>
parents: 2308
diff changeset
  1968
    if (ret < 0) {
3843
fbced69597a7 oops - error check was disabled
Claus Gittinger <cg@exept.de>
parents: 3742
diff changeset
  1969
# ifdef __win32__
4568
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  1970
        if (errno == 0) {
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  1971
            errno = WSAGetLastError();
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  1972
        }
3126
d95cc55a4fb5 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3123
diff changeset
  1973
# endif
4568
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  1974
        DBGPRINTF(("SOCKET: bind failed errno=%d\n", errno));
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  1975
        error = __INST(lastErrorNumber) = __MKSMALLINT(errno);
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  1976
        goto getOutOfHere;
2321
6f4cc7b644db filePointer -> handle migration
Claus Gittinger <cg@exept.de>
parents: 2308
diff changeset
  1977
    } else {
4568
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  1978
        ok = true;
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  1979
    }
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  1980
#endif /* NO_SOCKET */
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  1981
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  1982
getOutOfHere: ;
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  1983
%}.
4234
eb1b470a27ee #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 4206
diff changeset
  1984
    ok ifFalse:[
4568
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  1985
        |errorHolder errorString|
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  1986
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  1987
        error isInteger ifTrue:[
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  1988
            errorHolder := OperatingSystem errorHolderForNumber:error.
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  1989
            errorString := errorHolder errorString.
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  1990
        ] ifFalse:[
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  1991
            errorString := error.
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  1992
        ].
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  1993
        OpenError newException
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  1994
            errorString:('cannot bind socket to address: %1 (%2)'
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  1995
                            bindWith:socketAddress
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  1996
                            with:errorString);
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  1997
            errorCode:error;
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  1998
            osErrorHolder:errorHolder;
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  1999
            parameter:self;
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  2000
            raiseRequest.
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  2001
        "maybe someone catches the error and binds to some other port..."
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  2002
        ^ true.
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2003
    ].
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2004
3059
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  2005
    port := socketAddress port.
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  2006
    port == 0 ifTrue:[
4568
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  2007
        "this is a bind to a random port, now we can get the real port"
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  2008
        port := self getFullSocketAddress port.
3059
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  2009
    ].
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2010
    ^ true
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2011
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2012
    "
3059
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  2013
     (Socket domain:#'AF_INET' type:#stream)
4568
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  2014
        bindTo:(IPSocketAddress anyHost port:445) reuseAddress:false;
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  2015
        yourself.
3059
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  2016
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  2017
     (Socket domain:#'AF_INET' type:#stream)
4568
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  2018
        bindTo:139 reuseAddress:false;
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  2019
        yourself.
3059
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  2020
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  2021
     (Socket domain:#'AF_INET6' type:#stream)
4568
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  2022
        bindTo:nil reuseAddress:false;
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  2023
        yourself.
3059
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  2024
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  2025
     (Socket domain:#'AF_INET' type:#stream)
4568
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  2026
        bindTo:(IPSocketAddress localHost port:2122) reuseAddress:false;
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  2027
        yourself.
3059
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  2028
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  2029
     (Socket domain:#'AF_UNIX' type:#stream)
4568
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  2030
        bindTo:nil reuseAddress:false;
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  2031
        yourself.
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2032
    "
4568
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  2033
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  2034
    "Modified: / 19-01-2018 / 13:37:21 / stefan"
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2035
!
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2036
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2037
listenFor:aNumber
4568
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  2038
    "start listening; return true if ok, false on error.
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  2039
     Notify with a SocketErrorNotification on error.
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2040
     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
  2041
4568
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  2042
    |err|
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  2043
2321
6f4cc7b644db filePointer -> handle migration
Claus Gittinger <cg@exept.de>
parents: 2308
diff changeset
  2044
    handle isNil ifTrue:[
4568
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  2045
        ^ self errorNotOpen
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2046
    ].
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2047
%{
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2048
#ifndef NO_SOCKET
2321
6f4cc7b644db filePointer -> handle migration
Claus Gittinger <cg@exept.de>
parents: 2308
diff changeset
  2049
    OBJ fp = __INST(handle);
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2050
    SOCKET sock;
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2051
    int ret;
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2052
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2053
    if (! __isSmallInteger(aNumber)) {
4568
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  2054
        DBGPRINTF(("SOCKET: invalid arg\n"));
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  2055
        err = @symbol(badArgument);
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  2056
        goto out;
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2057
    }
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2058
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2059
    sock = SOCKET_FROM_FILE_OBJECT(fp);
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
#ifdef LISTEN_BLOCKS
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2062
# ifdef DO_WRAP_CALLS
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2063
    do {
4568
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  2064
        __threadErrno = 0;
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  2065
        ret = STX_WSA_NOINT_CALL2("listen", listen, sock, __intVal(aNumber));
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2066
    } while ((ret < 0) && (__threadErrno == EINTR));
3126
d95cc55a4fb5 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3123
diff changeset
  2067
    if (ret < 0) {
4568
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  2068
        errno = __threadErrno;
3126
d95cc55a4fb5 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3123
diff changeset
  2069
    }
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2070
# else
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2071
    __BEGIN_INTERRUPTABLE__
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2072
    do {
4568
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  2073
        ret = listen(sock, __intVal(aNumber));
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2074
    } while ((ret < 0) && (errno == EINTR));
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2075
    __END_INTERRUPTABLE__
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2076
# endif
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2077
#else
3126
d95cc55a4fb5 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3123
diff changeset
  2078
    errno = 0;
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2079
    ret = listen(sock, __intVal(aNumber));
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2080
#endif
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2081
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2082
    if (ret < 0) {
3843
fbced69597a7 oops - error check was disabled
Claus Gittinger <cg@exept.de>
parents: 3742
diff changeset
  2083
# ifdef __win32__
4568
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  2084
        if (errno == 0) {
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  2085
            errno = WSAGetLastError();
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  2086
        }
3126
d95cc55a4fb5 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3123
diff changeset
  2087
# endif
4568
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  2088
        err = __MKSMALLINT(errno);
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  2089
        DBGPRINTF(("SOCKET: listen call failed errno=%d\n", errno));
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  2090
        goto out;
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2091
    }
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2092
#else
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2093
    RETURN (false);
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2094
#endif
4568
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  2095
out:;
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2096
%}.
4568
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  2097
    err notNil ifTrue:[
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  2098
        err isSymbol ifTrue:[
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  2099
            self error:err.
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  2100
        ].
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  2101
        ^ self reportError:err.
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  2102
    ].
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  2103
3157
44f5f9f79256 initialize methods
Stefan Vogel <sv@exept.de>
parents: 3155
diff changeset
  2104
    listening := aNumber.
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2105
    ^ true
4568
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  2106
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  2107
    "
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  2108
       [
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  2109
           |sock|
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  2110
           sock := Socket newTCP.
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  2111
           sock listenFor:1.
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  2112
           sock
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  2113
       ] on:SocketErrorNotification do:[:ex|
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  2114
           ex halt.
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  2115
       ].
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  2116
    "
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  2117
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  2118
    "Modified (comment): / 19-01-2018 / 13:50:09 / stefan"
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2119
! !
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2120
1576
a2ffb22c5f5e New: #shutDownInput #shutDownOutput
Stefan Vogel <sv@exept.de>
parents: 1568
diff changeset
  2121
!Socket methodsFor:'closing'!
a2ffb22c5f5e New: #shutDownInput #shutDownOutput
Stefan Vogel <sv@exept.de>
parents: 1568
diff changeset
  2122
4172
2a6544c030fc #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 4091
diff changeset
  2123
abortAndClose
2a6544c030fc #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 4091
diff changeset
  2124
    "immediately abort the connection:
4414
42edc97b2323 bcopy -> memcpy
Claus Gittinger <cg@exept.de>
parents: 4341
diff changeset
  2125
	discard buffered data and close the stream"
42edc97b2323 bcopy -> memcpy
Claus Gittinger <cg@exept.de>
parents: 4341
diff changeset
  2126
42edc97b2323 bcopy -> memcpy
Claus Gittinger <cg@exept.de>
parents: 4341
diff changeset
  2127
    self linger:0.
42edc97b2323 bcopy -> memcpy
Claus Gittinger <cg@exept.de>
parents: 4341
diff changeset
  2128
    self close.
3224
bad706c50347 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3223
diff changeset
  2129
!
bad706c50347 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3223
diff changeset
  2130
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2131
shutDown
4414
42edc97b2323 bcopy -> memcpy
Claus Gittinger <cg@exept.de>
parents: 4341
diff changeset
  2132
    "shutDown (initiate a graceful close)
4172
2a6544c030fc #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 4091
diff changeset
  2133
     and close (free the filedescriptor) the socket.
4414
42edc97b2323 bcopy -> memcpy
Claus Gittinger <cg@exept.de>
parents: 4341
diff changeset
  2134
     The close will return immediately and buffered data will be sent in the
4172
2a6544c030fc #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 4091
diff changeset
  2135
     background, unless you set linger"
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2136
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2137
    self shutdown:2.
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2138
    self close
1576
a2ffb22c5f5e New: #shutDownInput #shutDownOutput
Stefan Vogel <sv@exept.de>
parents: 1568
diff changeset
  2139
!
a2ffb22c5f5e New: #shutDownInput #shutDownOutput
Stefan Vogel <sv@exept.de>
parents: 1568
diff changeset
  2140
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2141
shutDownInput
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2142
    "shutDown the input side of the socket.
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2143
     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
  2144
     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
  2145
     (e.g. setting the TCP-Windowsize to 0)"
a2ffb22c5f5e New: #shutDownInput #shutDownOutput
Stefan Vogel <sv@exept.de>
parents: 1568
diff changeset
  2146
a2ffb22c5f5e New: #shutDownInput #shutDownOutput
Stefan Vogel <sv@exept.de>
parents: 1568
diff changeset
  2147
    self shutdown:0.
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2148
!
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2149
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2150
shutDownOutput
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2151
    "shutDown the output side of the socket.
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2152
     Any write to the socket will signal end-of-file from now on.
4172
2a6544c030fc #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 4091
diff changeset
  2153
     An orderly release (TCP FIN) will be initiated after the last buffered data
2a6544c030fc #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 4091
diff changeset
  2154
     has been sent, so the other side will get a end-of-file condition eventually.
4414
42edc97b2323 bcopy -> memcpy
Claus Gittinger <cg@exept.de>
parents: 4341
diff changeset
  2155
     If you set linger > 0, the operation will wait until buffered data
4172
2a6544c030fc #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 4091
diff changeset
  2156
     has been delivered to the peer.
2a6544c030fc #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 4091
diff changeset
  2157
     Otherwise the operation returns immediately."
1343
cc3bed115c0a definitions cleanup with stxOSDefs.h
penk
parents: 1342
diff changeset
  2158
1884
ee0d640a25a7 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1882
diff changeset
  2159
    self shutdown:1.
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2160
! !
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2161
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2162
!Socket methodsFor:'connecting'!
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2163
3059
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  2164
connectTo:aSocketAddress
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  2165
    ^ self connectTo:aSocketAddress withTimeout:nil
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  2166
!
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  2167
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2168
connectTo:hostOrPathName port:portNrOrName
3655
eb81fa3d8407 #REFACTORING
Stefan Vogel <sv@exept.de>
parents: 3633
diff changeset
  2169
    <resource: #obsolete>
3059
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  2170
    "Backward compatibility connect; connect to port, portNrOrNameOrNil on host, hostOrPathNameOrSocketAddr.
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  2171
     For backward compatibility, hostOrPathNameOrSocketAddr may be also a string or a byteArray,
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  2172
     but it is recommended to pass SocketAddress instances.
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2173
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2174
     Return true if ok, false otherwise.
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2175
     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
  2176
     See also: #connectTo:port:withTimeout: for a somewhat nicer interface."
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2177
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2178
    ^ self connectTo:hostOrPathName port:portNrOrName withTimeout:nil
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2179
!
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2180
4570
39e965ca8d06 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4568
diff changeset
  2181
connectTo:hostOrPathNameOrSocketAddr port:portNrOrNameOrNil withTimeout:milliSecondsOrTimeDuration
3655
eb81fa3d8407 #REFACTORING
Stefan Vogel <sv@exept.de>
parents: 3633
diff changeset
  2182
    <resource: #obsolete>
3059
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  2183
    "Backward compatibility connect; connect to port, portNrOrNameOrNil on host, hostOrPathNameOrSocketAddr.
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  2184
     For backward compatibility, hostOrPathNameOrSocketAddr may be also a string or a byteArray,
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  2185
     but it is recommended to pass SocketAddress instances.
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2186
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2187
     Return true if ok, false otherwise.
4568
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  2188
     Notify with a SocketErrorNotification on error.
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  2189
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2190
     The current process will block (but not the whole Smalltalk) until the connection is established,
4570
39e965ca8d06 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4568
diff changeset
  2191
     or milliSecondsOrTimeDuration milliseconds have passed."
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2192
3059
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  2193
    |domainClass socketAddress|
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  2194
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  2195
    (hostOrPathNameOrSocketAddr isSocketAddress) ifTrue:[
4568
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  2196
        socketAddress := hostOrPathNameOrSocketAddr.
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  2197
        portNrOrNameOrNil notNil ifTrue:[
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  2198
            socketAddress port:portNrOrNameOrNil.
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  2199
        ].
3059
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  2200
    ] ifFalse:[
4568
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  2201
        "backward compatibility: support for byteArray and string arg"
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  2202
        domainClass := self class socketAddressClassForDomain:domain.
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  2203
        domainClass isNil ifTrue:[
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  2204
            ^ self error:'invalid (unsupported) domain'.
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  2205
        ].
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  2206
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  2207
        hostOrPathNameOrSocketAddr isString ifTrue:[
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  2208
            socketAddress := domainClass hostName:hostOrPathNameOrSocketAddr serviceName:portNrOrNameOrNil type:#SOCK_STREAM.
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  2209
            peerName := hostOrPathNameOrSocketAddr.
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  2210
        ] ifFalse:[
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  2211
            hostOrPathNameOrSocketAddr isByteCollection ifFalse:[
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  2212
                ^ self error:'connectTo: bad host (socketAddress) argument'
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  2213
            ].
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  2214
            socketAddress := domainClass hostAddress:hostOrPathNameOrSocketAddr port:portNrOrNameOrNil.
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  2215
        ].
3059
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  2216
    ].
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  2217
4570
39e965ca8d06 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4568
diff changeset
  2218
    ^ self connectTo:socketAddress withTimeout:milliSecondsOrTimeDuration.
3059
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  2219
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  2220
    "
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  2221
       |sock|
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  2222
       sock := Socket newTCP.
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  2223
       sock connectTo:'localhost' port:21 withTimeout:1000.
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  2224
       sock
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  2225
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  2226
       |sock|
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  2227
       sock := Socket newTCP.
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  2228
       sock connectTo:'localhost' port:9876 withTimeout:2000.
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  2229
       sock
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  2230
    "
4568
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  2231
4570
39e965ca8d06 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4568
diff changeset
  2232
    "Modified (comment): / 19-01-2018 / 17:48:08 / stefan"
3059
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  2233
!
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  2234
4570
39e965ca8d06 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4568
diff changeset
  2235
connectTo:aSocketAddress withTimeout:milliSecondsOrTimeDuration
3059
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  2236
    "Connect to a SocketAddress.
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  2237
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  2238
     Return true if ok, false otherwise.
4568
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  2239
     Notify with a SocketErrorNotification on error.
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  2240
3059
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  2241
     The current process will block (but not the whole Smalltalk) until the connection is established,
4038
3ff1884f5acd #OTHER by mawalch
mawalch
parents: 4032
diff changeset
  2242
     or timeout milliseconds have passed."
3059
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  2243
4570
39e965ca8d06 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4568
diff changeset
  2244
    |isAsync err timeoutMs milliSeconds|
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2245
2321
6f4cc7b644db filePointer -> handle migration
Claus Gittinger <cg@exept.de>
parents: 2308
diff changeset
  2246
    handle isNil ifTrue:[
4568
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  2247
        ^ self errorNotOpen
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2248
    ].
4234
eb1b470a27ee #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 4206
diff changeset
  2249
    isAsync := false.
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2250
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2251
%{  /* STACK: 100000 */
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2252
#ifndef NO_SOCKET
3123
55ef9ca4f09f class: Socket
Stefan Vogel <sv@exept.de>
parents: 3077
diff changeset
  2253
//#define DUMP_ADDRESS 1
2321
6f4cc7b644db filePointer -> handle migration
Claus Gittinger <cg@exept.de>
parents: 2308
diff changeset
  2254
    OBJ fp = __INST(handle);
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2255
    union sockaddr_u sa;
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2256
    SOCKET sock;
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2257
    int a;
2909
aacef77a1697 64bit fixes
Claus Gittinger <cg@exept.de>
parents: 2904
diff changeset
  2258
    INT ret;
aacef77a1697 64bit fixes
Claus Gittinger <cg@exept.de>
parents: 2904
diff changeset
  2259
    int oldFlags;
3741
2a39a558012f mingw change
Claus Gittinger <cg@exept.de>
parents: 3657
diff changeset
  2260
# ifdef __MINGW64__
2a39a558012f mingw change
Claus Gittinger <cg@exept.de>
parents: 3657
diff changeset
  2261
    unsigned long on = 1;
2a39a558012f mingw change
Claus Gittinger <cg@exept.de>
parents: 3657
diff changeset
  2262
# else
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2263
    int on = 1;
3741
2a39a558012f mingw change
Claus Gittinger <cg@exept.de>
parents: 3657
diff changeset
  2264
#endif
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2265
    int sockaddr_size;
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2266
3059
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  2267
    if (!__isNonNilObject(aSocketAddress) || !__isBytes(aSocketAddress)) {
4568
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  2268
        DBGPRINTF(("SOCKET: invalid socketAddress\n"));
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  2269
        err = @symbol(argumentError);
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  2270
        goto out;
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2271
    }
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2272
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2273
    {
4568
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  2274
        int sockAddrOffs = 0;
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  2275
        int nIndex =__byteArraySize(aSocketAddress);
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  2276
        OBJ cls = __qClass(aSocketAddress);
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  2277
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  2278
        //if (cls != @global(ByteArray))
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  2279
        //    sockAddrOffs = __OBJS2BYTES__(__intVal(__ClassInstPtr(cls)->c_ninstvars));
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  2280
        sockaddr_size = nIndex - sockAddrOffs;
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  2281
        if (sockaddr_size > sizeof(sa)) {
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  2282
            DBGPRINTF(("SOCKET: invalid (short) socketAddress\n"));
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  2283
            err = @symbol(argumentError);
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  2284
            goto out;
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  2285
        }
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  2286
        memcpy(&sa, __byteArrayVal(aSocketAddress) + sockAddrOffs, sockaddr_size);
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2287
    }
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2288
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2289
    sock = SOCKET_FROM_FILE_OBJECT(fp);
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2290
3843
fbced69597a7 oops - error check was disabled
Claus Gittinger <cg@exept.de>
parents: 3742
diff changeset
  2291
#ifdef __win32__
3657
Stefan Vogel <sv@exept.de>
parents: 3655
diff changeset
  2292
     ioctlsocket(sock, FIONBIO, &on);
Stefan Vogel <sv@exept.de>
parents: 3655
diff changeset
  2293
#elif defined(O_NONBLOCK)
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2294
    /*
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2295
     * set to non-blocking and wait later
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
    oldFlags = fcntl(sock, F_GETFL, 0);
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2298
    /* on SUNOS4.x, would use fcntl(osfd, F_SETFL, flags | FNDELAY); */
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2299
    fcntl(sock, F_SETFL, oldFlags | O_NONBLOCK);
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2300
# endif
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2301
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2302
    /*
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2303
     * connect
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2304
     */
3123
55ef9ca4f09f class: Socket
Stefan Vogel <sv@exept.de>
parents: 3077
diff changeset
  2305
4039
87f0dc2e89d8 #OTHER by mawalch
mawalch
parents: 4038
diff changeset
  2306
// we do not use wrap calls any longer, because they have problems with aborting.
3657
Stefan Vogel <sv@exept.de>
parents: 3655
diff changeset
  2307
// we use nonblocking accept() instead.
Stefan Vogel <sv@exept.de>
parents: 3655
diff changeset
  2308
# if 0 && defined(DO_WRAP_CALLS)
3217
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  2309
    // __setWrapCallDebugging(1,1);
2414
886ecf4b36cd changed:
ab
parents: 2340
diff changeset
  2310
3123
55ef9ca4f09f class: Socket
Stefan Vogel <sv@exept.de>
parents: 3077
diff changeset
  2311
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2312
    do {
4568
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  2313
        DBGFPRINTF((stderr, "SOCKET: (sock=%d) connect...\n", sock));
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  2314
        ret = STX_WSA_NOINT_CALL3("connect", connect, sock, &sa, (INT)sockaddr_size);
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  2315
        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
  2316
    } while ((ret < 0) && (__threadErrno == EINTR));
3123
55ef9ca4f09f class: Socket
Stefan Vogel <sv@exept.de>
parents: 3077
diff changeset
  2317
3077
032905ddd57a class: Socket
Claus Gittinger <cg@exept.de>
parents: 3072
diff changeset
  2318
    if (ret < 0) {
4568
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  2319
        int optLen = sizeof(errno);
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  2320
        errno = __threadErrno;
3123
55ef9ca4f09f class: Socket
Stefan Vogel <sv@exept.de>
parents: 3077
diff changeset
  2321
#if 0
4568
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  2322
        if (getsockopt(sock, SOL_SOCKET, SO_ERROR, &errno, &optLen) == SOCKET_ERROR) {
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  2323
            DBGFPRINTF((stderr, "SOCKET: getsockopt(SO_ERROR) failed: %d\n", WSAGetLastError()));
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  2324
        }
3657
Stefan Vogel <sv@exept.de>
parents: 3655
diff changeset
  2325
#endif // 0
3077
032905ddd57a class: Socket
Claus Gittinger <cg@exept.de>
parents: 3072
diff changeset
  2326
    }
032905ddd57a class: Socket
Claus Gittinger <cg@exept.de>
parents: 3072
diff changeset
  2327
032905ddd57a class: Socket
Claus Gittinger <cg@exept.de>
parents: 3072
diff changeset
  2328
    // __setWrapCallDebugging(1,0);
3657
Stefan Vogel <sv@exept.de>
parents: 3655
diff changeset
  2329
# else // !DO_WRAP_CALLS
Stefan Vogel <sv@exept.de>
parents: 3655
diff changeset
  2330
3843
fbced69597a7 oops - error check was disabled
Claus Gittinger <cg@exept.de>
parents: 3742
diff changeset
  2331
#  if !defined(__win32__) && !defined(O_NONBLOCK)
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2332
    __BEGIN_INTERRUPTABLE__
3657
Stefan Vogel <sv@exept.de>
parents: 3655
diff changeset
  2333
#  endif
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2334
    do {
4568
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  2335
        ret = connect(sock, (struct sockaddr *)&sa, sockaddr_size);
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2336
    } while ((ret < 0)
3843
fbced69597a7 oops - error check was disabled
Claus Gittinger <cg@exept.de>
parents: 3742
diff changeset
  2337
#  ifdef __win32__
4568
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  2338
             && (errno = WSAGetLastError())
3657
Stefan Vogel <sv@exept.de>
parents: 3655
diff changeset
  2339
#  endif
4568
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  2340
             && ((errno == EINTR)
3657
Stefan Vogel <sv@exept.de>
parents: 3655
diff changeset
  2341
#  ifdef EAGAIN
4568
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  2342
                 || (errno == EAGAIN)
3657
Stefan Vogel <sv@exept.de>
parents: 3655
diff changeset
  2343
#  endif
4568
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  2344
                ));
3843
fbced69597a7 oops - error check was disabled
Claus Gittinger <cg@exept.de>
parents: 3742
diff changeset
  2345
#  if !defined(__win32__) && !defined(O_NONBLOCK)
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2346
    __END_INTERRUPTABLE__
3657
Stefan Vogel <sv@exept.de>
parents: 3655
diff changeset
  2347
#  endif
Stefan Vogel <sv@exept.de>
parents: 3655
diff changeset
  2348
#endif
Stefan Vogel <sv@exept.de>
parents: 3655
diff changeset
  2349
3843
fbced69597a7 oops - error check was disabled
Claus Gittinger <cg@exept.de>
parents: 3742
diff changeset
  2350
#if defined(__win32__) && !defined(EINPROGRESS)
3657
Stefan Vogel <sv@exept.de>
parents: 3655
diff changeset
  2351
# define EINPROGRESSS WSAEINPROGRESSS
Stefan Vogel <sv@exept.de>
parents: 3655
diff changeset
  2352
# define EALREADY WSAEALREADY
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2353
#endif
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2354
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2355
    if (ret < 0) {
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2356
# if defined(EINPROGRESS) || defined(EALREADY)
4568
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  2357
        if (0
3843
fbced69597a7 oops - error check was disabled
Claus Gittinger <cg@exept.de>
parents: 3742
diff changeset
  2358
#  ifdef __win32__
4568
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  2359
            || (errno == WSAEWOULDBLOCK)
3657
Stefan Vogel <sv@exept.de>
parents: 3655
diff changeset
  2360
#  endif
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2361
#  ifdef EINPROGRESS
4568
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  2362
            || (errno == EINPROGRESS)
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2363
#  endif
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2364
#  ifdef EALREADY
4568
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  2365
            || (errno == EALREADY)
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2366
#  endif
4568
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  2367
        ) {
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  2368
            /*
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  2369
             * This was a nonblocking operation that will take some time.
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  2370
             * Do a select on read to get informed when the operation is ready.
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  2371
             */
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  2372
            DBGFPRINTF((stderr, "SOCKET: isAsync is true\n"));
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  2373
            isAsync = true;
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  2374
        } else
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2375
# endif /* EINPROGRESS or EALREADY */
4568
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  2376
        {
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  2377
            DBGFPRINTF((stderr, "SOCKET: connect failed ret=%"_ld_" errno=%d __threadErrno=%d\n",
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  2378
                        (INT)ret, errno, __threadErrno ));
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2379
# ifdef DUMP_ADDRESS
4568
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  2380
            {
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  2381
                unsigned char *cp = (unsigned char *)(&sa);
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  2382
                int i;
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  2383
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  2384
                console_printf("address data:\n");
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  2385
                for (i=0; i<sockaddr_size; i++) {
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  2386
                    console_printf(" %02x\n", *cp++);
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  2387
                }
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  2388
            }
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2389
# endif
4568
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  2390
            err = __MKSMALLINT(errno);
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  2391
        }
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2392
    }
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2393
3843
fbced69597a7 oops - error check was disabled
Claus Gittinger <cg@exept.de>
parents: 3742
diff changeset
  2394
# ifdef __win32__
3657
Stefan Vogel <sv@exept.de>
parents: 3655
diff changeset
  2395
    {
4568
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  2396
        int off = 0;
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  2397
        ioctlsocket(sock, FIONBIO, &off);
3657
Stefan Vogel <sv@exept.de>
parents: 3655
diff changeset
  2398
    }
Stefan Vogel <sv@exept.de>
parents: 3655
diff changeset
  2399
# elif defined(O_NONBLOCK) // Linux / Unix
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2400
    fcntl(sock, F_SETFL, oldFlags);
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2401
# endif
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2402
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2403
# else /* NO_SOCKET */
3077
032905ddd57a class: Socket
Claus Gittinger <cg@exept.de>
parents: 3072
diff changeset
  2404
    err = @symbol(notSupported);
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2405
# endif /* NO_SOCKET */
3077
032905ddd57a class: Socket
Claus Gittinger <cg@exept.de>
parents: 3072
diff changeset
  2406
out:;
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2407
%}.
3217
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  2408
3077
032905ddd57a class: Socket
Claus Gittinger <cg@exept.de>
parents: 3072
diff changeset
  2409
    err notNil ifTrue:[
4568
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  2410
        err isSymbol ifTrue:[
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  2411
            self primitiveFailed:err.
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  2412
        ].
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  2413
        ^ self reportError:err.
3077
032905ddd57a class: Socket
Claus Gittinger <cg@exept.de>
parents: 3072
diff changeset
  2414
    ].
4234
eb1b470a27ee #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 4206
diff changeset
  2415
    isAsync ifTrue:[
4570
39e965ca8d06 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4568
diff changeset
  2416
        milliSeconds := milliSecondsOrTimeDuration.
39e965ca8d06 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4568
diff changeset
  2417
        milliSecondsOrTimeDuration isTimeDuration ifTrue:[
39e965ca8d06 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4568
diff changeset
  2418
            milliSeconds := milliSecondsOrTimeDuration asMilliseconds.
39e965ca8d06 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4568
diff changeset
  2419
        ].
39e965ca8d06 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4568
diff changeset
  2420
        (self writeExceptionWaitWithTimeoutMs:milliSeconds) ifTrue:[
4568
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  2421
            "/ a timeout occurred
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  2422
            "/ should I cancel the connect?
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  2423
            ^ self reportError:(OperatingSystem errorNumberFor:#ETIMEDOUT).
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  2424
        ].
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  2425
        err := self getSocketError.
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  2426
        err ~~ 0 ifTrue:[
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  2427
            ^ self reportError:err.
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  2428
        ].
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2429
    ].
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2430
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
  2431
3059
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  2432
    peer := aSocketAddress.
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2433
    port isNil ifTrue:[
4568
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  2434
        "socket has not been explicitly bound,
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  2435
         after connect it has been bound implicitly - fetch the port"
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  2436
        port := self getFullSocketAddress port.
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2437
    ].
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2438
    ^ true
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2439
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2440
    "
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2441
       |sock|
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2442
       sock := Socket newTCP.
3059
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  2443
       sock connectTo:(IPSocketAddress localHost port:21) withTimeout:1000.
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2444
       sock
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2445
4568
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  2446
       [
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  2447
           |sock|
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  2448
           sock := Socket newTCP.
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  2449
           sock connectTo:(IPSocketAddress localHost port:21) withTimeout:1000.
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  2450
           sock
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  2451
       ] on:SocketErrorNotification do:[:ex|
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  2452
           ex halt.
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  2453
       ].
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  2454
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2455
       |sock|
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2456
       sock := Socket newTCP.
3059
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  2457
       sock connectTo:(IPSocketAddress localHost port:9876) withTimeout:2000.
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2458
       sock
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2459
    "
4568
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  2460
4570
39e965ca8d06 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4568
diff changeset
  2461
    "Modified: / 19-01-2018 / 17:57:36 / stefan"
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2462
! !
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2463
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2464
!Socket methodsFor:'datagram transmission'!
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2465
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2466
receiveBuffer:aDataBuffer start:startIndex for:nBytes
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2467
    "receive data
4626
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2468
     Return the number of bytes received.
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2469
     The thread blocks until data arrives - you may want to wait before
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2470
     receiving, using #readWait or #readWaitWithTimeout:."
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2471
3126
d95cc55a4fb5 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3123
diff changeset
  2472
    |nReceived error|
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2473
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2474
%{
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2475
#ifndef NO_SOCKET
2321
6f4cc7b644db filePointer -> handle migration
Claus Gittinger <cg@exept.de>
parents: 2308
diff changeset
  2476
    OBJ fp = __INST(handle);
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2477
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2478
    if (fp != nil) {
4626
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2479
        SOCKET sock;
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2480
        INT objSize, offs;
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2481
        INT n;
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2482
        char *extPtr;
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2483
        unsigned char *buffer;
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2484
        unsigned char *allocatedBuffer = NULL;
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2485
        INT flags = 0;
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2486
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2487
        sock = SOCKET_FROM_FILE_OBJECT(fp);
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2488
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2489
        if (! setupBufferParameters(aDataBuffer, startIndex, &extPtr, &offs, &objSize)) goto bad;
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2490
        if (__isSmallInteger(nBytes)) {
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2491
            if (__intVal(nBytes) < objSize) {
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2492
                objSize = __intVal(nBytes);
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2493
            }
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2494
        }
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2495
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2496
# ifdef DO_WRAP_CALLS
4626
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2497
        if (extPtr) {
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2498
            buffer = extPtr + offs;
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2499
        } else {
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2500
            allocatedBuffer = buffer = (char *)malloc(objSize);
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2501
        }
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2502
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2503
        do {
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2504
            __threadErrno = 0;
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2505
            n = (INT)STX_WSA_NOINT_CALL4("recv", recv, sock, buffer, objSize, flags);
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2506
        } while ((n < 0) && (__threadErrno == EINTR));
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2507
        if (n < 0) {
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2508
            errno = __threadErrno;
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2509
        }
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2510
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2511
        if (allocatedBuffer) {
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2512
            if (n > 0) {
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2513
                memcpy((char *)__InstPtr(aDataBuffer) + offs, allocatedBuffer, n);
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2514
            }
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2515
            free(allocatedBuffer);
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2516
        }
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2517
# else
4626
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2518
        __BEGIN_INTERRUPTABLE__
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2519
        do {
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2520
            if (extPtr) {
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2521
                n = recv(sock, extPtr + offs, objSize, flags);
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2522
            } else {
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2523
                n = recv(sock, (char *)__InstPtr(aDataBuffer) + offs, objSize, flags);
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2524
            }
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2525
        } while ((n < 0) && (errno == EINTR));
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2526
        __END_INTERRUPTABLE__
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2527
# endif
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2528
4626
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2529
        if (n < 0) {
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2530
            error = __INST(lastErrorNumber) = __MKSMALLINT(errno);
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2531
        } else {
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2532
            RETURN(__MKSMALLINT(n));
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2533
        }
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2534
    }
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2535
#endif
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2536
bad: ;
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2537
%}.
3126
d95cc55a4fb5 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3123
diff changeset
  2538
    error notNil ifTrue:[
4626
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2539
        ^ self readError:error.
915
3dc0e3cd838a added interface to send() and recv()
Claus Gittinger <cg@exept.de>
parents: 898
diff changeset
  2540
    ].
3dc0e3cd838a added interface to send() and recv()
Claus Gittinger <cg@exept.de>
parents: 898
diff changeset
  2541
    "
1282
7e4ffdfd19f6 remove historic leftover
Claus Gittinger <cg@exept.de>
parents: 1280
diff changeset
  2542
     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
  2543
    "
3dc0e3cd838a added interface to send() and recv()
Claus Gittinger <cg@exept.de>
parents: 898
diff changeset
  2544
    self primitiveFailed
4626
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2545
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2546
    "Modified: / 21-03-2018 / 19:35:09 / stefan"
99
7d016cc30052 fixed & moved pingWalk from SNMPSession to here;
Claus Gittinger <cg@exept.de>
parents: 98
diff changeset
  2547
!
7d016cc30052 fixed & moved pingWalk from SNMPSession to here;
Claus Gittinger <cg@exept.de>
parents: 98
diff changeset
  2548
4626
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2549
receiveFrom:aSocketAddress buffer:aDataBuffer
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2550
    "receive datagramm data - put address of originating host into
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2551
     aSocketAddress, data into aDataBuffer.
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2552
     aDataBuffer must be ByteArray-like.
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2553
     For backward compatibility, aSocketAddress may be a non-SocketAddress;
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2554
     then, it must be a byteArray with appropriate size for the addressBytes.
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2555
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2556
     Return the number of bytes received.
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2557
     The thread blocks until data arrives - you may want to wait before
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2558
     receiving, using #readWait or #readWaitWithTimeout:."
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2559
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2560
    ^ self receiveFrom:aSocketAddress buffer:aDataBuffer start:1 for:(aDataBuffer size) flags:0
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2561
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2562
    "Modified (comment): / 21-03-2018 / 19:33:59 / stefan"
3615
ffe86e1b14ed #BUGFIX
Stefan Vogel <sv@exept.de>
parents: 3614
diff changeset
  2563
!
ffe86e1b14ed #BUGFIX
Stefan Vogel <sv@exept.de>
parents: 3614
diff changeset
  2564
4626
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2565
receiveFrom:aSocketAddress buffer:aDataBuffer start:startIndex for:nBytes
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2566
    ^ self receiveFrom:aSocketAddress buffer:aDataBuffer start:startIndex for:nBytes flags:0
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2567
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2568
    "Modified (format): / 21-03-2018 / 19:32:27 / stefan"
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2569
!
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2570
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2571
receiveFrom:aSocketAddress buffer:aDataBuffer start:startIndex for:nBytes flags:flags
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2572
    "receive datagramm data
4626
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2573
     - put address of originating host into aSocketAddress, data into aDataBuffer.
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2574
     aDataBuffer must be ByteArray-like.
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2575
     For backward compatibility, aSocketAddress may be a non-SocketAddress;
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2576
     then, it must be a byteArray with appropriate size for the addressBytes.
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2577
4626
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2578
     Return the number of bytes received.
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2579
     The thread blocks until data arrives - you may want to wait before
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2580
     receiving, using #readWait or #readWaitWithTimeout:."
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2581
3126
d95cc55a4fb5 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3123
diff changeset
  2582
    |domainClass addr addrLen nReceived error|
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2583
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2584
    domainClass := self class socketAddressClassForDomain:domain.
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2585
    domainClass isNil ifTrue:[
4626
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2586
        ^ self error:'invalid (unsupported) domain'.
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2587
    ].
4626
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2588
    aSocketAddress isSocketAddress ifTrue:[
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2589
        aSocketAddress class == domainClass ifFalse:[
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2590
            ^ self error:'addressBuffer class mismatch (domain)'.
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2591
        ].
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2592
        addr := aSocketAddress.
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2593
    ] ifFalse:[
4626
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2594
        aSocketAddress notNil ifTrue:[
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2595
            addr := domainClass new.
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2596
        ].
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2597
    ].
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2598
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2599
%{
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2600
#ifndef NO_SOCKET
2321
6f4cc7b644db filePointer -> handle migration
Claus Gittinger <cg@exept.de>
parents: 2308
diff changeset
  2601
    OBJ fp = __INST(handle);
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2602
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2603
    if (fp != nil) {
4626
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2604
        SOCKET sock;
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2605
        size_t objSize;
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2606
        union sockaddr_u sa;
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2607
        socklen_t alen = 0;
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2608
        INT n, offs;
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2609
        int _flags = __longIntVal(flags);
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2610
        char *extPtr;
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2611
        unsigned char *allocatedBuffer = NULL, *buffer = NULL;
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2612
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2613
        sock = SOCKET_FROM_FILE_OBJECT(fp);
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2614
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2615
        if (! setupBufferParameters(aDataBuffer, startIndex, &extPtr, &offs, &objSize)) goto bad;
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2616
        if (__isSmallInteger(nBytes)) {
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2617
            if (__intVal(nBytes) < objSize) {
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2618
                objSize = __intVal(nBytes);
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2619
            }
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2620
        }
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2621
# ifdef DO_WRAP_CALLS
4626
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2622
        if (extPtr) {
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2623
            buffer = extPtr + offs;
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2624
        } else {
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2625
            allocatedBuffer = buffer = (char *)malloc(objSize);
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2626
        }
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2627
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2628
        do {
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2629
            __threadErrno = 0;
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2630
            alen = sizeof(sa);
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2631
            n = (INT)STX_WSA_NOINT_CALL6("recvfrom", recvfrom, sock, buffer, objSize, _flags, (struct sockaddr *)&sa, &alen);
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2632
        } while ((n < 0) && (__threadErrno == EINTR));
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2633
        if (n < 0) {
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2634
            errno = __threadErrno;
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2635
        }
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2636
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2637
        if (allocatedBuffer) {
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2638
            if (n > 0) {
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2639
                memcpy((char *)__InstPtr(aDataBuffer) + offs, allocatedBuffer, n);
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2640
            }
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2641
            free(allocatedBuffer);
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2642
        }
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2643
# else
4626
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2644
        __BEGIN_INTERRUPTABLE__
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2645
        do {
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2646
            alen = sizeof(sa);
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2647
            if (extPtr) {
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2648
                n = recvfrom(sock, extPtr + offs, objSize, _flags, (struct sockaddr *) &sa, &alen);
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2649
            } else {
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2650
                n = recvfrom(sock, (char *)__InstPtr(aDataBuffer) + offs, objSize, _flags, (struct sockaddr *) &sa, &alen);
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2651
            }
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2652
        } while ((n < 0) && (errno == EINTR));
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2653
        __END_INTERRUPTABLE__
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2654
# endif
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2655
4626
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2656
        if (n >= 0) {
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2657
            if (__isNonNilObject(addr)) {
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2658
                char *addrPtr;
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2659
                OBJ oClass;
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2660
                int nInstVars, nInstBytes, objSize;
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2661
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2662
                oClass = __qClass(addr);
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2663
                if (! __isBytes(addr) )
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2664
                    goto bad;
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2665
                nInstVars = __intVal(__ClassInstPtr(oClass)->c_ninstvars);
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2666
                nInstBytes = OHDR_SIZE + (nInstVars * sizeof(OBJ));
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2667
                objSize = __qSize(addr) - nInstBytes;
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2668
                addrPtr = (char *)__InstPtr(addr) + nInstBytes;
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2669
                if (objSize < alen)
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2670
                    goto bad;
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2671
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2672
                /*
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2673
                 * extract the datagrams address
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2674
                 */
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2675
                memcpy(addrPtr, (char *)&sa, alen);
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2676
                addrLen = __MKSMALLINT(alen);
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2677
            }
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2678
        }
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2679
        if (n < 0) {
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2680
            error = __INST(lastErrorNumber) = __MKSMALLINT(errno);
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2681
        }
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2682
        nReceived = __MKSMALLINT(n);
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2683
    }
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2684
#endif
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2685
bad: ;
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2686
%}.
3126
d95cc55a4fb5 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3123
diff changeset
  2687
    error notNil ifTrue:[
4626
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2688
        ^ self readError:error.
3126
d95cc55a4fb5 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3123
diff changeset
  2689
    ].
d95cc55a4fb5 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3123
diff changeset
  2690
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2691
    nReceived notNil ifTrue:[
4626
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2692
        addrLen notNil ifTrue:[
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2693
            (addr == aSocketAddress) ifFalse:[
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2694
                self obsoleteFeatureWarning:'please use a socketAddress argument'.
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2695
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2696
                "can be a ByteArray for backward compatibility"
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2697
                aSocketAddress replaceFrom:1 to:addrLen with:(addr hostAddress).
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2698
            ].
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2699
        ].
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2700
        ^ nReceived
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2701
    ].
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2702
    "
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2703
     arrive here if you try to receive into an invalid buffer
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2704
     (i.e. not ByteArray-like),
1485
d8578cf3504b gcc3.3.1 insn-scheduler bug workaround
Claus Gittinger <cg@exept.de>
parents: 1474
diff changeset
  2705
     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
  2706
     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
  2707
    "
126
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
  2708
    self primitiveFailed
4626
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2709
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2710
    "Modified (comment): / 21-03-2018 / 19:33:49 / stefan"
116
7789fb1c9fa2 more UD socket fixes (at least client side seems to work now)
Claus Gittinger <cg@exept.de>
parents: 115
diff changeset
  2711
!
7789fb1c9fa2 more UD socket fixes (at least client side seems to work now)
Claus Gittinger <cg@exept.de>
parents: 115
diff changeset
  2712
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2713
sendBuffer:aDataBuffer start:startIndex for:nBytes flags:flags
4626
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2714
    "send data. aDataBuffer be ByteArray-like.
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2715
     Return the number of bytes transmitted, or a negative number on error."
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2716
3126
d95cc55a4fb5 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3123
diff changeset
  2717
    |error|
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2718
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2719
%{
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2720
#ifndef NO_SOCKET
2321
6f4cc7b644db filePointer -> handle migration
Claus Gittinger <cg@exept.de>
parents: 2308
diff changeset
  2721
    OBJ fp = __INST(handle);
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2722
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2723
    if ((fp != nil)
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2724
     && __isSmallInteger(startIndex)
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2725
     && __isSmallInteger(nBytes)) {
4626
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2726
        SOCKET sock;
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2727
        INT objSize, n, offs;
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2728
        char *extPtr;
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2729
        int _flags = __longIntVal(flags);
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2730
        unsigned long norder;
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2731
        unsigned char *buffer, *allocatedBuffer = NULL;
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2732
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2733
        sock = SOCKET_FROM_FILE_OBJECT(fp);
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2734
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2735
        if (! setupBufferParameters(aDataBuffer, startIndex, &extPtr, &offs, &objSize)) goto bad;
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2736
        if (__isSmallInteger(nBytes)) {
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2737
            if (__intVal(nBytes) < objSize) {
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2738
                objSize = __intVal(nBytes);
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2739
            }
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2740
        }
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2741
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2742
# ifdef DGRAM_DEBUG
4626
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2743
        console_printf("sending %d bytes ...\n", nBytes);
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2744
# endif
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2745
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2746
#ifdef DO_WRAP_CALLS
4626
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2747
        if (extPtr) {
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2748
            buffer = extPtr + offs;
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2749
        } else {
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2750
            allocatedBuffer = buffer = (char *)malloc(objSize);
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2751
            memcpy(allocatedBuffer, (char *)__InstPtr(aDataBuffer) + offs, objSize);
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2752
        }
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2753
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2754
        do {
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2755
            __threadErrno = 0;
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2756
            n = (INT)STX_WSA_NOINT_CALL4("send", send, sock, buffer, objSize, _flags);
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2757
        } while ((n < 0) && (__threadErrno == EINTR));
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2758
        if (n < 0) {
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2759
            errno = __threadErrno;
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2760
        }
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2761
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2762
        if (allocatedBuffer) {
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2763
            free(allocatedBuffer);
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2764
        }
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2765
#else
4626
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2766
        __BEGIN_INTERRUPTABLE__
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2767
        do {
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2768
            if (extPtr) {
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2769
                n = send(sock, extPtr + offs, objSize, _flags);
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2770
            } else {
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2771
                n = send(sock, (char *)__InstPtr(aDataBuffer) + offs, objSize, _flags);
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2772
            }
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2773
        } while ((n < 0) && (errno == EINTR));
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2774
        __END_INTERRUPTABLE__
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2775
#endif
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2776
4626
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2777
        if (n < 0) {
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2778
            error = __INST(lastErrorNumber) = __MKSMALLINT(errno);
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2779
        } else {
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2780
            RETURN (__MKSMALLINT(n));
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2781
        }
915
3dc0e3cd838a added interface to send() and recv()
Claus Gittinger <cg@exept.de>
parents: 898
diff changeset
  2782
    }
3dc0e3cd838a added interface to send() and recv()
Claus Gittinger <cg@exept.de>
parents: 898
diff changeset
  2783
#endif
3dc0e3cd838a added interface to send() and recv()
Claus Gittinger <cg@exept.de>
parents: 898
diff changeset
  2784
bad: ;
3dc0e3cd838a added interface to send() and recv()
Claus Gittinger <cg@exept.de>
parents: 898
diff changeset
  2785
%}.
3126
d95cc55a4fb5 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3123
diff changeset
  2786
    error notNil ifTrue:[
4626
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2787
        self writeError:error.
3126
d95cc55a4fb5 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3123
diff changeset
  2788
    ].
d95cc55a4fb5 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3123
diff changeset
  2789
915
3dc0e3cd838a added interface to send() and recv()
Claus Gittinger <cg@exept.de>
parents: 898
diff changeset
  2790
    "
1485
d8578cf3504b gcc3.3.1 insn-scheduler bug workaround
Claus Gittinger <cg@exept.de>
parents: 1474
diff changeset
  2791
     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
  2792
    "
3dc0e3cd838a added interface to send() and recv()
Claus Gittinger <cg@exept.de>
parents: 898
diff changeset
  2793
    self primitiveFailed
4626
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2794
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2795
    "Modified: / 21-03-2018 / 19:22:52 / stefan"
915
3dc0e3cd838a added interface to send() and recv()
Claus Gittinger <cg@exept.de>
parents: 898
diff changeset
  2796
!
3dc0e3cd838a added interface to send() and recv()
Claus Gittinger <cg@exept.de>
parents: 898
diff changeset
  2797
4626
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2798
sendTo:aSocketAddress buffer:buffer
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2799
    "send datagramm data - fetch address of destination host from
4626
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2800
     aSocketAddress, data from aDataBuffer.
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2801
     aDataBuffer must be ByteArray-like. 
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2802
     aSocketAddress must be a valid SocketAddress for my domain 
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2803
     (i.e. for IPv4, an IPSocketAddress).
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2804
     For backward compatibility, a ByteArray is still supported in aSocketAddress
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2805
     (i.e. for IPv4, a 4-byte byteArray).
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2806
     Return the number of bytes transmitted."
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2807
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2808
    ^ self sendTo:aSocketAddress buffer:buffer start:1 for:buffer size flags:0
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2809
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2810
    "Modified (comment): / 21-03-2018 / 19:30:20 / stefan"
116
7789fb1c9fa2 more UD socket fixes (at least client side seems to work now)
Claus Gittinger <cg@exept.de>
parents: 115
diff changeset
  2811
!
7789fb1c9fa2 more UD socket fixes (at least client side seems to work now)
Claus Gittinger <cg@exept.de>
parents: 115
diff changeset
  2812
4626
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2813
sendTo:aSocketAddress buffer:buffer start:startIndex for:count
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2814
    "send datagramm data - fetch address of destination host from
4626
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2815
     aSocketAddress, data from aDataBuffer.
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2816
     aDataBuffer must be ByteArray-like. 
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2817
     aSocketAddress must be a valid SocketAddress for my domain 
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2818
     (i.e. for IPv4, an IPSocketAddress).
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2819
     For backward compatibility, a ByteArray is still supported in aSocketAddress
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2820
     (i.e. for IPv4, a 4-byte byteArray).
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2821
     Return the number of bytes transmitted."
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2822
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2823
    ^ self sendTo:aSocketAddress buffer:buffer start:startIndex for:count flags:0
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2824
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2825
    "Modified (comment): / 21-03-2018 / 19:29:07 / stefan"
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2826
!
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2827
4626
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2828
sendTo:aSocketAddress buffer:aDataBuffer start:startIndex for:nBytes flags:flags
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2829
    "send datagramm data - fetch address of destination host from
4626
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2830
     aSocketAddress, data from aDataBuffer starting at startIndex,
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2831
     sending count bytes.
4626
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2832
     aDataBuffer must be ByteArray-like. 
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2833
     aSocketAddress must be a valid SocketAddress for my domain 
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2834
     (i.e. for IPv4, an IPSocketAddress).
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2835
     For backward compatibility, a ByteArray is still supported in aSocketAddress
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2836
     (i.e. for IPv4, a 4-byte byteArray).
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2837
     Return the number of bytes transmitted."
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2838
3126
d95cc55a4fb5 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3123
diff changeset
  2839
    |domainClass addr error|
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2840
4626
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2841
    aSocketAddress isSocketAddress ifTrue:[
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2842
        addr := aSocketAddress.
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2843
    ] ifFalse:[
4626
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2844
        aSocketAddress isByteArray ifFalse:[
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2845
            ^ self error:'bad socketAddress argument'
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2846
        ].
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2847
        domainClass := self class socketAddressClassForDomain:domain.
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2848
        domainClass isNil ifTrue:[
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2849
            ^ self error:'invalid (unsupported) domain'.
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2850
        ].
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2851
        addr := domainClass hostAddress:aSocketAddress.
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2852
    ].
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2853
%{
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2854
#ifndef NO_SOCKET
2321
6f4cc7b644db filePointer -> handle migration
Claus Gittinger <cg@exept.de>
parents: 2308
diff changeset
  2855
    OBJ fp = __INST(handle);
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2856
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2857
    if ((fp != nil)
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2858
     && __isSmallInteger(startIndex)
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2859
     && __isSmallInteger(nBytes)) {
4626
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2860
        SOCKET sock;
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2861
        INT objSize;
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2862
        struct sockaddr *sockaddr_ptr;
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2863
        union sockaddr_u sa;
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2864
        socklen_t sockaddr_size, alen = 0;
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2865
        INT sockAddrOffs;
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2866
        INT n, offs;
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2867
        char *extPtr;
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2868
        int _flags = __longIntVal(flags);
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2869
        unsigned long norder;
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2870
        unsigned char *buffer;
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2871
        unsigned char *allocatedBuffer = NULL;
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2872
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2873
        sock = SOCKET_FROM_FILE_OBJECT(fp);
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2874
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2875
        if (! __isBytes(addr)) {
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2876
            sockaddr_size = 0;
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2877
            sockaddr_ptr = (struct sockaddr *)0;
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2878
        } else {
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2879
            int nIndex;
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2880
            OBJ cls;
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2881
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2882
            sockAddrOffs = 0;
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2883
            if ((cls = __qClass(addr)) != @global(ByteArray))
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2884
                sockAddrOffs += __OBJS2BYTES__(__intVal(__ClassInstPtr(cls)->c_ninstvars));
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2885
            nIndex = __qSize(addr) - OHDR_SIZE;
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2886
            sockaddr_size = nIndex - sockAddrOffs;
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2887
            if (sockaddr_size > sizeof(sa)) {
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2888
                console_fprintf(stderr, "Socket [warning]: bad socketAddr\n");
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2889
                goto bad;
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2890
            }
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2891
            memcpy(&sa, (__byteArrayVal(addr) + sockAddrOffs), sockaddr_size);
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2892
            sockaddr_ptr = (struct sockaddr *)(&sa);
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2893
        }
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2894
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2895
        if (! setupBufferParameters(aDataBuffer, startIndex, &extPtr, &offs, &objSize)) goto bad;
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2896
        if (__isSmallInteger(nBytes)) {
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2897
            if (__intVal(nBytes) < objSize) {
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2898
                objSize = __intVal(nBytes);
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2899
            }
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2900
        }
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2901
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2902
#ifdef DO_WRAP_CALLS
4626
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2903
        if (extPtr) {
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2904
            buffer = extPtr + offs;
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2905
        } else {
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2906
            allocatedBuffer = buffer = (char *)malloc(objSize);
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2907
            memcpy(allocatedBuffer, (char *)__InstPtr(aDataBuffer) + offs, objSize);
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2908
        }
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2909
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2910
        do {
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2911
            __threadErrno = 0;
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2912
            n = (INT)STX_WSA_NOINT_CALL6("sendto", sendto, sock, buffer, objSize, _flags, sockaddr_ptr, sockaddr_size);
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2913
        } while ((n < 0) && (__threadErrno == EINTR));
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2914
        if (n < 0) {
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2915
            errno = __threadErrno;
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2916
        }
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2917
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2918
        if (allocatedBuffer) {
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2919
            free(allocatedBuffer);
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2920
        }
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2921
#else
4626
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2922
        __BEGIN_INTERRUPTABLE__
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2923
        do {
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2924
            if (extPtr) {
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2925
                n = sendto(sock, extPtr + offs, objSize, _flags, sockaddr_ptr, sockaddr_size);
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2926
            } else {
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2927
                n = sendto(sock, (char *)__InstPtr(aDataBuffer) + offs, objSize, _flags, sockaddr_ptr, sockaddr_size);
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2928
            }
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2929
        } while ((n < 0) && (errno == EINTR));
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2930
        __END_INTERRUPTABLE__
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2931
#endif
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2932
4626
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2933
        if (n < 0) {
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2934
            error = __INST(lastErrorNumber) = __MKSMALLINT(errno);
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2935
        } else {
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2936
            RETURN (__MKSMALLINT(n));
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2937
        }
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2938
    }
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2939
#endif
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2940
bad: ;
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2941
%}.
3126
d95cc55a4fb5 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3123
diff changeset
  2942
    error notNil ifTrue:[
4626
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2943
        self writeError:error.
3126
d95cc55a4fb5 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3123
diff changeset
  2944
    ].
d95cc55a4fb5 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3123
diff changeset
  2945
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2946
    "
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2947
     arrive here if you try to send from an invalid buffer
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2948
     (i.e. not ByteArray-like),
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2949
     or if the addressBuffer is nonNil AND not a ByteArray/String
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2950
     or if the addressBuffer is nonNil AND too small.
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2951
    "
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2952
    self primitiveFailed
4626
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2953
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2954
    "Modified: / 21-03-2018 / 19:27:51 / stefan"
0
1cf8d1747859 Initial revision
claus
parents:
diff changeset
  2955
! !
1cf8d1747859 Initial revision
claus
parents:
diff changeset
  2956
4568
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  2957
!Socket methodsFor:'error reporting'!
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  2958
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  2959
reportError:osErrorNumber
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  2960
    "report an error to the initiator of a Socket operation.
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  2961
     We raise a notification for newer code, and also
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  2962
     return false for old code not catching the notification."
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  2963
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  2964
    |errorHolder|
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  2965
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  2966
    lastErrorNumber := osErrorNumber.
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  2967
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  2968
    errorHolder := OperatingSystem errorHolderForNumber:osErrorNumber.
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  2969
    SocketErrorNotification raiseRequestWith:errorHolder.
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  2970
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  2971
    ^ false.
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  2972
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  2973
    "Created: / 19-01-2018 / 12:50:00 / stefan"
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  2974
! !
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  2975
4172
2a6544c030fc #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 4091
diff changeset
  2976
!Socket methodsFor:'finalization'!
2a6544c030fc #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 4091
diff changeset
  2977
2a6544c030fc #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 4091
diff changeset
  2978
finalize
2a6544c030fc #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 4091
diff changeset
  2979
    self linger:0.      "/ do an abortive release - discard buffered data
2a6544c030fc #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 4091
diff changeset
  2980
    self closeFile.     "/ does not wait due to abortive release.
2a6544c030fc #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 4091
diff changeset
  2981
! !
2a6544c030fc #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 4091
diff changeset
  2982
3484
ccd8683e4e7e class: Socket
Claus Gittinger <cg@exept.de>
parents: 3481
diff changeset
  2983
!Socket methodsFor:'initialization'!
ccd8683e4e7e class: Socket
Claus Gittinger <cg@exept.de>
parents: 3481
diff changeset
  2984
ccd8683e4e7e class: Socket
Claus Gittinger <cg@exept.de>
parents: 3481
diff changeset
  2985
initialize
ccd8683e4e7e class: Socket
Claus Gittinger <cg@exept.de>
parents: 3481
diff changeset
  2986
    super initialize.
ccd8683e4e7e class: Socket
Claus Gittinger <cg@exept.de>
parents: 3481
diff changeset
  2987
    "/ transparent
ccd8683e4e7e class: Socket
Claus Gittinger <cg@exept.de>
parents: 3481
diff changeset
  2988
    eolMode := nil.
ccd8683e4e7e class: Socket
Claus Gittinger <cg@exept.de>
parents: 3481
diff changeset
  2989
! !
ccd8683e4e7e class: Socket
Claus Gittinger <cg@exept.de>
parents: 3481
diff changeset
  2990
3123
55ef9ca4f09f class: Socket
Stefan Vogel <sv@exept.de>
parents: 3077
diff changeset
  2991
!Socket methodsFor:'low level'!
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2992
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2993
getSocketAdress
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2994
    "BAD SPELLING, of #getSocketAddress, kept for compatibility with swazoo"
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2995
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2996
    <resource: #obsolete>
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2997
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2998
    ^ self getSocketAddress
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2999
!
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  3000
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3001
getSocketError
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3002
    "get the SO_ERROR form the socket, which indicates the
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3003
     result of an asynchronous operation"
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3004
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3005
%{
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3006
#ifndef NO_SOCKET
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3007
    OBJ fp;
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3008
    int err;
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3009
2321
6f4cc7b644db filePointer -> handle migration
Claus Gittinger <cg@exept.de>
parents: 2308
diff changeset
  3010
    fp = __INST(handle);
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3011
    if (fp == nil) {
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3012
	err = EBADF;
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3013
    } else {
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3014
	unsigned int sz;
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3015
	SOCKET sock;
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3016
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3017
	sock = SOCKET_FROM_FILE_OBJECT(fp);
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3018
	sz = sizeof(err);
2909
aacef77a1697 64bit fixes
Claus Gittinger <cg@exept.de>
parents: 2904
diff changeset
  3019
	if (getsockopt(sock, SOL_SOCKET, SO_ERROR, (char *)(&err), &sz) < 0) {
3843
fbced69597a7 oops - error check was disabled
Claus Gittinger <cg@exept.de>
parents: 3742
diff changeset
  3020
# ifdef __win32__
1568
3bca500e0c7a send and receiveTimeout fixed
Claus Gittinger <cg@exept.de>
parents: 1561
diff changeset
  3021
	    errno = WSAGetLastError();
1558
a563aac90660 No need to ask Socket>>#networkXXXOrderIsMSB, because the return value is
Stefan Vogel <sv@exept.de>
parents: 1542
diff changeset
  3022
# endif
1568
3bca500e0c7a send and receiveTimeout fixed
Claus Gittinger <cg@exept.de>
parents: 1561
diff changeset
  3023
	    err = errno;
3bca500e0c7a send and receiveTimeout fixed
Claus Gittinger <cg@exept.de>
parents: 1561
diff changeset
  3024
	}
1558
a563aac90660 No need to ask Socket>>#networkXXXOrderIsMSB, because the return value is
Stefan Vogel <sv@exept.de>
parents: 1542
diff changeset
  3025
    }
a563aac90660 No need to ask Socket>>#networkXXXOrderIsMSB, because the return value is
Stefan Vogel <sv@exept.de>
parents: 1542
diff changeset
  3026
a563aac90660 No need to ask Socket>>#networkXXXOrderIsMSB, because the return value is
Stefan Vogel <sv@exept.de>
parents: 1542
diff changeset
  3027
    RETURN(__MKSMALLINT(err));
a563aac90660 No need to ask Socket>>#networkXXXOrderIsMSB, because the return value is
Stefan Vogel <sv@exept.de>
parents: 1542
diff changeset
  3028
#endif
a563aac90660 No need to ask Socket>>#networkXXXOrderIsMSB, because the return value is
Stefan Vogel <sv@exept.de>
parents: 1542
diff changeset
  3029
%}
a563aac90660 No need to ask Socket>>#networkXXXOrderIsMSB, because the return value is
Stefan Vogel <sv@exept.de>
parents: 1542
diff changeset
  3030
!
a563aac90660 No need to ask Socket>>#networkXXXOrderIsMSB, because the return value is
Stefan Vogel <sv@exept.de>
parents: 1542
diff changeset
  3031
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  3032
listenWithBacklog:aNumber
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  3033
    <resource: #obsolete>
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  3034
    "same as listenFor: - backward compatibility with old ST/X"
3059
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  3035
    self obsoleteMethodWarning.
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  3036
    ^ self listenFor:aNumber
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3037
!
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3038
3246
c75a006f9a7a Win32 sockets use handles instead of file pointers
Stefan Vogel <sv@exept.de>
parents: 3224
diff changeset
  3039
primAcceptOn:aServerSocket blocking:blocking
3059
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  3040
    "accept a connection on a server port (created with:'Socket>>newTCP:')
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  3041
     usage is: (Socket basicNew acceptOn:(Socket newTCP:9999)).
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  3042
     Return the true if ok; false if not.
4568
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  3043
     Notify with a SocketErrorNotification on error.
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  3044
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  3045
     If blocking is true, the accept() syscall (and the whole smalltalk image)
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  3046
     will block, until a connection is accepted.
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  3047
     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
  3048
4568
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  3049
    |serverSocketHandle addr domainClass newHandle err|
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  3050
2321
6f4cc7b644db filePointer -> handle migration
Claus Gittinger <cg@exept.de>
parents: 2308
diff changeset
  3051
    handle notNil ifTrue:[
4568
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  3052
        ^ self errorAlreadyOpen.
4180
f2539f82b744 #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4172
diff changeset
  3053
    ].
f2539f82b744 #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4172
diff changeset
  3054
    serverSocketHandle := aServerSocket fileHandle.
f2539f82b744 #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4172
diff changeset
  3055
    serverSocketHandle isNil ifTrue:[
4568
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  3056
        "socket is not open"
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  3057
        ^ self errorNotOpen
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  3058
    ].
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  3059
3246
c75a006f9a7a Win32 sockets use handles instead of file pointers
Stefan Vogel <sv@exept.de>
parents: 3224
diff changeset
  3060
    domain := aServerSocket domain.
c75a006f9a7a Win32 sockets use handles instead of file pointers
Stefan Vogel <sv@exept.de>
parents: 3224
diff changeset
  3061
    socketType := aServerSocket type.
c75a006f9a7a Win32 sockets use handles instead of file pointers
Stefan Vogel <sv@exept.de>
parents: 3224
diff changeset
  3062
    handleType := aServerSocket handleType.
3059
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  3063
    "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
  3064
    domainClass := self class socketAddressClassForDomain:domain.
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  3065
    domainClass isNil ifTrue:[
4568
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  3066
        ^ self error:'invalid (unsupported) domain'.
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  3067
    ].
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  3068
    addr := domainClass new.
3246
c75a006f9a7a Win32 sockets use handles instead of file pointers
Stefan Vogel <sv@exept.de>
parents: 3224
diff changeset
  3069
    newHandle := OperatingSystem socketAccessor new.
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  3070
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  3071
%{  /* STACK: 100000 */
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3072
#ifndef NO_SOCKET
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  3073
    FILE *fp;
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  3074
    int flags;
3246
c75a006f9a7a Win32 sockets use handles instead of file pointers
Stefan Vogel <sv@exept.de>
parents: 3224
diff changeset
  3075
    SOCKET serverSocket, newSock;
c75a006f9a7a Win32 sockets use handles instead of file pointers
Stefan Vogel <sv@exept.de>
parents: 3224
diff changeset
  3076
    int _fd;
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  3077
    union sockaddr_u sa;
3059
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  3078
    unsigned int alen;
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  3079
3843
fbced69597a7 oops - error check was disabled
Claus Gittinger <cg@exept.de>
parents: 3742
diff changeset
  3080
# ifdef __win32__
3246
c75a006f9a7a Win32 sockets use handles instead of file pointers
Stefan Vogel <sv@exept.de>
parents: 3224
diff changeset
  3081
    serverSocket = SOCKET_FROM_FILE_OBJECT(serverSocketHandle);
3843
fbced69597a7 oops - error check was disabled
Claus Gittinger <cg@exept.de>
parents: 3742
diff changeset
  3082
# else
3247
259f71b89b6e class: Socket
Stefan Vogel <sv@exept.de>
parents: 3246
diff changeset
  3083
    serverSocket = __intVal(serverSocketHandle);
3843
fbced69597a7 oops - error check was disabled
Claus Gittinger <cg@exept.de>
parents: 3742
diff changeset
  3084
# endif
3246
c75a006f9a7a Win32 sockets use handles instead of file pointers
Stefan Vogel <sv@exept.de>
parents: 3224
diff changeset
  3085
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  3086
# 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
  3087
    if (blocking == false) {
4568
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  3088
        flags = fcntl(serverSocket, F_GETFL);
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  3089
        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
  3090
    }
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  3091
# endif
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  3092
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3093
# ifdef DO_WRAP_CALLS
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3094
    do {
4568
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  3095
        __threadErrno = 0;
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  3096
        alen = sizeof(sa);
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  3097
        newSock = (SOCKET)STX_WSA_CALL3("accept", accept, serverSocket, &sa, &alen);
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  3098
    } while ((newSock < 0) && (__threadErrno == EINTR));
4568
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  3099
    if (newSock == -1) {
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  3100
        err = __MKSMALLINT(__threadErrno);
3126
d95cc55a4fb5 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3123
diff changeset
  3101
    }
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3102
# else
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3103
    __BEGIN_INTERRUPTABLE__
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3104
    do {
4568
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  3105
        alen = sizeof(sa);
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  3106
        newSock = accept(serverSocket, (struct sockaddr *) &sa, &alen);
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  3107
    } while ((newSock < 0) && (errno == EINTR));
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3108
    __END_INTERRUPTABLE__
4568
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  3109
    if (newSock == -1) {
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  3110
        err = __MKSMALLINT(errno);
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  3111
    }
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3112
# endif
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  3113
    DBGFPRINTF((stderr, "SOCKET: accept newSock=%d\n", newSock));
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  3114
3246
c75a006f9a7a Win32 sockets use handles instead of file pointers
Stefan Vogel <sv@exept.de>
parents: 3224
diff changeset
  3115
# if defined(O_NDELAY) && defined(SET_NDELAY)
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  3116
    if (blocking == false) {
4568
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  3117
        fcntl(serverSocket, F_SETFL, flags);
3246
c75a006f9a7a Win32 sockets use handles instead of file pointers
Stefan Vogel <sv@exept.de>
parents: 3224
diff changeset
  3118
    }
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  3119
# endif
3246
c75a006f9a7a Win32 sockets use handles instead of file pointers
Stefan Vogel <sv@exept.de>
parents: 3224
diff changeset
  3120
    if (newSock == -1) {
4568
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  3121
        DBGPRINTF(("SOCKET: accept call failed errno=%d\n", err));
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  3122
        goto out;
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  3123
    }
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  3124
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  3125
    if (__isNonNilObject(addr)) {
4568
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  3126
        OBJ oClass = __qClass(addr);
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  3127
        int nInstVars, nInstBytes, objSize;
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  3128
        char *addrP;
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  3129
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  3130
        if (! __isBytes(addr)) {
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  3131
            DBGPRINTF(("SOCKET: bad addr\n"));
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  3132
            closesocket(newSock);
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  3133
            err = @symbol(badAddressArg);
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  3134
            goto out;
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  3135
        }
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  3136
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  3137
        nInstVars = __intVal(__ClassInstPtr(oClass)->c_ninstvars);
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  3138
        nInstBytes = OHDR_SIZE + (nInstVars * sizeof(OBJ));
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  3139
        objSize = __qSize(addr) - nInstBytes;
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  3140
        addrP = (char *)__InstPtr(addr) + nInstBytes;
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  3141
        if (objSize < alen) {
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  3142
            DBGPRINTF(("SOCKET: bad addr\n"));
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  3143
            closesocket(newSock);
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  3144
            err = @symbol(badAddressArgLen);
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  3145
            goto out;
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  3146
        }
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  3147
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  3148
        /*
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  3149
         * extract the partners address
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  3150
         */
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  3151
        memcpy(addrP, (char *)&sa, alen);
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  3152
    }
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  3153
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  3154
    /*
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  3155
     * make it a FILE *
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  3156
     */
3843
fbced69597a7 oops - error check was disabled
Claus Gittinger <cg@exept.de>
parents: 3742
diff changeset
  3157
# ifdef __win32__
3246
c75a006f9a7a Win32 sockets use handles instead of file pointers
Stefan Vogel <sv@exept.de>
parents: 3224
diff changeset
  3158
#  if 0 && (defined( __BORLANDC__ ) || defined( __MINGW__ ))
c75a006f9a7a Win32 sockets use handles instead of file pointers
Stefan Vogel <sv@exept.de>
parents: 3224
diff changeset
  3159
    __stxWrapApiEnterCritical();
c75a006f9a7a Win32 sockets use handles instead of file pointers
Stefan Vogel <sv@exept.de>
parents: 3224
diff changeset
  3160
    _fd = _open_osfhandle((long)newSock, 0);
c75a006f9a7a Win32 sockets use handles instead of file pointers
Stefan Vogel <sv@exept.de>
parents: 3224
diff changeset
  3161
    __stxWrapApiLeaveCritical();
c75a006f9a7a Win32 sockets use handles instead of file pointers
Stefan Vogel <sv@exept.de>
parents: 3224
diff changeset
  3162
    DBGPRINTF(("SOCKET: sock=%d fd=%d\n", newSock, _fd));
2773
ab3049f4a351 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2748
diff changeset
  3163
#  else
3246
c75a006f9a7a Win32 sockets use handles instead of file pointers
Stefan Vogel <sv@exept.de>
parents: 3224
diff changeset
  3164
    _fd = (int)newSock;
2773
ab3049f4a351 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2748
diff changeset
  3165
#  endif
3843
fbced69597a7 oops - error check was disabled
Claus Gittinger <cg@exept.de>
parents: 3742
diff changeset
  3166
# else // ! __win32__
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  3167
    fp = fdopen(newSock, "r+");
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  3168
    if (! fp) {
4568
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  3169
        DBGPRINTF(("SOCKET: fdopen call failed\n"));
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  3170
        err = __MKSMALLINT(errno);
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  3171
        closesocket(newSock);
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  3172
        DBGFPRINTF((stderr, "SOCKET: close (fdopen failed) (%d)\n", newSock));
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  3173
        goto out;
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  3174
    }
3843
fbced69597a7 oops - error check was disabled
Claus Gittinger <cg@exept.de>
parents: 3742
diff changeset
  3175
# endif // ! __win32__
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  3176
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  3177
    if ((@global(FileOpenTrace) == true) || __debugging__) {
3843
fbced69597a7 oops - error check was disabled
Claus Gittinger <cg@exept.de>
parents: 3742
diff changeset
  3178
# ifdef __win32__
4568
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  3179
        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
  3180
# else
4568
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  3181
        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
  3182
# endif
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  3183
    }
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  3184
3843
fbced69597a7 oops - error check was disabled
Claus Gittinger <cg@exept.de>
parents: 3742
diff changeset
  3185
# ifdef __win32__
3246
c75a006f9a7a Win32 sockets use handles instead of file pointers
Stefan Vogel <sv@exept.de>
parents: 3224
diff changeset
  3186
    __externalAddressVal(newHandle) = _fd;
c75a006f9a7a Win32 sockets use handles instead of file pointers
Stefan Vogel <sv@exept.de>
parents: 3224
diff changeset
  3187
    __INST(handleType) = @symbol(socketHandle);
c75a006f9a7a Win32 sockets use handles instead of file pointers
Stefan Vogel <sv@exept.de>
parents: 3224
diff changeset
  3188
# else
c75a006f9a7a Win32 sockets use handles instead of file pointers
Stefan Vogel <sv@exept.de>
parents: 3224
diff changeset
  3189
    __externalAddressVal(newHandle) = fp;
c75a006f9a7a Win32 sockets use handles instead of file pointers
Stefan Vogel <sv@exept.de>
parents: 3224
diff changeset
  3190
    __INST(handleType) = @symbol(socketFilePointer);
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  3191
# endif
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  3192
#endif /* not NO_SOCKET */
4568
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  3193
out:;
1558
a563aac90660 No need to ask Socket>>#networkXXXOrderIsMSB, because the return value is
Stefan Vogel <sv@exept.de>
parents: 1542
diff changeset
  3194
%}.
3246
c75a006f9a7a Win32 sockets use handles instead of file pointers
Stefan Vogel <sv@exept.de>
parents: 3224
diff changeset
  3195
4568
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  3196
    err notNil ifTrue:[
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  3197
        err isSymbol ifTrue:[
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  3198
            self error:err.
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  3199
        ].
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  3200
        ^ self reportError:err.
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  3201
    ].
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  3202
3246
c75a006f9a7a Win32 sockets use handles instead of file pointers
Stefan Vogel <sv@exept.de>
parents: 3224
diff changeset
  3203
    handle := newHandle.
c75a006f9a7a Win32 sockets use handles instead of file pointers
Stefan Vogel <sv@exept.de>
parents: 3224
diff changeset
  3204
    buffered := false.
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  3205
    mode := #readwrite.
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  3206
    binary := false.
3620
c648d063bccc #REFACTORING
Stefan Vogel <sv@exept.de>
parents: 3617
diff changeset
  3207
    self registerForFinalization.
3059
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  3208
    peer := addr.
3246
c75a006f9a7a Win32 sockets use handles instead of file pointers
Stefan Vogel <sv@exept.de>
parents: 3224
diff changeset
  3209
    port := aServerSocket port.
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  3210
1558
a563aac90660 No need to ask Socket>>#networkXXXOrderIsMSB, because the return value is
Stefan Vogel <sv@exept.de>
parents: 1542
diff changeset
  3211
    ^ true
4568
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  3212
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  3213
    "Modified (comment): / 19-01-2018 / 13:35:57 / stefan"
2551
6da1bc89b74a changed:
Stefan Vogel <sv@exept.de>
parents: 2516
diff changeset
  3214
!
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3215
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3216
setSocketOption:option argument:arg1 argument:arg2
3513
8105bf370769 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3485
diff changeset
  3217
    |ok error|
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3218
2551
6da1bc89b74a changed:
Stefan Vogel <sv@exept.de>
parents: 2516
diff changeset
  3219
    handle isNil ifTrue:[
4738
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
  3220
        ^ self errorNotOpen
2551
6da1bc89b74a changed:
Stefan Vogel <sv@exept.de>
parents: 2516
diff changeset
  3221
    ].
6da1bc89b74a changed:
Stefan Vogel <sv@exept.de>
parents: 2516
diff changeset
  3222
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3223
%{  /* STACK: 32000 */
2818
94d67df5c00d compilable with tcc
Claus Gittinger <cg@exept.de>
parents: 2773
diff changeset
  3224
#ifndef NO_SOCKET
2321
6f4cc7b644db filePointer -> handle migration
Claus Gittinger <cg@exept.de>
parents: 2308
diff changeset
  3225
    OBJ fp = __INST(handle);
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3226
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3227
    if (fp != nil) {
4738
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
  3228
        SOCKET sock = SOCKET_FROM_FILE_OBJECT(fp);
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
  3229
        int opt = -1;
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
  3230
        int level = -1;
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
  3231
        int usize = -1;
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
  3232
        int ret;
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
  3233
        union u {
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
  3234
            BOOL        u_bool;
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
  3235
            int         u_int;
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
  3236
            struct linger  u_linger;
2516
592619f82885 Add setsockopt for Multicast stuff
Stefan Vogel <sv@exept.de>
parents: 2465
diff changeset
  3237
# ifdef IP_ADD_MEMBERSHIP
4738
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
  3238
            struct ip_mreq u_ip_mreq;
2516
592619f82885 Add setsockopt for Multicast stuff
Stefan Vogel <sv@exept.de>
parents: 2465
diff changeset
  3239
# endif
3467
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
  3240
# if defined(SO_RCVTIMEO) || defined(SO_SNDTIMEO)
4738
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
  3241
            struct timeval u_tv;
3467
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
  3242
# endif
4738
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
  3243
        } u;
2516
592619f82885 Add setsockopt for Multicast stuff
Stefan Vogel <sv@exept.de>
parents: 2465
diff changeset
  3244
592619f82885 Add setsockopt for Multicast stuff
Stefan Vogel <sv@exept.de>
parents: 2465
diff changeset
  3245
# ifdef IP_ADD_MEMBERSHIP
4738
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
  3246
        if (option == @symbol(IP_DROP_MEMBERSHIP)) {
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
  3247
            opt = IP_DROP_MEMBERSHIP;
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
  3248
            goto dropOrAdd;
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
  3249
        }
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
  3250
        if (option == @symbol(IP_ADD_MEMBERSHIP)) {
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
  3251
            /* add membership to a multicast group */
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
  3252
            opt = IP_ADD_MEMBERSHIP;
2516
592619f82885 Add setsockopt for Multicast stuff
Stefan Vogel <sv@exept.de>
parents: 2465
diff changeset
  3253
dropOrAdd:
4738
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
  3254
            level = IPPROTO_IP;
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
  3255
            usize = sizeof(u.u_ip_mreq);
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
  3256
            if (__isByteArrayLike(arg1) && __isByteArrayLike(arg2)) {
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
  3257
                memcpy(&u.u_ip_mreq.imr_multiaddr, __byteArrayVal(arg1), sizeof(u.u_ip_mreq.imr_multiaddr));
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
  3258
                memcpy(&u.u_ip_mreq.imr_interface, __byteArrayVal(arg2), sizeof(u.u_ip_mreq.imr_interface));
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
  3259
                // once we use the struct ip_mreqn:
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
  3260
                // u.u_ip_mreqn.imr_ifindex = 0;
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
  3261
            }
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
  3262
            else
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
  3263
                goto argError;
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
  3264
        }
2516
592619f82885 Add setsockopt for Multicast stuff
Stefan Vogel <sv@exept.de>
parents: 2465
diff changeset
  3265
# endif /* IP_ADD_MEMBERSHIP */
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3266
4738
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
  3267
# ifdef IP_TTL
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
  3268
        if (option == @symbol(IP_TTL)) {
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
  3269
            opt = IP_TTL;
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
  3270
            level = IPPROTO_IP;
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
  3271
            usize = sizeof(u.u_int);
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
  3272
            if (__isSmallInteger(arg1))u.u_int = __intVal(arg1);
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
  3273
            else goto argError;
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
  3274
        }
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
  3275
# endif /* IP_TTL */
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
  3276
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
  3277
# ifdef IP_MULTICAST_TTL
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
  3278
        if (option == @symbol(IP_MULTICAST_TTL)) {
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
  3279
            opt = IP_MULTICAST_TTL;
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
  3280
            level = IPPROTO_IP;
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
  3281
            usize = sizeof(u.u_int);
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
  3282
            if (__isSmallInteger(arg1))u.u_int = __intVal(arg1);
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
  3283
            else goto argError;
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
  3284
        }
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
  3285
# endif /* IP_TTL */
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
  3286
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
  3287
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3288
# ifdef SO_BROADCAST
4738
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
  3289
        if (option == @symbol(SO_BROADCAST)) {
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
  3290
            /* Enables transmission and receipt of broadcast messages on the socket. */
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
  3291
            opt = SO_BROADCAST;
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
  3292
            level = SOL_SOCKET;
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
  3293
            usize = sizeof(u.u_bool);
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
  3294
            if (arg1 == true) u.u_bool = TRUE;
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
  3295
            else if (arg1 == false) u.u_bool = FALSE;
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
  3296
            else goto argError;
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
  3297
        }
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3298
# endif /* SO_BROADCAST */
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3299
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3300
# ifdef SO_CONDITIONAL
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3301
#  if 0
4738
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
  3302
        if (option == @symbol(SO_CONDITIONAL)) {
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
  3303
            /* Enables sockets to delay the acknowledgment of a connection until after the WSAAccept condition function is called. */
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
  3304
            opt = SO_CONDITIONAL;
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
  3305
            level = SOL_SOCKET;
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
  3306
            usize = sizeof(u.u_bool);
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
  3307
            if (arg1 == true) u.u_bool = TRUE;
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
  3308
            else if (arg1 == false) u.u_bool = FALSE;
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
  3309
            else goto argError;
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
  3310
        }
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3311
#  endif
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3312
# endif /* SO_CONDITIONAL */
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3313
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3314
# ifdef SO_DEBUG
4738
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
  3315
        if (option == @symbol(SO_DEBUG)) {
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
  3316
            /* Records debugging information. */
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
  3317
            opt = SO_DEBUG;
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
  3318
            level = SOL_SOCKET;
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
  3319
            usize = sizeof(u.u_bool);
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
  3320
            if (arg1 == true) u.u_bool = TRUE;
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
  3321
            else if (arg1 == false) u.u_bool = FALSE;
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
  3322
            else goto argError;
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
  3323
        }
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3324
# endif /* SO_DEBUG */
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3325
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3326
# ifdef SO_DONTLINGER
4738
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
  3327
        if (option == @symbol(SO_DONTLINGER)) {
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
  3328
            /* Does not block close waiting for unsent data to be sent.
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
  3329
               Setting this option is equivalent to setting SO_LINGER with l_onoff set to zero. */
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
  3330
            opt = SO_DONTLINGER;
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
  3331
            level = SOL_SOCKET;
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
  3332
            usize = sizeof(u.u_bool);
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
  3333
            if (arg1 == true) u.u_bool = TRUE;
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
  3334
            else if (arg1 == false) u.u_bool = FALSE;
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
  3335
            else goto argError;
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
  3336
        }
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3337
# endif /* SO_DONTLINGER */
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3338
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3339
# ifdef SO_DONTROUTE
4738
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
  3340
        if (option == @symbol(SO_DONTROUTE)) {
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
  3341
            /* Does not route: sends directly to interface.
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
  3342
               Succeeds but is ignored on AF_INET sockets;
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
  3343
               fails on AF_INET6 sockets with WSAENOPROTOOPT.
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
  3344
               Not supported on ATM sockets (results in an error). */
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
  3345
            opt = SO_DONTROUTE;
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
  3346
            level = SOL_SOCKET;
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
  3347
            usize = sizeof(u.u_bool);
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
  3348
            if (arg1 == true) u.u_bool = TRUE;
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
  3349
            else if (arg1 == false) u.u_bool = FALSE;
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
  3350
            else goto argError;
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
  3351
        }
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3352
# endif /* SO_DONTROUTE */
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3353
2516
592619f82885 Add setsockopt for Multicast stuff
Stefan Vogel <sv@exept.de>
parents: 2465
diff changeset
  3354
#if defined(IPPROTO_TCP) && defined(TCP_NODELAY)
4738
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
  3355
        if (option == @symbol(TCP_NODELAY)) {
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
  3356
            /* enable/disable TCP_NODELAY (i.e. disable/enable the Nagle algorithm) */
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
  3357
            opt = TCP_NODELAY;
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
  3358
            level = IPPROTO_TCP;
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
  3359
            usize = sizeof(u.u_bool);
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
  3360
            if (arg1 == true) u.u_bool = TRUE;
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
  3361
            else if (arg1 == false) u.u_bool = FALSE;
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
  3362
            else goto argError;
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
  3363
        }
2516
592619f82885 Add setsockopt for Multicast stuff
Stefan Vogel <sv@exept.de>
parents: 2465
diff changeset
  3364
# endif /* TCP_NODELAY */
592619f82885 Add setsockopt for Multicast stuff
Stefan Vogel <sv@exept.de>
parents: 2465
diff changeset
  3365
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3366
# ifdef SO_KEEPALIVE
4738
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
  3367
        if (option == @symbol(SO_KEEPALIVE)) {
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
  3368
            /* Sends keep-alives. Not supported on ATM sockets (results in an error). */
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
  3369
            opt = SO_KEEPALIVE;
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
  3370
            level = SOL_SOCKET;
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
  3371
            usize = sizeof(u.u_bool);
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
  3372
            if (arg1 == true) u.u_bool = TRUE;
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
  3373
            else if (arg1 == false) u.u_bool = FALSE;
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
  3374
            else goto argError;
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
  3375
        }
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3376
# endif /* SO_KEEPALIVE */
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3377
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3378
# ifdef SO_LINGER
4738
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
  3379
        if (option == @symbol(SO_LINGER)) {
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
  3380
            /* Lingers on close if unsent data is present. */
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
  3381
            opt = SO_LINGER;
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
  3382
            level = SOL_SOCKET;
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
  3383
            usize = sizeof(u.u_linger);
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
  3384
            if (arg1 == true) u.u_linger.l_onoff = TRUE;
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
  3385
            else if (arg1 == false) u.u_linger.l_onoff = FALSE;
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
  3386
            else goto argError;
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
  3387
            if (arg2 == nil) u.u_linger.l_linger = 0;
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
  3388
            else if (__isSmallInteger(arg2))u.u_linger.l_linger = __intVal(arg2);
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
  3389
            else goto argError;
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
  3390
            DBGPRINTF(("SOCKET: SO_LINGER %d %d\n", u.u_linger.l_onoff, u.u_linger.l_linger));
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
  3391
        }
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3392
# endif /* SO_LINGER */
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3393
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3394
# ifdef SO_OOBINLINE
4738
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
  3395
        if (option == @symbol(SO_OOBINLINE)) {
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
  3396
            /* Receives OOB data in the normal data stream. */
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
  3397
            opt = SO_OOBINLINE;
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
  3398
            level = SOL_SOCKET;
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
  3399
            usize = sizeof(u.u_bool);
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
  3400
            if (arg1 == true) u.u_bool = TRUE;
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
  3401
            else if (arg1 == false) u.u_bool = FALSE;
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
  3402
            else goto argError;
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
  3403
        }
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3404
# endif /* SO_OOBINLINE */
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3405
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3406
# ifdef SO_RCVBUF
4738
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
  3407
        if (option == @symbol(SO_RCVBUF)) {
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
  3408
            /* Specifies the total per-socket buffer space reserved for receives.
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
  3409
               This is unrelated to SO_MAX_MSG_SIZE or the size of a TCP window. */
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
  3410
            opt = SO_RCVBUF;
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
  3411
            level = SOL_SOCKET;
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
  3412
            usize = sizeof(u.u_int);
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
  3413
            if (__isSmallInteger(arg1))u.u_int = __intVal(arg1);
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
  3414
            else goto argError;
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
  3415
        }
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3416
# endif /* SO_RCVBUF */
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3417
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3418
# ifdef SO_SNDBUF
4738
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
  3419
        if (option == @symbol(SO_SNDBUF)) {
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
  3420
            /* Specifies the total per-socket buffer space reserved for sends.
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
  3421
               This is unrelated to SO_MAX_MSG_SIZE or the size of a TCP window. */
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
  3422
            opt = SO_SNDBUF;
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
  3423
            level = SOL_SOCKET;
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
  3424
            usize = sizeof(u.u_int);
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
  3425
            if (__isSmallInteger(arg1))u.u_int = __intVal(arg1);
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
  3426
            else goto argError;
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
  3427
        }
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3428
# endif /* SO_SNDBUF */
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3429
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3430
# ifdef SO_REUSEADDR
4738
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
  3431
        if (option == @symbol(SO_REUSEADDR)) {
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
  3432
            /* Allows the socket to be bound to an address that is already in use.  */
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
  3433
            opt = SO_REUSEADDR;
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
  3434
            level = SOL_SOCKET;
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
  3435
            usize = sizeof(u.u_bool);
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
  3436
            if (arg1 == true) u.u_bool = TRUE;
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
  3437
            else if (arg1 == false) u.u_bool = FALSE;
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
  3438
            else goto argError;
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
  3439
        }
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3440
# endif /* SO_OOBINLINE */
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3441
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3442
# ifdef SO_EXCLUSIVEADDRUSE
4738
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
  3443
        if (option == @symbol(SO_EXCLUSIVEADDRUSE)) {
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
  3444
            /* Enables a socket to be bound for exclusive access.
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
  3445
               Does not require administrative privilege.  */
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
  3446
            opt = SO_EXCLUSIVEADDRUSE;
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
  3447
            level = SOL_SOCKET;
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
  3448
            usize = sizeof(u.u_bool);
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
  3449
            if (arg1 == true) u.u_bool = TRUE;
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
  3450
            else if (arg1 == false) u.u_bool = FALSE;
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
  3451
            else goto argError;
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
  3452
        }
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3453
# endif /* SO_OOBINLINE */
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3454
3467
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
  3455
# ifdef SO_RCVTIMEO
4738
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
  3456
        if ((option == @symbol(SO_RCVTIMEO))
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
  3457
         && __isSmallInteger(arg1)
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
  3458
         && __isSmallInteger(arg2)) {
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
  3459
            opt = SO_RCVTIMEO;
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
  3460
            level = SOL_SOCKET;
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
  3461
            u.u_tv.tv_sec = __intVal(arg1);
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
  3462
            u.u_tv.tv_usec = __intVal(arg2);
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
  3463
            usize = sizeof(u.u_tv);
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
  3464
        }
3467
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
  3465
# endif /* SO_RCVTIMEO */
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
  3466
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
  3467
# ifdef SO_SNDTIMEO
4738
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
  3468
        if ((option == @symbol(SO_SNDTIMEO))
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
  3469
         && __isSmallInteger(arg1)
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
  3470
         && __isSmallInteger(arg2)) {
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
  3471
            opt = SO_SNDTIMEO;
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
  3472
            level = SOL_SOCKET;
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
  3473
            u.u_tv.tv_sec = __intVal(arg1);
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
  3474
            u.u_tv.tv_usec = __intVal(arg2);
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
  3475
            usize = sizeof(u.u_tv);
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
  3476
        }
3467
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
  3477
# endif /* SO_SNDTIMEO */
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
  3478
3843
fbced69597a7 oops - error check was disabled
Claus Gittinger <cg@exept.de>
parents: 3742
diff changeset
  3479
# if !defined(IPV6_V6ONLY) && defined(__win32__)
3513
8105bf370769 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3485
diff changeset
  3480
#  define IPPROTO_IPV6 41
8105bf370769 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3485
diff changeset
  3481
#  define IPV6_V6ONLY 27
8105bf370769 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3485
diff changeset
  3482
# endif
8105bf370769 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3485
diff changeset
  3483
8105bf370769 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3485
diff changeset
  3484
# if defined(IPV6_V6ONLY)
4738
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
  3485
        if (option == @symbol(IPV6_V6ONLY)) {
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
  3486
            opt = IPV6_V6ONLY;
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
  3487
            level = IPPROTO_IPV6;
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
  3488
            usize = sizeof(u.u_bool);
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
  3489
            if (arg1 == true) u.u_bool = TRUE;
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
  3490
            else if (arg1 == false) u.u_bool = FALSE;
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
  3491
            else goto argError;
3843
fbced69597a7 oops - error check was disabled
Claus Gittinger <cg@exept.de>
parents: 3742
diff changeset
  3492
#  ifdef __win32__
4738
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
  3493
            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
  3494
#  endif
4738
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
  3495
        }
3513
8105bf370769 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3485
diff changeset
  3496
# endif /* IPV6_V6ONLY */
8105bf370769 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3485
diff changeset
  3497
4738
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
  3498
        if (usize == -1) goto argError;
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
  3499
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
  3500
        ok = (setsockopt(sock, level, opt, (char *)&u, usize) >= 0) ? true : false;
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
  3501
        if (ok == false) {
3843
fbced69597a7 oops - error check was disabled
Claus Gittinger <cg@exept.de>
parents: 3742
diff changeset
  3502
# ifdef __win32__
4738
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
  3503
            error = __mkSmallInteger(WSAGetLastError());
3843
fbced69597a7 oops - error check was disabled
Claus Gittinger <cg@exept.de>
parents: 3742
diff changeset
  3504
# else
4738
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
  3505
            error = __mkSmallInteger(errno);
3843
fbced69597a7 oops - error check was disabled
Claus Gittinger <cg@exept.de>
parents: 3742
diff changeset
  3506
# endif
4738
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
  3507
        }
3513
8105bf370769 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3485
diff changeset
  3508
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3509
    }
1529
911273d090c1 Re-unified Win32 and Unix code into single Socket.st.
Claus Gittinger <cg@exept.de>
parents: 1505
diff changeset
  3510
argError: ;
2818
94d67df5c00d compilable with tcc
Claus Gittinger <cg@exept.de>
parents: 2773
diff changeset
  3511
#endif /* NO_SOCKET */
1529
911273d090c1 Re-unified Win32 and Unix code into single Socket.st.
Claus Gittinger <cg@exept.de>
parents: 1505
diff changeset
  3512
%}.
911273d090c1 Re-unified Win32 and Unix code into single Socket.st.
Claus Gittinger <cg@exept.de>
parents: 1505
diff changeset
  3513
    ok isNil ifTrue:[
4738
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
  3514
        self primitiveFailed
1529
911273d090c1 Re-unified Win32 and Unix code into single Socket.st.
Claus Gittinger <cg@exept.de>
parents: 1505
diff changeset
  3515
    ].
911273d090c1 Re-unified Win32 and Unix code into single Socket.st.
Claus Gittinger <cg@exept.de>
parents: 1505
diff changeset
  3516
    ok ifFalse:[
4738
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
  3517
        '++++ 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
  3518
    ].
2551
6da1bc89b74a changed:
Stefan Vogel <sv@exept.de>
parents: 2516
diff changeset
  3519
!
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3520
2823
10179ccfae5d Default for close - linger in background instead 30s in foreground
Stefan Vogel <sv@exept.de>
parents: 2818
diff changeset
  3521
shutdown:howNum
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3522
    "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
  3523
	 0 - read side   (no further reads)
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
  3524
	     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
  3525
	 1 - write side  (no further writes)
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
  3526
	     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
  3527
	     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
  3528
	     that we will not send more data.
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
  3529
	 2 - both read side and write side."
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3530
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3531
%{
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3532
#ifndef NO_SOCKET
2823
10179ccfae5d Default for close - linger in background instead 30s in foreground
Stefan Vogel <sv@exept.de>
parents: 2818
diff changeset
  3533
    OBJ __handle = __INST(handle);
3246
c75a006f9a7a Win32 sockets use handles instead of file pointers
Stefan Vogel <sv@exept.de>
parents: 3224
diff changeset
  3534
2823
10179ccfae5d Default for close - linger in background instead 30s in foreground
Stefan Vogel <sv@exept.de>
parents: 2818
diff changeset
  3535
    if ((__handle != nil) && __isSmallInteger(howNum)) {
3467
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
  3536
	SOCKET sock = SOCKET_FROM_FILE_OBJECT(__handle);
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
  3537
	INT how = __intVal(howNum);
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
  3538
	INT ret;
2823
10179ccfae5d Default for close - linger in background instead 30s in foreground
Stefan Vogel <sv@exept.de>
parents: 2818
diff changeset
  3539
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3540
# ifdef DO_WRAP_CALLS
3467
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
  3541
	do {
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
  3542
	    __threadErrno = 0;
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
  3543
	    DBGFPRINTF((stderr, "SOCKET: shutDown...\n"));
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
  3544
	    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
  3545
	    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
  3546
	} 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
  3547
# else
3467
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
  3548
	__BEGIN_INTERRUPTABLE__
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
  3549
	shutdown(sock, how);
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
  3550
	__END_INTERRUPTABLE__
1529
911273d090c1 Re-unified Win32 and Unix code into single Socket.st.
Claus Gittinger <cg@exept.de>
parents: 1505
diff changeset
  3551
# endif
781
4d61e7588ff3 added #waitForNewConnectionOrDataOnAny:timeout:
Claus Gittinger <cg@exept.de>
parents: 776
diff changeset
  3552
    }
4d61e7588ff3 added #waitForNewConnectionOrDataOnAny:timeout:
Claus Gittinger <cg@exept.de>
parents: 776
diff changeset
  3553
#endif
1339
cc973a42aa54 shutdown: added
Claus Gittinger <cg@exept.de>
parents: 1338
diff changeset
  3554
%}.
781
4d61e7588ff3 added #waitForNewConnectionOrDataOnAny:timeout:
Claus Gittinger <cg@exept.de>
parents: 776
diff changeset
  3555
! !
4d61e7588ff3 added #waitForNewConnectionOrDataOnAny:timeout:
Claus Gittinger <cg@exept.de>
parents: 776
diff changeset
  3556
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3557
!Socket methodsFor:'printing & storing'!
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3558
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3559
printOn:aStream
3530
ce2171c0fe57 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3514
diff changeset
  3560
    aStream nextPutAll:self className; nextPutAll:'('.
ce2171c0fe57 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3514
diff changeset
  3561
    domain printOn:aStream.
ce2171c0fe57 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3514
diff changeset
  3562
    aStream nextPutAll:' protocol='.
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3563
    protocol printOn:aStream.
4736
c5a3e2dae276 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 4671
diff changeset
  3564
    aStream nextPutAll:' type='.
c5a3e2dae276 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 4671
diff changeset
  3565
    socketType printOn:aStream.
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3566
    aStream nextPutAll:' port='.
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  3567
    self port printOn:aStream.
4636
7e1e0ce3e0b4 #QUALITY by stefan
Stefan Vogel <sv@exept.de>
parents: 4630
diff changeset
  3568
    peer notNil ifTrue:[
7e1e0ce3e0b4 #QUALITY by stefan
Stefan Vogel <sv@exept.de>
parents: 4630
diff changeset
  3569
        aStream nextPutAll:' peer='.
7e1e0ce3e0b4 #QUALITY by stefan
Stefan Vogel <sv@exept.de>
parents: 4630
diff changeset
  3570
        peer printOn:aStream.
7e1e0ce3e0b4 #QUALITY by stefan
Stefan Vogel <sv@exept.de>
parents: 4630
diff changeset
  3571
    ].
7e1e0ce3e0b4 #QUALITY by stefan
Stefan Vogel <sv@exept.de>
parents: 4630
diff changeset
  3572
    listening notNil ifTrue:[
7e1e0ce3e0b4 #QUALITY by stefan
Stefan Vogel <sv@exept.de>
parents: 4630
diff changeset
  3573
        aStream nextPutAll:' *listening('.
7e1e0ce3e0b4 #QUALITY by stefan
Stefan Vogel <sv@exept.de>
parents: 4630
diff changeset
  3574
        listening printOn:aStream.
7e1e0ce3e0b4 #QUALITY by stefan
Stefan Vogel <sv@exept.de>
parents: 4630
diff changeset
  3575
        aStream nextPutAll:')*'.
7e1e0ce3e0b4 #QUALITY by stefan
Stefan Vogel <sv@exept.de>
parents: 4630
diff changeset
  3576
    ].
1842
88c04d1e9e6b changed #printOn:
Stefan Vogel <sv@exept.de>
parents: 1839
diff changeset
  3577
    aStream nextPut:$).
4636
7e1e0ce3e0b4 #QUALITY by stefan
Stefan Vogel <sv@exept.de>
parents: 4630
diff changeset
  3578
7e1e0ce3e0b4 #QUALITY by stefan
Stefan Vogel <sv@exept.de>
parents: 4630
diff changeset
  3579
    "Modified: / 23-04-2018 / 19:44:24 / stefan"
4736
c5a3e2dae276 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 4671
diff changeset
  3580
    "Modified: / 19-09-2018 / 18:30:20 / Claus Gittinger"
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3581
! !
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3582
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3583
!Socket methodsFor:'queries'!
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3584
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3585
domain
3059
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  3586
    "return the sockets addressing domain (i.e. #AF_INET, #AF_INET6, #AF_UNIX, ...)"
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3587
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3588
    ^ domain
126
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
  3589
!
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
  3590
3059
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  3591
getFullPeerAddress
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  3592
    "implemented for swazoo project (primitive code can't be loaded as extension)
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3593
     Answer my own address (I am bound to this address).
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3594
     Note that this address may change after a connect or accept."
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3595
3059
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  3596
    |error domainClass addr|
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3597
2321
6f4cc7b644db filePointer -> handle migration
Claus Gittinger <cg@exept.de>
parents: 2308
diff changeset
  3598
    handle isNil ifTrue:[
3217
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  3599
	^ self errorNotOpen
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3600
    ].
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3601
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3602
    domainClass := self class socketAddressClassForDomain:domain.
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3603
    domainClass isNil ifTrue:[
3217
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  3604
	^ self error:'invalid (unsupported) domain'.
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3605
    ].
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3606
    addr := domainClass new.
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3607
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3608
%{
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3609
#ifndef NO_SOCKET
2321
6f4cc7b644db filePointer -> handle migration
Claus Gittinger <cg@exept.de>
parents: 2308
diff changeset
  3610
    OBJ fp = __INST(handle);
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3611
    SOCKET sock;
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3612
    int ret;
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3613
    union sockaddr_u sa;
3059
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  3614
    unsigned int alen = sizeof(sa);
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3615
    char *addrP;
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3616
    int addrObjSize, nAddrInstBytes;
3059
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  3617
    OBJ addrClass;
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  3618
    int nAddrInstVars;
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3619
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3620
    if (!__isNonNilObject(addr) || !__isBytes(addr)) {
3217
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  3621
	DBGPRINTF(("SOCKET: bad addr\n"));
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  3622
	error = @symbol(badArgument);
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  3623
	goto err;
3059
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  3624
    }
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  3625
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  3626
    addrClass = __qClass(addr);
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  3627
    nAddrInstVars = __intVal(__ClassInstPtr(addrClass)->c_ninstvars);
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  3628
    nAddrInstBytes = OHDR_SIZE + (nAddrInstVars * sizeof(OBJ));
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  3629
    addrObjSize = __qSize(addr) - nAddrInstBytes;
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  3630
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  3631
    sock = SOCKET_FROM_FILE_OBJECT(fp);
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  3632
    ret = getpeername(sock, (struct sockaddr *)&sa, &alen);
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  3633
    if (ret < 0) {
3843
fbced69597a7 oops - error check was disabled
Claus Gittinger <cg@exept.de>
parents: 3742
diff changeset
  3634
# ifdef __win32__
3217
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  3635
	errno = WSAGetLastError();
3059
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  3636
# endif
3217
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  3637
	DBGPRINTF(("SOCKET: getsocketname failed ret=%d errno=%d\n", ret, errno));
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  3638
	error = __MKSMALLINT(errno);
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  3639
	goto err;
3059
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  3640
    }
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  3641
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  3642
    if (addrObjSize < alen) {
3217
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  3643
	DBGPRINTF(("SOCKET: bad addr\n"));
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  3644
	error = @symbol(badArgument);
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  3645
	goto err;
3059
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  3646
    }
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  3647
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  3648
    addrP = (char *)__InstPtr(addr) + nAddrInstBytes;
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  3649
    memcpy(addrP, (char *)&sa, alen);
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  3650
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  3651
err:;
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  3652
#else /* NO_SOCKET */
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  3653
    error = @symbol(notImplemented);
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  3654
#endif /* NO_SOCKET */
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  3655
%}.
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  3656
    error notNil ifTrue:[
3217
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  3657
	^ self errorReporter reportOn:error
3059
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  3658
    ].
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  3659
    ^ addr
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  3660
!
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  3661
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  3662
getFullSocketAddress
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  3663
    "implemented for swazoo project (primitive code can't be loaded as extension)
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  3664
     Answer my own address (I am bound to this address).
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  3665
     Note that this address may change after a connect or accept."
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  3666
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  3667
    |error domainClass addr|
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  3668
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  3669
    handle isNil ifTrue:[
3217
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  3670
	^ self errorNotOpen
3059
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  3671
    ].
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  3672
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  3673
    domainClass := self class socketAddressClassForDomain:domain.
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  3674
    domainClass isNil ifTrue:[
3217
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  3675
	^ self error:'invalid (unsupported) domain'.
3059
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  3676
    ].
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  3677
    addr := domainClass new.
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  3678
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  3679
%{
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  3680
#ifndef NO_SOCKET
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  3681
    OBJ fp = __INST(handle);
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  3682
    SOCKET sock;
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  3683
    int ret;
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  3684
    union sockaddr_u sa;
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  3685
    unsigned int alen = sizeof(sa);
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  3686
    char *addrP;
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  3687
    int addrObjSize, nAddrInstBytes;
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  3688
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  3689
    if (!__isNonNilObject(addr) || !__isBytes(addr)) {
3217
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  3690
	DBGPRINTF(("SOCKET: bad addr\n"));
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  3691
	error = @symbol(badArgument);
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  3692
	goto err;
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3693
    }
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3694
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3695
    {
3217
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  3696
	OBJ addrClass;
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  3697
	int nAddrInstVars;
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  3698
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  3699
	addrClass = __qClass(addr);
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  3700
	nAddrInstVars = __intVal(__ClassInstPtr(addrClass)->c_ninstvars);
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  3701
	nAddrInstBytes = OHDR_SIZE + (nAddrInstVars * sizeof(OBJ));
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  3702
	addrObjSize = __qSize(addr) - nAddrInstBytes;
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3703
    }
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3704
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3705
    sock = SOCKET_FROM_FILE_OBJECT(fp);
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3706
    ret = getsockname(sock, (struct sockaddr *)&sa, &alen);
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3707
    if (ret < 0) {
3843
fbced69597a7 oops - error check was disabled
Claus Gittinger <cg@exept.de>
parents: 3742
diff changeset
  3708
# ifdef __win32__
3217
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  3709
	errno = WSAGetLastError();
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3710
# endif
3217
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  3711
	DBGPRINTF(("SOCKET: getsocketname failed ret=%d errno=%d\n", ret, errno));
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  3712
	error = __MKSMALLINT(errno);
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  3713
	goto err;
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3714
    }
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3715
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3716
    if (addrObjSize < alen) {
3217
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  3717
	DBGPRINTF(("SOCKET: bad addr\n"));
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  3718
	error = @symbol(badArgument);
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  3719
	goto err;
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3720
    }
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3721
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3722
    addrP = (char *)__InstPtr(addr) + nAddrInstBytes;
3059
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  3723
    memcpy(addrP, (char *)&sa, alen);
1535
f6aa0fc8c3cc getSocketAddress
Claus Gittinger <cg@exept.de>
parents: 1533
diff changeset
  3724
f6aa0fc8c3cc getSocketAddress
Claus Gittinger <cg@exept.de>
parents: 1533
diff changeset
  3725
err:;
f6aa0fc8c3cc getSocketAddress
Claus Gittinger <cg@exept.de>
parents: 1533
diff changeset
  3726
#else /* NO_SOCKET */
f6aa0fc8c3cc getSocketAddress
Claus Gittinger <cg@exept.de>
parents: 1533
diff changeset
  3727
    error = @symbol(notImplemented);
f6aa0fc8c3cc getSocketAddress
Claus Gittinger <cg@exept.de>
parents: 1533
diff changeset
  3728
#endif /* NO_SOCKET */
f6aa0fc8c3cc getSocketAddress
Claus Gittinger <cg@exept.de>
parents: 1533
diff changeset
  3729
%}.
f6aa0fc8c3cc getSocketAddress
Claus Gittinger <cg@exept.de>
parents: 1533
diff changeset
  3730
    error notNil ifTrue:[
3217
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  3731
	^ self errorReporter reportOn:error
1535
f6aa0fc8c3cc getSocketAddress
Claus Gittinger <cg@exept.de>
parents: 1533
diff changeset
  3732
    ].
f6aa0fc8c3cc getSocketAddress
Claus Gittinger <cg@exept.de>
parents: 1533
diff changeset
  3733
    ^ addr
f6aa0fc8c3cc getSocketAddress
Claus Gittinger <cg@exept.de>
parents: 1533
diff changeset
  3734
!
f6aa0fc8c3cc getSocketAddress
Claus Gittinger <cg@exept.de>
parents: 1533
diff changeset
  3735
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3736
getName
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3737
    "return the name; here, we return the ports name"
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3738
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  3739
    ^ self port printString
126
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
  3740
!
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
  3741
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3742
getPeer
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3743
    "ST-80 compatibility: return an IPSocketAddress instance representing
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3744
     my hostname/port combination.
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3745
     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
  3746
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
  3747
    ^ peer
102
5dc264007513 added getPeer for ST-80 compatibility
Claus Gittinger <cg@exept.de>
parents: 99
diff changeset
  3748
!
5dc264007513 added getPeer for ST-80 compatibility
Claus Gittinger <cg@exept.de>
parents: 99
diff changeset
  3749
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3750
getPeerName
4091
ff4070ceffad #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 4039
diff changeset
  3751
    "return the peer name; that's the hostname (or dotted name) of the
25
996051271ce9 *** empty log message ***
claus
parents: 21
diff changeset
  3752
     partners host after an accept."
996051271ce9 *** empty log message ***
claus
parents: 21
diff changeset
  3753
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
  3754
    peerName isNil ifTrue:[
4414
42edc97b2323 bcopy -> memcpy
Claus Gittinger <cg@exept.de>
parents: 4341
diff changeset
  3755
	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
  3756
    ].
25
996051271ce9 *** empty log message ***
claus
parents: 21
diff changeset
  3757
    ^ peerName
28
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  3758
!
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  3759
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3760
getSocketAddress
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3761
    "implemented for swazoo project primitive code cant load as extension
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3762
     answer my own address (I am bound to this address).
1146
71a9df78ba9e bad spelling
Stefan Vogel <sv@exept.de>
parents: 1136
diff changeset
  3763
     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
  3764
1535
f6aa0fc8c3cc getSocketAddress
Claus Gittinger <cg@exept.de>
parents: 1533
diff changeset
  3765
    ^ self getFullSocketAddress hostAddress
1146
71a9df78ba9e bad spelling
Stefan Vogel <sv@exept.de>
parents: 1136
diff changeset
  3766
!
71a9df78ba9e bad spelling
Stefan Vogel <sv@exept.de>
parents: 1136
diff changeset
  3767
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3768
isActive
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3769
    "return true, if the receiver has a connection"
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3770
2321
6f4cc7b644db filePointer -> handle migration
Claus Gittinger <cg@exept.de>
parents: 2308
diff changeset
  3771
    ^ handle notNil
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3772
!
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3773
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3774
isConnected
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3775
    "return true, if the receiver has a connection"
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3776
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3777
    ^ self isActive
2321
6f4cc7b644db filePointer -> handle migration
Claus Gittinger <cg@exept.de>
parents: 2308
diff changeset
  3778
	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
  3779
!
a563aac90660 No need to ask Socket>>#networkXXXOrderIsMSB, because the return value is
Stefan Vogel <sv@exept.de>
parents: 1542
diff changeset
  3780
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3781
port
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  3782
    "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
  3783
     - so this is the local port."
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  3784
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  3785
"/    port isNil ifTrue:[
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  3786
"/        port := self getFullSocketAddress port.
1505
Stefan Vogel <sv@exept.de>
parents: 1504
diff changeset
  3787
"/    ].
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  3788
71
claus
parents: 63
diff changeset
  3789
    ^ port
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3790
!
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3791
3059
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  3792
socketAddressClass
4288
00e575acf898 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 4261
diff changeset
  3793
    "get the matching SocketAddress class for this socket"
3059
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  3794
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  3795
    |domainClass|
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  3796
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  3797
    domainClass := self class socketAddressClassForDomain:domain.
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  3798
    domainClass isNil ifTrue:[
4414
42edc97b2323 bcopy -> memcpy
Claus Gittinger <cg@exept.de>
parents: 4341
diff changeset
  3799
	^ self error:'invalid (unsupported) domain'.
3059
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  3800
    ].
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  3801
    ^ domainClass.
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  3802
!
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  3803
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3804
type
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3805
    "return the sockets connection type (i.e. #datagram, #stream etc)"
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3806
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3807
    ^ socketType
81
claus
parents: 79
diff changeset
  3808
! !
claus
parents: 79
diff changeset
  3809
126
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
  3810
!Socket methodsFor:'socket setup'!
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
  3811
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3812
domain:domainArg type:typeArg
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3813
    "set up socket with domain and type.
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3814
     This is a low level entry; no binding, listening or connect
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3815
     is done. Both arguments must be symbols from one of
3059
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  3816
      #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
  3817
3137
df3e9cebf52c class: Socket
Stefan Vogel <sv@exept.de>
parents: 3127
diff changeset
  3818
    ^ self domain:domainArg type:typeArg protocol:nil
126
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
  3819
!
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
  3820
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3821
domain:domainArg type:typeArg protocol:protocolNumber
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3822
    "set up socket with domain, type and protocol number.
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3823
     This is a low level entry; no binding, listening or connect
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3824
     is done. Both arguments must be symbols from one of
3059
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  3825
     #AF_INET, #AF_INET6, #AF_UNIX ... and #stream, #datagram, #raw resp."
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3826
3246
c75a006f9a7a Win32 sockets use handles instead of file pointers
Stefan Vogel <sv@exept.de>
parents: 3224
diff changeset
  3827
    |domainName domainCode typeCode error newHandle|
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3828
2321
6f4cc7b644db filePointer -> handle migration
Claus Gittinger <cg@exept.de>
parents: 2308
diff changeset
  3829
    handle notNil ifTrue:[
4414
42edc97b2323 bcopy -> memcpy
Claus Gittinger <cg@exept.de>
parents: 4341
diff changeset
  3830
	^ self errorAlreadyOpen
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3831
    ].
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3832
    domainName := SocketAddress domainCodeFromName:domainArg.
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3833
    domainCode := OperatingSystem domainCodeOf:domainName.
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3834
    typeCode := OperatingSystem socketTypeCodeOf:typeArg.
3246
c75a006f9a7a Win32 sockets use handles instead of file pointers
Stefan Vogel <sv@exept.de>
parents: 3224
diff changeset
  3835
    newHandle := OperatingSystem socketAccessor new.
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3836
%{
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3837
#ifndef NO_SOCKET
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3838
    FILE *fp;
3137
df3e9cebf52c class: Socket
Stefan Vogel <sv@exept.de>
parents: 3127
diff changeset
  3839
    int dom, typ, proto = 0;
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3840
    int on = 1;
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3841
    SOCKET sock;
3246
c75a006f9a7a Win32 sockets use handles instead of file pointers
Stefan Vogel <sv@exept.de>
parents: 3224
diff changeset
  3842
    int _fd;
c75a006f9a7a Win32 sockets use handles instead of file pointers
Stefan Vogel <sv@exept.de>
parents: 3224
diff changeset
  3843
3843
fbced69597a7 oops - error check was disabled
Claus Gittinger <cg@exept.de>
parents: 3742
diff changeset
  3844
# ifdef __win32__
3123
55ef9ca4f09f class: Socket
Stefan Vogel <sv@exept.de>
parents: 3077
diff changeset
  3845
#  ifndef WSA_FLAG_NO_HANDLE_INHERIT
55ef9ca4f09f class: Socket
Stefan Vogel <sv@exept.de>
parents: 3077
diff changeset
  3846
#   define WSA_FLAG_NO_HANDLE_INHERIT 0x80
55ef9ca4f09f class: Socket
Stefan Vogel <sv@exept.de>
parents: 3077
diff changeset
  3847
#  endif
55ef9ca4f09f class: Socket
Stefan Vogel <sv@exept.de>
parents: 3077
diff changeset
  3848
    static int noInheritFlag = WSA_FLAG_NO_HANDLE_INHERIT;
55ef9ca4f09f class: Socket
Stefan Vogel <sv@exept.de>
parents: 3077
diff changeset
  3849
# endif
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3850
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3851
    if (! __isSmallInteger(domainCode)) {
4414
42edc97b2323 bcopy -> memcpy
Claus Gittinger <cg@exept.de>
parents: 4341
diff changeset
  3852
	error = @symbol(badArgument1);
42edc97b2323 bcopy -> memcpy
Claus Gittinger <cg@exept.de>
parents: 4341
diff changeset
  3853
	goto out;
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3854
    }
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3855
    if (! __isSmallInteger(typeCode)) {
4414
42edc97b2323 bcopy -> memcpy
Claus Gittinger <cg@exept.de>
parents: 4341
diff changeset
  3856
	error = @symbol(badArgument2);
42edc97b2323 bcopy -> memcpy
Claus Gittinger <cg@exept.de>
parents: 4341
diff changeset
  3857
	goto out;
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3858
    }
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3859
    if (protocolNumber != nil) {
4414
42edc97b2323 bcopy -> memcpy
Claus Gittinger <cg@exept.de>
parents: 4341
diff changeset
  3860
	if (!__isSmallInteger(protocolNumber)) {
42edc97b2323 bcopy -> memcpy
Claus Gittinger <cg@exept.de>
parents: 4341
diff changeset
  3861
	    error = @symbol(badArgument3);
42edc97b2323 bcopy -> memcpy
Claus Gittinger <cg@exept.de>
parents: 4341
diff changeset
  3862
	    goto out;
42edc97b2323 bcopy -> memcpy
Claus Gittinger <cg@exept.de>
parents: 4341
diff changeset
  3863
	}
42edc97b2323 bcopy -> memcpy
Claus Gittinger <cg@exept.de>
parents: 4341
diff changeset
  3864
	proto = __intVal(protocolNumber);
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3865
    }
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3866
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3867
    /*
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3868
     * get address and protocol-family
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3869
     */
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3870
    dom = __intVal(domainCode);
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3871
    typ = __intVal(typeCode);
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3872
3843
fbced69597a7 oops - error check was disabled
Claus Gittinger <cg@exept.de>
parents: 3742
diff changeset
  3873
# ifdef __win32__
3123
55ef9ca4f09f class: Socket
Stefan Vogel <sv@exept.de>
parents: 3077
diff changeset
  3874
    sock = WSASocket(dom, typ, proto, 0, 0, noInheritFlag);
55ef9ca4f09f class: Socket
Stefan Vogel <sv@exept.de>
parents: 3077
diff changeset
  3875
    if (sock == INVALID_SOCKET && noInheritFlag) {
4414
42edc97b2323 bcopy -> memcpy
Claus Gittinger <cg@exept.de>
parents: 4341
diff changeset
  3876
	// tried to open socket with WSA_FLAG_NO_HANDLE_INHERIT
42edc97b2323 bcopy -> memcpy
Claus Gittinger <cg@exept.de>
parents: 4341
diff changeset
  3877
	// This fails on older windows versions, e.g. Windows XP
42edc97b2323 bcopy -> memcpy
Claus Gittinger <cg@exept.de>
parents: 4341
diff changeset
  3878
	sock = WSASocket(dom, typ, proto, 0, 0, 0);
42edc97b2323 bcopy -> memcpy
Claus Gittinger <cg@exept.de>
parents: 4341
diff changeset
  3879
	if (sock != INVALID_SOCKET) {
42edc97b2323 bcopy -> memcpy
Claus Gittinger <cg@exept.de>
parents: 4341
diff changeset
  3880
	    // no error without WSA_FLAG_NO_HANDLE_INHERIT,
42edc97b2323 bcopy -> memcpy
Claus Gittinger <cg@exept.de>
parents: 4341
diff changeset
  3881
	    // never use this flag again!
42edc97b2323 bcopy -> memcpy
Claus Gittinger <cg@exept.de>
parents: 4341
diff changeset
  3882
	    noInheritFlag = 0;
42edc97b2323 bcopy -> memcpy
Claus Gittinger <cg@exept.de>
parents: 4341
diff changeset
  3883
	}
3123
55ef9ca4f09f class: Socket
Stefan Vogel <sv@exept.de>
parents: 3077
diff changeset
  3884
    }
55ef9ca4f09f class: Socket
Stefan Vogel <sv@exept.de>
parents: 3077
diff changeset
  3885
    if (sock == INVALID_SOCKET) {
4414
42edc97b2323 bcopy -> memcpy
Claus Gittinger <cg@exept.de>
parents: 4341
diff changeset
  3886
	errno = WSAGetLastError();
3123
55ef9ca4f09f class: Socket
Stefan Vogel <sv@exept.de>
parents: 3077
diff changeset
  3887
3843
fbced69597a7 oops - error check was disabled
Claus Gittinger <cg@exept.de>
parents: 3742
diff changeset
  3888
# else  // !__win32__
3123
55ef9ca4f09f class: Socket
Stefan Vogel <sv@exept.de>
parents: 3077
diff changeset
  3889
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3890
    sock = socket(dom, typ, proto);
3123
55ef9ca4f09f class: Socket
Stefan Vogel <sv@exept.de>
parents: 3077
diff changeset
  3891
# if defined(EPROTONOSUPPORT) /* for SGI */
55ef9ca4f09f class: Socket
Stefan Vogel <sv@exept.de>
parents: 3077
diff changeset
  3892
    if ((sock < 0) && (proto != 0) && (errno == EPROTONOSUPPORT)) {
4414
42edc97b2323 bcopy -> memcpy
Claus Gittinger <cg@exept.de>
parents: 4341
diff changeset
  3893
	DBGPRINTF(("SOCKET: retry with UNSPEC protocol\n"));
42edc97b2323 bcopy -> memcpy
Claus Gittinger <cg@exept.de>
parents: 4341
diff changeset
  3894
	proto = 0;
42edc97b2323 bcopy -> memcpy
Claus Gittinger <cg@exept.de>
parents: 4341
diff changeset
  3895
	sock = socket(dom, typ, 0);
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3896
    }
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3897
# endif
3123
55ef9ca4f09f class: Socket
Stefan Vogel <sv@exept.de>
parents: 3077
diff changeset
  3898
    if (sock < 0) {
3843
fbced69597a7 oops - error check was disabled
Claus Gittinger <cg@exept.de>
parents: 3742
diff changeset
  3899
# endif // !__win32__
3123
55ef9ca4f09f class: Socket
Stefan Vogel <sv@exept.de>
parents: 3077
diff changeset
  3900
4414
42edc97b2323 bcopy -> memcpy
Claus Gittinger <cg@exept.de>
parents: 4341
diff changeset
  3901
	DBGPRINTF(("SOCKET: socket(dom=%d typ=%d proto=%d) call failed errno=%d\n", dom, typ, proto, errno));
42edc97b2323 bcopy -> memcpy
Claus Gittinger <cg@exept.de>
parents: 4341
diff changeset
  3902
	error = __MKSMALLINT(errno);
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3903
    } else {
3123
55ef9ca4f09f class: Socket
Stefan Vogel <sv@exept.de>
parents: 3077
diff changeset
  3904
# if defined(SET_LINGER_WHEN_CREATING_SOCKET) && defined(SO_LINGER)
4414
42edc97b2323 bcopy -> memcpy
Claus Gittinger <cg@exept.de>
parents: 4341
diff changeset
  3905
	{
42edc97b2323 bcopy -> memcpy
Claus Gittinger <cg@exept.de>
parents: 4341
diff changeset
  3906
	    struct linger l;
42edc97b2323 bcopy -> memcpy
Claus Gittinger <cg@exept.de>
parents: 4341
diff changeset
  3907
42edc97b2323 bcopy -> memcpy
Claus Gittinger <cg@exept.de>
parents: 4341
diff changeset
  3908
	    l.l_onoff = 1;
42edc97b2323 bcopy -> memcpy
Claus Gittinger <cg@exept.de>
parents: 4341
diff changeset
  3909
	    l.l_linger = 30;
42edc97b2323 bcopy -> memcpy
Claus Gittinger <cg@exept.de>
parents: 4341
diff changeset
  3910
	    setsockopt(sock, SOL_SOCKET, SO_LINGER, &l, sizeof(l));
42edc97b2323 bcopy -> memcpy
Claus Gittinger <cg@exept.de>
parents: 4341
diff changeset
  3911
	}
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3912
# endif
3843
fbced69597a7 oops - error check was disabled
Claus Gittinger <cg@exept.de>
parents: 3742
diff changeset
  3913
# ifdef __win32__
4414
42edc97b2323 bcopy -> memcpy
Claus Gittinger <cg@exept.de>
parents: 4341
diff changeset
  3914
	/*
42edc97b2323 bcopy -> memcpy
Claus Gittinger <cg@exept.de>
parents: 4341
diff changeset
  3915
	 * make it blocking
42edc97b2323 bcopy -> memcpy
Claus Gittinger <cg@exept.de>
parents: 4341
diff changeset
  3916
	 */
42edc97b2323 bcopy -> memcpy
Claus Gittinger <cg@exept.de>
parents: 4341
diff changeset
  3917
	{
42edc97b2323 bcopy -> memcpy
Claus Gittinger <cg@exept.de>
parents: 4341
diff changeset
  3918
	    unsigned long zero = 0;
42edc97b2323 bcopy -> memcpy
Claus Gittinger <cg@exept.de>
parents: 4341
diff changeset
  3919
	    ioctlsocket(sock, FIONBIO, &zero);
42edc97b2323 bcopy -> memcpy
Claus Gittinger <cg@exept.de>
parents: 4341
diff changeset
  3920
	}
42edc97b2323 bcopy -> memcpy
Claus Gittinger <cg@exept.de>
parents: 4341
diff changeset
  3921
	{
3246
c75a006f9a7a Win32 sockets use handles instead of file pointers
Stefan Vogel <sv@exept.de>
parents: 3224
diff changeset
  3922
#  if 0 && (defined( __BORLANDC__ ) || defined( __MINGW__ ))
4414
42edc97b2323 bcopy -> memcpy
Claus Gittinger <cg@exept.de>
parents: 4341
diff changeset
  3923
	    /*
42edc97b2323 bcopy -> memcpy
Claus Gittinger <cg@exept.de>
parents: 4341
diff changeset
  3924
	     * make it a FILE *
42edc97b2323 bcopy -> memcpy
Claus Gittinger <cg@exept.de>
parents: 4341
diff changeset
  3925
	     */
42edc97b2323 bcopy -> memcpy
Claus Gittinger <cg@exept.de>
parents: 4341
diff changeset
  3926
	    __stxWrapApiEnterCritical();
42edc97b2323 bcopy -> memcpy
Claus Gittinger <cg@exept.de>
parents: 4341
diff changeset
  3927
	    _fd = _open_osfhandle((long)sock, 0);
42edc97b2323 bcopy -> memcpy
Claus Gittinger <cg@exept.de>
parents: 4341
diff changeset
  3928
	    __stxWrapApiLeaveCritical();
2773
ab3049f4a351 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2748
diff changeset
  3929
#  else
4414
42edc97b2323 bcopy -> memcpy
Claus Gittinger <cg@exept.de>
parents: 4341
diff changeset
  3930
	    _fd = (int)sock;
2773
ab3049f4a351 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2748
diff changeset
  3931
#  endif
4414
42edc97b2323 bcopy -> memcpy
Claus Gittinger <cg@exept.de>
parents: 4341
diff changeset
  3932
	    DBGPRINTF(("SOCKET: sock=%d fd=%d\n", sock, _fd));
42edc97b2323 bcopy -> memcpy
Claus Gittinger <cg@exept.de>
parents: 4341
diff changeset
  3933
	}
3843
fbced69597a7 oops - error check was disabled
Claus Gittinger <cg@exept.de>
parents: 3742
diff changeset
  3934
# else  // !__win32__
4414
42edc97b2323 bcopy -> memcpy
Claus Gittinger <cg@exept.de>
parents: 4341
diff changeset
  3935
	fp = fdopen(sock, "r+");
42edc97b2323 bcopy -> memcpy
Claus Gittinger <cg@exept.de>
parents: 4341
diff changeset
  3936
	if (! fp) {
42edc97b2323 bcopy -> memcpy
Claus Gittinger <cg@exept.de>
parents: 4341
diff changeset
  3937
	    DBGPRINTF(("SOCKET: fdopen call failed\n"));
42edc97b2323 bcopy -> memcpy
Claus Gittinger <cg@exept.de>
parents: 4341
diff changeset
  3938
	    error = __MKSMALLINT(errno);
42edc97b2323 bcopy -> memcpy
Claus Gittinger <cg@exept.de>
parents: 4341
diff changeset
  3939
	    __BEGIN_INTERRUPTABLE__
42edc97b2323 bcopy -> memcpy
Claus Gittinger <cg@exept.de>
parents: 4341
diff changeset
  3940
	    closesocket(sock);
42edc97b2323 bcopy -> memcpy
Claus Gittinger <cg@exept.de>
parents: 4341
diff changeset
  3941
	    DBGFPRINTF((stderr, "SOCKET: fdopen failed (%d)\n", sock));
42edc97b2323 bcopy -> memcpy
Claus Gittinger <cg@exept.de>
parents: 4341
diff changeset
  3942
	    __END_INTERRUPTABLE__
42edc97b2323 bcopy -> memcpy
Claus Gittinger <cg@exept.de>
parents: 4341
diff changeset
  3943
	    goto out;
42edc97b2323 bcopy -> memcpy
Claus Gittinger <cg@exept.de>
parents: 4341
diff changeset
  3944
	}
3843
fbced69597a7 oops - error check was disabled
Claus Gittinger <cg@exept.de>
parents: 3742
diff changeset
  3945
# endif // !__win32__
3246
c75a006f9a7a Win32 sockets use handles instead of file pointers
Stefan Vogel <sv@exept.de>
parents: 3224
diff changeset
  3946
4414
42edc97b2323 bcopy -> memcpy
Claus Gittinger <cg@exept.de>
parents: 4341
diff changeset
  3947
	if (@global(FileOpenTrace) == true) {
3843
fbced69597a7 oops - error check was disabled
Claus Gittinger <cg@exept.de>
parents: 3742
diff changeset
  3948
# ifdef __win32__
4414
42edc97b2323 bcopy -> memcpy
Claus Gittinger <cg@exept.de>
parents: 4341
diff changeset
  3949
	    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
  3950
# else
4414
42edc97b2323 bcopy -> memcpy
Claus Gittinger <cg@exept.de>
parents: 4341
diff changeset
  3951
	    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
  3952
# endif
4414
42edc97b2323 bcopy -> memcpy
Claus Gittinger <cg@exept.de>
parents: 4341
diff changeset
  3953
	}
3246
c75a006f9a7a Win32 sockets use handles instead of file pointers
Stefan Vogel <sv@exept.de>
parents: 3224
diff changeset
  3954
3843
fbced69597a7 oops - error check was disabled
Claus Gittinger <cg@exept.de>
parents: 3742
diff changeset
  3955
# ifdef __win32__
4414
42edc97b2323 bcopy -> memcpy
Claus Gittinger <cg@exept.de>
parents: 4341
diff changeset
  3956
	__externalAddressVal(newHandle) = _fd;
42edc97b2323 bcopy -> memcpy
Claus Gittinger <cg@exept.de>
parents: 4341
diff changeset
  3957
	__INST(handleType) = @symbol(socketHandle);
3246
c75a006f9a7a Win32 sockets use handles instead of file pointers
Stefan Vogel <sv@exept.de>
parents: 3224
diff changeset
  3958
# else
4414
42edc97b2323 bcopy -> memcpy
Claus Gittinger <cg@exept.de>
parents: 4341
diff changeset
  3959
	__externalAddressVal(newHandle) = fp;
42edc97b2323 bcopy -> memcpy
Claus Gittinger <cg@exept.de>
parents: 4341
diff changeset
  3960
	__INST(handleType) = @symbol(socketFilePointer);
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3961
# endif
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3962
    }
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3963
#endif
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3964
out:;
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3965
%}.
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3966
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3967
    "all ok?"
3246
c75a006f9a7a Win32 sockets use handles instead of file pointers
Stefan Vogel <sv@exept.de>
parents: 3224
diff changeset
  3968
    handleType notNil ifTrue:[
4414
42edc97b2323 bcopy -> memcpy
Claus Gittinger <cg@exept.de>
parents: 4341
diff changeset
  3969
	handle := newHandle.
42edc97b2323 bcopy -> memcpy
Claus Gittinger <cg@exept.de>
parents: 4341
diff changeset
  3970
	domain := domainArg.
42edc97b2323 bcopy -> memcpy
Claus Gittinger <cg@exept.de>
parents: 4341
diff changeset
  3971
	socketType := typeArg.
42edc97b2323 bcopy -> memcpy
Claus Gittinger <cg@exept.de>
parents: 4341
diff changeset
  3972
	self registerForFinalization.
42edc97b2323 bcopy -> memcpy
Claus Gittinger <cg@exept.de>
parents: 4341
diff changeset
  3973
	^ self.
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3974
    ].
3217
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  3975
    error isInteger ifTrue:[
4414
42edc97b2323 bcopy -> memcpy
Claus Gittinger <cg@exept.de>
parents: 4341
diff changeset
  3976
	lastErrorNumber := error.
42edc97b2323 bcopy -> memcpy
Claus Gittinger <cg@exept.de>
parents: 4341
diff changeset
  3977
	^ self openError:error.
3217
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  3978
    ].
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  3979
    ^ self primitiveFailed:error.
126
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
  3980
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
  3981
    "
3059
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  3982
     Socket new domain:#AF_INET type:#stream
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  3983
     Socket new domain:#AF_UNIX type:#stream
126
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
  3984
    "
28
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  3985
! !
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  3986
4736
c5a3e2dae276 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 4671
diff changeset
  3987
28
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  3988
!Socket methodsFor:'specials'!
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  3989
3467
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
  3990
linger:anIntegerOrNil
3224
bad706c50347 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3223
diff changeset
  3991
    "set the linger behavior on close:
bad706c50347 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3223
diff changeset
  3992
      anIntegerOrNil == nil: close returns immediately, socket tries
4414
42edc97b2323 bcopy -> memcpy
Claus Gittinger <cg@exept.de>
parents: 4341
diff changeset
  3993
			     to send buffered data in background.
3224
bad706c50347 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3223
diff changeset
  3994
      anIntegerOrNil == 0:   close returns immediately, bufferd data is discarded.
bad706c50347 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3223
diff changeset
  3995
      anIntegerOrNil > 0:    close waits this many seconds for buffered data
4414
42edc97b2323 bcopy -> memcpy
Claus Gittinger <cg@exept.de>
parents: 4341
diff changeset
  3996
			     to be delivered, after this time buffered data is
42edc97b2323 bcopy -> memcpy
Claus Gittinger <cg@exept.de>
parents: 4341
diff changeset
  3997
			     discarded and close returns with an error"
3467
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
  3998
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
  3999
    ^ self
4414
42edc97b2323 bcopy -> memcpy
Claus Gittinger <cg@exept.de>
parents: 4341
diff changeset
  4000
	setSocketOption:#'SO_LINGER'
42edc97b2323 bcopy -> memcpy
Claus Gittinger <cg@exept.de>
parents: 4341
diff changeset
  4001
	argument:anIntegerOrNil notNil
42edc97b2323 bcopy -> memcpy
Claus Gittinger <cg@exept.de>
parents: 4341
diff changeset
  4002
	argument:anIntegerOrNil.
3224
bad706c50347 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3223
diff changeset
  4003
!
bad706c50347 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3223
diff changeset
  4004
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  4005
receiveBufferSize
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  4006
    "get the send buffer size - for special applications only.
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  4007
     Not all operatingSystems offer this functionality
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  4008
     (returns nil, if unsupported)"
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  4009
2321
6f4cc7b644db filePointer -> handle migration
Claus Gittinger <cg@exept.de>
parents: 2308
diff changeset
  4010
    handle isNil ifTrue:[
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  4011
	^ self errorNotOpen
1335
0fafb78d7a80 sockopt utilities added
Claus Gittinger <cg@exept.de>
parents: 1316
diff changeset
  4012
    ].
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  4013
%{
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  4014
#if defined(SO_RCVBUF) && defined(SOL_SOCKET)
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  4015
    {
2321
6f4cc7b644db filePointer -> handle migration
Claus Gittinger <cg@exept.de>
parents: 2308
diff changeset
  4016
	OBJ fp = __INST(handle);
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  4017
	SOCKET sock;
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  4018
	int opt;
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  4019
	unsigned int size;
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  4020
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  4021
	sock = SOCKET_FROM_FILE_OBJECT(fp);
1568
3bca500e0c7a send and receiveTimeout fixed
Claus Gittinger <cg@exept.de>
parents: 1561
diff changeset
  4022
	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
  4023
	    RETURN( __MKSMALLINT(opt) );
3bca500e0c7a send and receiveTimeout fixed
Claus Gittinger <cg@exept.de>
parents: 1561
diff changeset
  4024
	}
1335
0fafb78d7a80 sockopt utilities added
Claus Gittinger <cg@exept.de>
parents: 1316
diff changeset
  4025
    }
0fafb78d7a80 sockopt utilities added
Claus Gittinger <cg@exept.de>
parents: 1316
diff changeset
  4026
#endif
0fafb78d7a80 sockopt utilities added
Claus Gittinger <cg@exept.de>
parents: 1316
diff changeset
  4027
%}.
0fafb78d7a80 sockopt utilities added
Claus Gittinger <cg@exept.de>
parents: 1316
diff changeset
  4028
    ^ nil
0fafb78d7a80 sockopt utilities added
Claus Gittinger <cg@exept.de>
parents: 1316
diff changeset
  4029
!
0fafb78d7a80 sockopt utilities added
Claus Gittinger <cg@exept.de>
parents: 1316
diff changeset
  4030
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  4031
receiveBufferSize:size
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  4032
    "set the receive buffer size - for special applications only.
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  4033
     Not all operatingSystems offer this functionality
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  4034
     (returns false, if unsupported)"
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  4035
2321
6f4cc7b644db filePointer -> handle migration
Claus Gittinger <cg@exept.de>
parents: 2308
diff changeset
  4036
    handle isNil ifTrue:[
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  4037
	^ self errorNotOpen
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  4038
    ].
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  4039
%{
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  4040
#if defined(SO_RCVBUF) && defined(SOL_SOCKET)
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  4041
    if (__isSmallInteger(size)) {
2321
6f4cc7b644db filePointer -> handle migration
Claus Gittinger <cg@exept.de>
parents: 2308
diff changeset
  4042
	OBJ fp = __INST(handle);
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  4043
	SOCKET sock;
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  4044
	int opt;
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  4045
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  4046
	sock = SOCKET_FROM_FILE_OBJECT(fp);
1343
cc3bed115c0a definitions cleanup with stxOSDefs.h
penk
parents: 1342
diff changeset
  4047
	opt = __intVal(size);
1529
911273d090c1 Re-unified Win32 and Unix code into single Socket.st.
Claus Gittinger <cg@exept.de>
parents: 1505
diff changeset
  4048
	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
  4049
	    RETURN(true);
911273d090c1 Re-unified Win32 and Unix code into single Socket.st.
Claus Gittinger <cg@exept.de>
parents: 1505
diff changeset
  4050
	}
1335
0fafb78d7a80 sockopt utilities added
Claus Gittinger <cg@exept.de>
parents: 1316
diff changeset
  4051
    }
0fafb78d7a80 sockopt utilities added
Claus Gittinger <cg@exept.de>
parents: 1316
diff changeset
  4052
#endif
0fafb78d7a80 sockopt utilities added
Claus Gittinger <cg@exept.de>
parents: 1316
diff changeset
  4053
%}.
0fafb78d7a80 sockopt utilities added
Claus Gittinger <cg@exept.de>
parents: 1316
diff changeset
  4054
    ^ false
0fafb78d7a80 sockopt utilities added
Claus Gittinger <cg@exept.de>
parents: 1316
diff changeset
  4055
!
0fafb78d7a80 sockopt utilities added
Claus Gittinger <cg@exept.de>
parents: 1316
diff changeset
  4056
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  4057
receiveTimeout
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  4058
    "get the receive timeout in millis - for special applications only.
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  4059
     Not all operatingSystems offer this functionality
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  4060
     (returns nil, if unsupported)"
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  4061
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  4062
    |millis|
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  4063
2321
6f4cc7b644db filePointer -> handle migration
Claus Gittinger <cg@exept.de>
parents: 2308
diff changeset
  4064
    handle isNil ifTrue:[
4570
39e965ca8d06 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4568
diff changeset
  4065
        ^ self errorNotOpen
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  4066
    ].
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  4067
%{
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  4068
#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
  4069
    OBJ fp = __INST(handle);
c75a006f9a7a Win32 sockets use handles instead of file pointers
Stefan Vogel <sv@exept.de>
parents: 3224
diff changeset
  4070
    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
  4071
    int len;
c75a006f9a7a Win32 sockets use handles instead of file pointers
Stefan Vogel <sv@exept.de>
parents: 3224
diff changeset
  4072
    int __millis;
c75a006f9a7a Win32 sockets use handles instead of file pointers
Stefan Vogel <sv@exept.de>
parents: 3224
diff changeset
  4073
    struct timeval tv = {0, 0};
c75a006f9a7a Win32 sockets use handles instead of file pointers
Stefan Vogel <sv@exept.de>
parents: 3224
diff changeset
  4074
c75a006f9a7a Win32 sockets use handles instead of file pointers
Stefan Vogel <sv@exept.de>
parents: 3224
diff changeset
  4075
    len = sizeof(struct timeval);
c75a006f9a7a Win32 sockets use handles instead of file pointers
Stefan Vogel <sv@exept.de>
parents: 3224
diff changeset
  4076
    if (getsockopt(sock, SOL_SOCKET, SO_RCVTIMEO, (void *)&tv, &len) == 0) {
4570
39e965ca8d06 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4568
diff changeset
  4077
        __millis = (tv.tv_sec * 1000) + (tv.tv_usec / 1000);
39e965ca8d06 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4568
diff changeset
  4078
        millis = __mkSmallInteger(__millis);
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  4079
# if 0
4570
39e965ca8d06 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4568
diff changeset
  4080
        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
  4081
# endif
3246
c75a006f9a7a Win32 sockets use handles instead of file pointers
Stefan Vogel <sv@exept.de>
parents: 3224
diff changeset
  4082
    } else {
4570
39e965ca8d06 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4568
diff changeset
  4083
        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
  4084
    }
3bca500e0c7a send and receiveTimeout fixed
Claus Gittinger <cg@exept.de>
parents: 1561
diff changeset
  4085
#endif
3bca500e0c7a send and receiveTimeout fixed
Claus Gittinger <cg@exept.de>
parents: 1561
diff changeset
  4086
%}.
4570
39e965ca8d06 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4568
diff changeset
  4087
    ^ millis
39e965ca8d06 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4568
diff changeset
  4088
39e965ca8d06 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4568
diff changeset
  4089
    "
39e965ca8d06 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4568
diff changeset
  4090
        Socket newTCP receiveTimeout
39e965ca8d06 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4568
diff changeset
  4091
    "
39e965ca8d06 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4568
diff changeset
  4092
39e965ca8d06 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4568
diff changeset
  4093
    "Modified: / 19-01-2018 / 19:15:17 / stefan"
1568
3bca500e0c7a send and receiveTimeout fixed
Claus Gittinger <cg@exept.de>
parents: 1561
diff changeset
  4094
!
3bca500e0c7a send and receiveTimeout fixed
Claus Gittinger <cg@exept.de>
parents: 1561
diff changeset
  4095
4570
39e965ca8d06 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4568
diff changeset
  4096
receiveTimeout:secondsOrTimeDuration
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  4097
    "set the receive timeout - for special applications only.
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  4098
     Not all operatingSystems offer this functionality
4570
39e965ca8d06 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4568
diff changeset
  4099
     (returns false, if unsupported).
39e965ca8d06 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4568
diff changeset
  4100
39e965ca8d06 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4568
diff changeset
  4101
     From linux manpage:
39e965ca8d06 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4568
diff changeset
  4102
          SO_RCVTIMEO and SO_SNDTIMEO
39e965ca8d06 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4568
diff changeset
  4103
              Specify  the  receiving  or  sending  timeouts  until reporting an error.  The argument is a
39e965ca8d06 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4568
diff changeset
  4104
              struct timeval.  If an input or output function blocks for this period of time, and data has
39e965ca8d06 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4568
diff changeset
  4105
              been  sent  or received, the return value of that function will be the amount of data trans-
39e965ca8d06 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4568
diff changeset
  4106
              ferred; if no data has been transferred and  the  timeout  has  been  reached,  then  -1  is
39e965ca8d06 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4568
diff changeset
  4107
              returned with errno set to EAGAIN or EWOULDBLOCK, or EINPROGRESS (for connect(2)) just as if
39e965ca8d06 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4568
diff changeset
  4108
              the socket was specified to be nonblocking.  If the timeout is set to  zero  (the  default),
39e965ca8d06 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4568
diff changeset
  4109
              then the operation will never timeout.  Timeouts only have effect for system calls that per-
39e965ca8d06 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4568
diff changeset
  4110
              form socket I/O (e.g., read(2), recvmsg(2), send(2), sendmsg(2)); timeouts  have  no  effect
39e965ca8d06 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4568
diff changeset
  4111
              for select(2), poll(2), epoll_wait(2), and so on."
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  4112
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  4113
    |millis|
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  4114
2321
6f4cc7b644db filePointer -> handle migration
Claus Gittinger <cg@exept.de>
parents: 2308
diff changeset
  4115
    handle isNil ifTrue:[
4570
39e965ca8d06 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4568
diff changeset
  4116
        ^ self errorNotOpen
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  4117
    ].
4570
39e965ca8d06 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4568
diff changeset
  4118
    secondsOrTimeDuration isTimeDuration ifTrue:[
39e965ca8d06 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4568
diff changeset
  4119
        millis := secondsOrTimeDuration getMilliseconds.
39e965ca8d06 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4568
diff changeset
  4120
    ] ifFalse:[
39e965ca8d06 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4568
diff changeset
  4121
        millis := (secondsOrTimeDuration * 1000) rounded.
39e965ca8d06 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4568
diff changeset
  4122
    ].
39e965ca8d06 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4568
diff changeset
  4123
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  4124
%{
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  4125
#if defined(SO_RCVTIMEO) && defined(SOL_SOCKET)
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  4126
    if (__isSmallInteger(millis)) {
4570
39e965ca8d06 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4568
diff changeset
  4127
        OBJ fp = __INST(handle);
39e965ca8d06 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4568
diff changeset
  4128
        SOCKET sock = SOCKET_FROM_FILE_OBJECT(fp);
39e965ca8d06 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4568
diff changeset
  4129
        int __millis = __intVal(millis);
39e965ca8d06 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4568
diff changeset
  4130
        struct timeval tv = {0, 0};
39e965ca8d06 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4568
diff changeset
  4131
39e965ca8d06 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4568
diff changeset
  4132
        tv.tv_sec = __millis / 1000;
39e965ca8d06 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4568
diff changeset
  4133
        tv.tv_usec = (__millis % 1000) * 1000;
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  4134
# if 0
4570
39e965ca8d06 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4568
diff changeset
  4135
        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
  4136
# endif
4570
39e965ca8d06 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4568
diff changeset
  4137
        if (setsockopt(sock, SOL_SOCKET, SO_RCVTIMEO, (void *)&tv, sizeof(struct timeval)) == 0) {
39e965ca8d06 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4568
diff changeset
  4138
            RETURN(true);
39e965ca8d06 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4568
diff changeset
  4139
        }
39e965ca8d06 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4568
diff changeset
  4140
        console_fprintf(stderr, "Socket [warning]: setsockopt %d failed; errno=%d\n", sock, errno);
28
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  4141
    }
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  4142
#endif
71
claus
parents: 63
diff changeset
  4143
%}.
28
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  4144
    ^ false
4570
39e965ca8d06 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4568
diff changeset
  4145
39e965ca8d06 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4568
diff changeset
  4146
    "
39e965ca8d06 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4568
diff changeset
  4147
        Socket newTCP 
39e965ca8d06 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4568
diff changeset
  4148
            receiveTimeout:5s;
39e965ca8d06 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4568
diff changeset
  4149
            receiveTimeout
39e965ca8d06 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4568
diff changeset
  4150
    "
39e965ca8d06 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4568
diff changeset
  4151
39e965ca8d06 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4568
diff changeset
  4152
    "Modified (comment): / 19-01-2018 / 19:14:49 / stefan"
81
claus
parents: 79
diff changeset
  4153
!
claus
parents: 79
diff changeset
  4154
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  4155
sendBufferSize
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  4156
    "get the send buffer size - for special applications only.
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  4157
     Not all operatingSystems offer this functionality
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  4158
     (returns nil, if unsupported)"
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  4159
2321
6f4cc7b644db filePointer -> handle migration
Claus Gittinger <cg@exept.de>
parents: 2308
diff changeset
  4160
    handle isNil ifTrue:[
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  4161
	^ self errorNotOpen
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  4162
    ].
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  4163
%{
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  4164
#if defined(SO_SNDBUF) && defined(SOL_SOCKET)
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  4165
    {
2321
6f4cc7b644db filePointer -> handle migration
Claus Gittinger <cg@exept.de>
parents: 2308
diff changeset
  4166
	OBJ fp = __INST(handle);
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  4167
	SOCKET sock;
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  4168
	int opt;
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  4169
	unsigned int size;
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  4170
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  4171
	sock = SOCKET_FROM_FILE_OBJECT(fp);
1568
3bca500e0c7a send and receiveTimeout fixed
Claus Gittinger <cg@exept.de>
parents: 1561
diff changeset
  4172
	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
  4173
	    RETURN( __MKSMALLINT(opt) );
3bca500e0c7a send and receiveTimeout fixed
Claus Gittinger <cg@exept.de>
parents: 1561
diff changeset
  4174
	}
1335
0fafb78d7a80 sockopt utilities added
Claus Gittinger <cg@exept.de>
parents: 1316
diff changeset
  4175
    }
0fafb78d7a80 sockopt utilities added
Claus Gittinger <cg@exept.de>
parents: 1316
diff changeset
  4176
#endif
0fafb78d7a80 sockopt utilities added
Claus Gittinger <cg@exept.de>
parents: 1316
diff changeset
  4177
%}.
0fafb78d7a80 sockopt utilities added
Claus Gittinger <cg@exept.de>
parents: 1316
diff changeset
  4178
    ^ nil
0fafb78d7a80 sockopt utilities added
Claus Gittinger <cg@exept.de>
parents: 1316
diff changeset
  4179
!
0fafb78d7a80 sockopt utilities added
Claus Gittinger <cg@exept.de>
parents: 1316
diff changeset
  4180
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  4181
sendBufferSize:size
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  4182
    "set the send buffer size - for special applications only.
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  4183
     Not all operatingSystems offer this functionality
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  4184
     (returns false, if unsupported)"
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  4185
2321
6f4cc7b644db filePointer -> handle migration
Claus Gittinger <cg@exept.de>
parents: 2308
diff changeset
  4186
    handle isNil ifTrue:[
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  4187
	^ self errorNotOpen
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  4188
    ].
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  4189
%{
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  4190
#if defined(SO_SNDBUF) && defined(SOL_SOCKET)
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  4191
    if (__isSmallInteger(size)) {
2321
6f4cc7b644db filePointer -> handle migration
Claus Gittinger <cg@exept.de>
parents: 2308
diff changeset
  4192
	OBJ fp = __INST(handle);
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  4193
	SOCKET sock;
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  4194
	int opt;
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  4195
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  4196
	sock = SOCKET_FROM_FILE_OBJECT(fp);
1343
cc3bed115c0a definitions cleanup with stxOSDefs.h
penk
parents: 1342
diff changeset
  4197
	opt = __intVal(size);
1529
911273d090c1 Re-unified Win32 and Unix code into single Socket.st.
Claus Gittinger <cg@exept.de>
parents: 1505
diff changeset
  4198
	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
  4199
	    RETURN(true);
911273d090c1 Re-unified Win32 and Unix code into single Socket.st.
Claus Gittinger <cg@exept.de>
parents: 1505
diff changeset
  4200
	}
1335
0fafb78d7a80 sockopt utilities added
Claus Gittinger <cg@exept.de>
parents: 1316
diff changeset
  4201
    }
0fafb78d7a80 sockopt utilities added
Claus Gittinger <cg@exept.de>
parents: 1316
diff changeset
  4202
#endif
0fafb78d7a80 sockopt utilities added
Claus Gittinger <cg@exept.de>
parents: 1316
diff changeset
  4203
%}.
0fafb78d7a80 sockopt utilities added
Claus Gittinger <cg@exept.de>
parents: 1316
diff changeset
  4204
    ^ false
0fafb78d7a80 sockopt utilities added
Claus Gittinger <cg@exept.de>
parents: 1316
diff changeset
  4205
!
0fafb78d7a80 sockopt utilities added
Claus Gittinger <cg@exept.de>
parents: 1316
diff changeset
  4206
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  4207
sendTimeout
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  4208
    "get the send timeout in millis - for special applications only.
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  4209
     Not all operatingSystems offer this functionality
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  4210
     (returns nil, if unsupported)"
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  4211
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  4212
    |millis|
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  4213
2321
6f4cc7b644db filePointer -> handle migration
Claus Gittinger <cg@exept.de>
parents: 2308
diff changeset
  4214
    handle isNil ifTrue:[
4570
39e965ca8d06 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4568
diff changeset
  4215
        ^ self errorNotOpen
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  4216
    ].
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  4217
%{
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  4218
#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
  4219
    OBJ fp = __INST(handle);
c75a006f9a7a Win32 sockets use handles instead of file pointers
Stefan Vogel <sv@exept.de>
parents: 3224
diff changeset
  4220
    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
  4221
    int len;
c75a006f9a7a Win32 sockets use handles instead of file pointers
Stefan Vogel <sv@exept.de>
parents: 3224
diff changeset
  4222
    int __millis;
c75a006f9a7a Win32 sockets use handles instead of file pointers
Stefan Vogel <sv@exept.de>
parents: 3224
diff changeset
  4223
    struct timeval tv = {0, 0};
c75a006f9a7a Win32 sockets use handles instead of file pointers
Stefan Vogel <sv@exept.de>
parents: 3224
diff changeset
  4224
c75a006f9a7a Win32 sockets use handles instead of file pointers
Stefan Vogel <sv@exept.de>
parents: 3224
diff changeset
  4225
    len = sizeof(struct timeval);
c75a006f9a7a Win32 sockets use handles instead of file pointers
Stefan Vogel <sv@exept.de>
parents: 3224
diff changeset
  4226
    if (getsockopt(sock, SOL_SOCKET, SO_SNDTIMEO, (void *)&tv, &len) == 0) {
4570
39e965ca8d06 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4568
diff changeset
  4227
        __millis = (tv.tv_sec * 1000) + (tv.tv_usec / 1000);
39e965ca8d06 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4568
diff changeset
  4228
        millis = __mkSmallInteger(__millis);
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  4229
# if 0
4570
39e965ca8d06 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4568
diff changeset
  4230
        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
  4231
# endif
3246
c75a006f9a7a Win32 sockets use handles instead of file pointers
Stefan Vogel <sv@exept.de>
parents: 3224
diff changeset
  4232
    } else {
4570
39e965ca8d06 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4568
diff changeset
  4233
        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
  4234
    }
3bca500e0c7a send and receiveTimeout fixed
Claus Gittinger <cg@exept.de>
parents: 1561
diff changeset
  4235
#endif
3bca500e0c7a send and receiveTimeout fixed
Claus Gittinger <cg@exept.de>
parents: 1561
diff changeset
  4236
%}.
4570
39e965ca8d06 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4568
diff changeset
  4237
    ^ millis
39e965ca8d06 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4568
diff changeset
  4238
39e965ca8d06 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4568
diff changeset
  4239
    "
39e965ca8d06 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4568
diff changeset
  4240
        Socket newTCP sendTimeout
39e965ca8d06 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4568
diff changeset
  4241
    "
39e965ca8d06 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4568
diff changeset
  4242
39e965ca8d06 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4568
diff changeset
  4243
    "Modified (comment): / 19-01-2018 / 19:16:23 / stefan"
1568
3bca500e0c7a send and receiveTimeout fixed
Claus Gittinger <cg@exept.de>
parents: 1561
diff changeset
  4244
!
3bca500e0c7a send and receiveTimeout fixed
Claus Gittinger <cg@exept.de>
parents: 1561
diff changeset
  4245
4570
39e965ca8d06 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4568
diff changeset
  4246
sendTimeout:secondsOrTimeDuration
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  4247
    "set the send timeout - for special applications only.
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  4248
     Not all operatingSystems offer this functionality
4570
39e965ca8d06 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4568
diff changeset
  4249
     (returns false, if unsupported).
39e965ca8d06 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4568
diff changeset
  4250
     From linux manpage:
39e965ca8d06 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4568
diff changeset
  4251
          SO_RCVTIMEO and SO_SNDTIMEO
39e965ca8d06 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4568
diff changeset
  4252
              Specify  the  receiving  or  sending  timeouts  until reporting an error.  The argument is a
39e965ca8d06 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4568
diff changeset
  4253
              struct timeval.  If an input or output function blocks for this period of time, and data has
39e965ca8d06 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4568
diff changeset
  4254
              been  sent  or received, the return value of that function will be the amount of data trans-
39e965ca8d06 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4568
diff changeset
  4255
              ferred; if no data has been transferred and  the  timeout  has  been  reached,  then  -1  is
39e965ca8d06 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4568
diff changeset
  4256
              returned with errno set to EAGAIN or EWOULDBLOCK, or EINPROGRESS (for connect(2)) just as if
39e965ca8d06 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4568
diff changeset
  4257
              the socket was specified to be nonblocking.  If the timeout is set to  zero  (the  default),
39e965ca8d06 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4568
diff changeset
  4258
              then the operation will never timeout.  Timeouts only have effect for system calls that per-
39e965ca8d06 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4568
diff changeset
  4259
              form socket I/O (e.g., read(2), recvmsg(2), send(2), sendmsg(2)); timeouts  have  no  effect
39e965ca8d06 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4568
diff changeset
  4260
              for select(2), poll(2), epoll_wait(2), and so on."
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  4261
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  4262
    |millis|
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  4263
2321
6f4cc7b644db filePointer -> handle migration
Claus Gittinger <cg@exept.de>
parents: 2308
diff changeset
  4264
    handle isNil ifTrue:[
4570
39e965ca8d06 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4568
diff changeset
  4265
        ^ self errorNotOpen
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  4266
    ].
4570
39e965ca8d06 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4568
diff changeset
  4267
    secondsOrTimeDuration isTimeDuration ifTrue:[
39e965ca8d06 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4568
diff changeset
  4268
        millis := secondsOrTimeDuration getMilliseconds.
39e965ca8d06 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4568
diff changeset
  4269
    ] ifFalse:[
39e965ca8d06 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4568
diff changeset
  4270
        millis := (secondsOrTimeDuration * 1000) rounded.
39e965ca8d06 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4568
diff changeset
  4271
    ].
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  4272
%{
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  4273
#if defined(SO_SNDTIMEO) && defined(SOL_SOCKET)
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  4274
    if (__isSmallInteger(millis)) {
4570
39e965ca8d06 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4568
diff changeset
  4275
        OBJ fp = __INST(handle);
39e965ca8d06 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4568
diff changeset
  4276
        SOCKET sock = SOCKET_FROM_FILE_OBJECT(fp);
39e965ca8d06 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4568
diff changeset
  4277
        int __millis = __intVal(millis);
39e965ca8d06 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4568
diff changeset
  4278
        struct timeval tv = {0, 0};
39e965ca8d06 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4568
diff changeset
  4279
39e965ca8d06 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4568
diff changeset
  4280
        tv.tv_sec = __millis / 1000;
39e965ca8d06 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4568
diff changeset
  4281
        tv.tv_usec = (__millis % 1000) * 1000;
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  4282
# if 0
4570
39e965ca8d06 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4568
diff changeset
  4283
        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
  4284
# endif
4570
39e965ca8d06 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4568
diff changeset
  4285
        if (setsockopt(sock, SOL_SOCKET, SO_SNDTIMEO, (void *)&tv, sizeof(struct timeval)) == 0) {
39e965ca8d06 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4568
diff changeset
  4286
            RETURN(true);
39e965ca8d06 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4568
diff changeset
  4287
        }
39e965ca8d06 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4568
diff changeset
  4288
        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
  4289
    }
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
  4290
#endif
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
  4291
%}.
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
  4292
    ^ false
4570
39e965ca8d06 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4568
diff changeset
  4293
39e965ca8d06 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4568
diff changeset
  4294
    "
39e965ca8d06 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4568
diff changeset
  4295
        Socket newTCP 
39e965ca8d06 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4568
diff changeset
  4296
            sendTimeout:5s;
39e965ca8d06 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4568
diff changeset
  4297
            sendTimeout
39e965ca8d06 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4568
diff changeset
  4298
    "
39e965ca8d06 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4568
diff changeset
  4299
39e965ca8d06 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4568
diff changeset
  4300
    "Modified (comment): / 19-01-2018 / 19:12:51 / stefan"
1340
eb9b1f1340e5 setTCP_NODELAY
Claus Gittinger <cg@exept.de>
parents: 1339
diff changeset
  4301
!
eb9b1f1340e5 setTCP_NODELAY
Claus Gittinger <cg@exept.de>
parents: 1339
diff changeset
  4302
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  4303
setTCPCork:aBoolean
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  4304
    "enable/disable TCP_CORK (do-not-send-partial-frames)
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  4305
     For special applications only.
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  4306
     Not all OperatingSystems offer this functionality
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  4307
     (returns false, if unsupported)"
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  4308
2551
6da1bc89b74a changed:
Stefan Vogel <sv@exept.de>
parents: 2516
diff changeset
  4309
    ^ self setSocketOption:#'TCP_CORK' argument:aBoolean argument:nil.
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  4310
!
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  4311
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  4312
setTCPNoDelay:aBoolean
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  4313
    "enable/disable TCP_NODELAY (i.e. disable/enable the Nagle algorithm)
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  4314
     For special applications only.
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  4315
     Not all OperatingSystems offer this functionality
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  4316
     (returns false, if unsupported)"
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  4317
2551
6da1bc89b74a changed:
Stefan Vogel <sv@exept.de>
parents: 2516
diff changeset
  4318
    ^ self setSocketOption:#'TCP_NODELAY' argument:aBoolean argument:nil.
126
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
  4319
! !
82
claus
parents: 81
diff changeset
  4320
4626
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  4321
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  4322
!Socket methodsFor:'waiting'!
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  4323
4570
39e965ca8d06 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4568
diff changeset
  4324
waitForNewConnectionOrDataOnAny:otherConnections timeout:secondsOrTimeDurationOrNil
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  4325
    "suspend the current process, until either a new connection comes
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  4326
     in at the receiver, or data arrives on any of the otherConnections.
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  4327
     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
  4328
     For an old connection, that socket is returned.
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  4329
     In any case, the caller gets a socket to operate on as return value,
4032
24df60dcd5f4 #OTHER by mawalch
mawalch
parents: 3989
diff changeset
  4330
     or nil, if a timeout occurred.
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  4331
     This method implements the inner wait-primitive of a multi-connection
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  4332
     server application."
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  4333
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  4334
4570
39e965ca8d06 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4568
diff changeset
  4335
    |wasBlocked sema  timeoutMs|
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  4336
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  4337
    "first, a quick check if data is already available"
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  4338
    self canReadWithoutBlocking ifTrue:[
4497
bf5e9d5ec532 #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 4414
diff changeset
  4339
        ^ self accept.
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  4340
    ].
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  4341
    otherConnections do:[:aConnection |
4497
bf5e9d5ec532 #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 4414
diff changeset
  4342
        aConnection canReadWithoutBlocking ifTrue:[
bf5e9d5ec532 #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 4414
diff changeset
  4343
            ^ aConnection
bf5e9d5ec532 #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 4414
diff changeset
  4344
        ]
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  4345
    ].
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  4346
3281
bd9392932db1 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3247
diff changeset
  4347
    "check again - prevent incoming interrupts from disturbing our setup"
4570
39e965ca8d06 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4568
diff changeset
  4348
39e965ca8d06 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4568
diff changeset
  4349
    secondsOrTimeDurationOrNil notNil ifTrue:[
39e965ca8d06 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4568
diff changeset
  4350
        secondsOrTimeDurationOrNil isTimeDuration ifTrue:[
39e965ca8d06 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4568
diff changeset
  4351
            timeoutMs := secondsOrTimeDurationOrNil getMilliseconds.
39e965ca8d06 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4568
diff changeset
  4352
        ] ifFalse:[
39e965ca8d06 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4568
diff changeset
  4353
            timeoutMs := secondsOrTimeDurationOrNil * 1000.
39e965ca8d06 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4568
diff changeset
  4354
        ]
39e965ca8d06 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4568
diff changeset
  4355
    ].
39e965ca8d06 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4568
diff changeset
  4356
3281
bd9392932db1 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3247
diff changeset
  4357
    wasBlocked := OperatingSystem blockInterrupts.
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  4358
    [
4497
bf5e9d5ec532 #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 4414
diff changeset
  4359
        sema := Semaphore name:'multiReadWait'.
bf5e9d5ec532 #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 4414
diff changeset
  4360
        otherConnections do:[:aConnection |
bf5e9d5ec532 #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 4414
diff changeset
  4361
            Processor signal:sema onInput:(aConnection fileDescriptor).
bf5e9d5ec532 #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 4414
diff changeset
  4362
        ].
bf5e9d5ec532 #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 4414
diff changeset
  4363
        Processor signal:sema onInput:(self fileDescriptor).
4570
39e965ca8d06 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4568
diff changeset
  4364
        timeoutMs notNil ifTrue:[
39e965ca8d06 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4568
diff changeset
  4365
            Processor signal:sema afterMilliseconds:timeoutMs
4497
bf5e9d5ec532 #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 4414
diff changeset
  4366
        ].
bf5e9d5ec532 #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 4414
diff changeset
  4367
        Processor activeProcess state:#ioWait.
bf5e9d5ec532 #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 4414
diff changeset
  4368
        sema wait.
3281
bd9392932db1 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3247
diff changeset
  4369
    ] ifCurtailed:[
4497
bf5e9d5ec532 #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 4414
diff changeset
  4370
        sema notNil ifTrue:[Processor disableSemaphore:sema].
bf5e9d5ec532 #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 4414
diff changeset
  4371
        wasBlocked ifFalse:[OperatingSystem unblockInterrupts].
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  4372
    ].
3281
bd9392932db1 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3247
diff changeset
  4373
    wasBlocked ifFalse:[OperatingSystem unblockInterrupts].
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  4374
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  4375
    "see who it was ..."
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  4376
    self canReadWithoutBlocking ifTrue:[
4497
bf5e9d5ec532 #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 4414
diff changeset
  4377
        ^ self accept.
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  4378
    ].
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  4379
    otherConnections do:[:aConnection |
4497
bf5e9d5ec532 #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 4414
diff changeset
  4380
        aConnection canReadWithoutBlocking ifTrue:[
bf5e9d5ec532 #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 4414
diff changeset
  4381
            ^ aConnection
bf5e9d5ec532 #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 4414
diff changeset
  4382
        ]
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  4383
    ].
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  4384
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  4385
    "none - a timeout"
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  4386
    ^ nil
4497
bf5e9d5ec532 #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 4414
diff changeset
  4387
bf5e9d5ec532 #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 4414
diff changeset
  4388
    "Modified: / 09-08-2017 / 11:59:50 / cg"
4570
39e965ca8d06 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4568
diff changeset
  4389
    "Modified: / 19-01-2018 / 18:59:17 / stefan"
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  4390
!
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  4391
4570
39e965ca8d06 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4568
diff changeset
  4392
waitForNewConnectionWithTimeout:secondsOrTimeDurationOrNil
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  4393
    "suspend the current process, until a new connection comes
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  4394
     in at the receiver or a timeout occurs.
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  4395
     For a new connection, an accept is performed and the new socket is returned.
4032
24df60dcd5f4 #OTHER by mawalch
mawalch
parents: 3989
diff changeset
  4396
     Returns nil, if a timeout occurred.
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  4397
     This method implements the inner wait-primitive of a single-connection
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  4398
     server application."
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  4399
3633
3a21f142432e #REFACTORING
Stefan Vogel <sv@exept.de>
parents: 3620
diff changeset
  4400
    |newSock|
3a21f142432e #REFACTORING
Stefan Vogel <sv@exept.de>
parents: 3620
diff changeset
  4401
4570
39e965ca8d06 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4568
diff changeset
  4402
    (self readWaitWithTimeout:secondsOrTimeDurationOrNil) ifTrue:[
4568
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  4403
        "a timeout occurred - no connection within timeout"
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  4404
        self reportError:(OperatingSystem errorNumberFor:#ETIMEDOUT).
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  4405
        ^ nil.
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  4406
    ].
4180
f2539f82b744 #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4172
diff changeset
  4407
    self isOpen ifFalse:[
4568
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  4408
        "I have been closed while waiting"
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  4409
        ^ self errorNotOpen.
4180
f2539f82b744 #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4172
diff changeset
  4410
    ].
4568
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  4411
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  4412
    "ok, a connection is present - accept it"
3633
3a21f142432e #REFACTORING
Stefan Vogel <sv@exept.de>
parents: 3620
diff changeset
  4413
    newSock := self class new.
3a21f142432e #REFACTORING
Stefan Vogel <sv@exept.de>
parents: 3620
diff changeset
  4414
    (newSock primAcceptOn:self blocking:false) ifFalse:[
4568
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  4415
        "should raise an error here - primitive code raises a notification"
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  4416
        ^ nil
3633
3a21f142432e #REFACTORING
Stefan Vogel <sv@exept.de>
parents: 3620
diff changeset
  4417
    ].
3a21f142432e #REFACTORING
Stefan Vogel <sv@exept.de>
parents: 3620
diff changeset
  4418
    ^ newSock
4568
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  4419
4570
39e965ca8d06 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4568
diff changeset
  4420
    "Modified (format): / 19-01-2018 / 18:53:15 / stefan"
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  4421
! !
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  4422
464
600b101a7035 alen in accept
Claus Gittinger <cg@exept.de>
parents: 463
diff changeset
  4423
!Socket class methodsFor:'documentation'!
206
77166a6b3ee6 For ST80 style socket creation: register socket in Lobby.
Stefan Vogel <sv@exept.de>
parents: 203
diff changeset
  4424
77166a6b3ee6 For ST80 style socket creation: register socket in Lobby.
Stefan Vogel <sv@exept.de>
parents: 203
diff changeset
  4425
version
3590
3487165a9cdf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3550
diff changeset
  4426
    ^ '$Header$'
2292
c4b0b901278e added: #standardTimeout
Claus Gittinger <cg@exept.de>
parents: 1940
diff changeset
  4427
!
c4b0b901278e added: #standardTimeout
Claus Gittinger <cg@exept.de>
parents: 1940
diff changeset
  4428
c4b0b901278e added: #standardTimeout
Claus Gittinger <cg@exept.de>
parents: 1940
diff changeset
  4429
version_CVS
3590
3487165a9cdf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3550
diff changeset
  4430
    ^ '$Header$'
206
77166a6b3ee6 For ST80 style socket creation: register socket in Lobby.
Stefan Vogel <sv@exept.de>
parents: 203
diff changeset
  4431
! !
4497
bf5e9d5ec532 #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 4414
diff changeset
  4432