Socket.st
author Claus Gittinger <cg@exept.de>
Sat, 02 May 2020 21:40:13 +0200
changeset 5476 7355a4b11cb6
parent 5474 99d731df2a80
permissions -rw-r--r--
#FEATURE by cg class: Socket class added: #newTCPclientToHost:port:domain:domainOrder:withTimeout: changed: #newTCPclientToHost:port:domain:withTimeout:
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
5473
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
     3
	      All Rights Reserved
0
1cf8d1747859 Initial revision
claus
parents:
diff changeset
     4
1cf8d1747859 Initial revision
claus
parents:
diff changeset
     5
 This software is furnished under a license and may be used
1cf8d1747859 Initial revision
claus
parents:
diff changeset
     6
 only in accordance with the terms of that license and with the
1cf8d1747859 Initial revision
claus
parents:
diff changeset
     7
 inclusion of the above copyright notice.   This software may not
1cf8d1747859 Initial revision
claus
parents:
diff changeset
     8
 be provided or otherwise made available to, or used by, any
1cf8d1747859 Initial revision
claus
parents:
diff changeset
     9
 other person.  No title to or ownership of the software is
1cf8d1747859 Initial revision
claus
parents:
diff changeset
    10
 hereby transferred.
1cf8d1747859 Initial revision
claus
parents:
diff changeset
    11
"
888
a868b0e54a2b ipAddress stuff
Claus Gittinger <cg@exept.de>
parents: 887
diff changeset
    12
"{ Package: 'stx:libbasic2' }"
a868b0e54a2b ipAddress stuff
Claus Gittinger <cg@exept.de>
parents: 887
diff changeset
    13
3462
cfdc47761d0f class: Socket
Claus Gittinger <cg@exept.de>
parents: 3281
diff changeset
    14
"{ NameSpace: Smalltalk }"
cfdc47761d0f class: Socket
Claus Gittinger <cg@exept.de>
parents: 3281
diff changeset
    15
63
7dd3d5b7877e *** empty log message ***
claus
parents: 58
diff changeset
    16
NonPositionableExternalStream subclass:#Socket
5467
914f6955a10a #REFACTORING by Stefan Reise
sr
parents: 5466
diff changeset
    17
	instanceVariableNames:'domain socketType protocol port peer peerName listening'
914f6955a10a #REFACTORING by Stefan Reise
sr
parents: 5466
diff changeset
    18
	classVariableNames:''
914f6955a10a #REFACTORING by Stefan Reise
sr
parents: 5466
diff changeset
    19
	poolDictionaries:''
914f6955a10a #REFACTORING by Stefan Reise
sr
parents: 5466
diff changeset
    20
	category:'Streams-External'
0
1cf8d1747859 Initial revision
claus
parents:
diff changeset
    21
!
1cf8d1747859 Initial revision
claus
parents:
diff changeset
    22
126
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
    23
!Socket primitiveDefinitions!
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
    24
%{
1009
e0839f923a3c double underlines;
Claus Gittinger <cg@exept.de>
parents: 1007
diff changeset
    25
/* #define DGRAM_DEBUG /* */
e0839f923a3c double underlines;
Claus Gittinger <cg@exept.de>
parents: 1007
diff changeset
    26
3590
3487165a9cdf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3550
diff changeset
    27
#ifdef __MINGW__
3487165a9cdf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3550
diff changeset
    28
# include <stdio.h>
3487165a9cdf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3550
diff changeset
    29
#endif
1343
cc3bed115c0a definitions cleanup with stxOSDefs.h
penk
parents: 1342
diff changeset
    30
#include "stxOSDefs.h"
126
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
    31
3843
fbced69597a7 oops - error check was disabled
Claus Gittinger <cg@exept.de>
parents: 3742
diff changeset
    32
#ifdef __win32__
3123
55ef9ca4f09f class: Socket
Stefan Vogel <sv@exept.de>
parents: 3077
diff changeset
    33
//#define DEBUG 1
2818
94d67df5c00d compilable with tcc
Claus Gittinger <cg@exept.de>
parents: 2773
diff changeset
    34
/* this is to catch uses of those - there should be none */
1503
4d97e4191d04 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1499
diff changeset
    35
# undef __BEGIN_INTERRUPTABLE__
4d97e4191d04 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1499
diff changeset
    36
# undef __END_INTERRUPTABLE__
2818
94d67df5c00d compilable with tcc
Claus Gittinger <cg@exept.de>
parents: 2773
diff changeset
    37
# ifdef __TCC__
94d67df5c00d compilable with tcc
Claus Gittinger <cg@exept.de>
parents: 2773
diff changeset
    38
#  define __BEGIN_INTERRUPTABLE__ xxxx
94d67df5c00d compilable with tcc
Claus Gittinger <cg@exept.de>
parents: 2773
diff changeset
    39
#  define __END_INTERRUPTABLE__ yyyy
94d67df5c00d compilable with tcc
Claus Gittinger <cg@exept.de>
parents: 2773
diff changeset
    40
# else
94d67df5c00d compilable with tcc
Claus Gittinger <cg@exept.de>
parents: 2773
diff changeset
    41
#  define __BEGIN_INTERRUPTABLE__ ..
94d67df5c00d compilable with tcc
Claus Gittinger <cg@exept.de>
parents: 2773
diff changeset
    42
#  define __END_INTERRUPTABLE__ ..
94d67df5c00d compilable with tcc
Claus Gittinger <cg@exept.de>
parents: 2773
diff changeset
    43
# endif
1503
4d97e4191d04 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1499
diff changeset
    44
1504
92005eec5c9d fixed moving-object-when-interrupted-with-scavenge bugs;
Claus Gittinger <cg@exept.de>
parents: 1503
diff changeset
    45
# define WRAP_STDIO
2823
10179ccfae5d Default for close - linger in background instead 30s in foreground
Stefan Vogel <sv@exept.de>
parents: 2818
diff changeset
    46
// The default is linger until all data is sent in background
10179ccfae5d Default for close - linger in background instead 30s in foreground
Stefan Vogel <sv@exept.de>
parents: 2818
diff changeset
    47
// so the close on the socket is non-blocking
10179ccfae5d Default for close - linger in background instead 30s in foreground
Stefan Vogel <sv@exept.de>
parents: 2818
diff changeset
    48
// linger.onoff=off linger.time= *irrelevant*
10179ccfae5d Default for close - linger in background instead 30s in foreground
Stefan Vogel <sv@exept.de>
parents: 2818
diff changeset
    49
//# define SET_LINGER_WHEN_CREATING_SOCKET
1529
911273d090c1 Re-unified Win32 and Unix code into single Socket.st.
Claus Gittinger <cg@exept.de>
parents: 1505
diff changeset
    50
3742
a12020350fa0 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3741
diff changeset
    51
# ifdef __xxMINGW__
2909
aacef77a1697 64bit fixes
Claus Gittinger <cg@exept.de>
parents: 2904
diff changeset
    52
extern HANDLE _get_osfhandle();
1845
df4d79bfba9d closesocket is still tricky
Claus Gittinger <cg@exept.de>
parents: 1844
diff changeset
    53
# endif
df4d79bfba9d closesocket is still tricky
Claus Gittinger <cg@exept.de>
parents: 1844
diff changeset
    54
3620
c648d063bccc #REFACTORING
Stefan Vogel <sv@exept.de>
parents: 3617
diff changeset
    55
# if defined(__BORLANDC__)
c648d063bccc #REFACTORING
Stefan Vogel <sv@exept.de>
parents: 3617
diff changeset
    56
// not defined in borland headers
c648d063bccc #REFACTORING
Stefan Vogel <sv@exept.de>
parents: 3617
diff changeset
    57
typedef unsigned int socklen_t;
c648d063bccc #REFACTORING
Stefan Vogel <sv@exept.de>
parents: 3617
diff changeset
    58
# endif
c648d063bccc #REFACTORING
Stefan Vogel <sv@exept.de>
parents: 3617
diff changeset
    59
3246
c75a006f9a7a Win32 sockets use handles instead of file pointers
Stefan Vogel <sv@exept.de>
parents: 3224
diff changeset
    60
# if 0 && (defined( __BORLANDC__ ) || defined( __MINGW__ ))
2915
896fffb0f02e mingw64
Claus Gittinger <cg@exept.de>
parents: 2909
diff changeset
    61
#  define SOCKET_FROM_FD(fd)               (SOCKET)(_get_osfhandle(fd))
2909
aacef77a1697 64bit fixes
Claus Gittinger <cg@exept.de>
parents: 2904
diff changeset
    62
# else
3246
c75a006f9a7a Win32 sockets use handles instead of file pointers
Stefan Vogel <sv@exept.de>
parents: 3224
diff changeset
    63
#  define SOCKET_FROM_FD(fd)               (SOCKET)(fd)
2909
aacef77a1697 64bit fixes
Claus Gittinger <cg@exept.de>
parents: 2904
diff changeset
    64
# endif
3843
fbced69597a7 oops - error check was disabled
Claus Gittinger <cg@exept.de>
parents: 3742
diff changeset
    65
#else /* not __win32__ */
3215
342d793d938c class: Socket
Stefan Vogel <sv@exept.de>
parents: 3214
diff changeset
    66
# define SOCKET_FROM_FD(fd)   (fd)
342d793d938c class: Socket
Stefan Vogel <sv@exept.de>
parents: 3214
diff changeset
    67
# define closesocket(sock)    close(sock)
342d793d938c class: Socket
Stefan Vogel <sv@exept.de>
parents: 3214
diff changeset
    68
# define SOCKET               int
3843
fbced69597a7 oops - error check was disabled
Claus Gittinger <cg@exept.de>
parents: 3742
diff changeset
    69
#endif /* ! __win32__ */
1503
4d97e4191d04 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1499
diff changeset
    70
1843
8ee90d243b49 closeSocket after fclose: no longer (Q: is this the right thing)
Claus Gittinger <cg@exept.de>
parents: 1842
diff changeset
    71
#define SOCKET_FROM_FILE(f)             (SOCKET_FROM_FD(fileno(f)))
5001
11cbbbcbc87e warnings
Claus Gittinger <cg@exept.de>
parents: 4961
diff changeset
    72
#define SOCKET_FROM_FILE_OBJECT(f)      (__INST(handleType) == @symbol(socketHandle) ? SOCKET_FROM_FD((INT)(__FILEVal(f))) : SOCKET_FROM_FILE(__FILEVal(f)))
1539
c0e89dcb58b3 non blocking stuff done right here;
Claus Gittinger <cg@exept.de>
parents: 1538
diff changeset
    73
3590
3487165a9cdf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3550
diff changeset
    74
#ifndef __MINGW__
3487165a9cdf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3550
diff changeset
    75
# include <stdio.h>
3487165a9cdf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3550
diff changeset
    76
#endif
126
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
    77
#include <errno.h>
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
    78
1343
cc3bed115c0a definitions cleanup with stxOSDefs.h
penk
parents: 1342
diff changeset
    79
#ifdef WANT__TCP_DOT_H
cc3bed115c0a definitions cleanup with stxOSDefs.h
penk
parents: 1342
diff changeset
    80
# include <netinet/tcp.h>
cc3bed115c0a definitions cleanup with stxOSDefs.h
penk
parents: 1342
diff changeset
    81
#endif
cc3bed115c0a definitions cleanup with stxOSDefs.h
penk
parents: 1342
diff changeset
    82
1344
70d73917ac78 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1343
diff changeset
    83
#ifdef WANT__NETDB_DOT_H
70d73917ac78 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1343
diff changeset
    84
# include <netdb.h>
1343
cc3bed115c0a definitions cleanup with stxOSDefs.h
penk
parents: 1342
diff changeset
    85
#endif
cc3bed115c0a definitions cleanup with stxOSDefs.h
penk
parents: 1342
diff changeset
    86
739
eb3878300c3b removed WIN32 ifdef's - win32 uses Socket_win32.st anyway.
Claus Gittinger <cg@exept.de>
parents: 726
diff changeset
    87
#if defined(TRY_AGAIN) || defined(HOST_NOT_FOUND)
eb3878300c3b removed WIN32 ifdef's - win32 uses Socket_win32.st anyway.
Claus Gittinger <cg@exept.de>
parents: 726
diff changeset
    88
# define USE_H_ERRNO
eb3878300c3b removed WIN32 ifdef's - win32 uses Socket_win32.st anyway.
Claus Gittinger <cg@exept.de>
parents: 726
diff changeset
    89
#endif
eb3878300c3b removed WIN32 ifdef's - win32 uses Socket_win32.st anyway.
Claus Gittinger <cg@exept.de>
parents: 726
diff changeset
    90
126
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
    91
/*
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
    92
 * on some systems errno is a macro ... check for it here
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
    93
 */
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
    94
#ifndef errno
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
    95
 extern errno;
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
    96
#endif
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
    97
648
58e11a70ddaf gethostbyname behaves strange, if a name-server lookup is involved.
Claus Gittinger <cg@exept.de>
parents: 617
diff changeset
    98
#ifdef USE_H_ERRNO
58e11a70ddaf gethostbyname behaves strange, if a name-server lookup is involved.
Claus Gittinger <cg@exept.de>
parents: 617
diff changeset
    99
# ifndef h_errno
58e11a70ddaf gethostbyname behaves strange, if a name-server lookup is involved.
Claus Gittinger <cg@exept.de>
parents: 617
diff changeset
   100
 extern h_errno;
58e11a70ddaf gethostbyname behaves strange, if a name-server lookup is involved.
Claus Gittinger <cg@exept.de>
parents: 617
diff changeset
   101
# endif
58e11a70ddaf gethostbyname behaves strange, if a name-server lookup is involved.
Claus Gittinger <cg@exept.de>
parents: 617
diff changeset
   102
#endif
58e11a70ddaf gethostbyname behaves strange, if a name-server lookup is involved.
Claus Gittinger <cg@exept.de>
parents: 617
diff changeset
   103
126
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
   104
#ifdef DEBUG
1839
c10cd58ec334 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1781
diff changeset
   105
# define DBGPRINTF(x)    { if (__debugging__) console_printf x; }
c10cd58ec334 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1781
diff changeset
   106
# define DBGFPRINTF(x)   { if (__debugging__) console_fprintf x; }
126
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
   107
#else
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
   108
# define DBGPRINTF(x)    /* as nothing */
821
40b0b69bf4b5 more debugs; fixed at-addresses
Claus Gittinger <cg@exept.de>
parents: 820
diff changeset
   109
# define DBGFPRINTF(x)   /* as nothing */
126
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
   110
#endif
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
   111
1531
ec98158988ca compilable under unix
Claus Gittinger <cg@exept.de>
parents: 1529
diff changeset
   112
#ifndef TRUE
1535
f6aa0fc8c3cc getSocketAddress
Claus Gittinger <cg@exept.de>
parents: 1533
diff changeset
   113
# define TRUE   1
1531
ec98158988ca compilable under unix
Claus Gittinger <cg@exept.de>
parents: 1529
diff changeset
   114
#endif
ec98158988ca compilable under unix
Claus Gittinger <cg@exept.de>
parents: 1529
diff changeset
   115
#ifndef FALSE
1535
f6aa0fc8c3cc getSocketAddress
Claus Gittinger <cg@exept.de>
parents: 1533
diff changeset
   116
# define FALSE  0
1531
ec98158988ca compilable under unix
Claus Gittinger <cg@exept.de>
parents: 1529
diff changeset
   117
#endif
3843
fbced69597a7 oops - error check was disabled
Claus Gittinger <cg@exept.de>
parents: 3742
diff changeset
   118
#ifndef __win32__
1531
ec98158988ca compilable under unix
Claus Gittinger <cg@exept.de>
parents: 1529
diff changeset
   119
typedef int BOOL;
ec98158988ca compilable under unix
Claus Gittinger <cg@exept.de>
parents: 1529
diff changeset
   120
#endif
ec98158988ca compilable under unix
Claus Gittinger <cg@exept.de>
parents: 1529
diff changeset
   121
3843
fbced69597a7 oops - error check was disabled
Claus Gittinger <cg@exept.de>
parents: 3742
diff changeset
   122
#ifdef __win32__
1843
8ee90d243b49 closeSocket after fclose: no longer (Q: is this the right thing)
Claus Gittinger <cg@exept.de>
parents: 1842
diff changeset
   123
# undef stdout
8ee90d243b49 closeSocket after fclose: no longer (Q: is this the right thing)
Claus Gittinger <cg@exept.de>
parents: 1842
diff changeset
   124
# undef stderr
8ee90d243b49 closeSocket after fclose: no longer (Q: is this the right thing)
Claus Gittinger <cg@exept.de>
parents: 1842
diff changeset
   125
# define stdout __win32_stdout()
8ee90d243b49 closeSocket after fclose: no longer (Q: is this the right thing)
Claus Gittinger <cg@exept.de>
parents: 1842
diff changeset
   126
# define stderr __win32_stderr()
8ee90d243b49 closeSocket after fclose: no longer (Q: is this the right thing)
Claus Gittinger <cg@exept.de>
parents: 1842
diff changeset
   127
#endif
126
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
   128
%}
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
   129
! !
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
   130
511
c071e228cb24 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 510
diff changeset
   131
!Socket primitiveVariables!
c071e228cb24 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 510
diff changeset
   132
%{
1844
decc9d62520d oops - debug
Claus Gittinger <cg@exept.de>
parents: 1843
diff changeset
   133
static int __debugging__ = 0;
511
c071e228cb24 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 510
diff changeset
   134
%}
c071e228cb24 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 510
diff changeset
   135
! !
c071e228cb24 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 510
diff changeset
   136
1504
92005eec5c9d fixed moving-object-when-interrupted-with-scavenge bugs;
Claus Gittinger <cg@exept.de>
parents: 1503
diff changeset
   137
!Socket primitiveFunctions!
92005eec5c9d fixed moving-object-when-interrupted-with-scavenge bugs;
Claus Gittinger <cg@exept.de>
parents: 1503
diff changeset
   138
%{
92005eec5c9d fixed moving-object-when-interrupted-with-scavenge bugs;
Claus Gittinger <cg@exept.de>
parents: 1503
diff changeset
   139
1529
911273d090c1 Re-unified Win32 and Unix code into single Socket.st.
Claus Gittinger <cg@exept.de>
parents: 1505
diff changeset
   140
static int
3616
Stefan Vogel <sv@exept.de>
parents: 3615
diff changeset
   141
setupBufferParameters(OBJ aDataBuffer, OBJ startIndex, char **p_extPtr, INT *p_offs, size_t *p_objSize)
1504
92005eec5c9d fixed moving-object-when-interrupted-with-scavenge bugs;
Claus Gittinger <cg@exept.de>
parents: 1503
diff changeset
   142
{
5473
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
   143
	char *extPtr = 0;
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
   144
	int sIdx = 0, objSize = 0, offs = 0;
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
   145
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
   146
	if (__isSmallInteger(startIndex)) {
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
   147
	    sIdx = __intVal(startIndex) - 1;
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
   148
	}
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
   149
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
   150
	if (__isExternalBytesLike(aDataBuffer)) {
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
   151
	    OBJ sz = __externalBytesSize(aDataBuffer);
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
   152
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
   153
	    extPtr = (char *)(__externalBytesAddress(aDataBuffer));
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
   154
	    if (__isSmallInteger(sz)) {
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
   155
		objSize = __intVal(sz);
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
   156
	    } else {
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
   157
		objSize = 0; /* unknown */
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
   158
	    }
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
   159
	    offs = sIdx;
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
   160
	} else {
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
   161
	    OBJ oClass = __Class(aDataBuffer);
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
   162
	    int nInstVars, nInstBytes;
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
   163
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
   164
	    switch (__intVal(__ClassInstPtr(oClass)->c_flags) & ARRAYMASK) {
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
   165
		case BYTEARRAY:
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
   166
		    offs = sIdx;
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
   167
		    break;
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
   168
		case WORDARRAY:
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
   169
		case SWORDARRAY:
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
   170
		    offs = sIdx * 2;
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
   171
		    break;
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
   172
		case LONGARRAY:
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
   173
		case SLONGARRAY:
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
   174
		    offs = sIdx * 4;
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
   175
		    break;
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
   176
		case LONGLONGARRAY:
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
   177
		case SLONGLONGARRAY:
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
   178
		    offs = sIdx * 8;
1504
92005eec5c9d fixed moving-object-when-interrupted-with-scavenge bugs;
Claus Gittinger <cg@exept.de>
parents: 1503
diff changeset
   179
# ifdef __NEED_LONGLONG_ALIGN
5473
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
   180
		    offs += 4;
1504
92005eec5c9d fixed moving-object-when-interrupted-with-scavenge bugs;
Claus Gittinger <cg@exept.de>
parents: 1503
diff changeset
   181
# endif
5473
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
   182
		    break;
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
   183
		case FLOATARRAY:
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
   184
		    offs = sIdx * sizeof(float);
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
   185
		    break;
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
   186
		case DOUBLEARRAY:
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
   187
		    offs = sIdx * sizeof(double);
1504
92005eec5c9d fixed moving-object-when-interrupted-with-scavenge bugs;
Claus Gittinger <cg@exept.de>
parents: 1503
diff changeset
   188
# ifdef __NEED_DOUBLE_ALIGN
5473
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
   189
		    offs += 4;
1504
92005eec5c9d fixed moving-object-when-interrupted-with-scavenge bugs;
Claus Gittinger <cg@exept.de>
parents: 1503
diff changeset
   190
# endif
5473
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
   191
		    break;
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
   192
		default:
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
   193
		    *p_objSize = -1;
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
   194
		    return 0;
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
   195
	    }
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
   196
	    nInstVars = __intVal(__ClassInstPtr(oClass)->c_ninstvars);
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
   197
	    nInstBytes = OHDR_SIZE + nInstVars * sizeof(OBJ);
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
   198
	    offs = offs + nInstBytes;
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
   199
	    objSize = __Size(aDataBuffer) - offs;
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
   200
	}
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
   201
	*p_extPtr = extPtr;
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
   202
	*p_objSize = objSize;
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
   203
	*p_offs = offs;
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
   204
	return 1;
1504
92005eec5c9d fixed moving-object-when-interrupted-with-scavenge bugs;
Claus Gittinger <cg@exept.de>
parents: 1503
diff changeset
   205
}
92005eec5c9d fixed moving-object-when-interrupted-with-scavenge bugs;
Claus Gittinger <cg@exept.de>
parents: 1503
diff changeset
   206
%}
92005eec5c9d fixed moving-object-when-interrupted-with-scavenge bugs;
Claus Gittinger <cg@exept.de>
parents: 1503
diff changeset
   207
! !
92005eec5c9d fixed moving-object-when-interrupted-with-scavenge bugs;
Claus Gittinger <cg@exept.de>
parents: 1503
diff changeset
   208
464
600b101a7035 alen in accept
Claus Gittinger <cg@exept.de>
parents: 463
diff changeset
   209
!Socket class methodsFor:'documentation'!
25
996051271ce9 *** empty log message ***
claus
parents: 21
diff changeset
   210
31
e223f3cf2995 *** empty log message ***
claus
parents: 28
diff changeset
   211
copyright
e223f3cf2995 *** empty log message ***
claus
parents: 28
diff changeset
   212
"
e223f3cf2995 *** empty log message ***
claus
parents: 28
diff changeset
   213
 COPYRIGHT (c) 1992 by Claus Gittinger
5473
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
   214
	      All Rights Reserved
31
e223f3cf2995 *** empty log message ***
claus
parents: 28
diff changeset
   215
e223f3cf2995 *** empty log message ***
claus
parents: 28
diff changeset
   216
 This software is furnished under a license and may be used
e223f3cf2995 *** empty log message ***
claus
parents: 28
diff changeset
   217
 only in accordance with the terms of that license and with the
e223f3cf2995 *** empty log message ***
claus
parents: 28
diff changeset
   218
 inclusion of the above copyright notice.   This software may not
e223f3cf2995 *** empty log message ***
claus
parents: 28
diff changeset
   219
 be provided or otherwise made available to, or used by, any
e223f3cf2995 *** empty log message ***
claus
parents: 28
diff changeset
   220
 other person.  No title to or ownership of the software is
e223f3cf2995 *** empty log message ***
claus
parents: 28
diff changeset
   221
 hereby transferred.
e223f3cf2995 *** empty log message ***
claus
parents: 28
diff changeset
   222
"
e223f3cf2995 *** empty log message ***
claus
parents: 28
diff changeset
   223
!
e223f3cf2995 *** empty log message ***
claus
parents: 28
diff changeset
   224
25
996051271ce9 *** empty log message ***
claus
parents: 21
diff changeset
   225
documentation
996051271ce9 *** empty log message ***
claus
parents: 21
diff changeset
   226
"
524
8287da54eccf more empty code for other domains;
Claus Gittinger <cg@exept.de>
parents: 513
diff changeset
   227
    This class provides access to sockets for interprocess communication.
25
996051271ce9 *** empty log message ***
claus
parents: 21
diff changeset
   228
1529
911273d090c1 Re-unified Win32 and Unix code into single Socket.st.
Claus Gittinger <cg@exept.de>
parents: 1505
diff changeset
   229
    Currently, only IP and UNIX domain sockets are really fully
911273d090c1 Re-unified Win32 and Unix code into single Socket.st.
Claus Gittinger <cg@exept.de>
parents: 1505
diff changeset
   230
    tested and supported.
525
5891518d17a3 appletalk support - untested
Claus Gittinger <cg@exept.de>
parents: 524
diff changeset
   231
    Code for appletalk is included, but was never tested ...
5891518d17a3 appletalk support - untested
Claus Gittinger <cg@exept.de>
parents: 524
diff changeset
   232
    More may be added in the future.
5891518d17a3 appletalk support - untested
Claus Gittinger <cg@exept.de>
parents: 524
diff changeset
   233
    (the code is prepared for things like SNA or decNet;
5891518d17a3 appletalk support - untested
Claus Gittinger <cg@exept.de>
parents: 524
diff changeset
   234
     however, right now, this code is empty and needs a little work.
3989
d99b5df54e27 #DOCUMENTATION by mawalch
mawalch
parents: 3988
diff changeset
   235
     Implementing those is pretty straightforward, once the address
525
5891518d17a3 appletalk support - untested
Claus Gittinger <cg@exept.de>
parents: 524
diff changeset
   236
     data structures are known.)
524
8287da54eccf more empty code for other domains;
Claus Gittinger <cg@exept.de>
parents: 513
diff changeset
   237
28
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   238
    Due to historic reasons (I started this class, before I got hold of some
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   239
    code using ST-80 Sockets i.e. RemoteInvocation), there is some old interface
3481
b28077459fde class: Socket
Claus Gittinger <cg@exept.de>
parents: 3467
diff changeset
   240
    which is still supported.
b28077459fde class: Socket
Claus Gittinger <cg@exept.de>
parents: 3467
diff changeset
   241
    This may vanish; use the #family:type: or #newTCPxxx and #newUDPxxx interfaces,
71
claus
parents: 63
diff changeset
   242
    together with the bind/listen and accept calls,
claus
parents: 63
diff changeset
   243
    which are meant to be compatible to ST-80's UnixSocketAccessor interface.
claus
parents: 63
diff changeset
   244
3481
b28077459fde class: Socket
Claus Gittinger <cg@exept.de>
parents: 3467
diff changeset
   245
    TODO: cleanup historic leftovers,
5473
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
   246
	  change to raise more signals on errors.
259
6d36f3ac42a2 documentation
Claus Gittinger <cg@exept.de>
parents: 220
diff changeset
   247
6d36f3ac42a2 documentation
Claus Gittinger <cg@exept.de>
parents: 220
diff changeset
   248
    [author:]
5473
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
   249
	Claus Gittinger
48
18b9353c9d07 *** empty log message ***
claus
parents: 44
diff changeset
   250
"
18b9353c9d07 *** empty log message ***
claus
parents: 44
diff changeset
   251
!
28
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   252
48
18b9353c9d07 *** empty log message ***
claus
parents: 44
diff changeset
   253
examples
18b9353c9d07 *** empty log message ***
claus
parents: 44
diff changeset
   254
"
28
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   255
    example (get help info from an nntp server):
5473
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
   256
									[exBegin]
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
   257
	|sock|
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
   258
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
   259
	sock := Socket newTCPclientToHost:'smtp.exept.de' port:'smtp'.
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
   260
	sock isNil ifTrue:[
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
   261
	    self warn:'no smtp daemon is running'.
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
   262
	    ^ self
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
   263
	].
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
   264
	Transcript showCR:sock nextLine.
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
   265
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
   266
	sock nextPutAll:'HELO STX socket test'; cr.
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
   267
	Transcript showCR:sock nextLine.
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
   268
	sock close
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
   269
									[exEnd]
209
2152fceba563 finger example
Claus Gittinger <cg@exept.de>
parents: 208
diff changeset
   270
28
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   271
209
2152fceba563 finger example
Claus Gittinger <cg@exept.de>
parents: 208
diff changeset
   272
    example (connect to finger daemon, get users entry):
5473
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
   273
									[exBegin]
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
   274
	|sock entry|
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
   275
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
   276
	sock := Socket newTCPclientToHost:'localhost' port:'finger'.
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
   277
	sock isNil ifTrue:[
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
   278
	    self warn:'no finger daemon is running'.
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
   279
	    ^ self
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
   280
	].
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
   281
	sock useCRLF:true.
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
   282
	sock buffered:false.
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
   283
	sock isNil ifTrue:[
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
   284
	    Transcript showCR:'cannot connect to local finger daemon'
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
   285
	] ifFalse:[
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
   286
	    sock nextPutAll:(OperatingSystem getLoginName).
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
   287
	    sock cr.
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
   288
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
   289
	    entry := sock nextLine.
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
   290
	    Transcript showCR:entry.
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
   291
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
   292
	    sock close
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
   293
	]
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
   294
									[exEnd]
99
7d016cc30052 fixed & moved pingWalk from SNMPSession to here;
Claus Gittinger <cg@exept.de>
parents: 98
diff changeset
   295
28
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   296
    example (connect to an ftp server):
5473
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
   297
									[exBegin]
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
   298
	|sock|
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
   299
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
   300
	sock := Socket newTCPclientToHost:'www.exept.de' port:'ftp'.
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
   301
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
   302
	sock buffered:false.
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
   303
	Transcript showCR:sock nextLine.
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
   304
	sock nextPutAll:('USER ' , 'anonymous'); cr.
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
   305
	Transcript showCR:sock nextLine.
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
   306
	sock nextPutAll:('PASS ' , 'fooBar'); cr.
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
   307
	Transcript showCR:sock nextLine.
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
   308
	sock nextPutAll:'HELP'; cr.
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
   309
	[
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
   310
	    |line|
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
   311
	    line := sock nextLine.
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
   312
	    Transcript showCR:line.
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
   313
	    (line at:4) = $-
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
   314
	] whileTrue.
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
   315
	sock close.
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
   316
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
   317
	'don't know enough of the ftp protocol to continue here ...'
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
   318
									[exEnd]
28
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   319
99
7d016cc30052 fixed & moved pingWalk from SNMPSession to here;
Claus Gittinger <cg@exept.de>
parents: 98
diff changeset
   320
93
Claus Gittinger <cg@exept.de>
parents: 92
diff changeset
   321
    example (connect to an snmp server [UDP]):
3985
f4df11cffecf #OTHER by mawalch
mawalch
parents: 3843
diff changeset
   322
    Note: this is not a real connection, only the destination address is
5473
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
   323
	  being fixed.
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
   324
									[exBegin]
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
   325
	|sock port|
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
   326
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
   327
	sock := Socket newUDP.
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
   328
	port := Socket portOfService:'snmp'.
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
   329
	sock connectTo:'224.1.2.3' port:port.
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
   330
	sock buffered:false.
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
   331
	Transcript showCR:'got it'.
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
   332
	sock close.
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
   333
									[exEnd]
42
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   334
99
7d016cc30052 fixed & moved pingWalk from SNMPSession to here;
Claus Gittinger <cg@exept.de>
parents: 98
diff changeset
   335
42
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   336
    example (await connection from a client and read some data):
5473
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
   337
									[exBegin]
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
   338
	|connectSock sock|
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
   339
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
   340
	connectSock := Socket newTCPserverAtPort:9998.
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
   341
	connectSock isNil ifTrue:[
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
   342
	    Transcript showCR:'socket setup failed.'.
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
   343
	] ifFalse:[
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
   344
	    Transcript showCR:'listen ..'.
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
   345
	    (connectSock listenFor:5) ifFalse:[
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
   346
		Transcript showCR:'listen failed.'.
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
   347
	    ] ifTrue:[
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
   348
		Transcript showCR:'wait'.
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
   349
		connectSock readWait.
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
   350
		Transcript showCR:'accept'.
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
   351
		sock := connectSock accept.
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
   352
		sock isNil ifTrue:[
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
   353
		    Transcript showCR:'accept failed.'.
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
   354
		] ifFalse:[
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
   355
		    sock buffered:false.
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
   356
		    Transcript showCR:'server: got it'.
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
   357
		    'can now do transfer via sock'.
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
   358
		    Transcript showCR:'read'.
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
   359
		    Transcript showCR:('got: ' , sock nextLine).
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
   360
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
   361
		    Transcript showCR:'close'.
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
   362
		    sock close
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
   363
		].
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
   364
		connectSock close.
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
   365
	    ]
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
   366
	]
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
   367
									[exEnd]
42
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   368
99
7d016cc30052 fixed & moved pingWalk from SNMPSession to here;
Claus Gittinger <cg@exept.de>
parents: 98
diff changeset
   369
42
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   370
    example (connect to above server and send some data):
5473
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
   371
									[exBegin]
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
   372
	|sock|
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
   373
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
   374
	sock := Socket newTCPclientToHost:'localhost' port:9998.
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
   375
	sock isNil ifTrue:[
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
   376
	    Transcript showCR:'nope'
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
   377
	] ifFalse:[
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
   378
	    sock buffered:false.
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
   379
	    Transcript showCR:'client: got it'.
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
   380
	    'can now do transfer via sock'.
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
   381
	    Transcript showCR:'sending <hello>'.
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
   382
	    sock nextPutLine:'hello'.
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
   383
	    sock close
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
   384
	]
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
   385
									[exEnd]
117
03cefad7e40b UD socket example & interruptable bind
Claus Gittinger <cg@exept.de>
parents: 116
diff changeset
   386
03cefad7e40b UD socket example & interruptable bind
Claus Gittinger <cg@exept.de>
parents: 116
diff changeset
   387
    example: UNIX domain socket (await connection from a client and read some data):
1009
e0839f923a3c double underlines;
Claus Gittinger <cg@exept.de>
parents: 1007
diff changeset
   388
5473
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
   389
	|connectSock sock|
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
   390
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
   391
	'/tmp/ud_socket' asFilename remove.
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
   392
	connectSock := Socket newUNIXserverAt:'/tmp/ud_socket'.
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
   393
	connectSock isNil ifTrue:[
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
   394
	    Transcript showCR:'socket setup failed.'.
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
   395
	] ifFalse:[
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
   396
	    Transcript showCR:'listen ..'.
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
   397
	    (connectSock listenFor:5) ifFalse:[
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
   398
		Transcript showCR:'listen failed.'.
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
   399
	    ] ifTrue:[
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
   400
		Transcript showCR:'wait'.
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
   401
		connectSock buffered:false.
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
   402
		connectSock readWait.
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
   403
		Transcript showCR:'accept'.
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
   404
		sock := connectSock accept.
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
   405
		sock isNil ifTrue:[
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
   406
		    Transcript showCR:'accept failed.'.
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
   407
		] ifFalse:[
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
   408
		    sock buffered:false.
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
   409
		    Transcript showCR:'server: got it'.
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
   410
		    'can now do transfer via sock'.
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
   411
		    Transcript showCR:'read'.
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
   412
		    Transcript showCR:('got: ' , sock nextLine).
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
   413
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
   414
		    Transcript showCR:'close'.
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
   415
		    sock close
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
   416
		].
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
   417
		connectSock close.
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
   418
	    ]
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
   419
	]
117
03cefad7e40b UD socket example & interruptable bind
Claus Gittinger <cg@exept.de>
parents: 116
diff changeset
   420
03cefad7e40b UD socket example & interruptable bind
Claus Gittinger <cg@exept.de>
parents: 116
diff changeset
   421
118
142d5c273454 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 117
diff changeset
   422
    example (connect to above server and send some data;
5473
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
   423
	     Notice, this fails, if above server code is executed in the same ST/X image
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
   424
		     (at least on LINUX), since the OS does not correctly handle
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
   425
		     a connect from within an interrupted accept system call
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
   426
		     On SGI's SVR4, this works ok
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
   427
									[exBegin]
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
   428
	|sock|
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
   429
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
   430
	sock := Socket newUNIXclientTo:'/tmp/ud_socket'.
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
   431
	sock isNil ifTrue:[
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
   432
	    Transcript showCR:'nope'
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
   433
	] ifFalse:[
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
   434
	    sock buffered:false.
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
   435
	    Transcript showCR:'client: got it'.
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
   436
	    'can now do transfer via sock'.
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
   437
	    Transcript showCR:'sending <hello>'.
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
   438
	    sock nextPutLine:'hello'.
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
   439
	    sock close
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
   440
	]
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
   441
									[exEnd]
1007
5267b5738779 UDP examples
Claus Gittinger <cg@exept.de>
parents: 1004
diff changeset
   442
5267b5738779 UDP examples
Claus Gittinger <cg@exept.de>
parents: 1004
diff changeset
   443
5267b5738779 UDP examples
Claus Gittinger <cg@exept.de>
parents: 1004
diff changeset
   444
    example (UDP await packet from a client and read some data):
5473
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
   445
									[exBegin]
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
   446
	|udpSock sock addr n dataBuffer|
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
   447
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
   448
	udpSock := Socket newUDPserverAtPort:9999.
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
   449
	udpSock isNil ifTrue:[
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
   450
	    Transcript showCR:'socket setup failed.'.
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
   451
	] ifFalse:[
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
   452
	    Transcript showCR:'wait'.
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
   453
	    udpSock readWait.
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
   454
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
   455
	    addr := IPSocketAddress new.
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
   456
	    dataBuffer := ByteArray new:1000.
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
   457
	    n := udpSock receiveFrom:addr buffer:dataBuffer start:1 for:dataBuffer size.
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
   458
	    n > 0 ifTrue:[
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
   459
		Transcript showCR:('got: ' , n printString , 'bytes  from ' , addr printString).
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
   460
		Transcript showCR:('data: ' , (dataBuffer copyTo:n) printString).
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
   461
	    ] ifFalse:[
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
   462
		Transcript showCR:'read failed'.
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
   463
	    ].
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
   464
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
   465
	    Transcript showCR:'close'.
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
   466
	    udpSock close
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
   467
	]
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
   468
									[exEnd]
4738
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
   469
1007
5267b5738779 UDP examples
Claus Gittinger <cg@exept.de>
parents: 1004
diff changeset
   470
    example (connect to above UDP server and send some data;
5473
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
   471
									[exBegin]
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
   472
	|sock|
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
   473
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
   474
	sock := Socket newUDP.
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
   475
	sock isNil ifTrue:[
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
   476
	    Transcript showCR:'nope'
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
   477
	] ifFalse:[
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
   478
	    sock
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
   479
		sendTo:(IPSocketAddress hostName:'127.0.0.1' port:9999) buffer:'hello world'.
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
   480
	    sock close
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
   481
	]
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
   482
									[exEnd]
4738
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
   483
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
   484
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
   485
    example (UDP await packet from a client and read some multicast data):
5473
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
   486
									[exBegin]
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
   487
	|udpSock sock addr n dataBuffer|
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
   488
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
   489
	udpSock := Socket newUDPserverAtPort:9999.
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
   490
	udpSock isNil ifTrue:[
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
   491
	    Transcript showCR:'socket setup failed.'.
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
   492
	] ifFalse:[
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
   493
	    udpSock setSocketOption:#'IP_ADD_MEMBERSHIP' argument:#[224 1 2 3] argument:#[0 0 0 0].
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
   494
	    Transcript showCR:'wait'.
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
   495
	    udpSock readWait.
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
   496
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
   497
	    addr := IPSocketAddress new.
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
   498
	    dataBuffer := ByteArray new:1000.
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
   499
	    n := udpSock receiveFrom:addr buffer:dataBuffer start:1 for:dataBuffer size.
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
   500
	    n > 0 ifTrue:[
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
   501
		Transcript showCR:('got: ' , n printString , 'bytes  from ' , addr printString).
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
   502
		Transcript showCR:('data: ' , (dataBuffer copyTo:n) printString).
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
   503
	    ] ifFalse:[
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
   504
		Transcript showCR:'read failed'.
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
   505
	    ].
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
   506
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
   507
	    Transcript showCR:'close'.
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
   508
	    udpSock close
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
   509
	]
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
   510
									[exEnd]
4738
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
   511
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
   512
    example (connect to above UDP server and send some multicast data):
5473
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
   513
									[exBegin]
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
   514
	|sock|
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
   515
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
   516
	sock := Socket newUDP.
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
   517
	sock isNil ifTrue:[
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
   518
	    Transcript showCR:'nope'
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
   519
	] ifFalse:[
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
   520
	    sock
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
   521
		setSocketOption:#'IP_MULTICAST_TTL' argument:3 argument:nil;
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
   522
		sendTo:(IPSocketAddress hostName:'224.1.2.3' port:9999) buffer:'hello world'.
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
   523
	    sock close
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
   524
	]
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
   525
									[exEnd]
99
7d016cc30052 fixed & moved pingWalk from SNMPSession to here;
Claus Gittinger <cg@exept.de>
parents: 98
diff changeset
   526
7d016cc30052 fixed & moved pingWalk from SNMPSession to here;
Claus Gittinger <cg@exept.de>
parents: 98
diff changeset
   527
    example: pingWalk (try to ping hosts on the local network)
2824
b00dc482dd03 comment/format in: #examples
Stefan Vogel <sv@exept.de>
parents: 2823
diff changeset
   528
    Note: it dosen't use ICMP ping, but tries to reache the echo service,
5473
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
   529
	  which is disabled on most OS.
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
   530
									[exBegin]
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
   531
	|myAddress list top hosts walkProcess port|
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
   532
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
   533
	myAddress := OperatingSystem getNetworkAddresses
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
   534
			keysAndValuesSelect:[:eachIFName :eachAddress|
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
   535
			    eachAddress isLocal not
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
   536
			    and:[eachIFName = 'wlan0']
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
   537
			].
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
   538
	myAddress := myAddress first hostAddress.
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
   539
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
   540
	port := Socket portOfService:'echo'.
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
   541
	port isNil ifTrue:[
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
   542
	    self error:'dont know echo port'.
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
   543
	    ^ self
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
   544
	].
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
   545
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
   546
	top := StandardSystemView new.
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
   547
	top label:'PING net walk'.
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
   548
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
   549
	list := ScrollableView for:ListView in:top.
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
   550
	list origin:0.0@0.0 corner:1.0@1.0.
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
   551
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
   552
	top openAndWait.
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
   553
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
   554
	walkProcess := [
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
   555
	    |l low hi direction tryHostID dottedName hostName conn addr|
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
   556
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
   557
	    l := SortedCollection new.
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
   558
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
   559
	    ' only works with type C-net
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
   560
	      the code below could simply do 1 to:254 do:[:hostID }
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
   561
	      but, to probe likely hosts earlier, the probing is done
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
   562
	      ping-pong like around my ip-address (assuming, that other machines
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
   563
	      have numbers around my own)'.
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
   564
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
   565
	    low := hi := (myAddress at:4).
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
   566
	    direction := 1.
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
   567
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
   568
	    [low > 0 or:[hi < 255]] whileTrue:[
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
   569
		direction > 0 ifTrue:[
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
   570
		    hi := hi + 1.
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
   571
		    tryHostID := hi.
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
   572
		    direction := -1.
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
   573
		] ifFalse:[
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
   574
		    low := low - 1.
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
   575
		    tryHostID := low.
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
   576
		    direction := 1.
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
   577
		].
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
   578
		(tryHostID between:1 and:254) ifTrue:[
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
   579
		    dottedName := (myAddress at:1) printString
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
   580
				  , '.' , (myAddress at:2) printString
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
   581
				  , '.' , (myAddress at:3) printString
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
   582
				  , '.' , tryHostID printString.
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
   583
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
   584
		    top label:'PING net walk - trying ' , dottedName.
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
   585
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
   586
		    top windowGroup withCursor:Cursor wait do:[
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
   587
			conn := Socket newTCPclientToHost:dottedName port:port withTimeout:1000.
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
   588
			conn notNil ifTrue:[
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
   589
			    addr := Socket ipAddressOfHost:dottedName.
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
   590
			    hostName := Socket hostWithIpAddress:addr.
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
   591
			    hostName isNil ifTrue:[
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
   592
				hostName :='?'
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
   593
			    ].
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
   594
			    l add:(dottedName paddedTo:15 with:Character space)
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
   595
				   , ' '
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
   596
				   , (hostName paddedTo:15 with:Character space)
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
   597
				   , ' up & reachable'.
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
   598
			    list list:l.
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
   599
			    conn close.
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
   600
			]
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
   601
		    ].
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
   602
		].
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
   603
	    ].
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
   604
	    top label:'PING reachable hosts'.
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
   605
	] forkAt:(Processor userBackgroundPriority).
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
   606
	walkProcess name:'ping net walker'.
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
   607
									[exEnd]
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
   608
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
   609
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
   610
	This example creates a simple UDP server that accepts
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
   611
	single packets from anybody and broadcasts them to all
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
   612
	clients that have connected so far.
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
   613
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
   614
									[exBegin]
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
   615
	| socket address buffer msgSize clients |
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
   616
	clients := Set new.
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
   617
	address := IPSocketAddress new.
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
   618
	buffer := String new: 1024.
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
   619
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
   620
	socket := self newUDPserverAtPort: 6666.
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
   621
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
   622
	Transcript showCR: 'server starting'.
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
   623
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
   624
	[
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
   625
	    [true] whileTrue: [
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
   626
		(socket readWaitWithTimeoutMs: 200) ifFalse: [
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
   627
		    msgSize := socket
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
   628
			    receiveFrom: address
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
   629
			    buffer: buffer
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
   630
			    start: 1
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
   631
			    for: buffer size.
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
   632
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
   633
		    clients add: address copy.
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
   634
		    clients do: [ :clientAddress |
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
   635
			    socket
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
   636
				    sendTo: clientAddress
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
   637
				    buffer: buffer
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
   638
				    start: 1
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
   639
				    for: msgSize]]
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
   640
	    ]
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
   641
	] ensure:[
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
   642
	    Transcript showCR: 'server shutting down'.
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
   643
	    socket close
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
   644
	]
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
   645
									[exEnd]
817
eda0065cbd47 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 814
diff changeset
   646
eda0065cbd47 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 814
diff changeset
   647
   send a datagram to above server:
5473
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
   648
									[exBegin]
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
   649
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
   650
	| socket address buffer host msg |
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
   651
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
   652
	host := Dialog
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
   653
		request: 'What is the name of the server''s host?'
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
   654
		initialAnswer: 'localhost'.
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
   655
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
   656
	socket := self newUDP.
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
   657
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
   658
	address := IPSocketAddress hostName: host port: 6666.
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
   659
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
   660
	buffer := ByteArray new: 1000.
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
   661
	[
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
   662
	    [(msg := Dialog request: 'Say something') isEmpty] whileFalse:[
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
   663
		| replySize stream |
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
   664
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
   665
		socket writeWait.
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
   666
		stream := buffer writeStream.
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
   667
		stream nextPutAll: msg.
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
   668
		socket sendTo:address buffer:buffer start:1 for:stream position.
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
   669
		socket readWait.
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
   670
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
   671
		replySize := socket receiveFrom:address buffer:buffer.
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
   672
		replySize > 0 ifTrue: [
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
   673
		    Transcript cr; nextPutAll: 'Server acknowledged: '.
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
   674
		    Transcript show: ((buffer copyFrom: 1 to: replySize) asString)
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
   675
		]
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
   676
	    ]
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
   677
	] ensure: [socket close].
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
   678
	Transcript cr
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
   679
									[exEnd]
1316
ffe05bfee9b5 example
Claus Gittinger <cg@exept.de>
parents: 1313
diff changeset
   680
ffe05bfee9b5 example
Claus Gittinger <cg@exept.de>
parents: 1313
diff changeset
   681
ffe05bfee9b5 example
Claus Gittinger <cg@exept.de>
parents: 1313
diff changeset
   682
   loopBack:
5473
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
   683
									[exBegin]
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
   684
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
   685
	|readerTask readingSocket writingSocket|
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
   686
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
   687
	readingSocket := self newTCPserverAtPort:9999.
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
   688
	readerTask :=
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
   689
	    [
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
   690
		|connection|
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
   691
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
   692
		readingSocket listenFor:1.
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
   693
		connection := readingSocket accept.
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
   694
		readingSocket close.
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
   695
		[connection atEnd] whileFalse:[
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
   696
		    Transcript showCR:(connection nextLine).
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
   697
		].
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
   698
		connection close.
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
   699
	    ] fork.
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
   700
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
   701
	Delay waitForSeconds:1.
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
   702
	writingSocket := self newTCPclientToHost:'localhost' port:9999.
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
   703
	writingSocket nextPutLine:'Hello'.
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
   704
	writingSocket nextPutLine:'World'.
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
   705
	writingSocket close.
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
   706
									[exEnd]
25
996051271ce9 *** empty log message ***
claus
parents: 21
diff changeset
   707
"
996051271ce9 *** empty log message ***
claus
parents: 21
diff changeset
   708
! !
996051271ce9 *** empty log message ***
claus
parents: 21
diff changeset
   709
1462
5602fce52b42 squeak stuff
Claus Gittinger <cg@exept.de>
parents: 1413
diff changeset
   710
!Socket class methodsFor:'instance creation'!
126
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
   711
3059
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
   712
bindTo:aSocketAddress type:aTypeSymbol
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
   713
    "create a socket for a specific type
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
   714
     and bind it to aSocketAddress.
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
   715
     Type must be:
5473
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
   716
	#stream, #datagram or #raw
3059
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
   717
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
   718
     Neither connect nor connect-wait is done."
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
   719
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
   720
    |newSock|
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
   721
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
   722
    newSock := self domain:aSocketAddress domain type:aTypeSymbol.
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
   723
    [
5473
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
   724
	newSock bindTo:aSocketAddress reuseAddress:true.
3059
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
   725
    ] ifCurtailed:[
5473
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
   726
	newSock close.
3059
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
   727
    ].
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
   728
    ^ newSock
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
   729
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
   730
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
   731
    "
5473
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
   732
	Socket bindTo:(IPSocketAddress anyHost port:8081) type:#stream.
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
   733
	Socket bindTo:(IPv6SocketAddress anyHost port:8081) type:#datagram.
3059
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
   734
    "
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
   735
!
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
   736
126
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
   737
domain:domainSymbol type:type
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
   738
    "create a socket for domain and type -
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
   739
     neither any connect nor binding is done.
1485
d8578cf3504b gcc3.3.1 insn-scheduler bug workaround
Claus Gittinger <cg@exept.de>
parents: 1474
diff changeset
   740
     Domain must be one of the symbols:
5473
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
   741
	#inet, #unix, #appletalk, #decnet, #xns, ...;
819
4cc15700d123 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 817
diff changeset
   742
     Type must be:
5473
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
   743
	#stream, #datagram or #raw
3059
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
   744
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
   745
     XXX: currently only the #AF_INET and #AF_INET6 and #AF_UNIX domains are supported"
126
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
   746
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
   747
    ^ self new domain:domainSymbol type:type
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
   748
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
   749
    "
3059
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
   750
     Socket domain:#AF_INET type:#stream
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
   751
     Socket domain:#AF_INET type:#datagram
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
   752
     Socket domain:#AF_INET6 type:#stream
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
   753
     Socket domain:#AF_INET6 type:#datagram
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
   754
     Socket domain:#AF_UNIX type:#stream
126
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
   755
    "
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
   756
!
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
   757
4955
a5b7af921f9e #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4944
diff changeset
   758
newIPv6
a5b7af921f9e #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4944
diff changeset
   759
    "create an IPv6 socket - no binding or other setup is done,
a5b7af921f9e #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4944
diff changeset
   760
     neither connect nor connect-wait is done."
a5b7af921f9e #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4944
diff changeset
   761
a5b7af921f9e #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4944
diff changeset
   762
    ^ self new domain:#'AF_INET6' type:#stream
a5b7af921f9e #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4944
diff changeset
   763
a5b7af921f9e #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4944
diff changeset
   764
    "
a5b7af921f9e #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4944
diff changeset
   765
      Socket newIPv6
a5b7af921f9e #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4944
diff changeset
   766
    "
a5b7af921f9e #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4944
diff changeset
   767
a5b7af921f9e #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4944
diff changeset
   768
    "Created: / 27-05-2019 / 14:06:23 / Claus Gittinger"
a5b7af921f9e #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4944
diff changeset
   769
!
a5b7af921f9e #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4944
diff changeset
   770
a5b7af921f9e #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4944
diff changeset
   771
newIPv6:portNrOrServiceName
a5b7af921f9e #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4944
diff changeset
   772
    "create an IPv6 socket for a service -
a5b7af921f9e #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4944
diff changeset
   773
     neither connect nor connect-wait is done."
a5b7af921f9e #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4944
diff changeset
   774
a5b7af921f9e #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4944
diff changeset
   775
    |newSock socketAddress socketAddressClass|
a5b7af921f9e #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4944
diff changeset
   776
a5b7af921f9e #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4944
diff changeset
   777
    newSock := self newIPv6.
a5b7af921f9e #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4944
diff changeset
   778
    (newSock notNil and:[portNrOrServiceName notNil]) ifTrue:[
5473
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
   779
	[
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
   780
	    socketAddressClass := newSock socketAddressClass.
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
   781
	    socketAddress := socketAddressClass hostName:nil serviceName:portNrOrServiceName type:#stream.
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
   782
	    socketAddress hostAddress:socketAddressClass anyAddress.
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
   783
	    newSock bindTo:socketAddress reuseAddress:true.
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
   784
	] ifCurtailed:[
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
   785
	    newSock close.
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
   786
	]
4955
a5b7af921f9e #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4944
diff changeset
   787
    ].
a5b7af921f9e #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4944
diff changeset
   788
    ^ newSock
a5b7af921f9e #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4944
diff changeset
   789
a5b7af921f9e #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4944
diff changeset
   790
a5b7af921f9e #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4944
diff changeset
   791
    "
a5b7af921f9e #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4944
diff changeset
   792
     (Socket newIPv6:9996).
a5b7af921f9e #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4944
diff changeset
   793
4961
a1c49a18e83d #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 4955
diff changeset
   794
     test (eval the code below, then open a browser on (replace by your own IPv6 address)
5473
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
   795
	http://[2003:a:e4d:bb01:a17f:9312:54cb:fed7]:9997/
5001
11cbbbcbc87e warnings
Claus Gittinger <cg@exept.de>
parents: 4961
diff changeset
   796
11cbbbcbc87e warnings
Claus Gittinger <cg@exept.de>
parents: 4961
diff changeset
   797
     (Socket newIPv6:9997)
5473
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
   798
	listenFor:1;
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
   799
	readWait;
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
   800
	accept.
5001
11cbbbcbc87e warnings
Claus Gittinger <cg@exept.de>
parents: 4961
diff changeset
   801
4955
a5b7af921f9e #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4944
diff changeset
   802
    "
a5b7af921f9e #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4944
diff changeset
   803
a5b7af921f9e #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4944
diff changeset
   804
    "Created: / 27-05-2019 / 14:06:49 / Claus Gittinger"
a5b7af921f9e #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4944
diff changeset
   805
!
a5b7af921f9e #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4944
diff changeset
   806
126
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
   807
newTCP
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
   808
    "create a TCP socket - no binding or other setup is done,
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
   809
     neither connect nor connect-wait is done."
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
   810
3059
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
   811
    ^ self new domain:#'AF_INET' type:#stream
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
   812
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
   813
    "
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
   814
      Socket newTCP
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
   815
    "
126
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
   816
!
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
   817
4944
f4f8254bfb3b #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 4942
diff changeset
   818
newTCP:portNrOrServiceName
126
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
   819
    "create a TCP socket for a service -
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
   820
     neither connect nor connect-wait is done."
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
   821
3059
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
   822
    |newSock socketAddress socketAddressClass|
126
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
   823
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
   824
    newSock := self newTCP.
4944
f4f8254bfb3b #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 4942
diff changeset
   825
    (newSock notNil and:[portNrOrServiceName notNil]) ifTrue:[
5473
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
   826
	[
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
   827
	    socketAddressClass := newSock socketAddressClass.
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
   828
	    socketAddress := socketAddressClass hostName:nil serviceName:portNrOrServiceName type:#stream.
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
   829
	    socketAddress hostAddress:socketAddressClass anyAddress.
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
   830
	    newSock bindTo:socketAddress reuseAddress:true.
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
   831
	] ifCurtailed:[
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
   832
	    newSock close.
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
   833
	]
126
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
   834
    ].
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
   835
    ^ newSock
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
   836
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
   837
1911
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
   838
    "
5473
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
   839
	Socket newTCP:'http-alt'.
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
   840
	Socket newTCP:9996.
1911
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
   841
    "
4944
f4f8254bfb3b #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 4942
diff changeset
   842
f4f8254bfb3b #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 4942
diff changeset
   843
    "Modified (comment): / 17-05-2019 / 13:10:18 / Claus Gittinger"
126
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
   844
!
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
   845
576
13acab81fad0 more ST80 compatibility
ca
parents: 572
diff changeset
   846
newTCPclientToAddress:aHostAddress port:aService
13acab81fad0 more ST80 compatibility
ca
parents: 572
diff changeset
   847
    "create a new TCP client socket connecting to a service.
13acab81fad0 more ST80 compatibility
ca
parents: 572
diff changeset
   848
     Return a socket instance if ok, nil on failure.
13acab81fad0 more ST80 compatibility
ca
parents: 572
diff changeset
   849
     Block until a connection is established (but only the current thread;
1485
d8578cf3504b gcc3.3.1 insn-scheduler bug workaround
Claus Gittinger <cg@exept.de>
parents: 1474
diff changeset
   850
     not the whole smalltalk).
576
13acab81fad0 more ST80 compatibility
ca
parents: 572
diff changeset
   851
     See also: #newTCPclientToAddress:port:withTimeout:"
13acab81fad0 more ST80 compatibility
ca
parents: 572
diff changeset
   852
13acab81fad0 more ST80 compatibility
ca
parents: 572
diff changeset
   853
    ^ self newTCPclientToAddress:aHostAddress port:aService withTimeout:nil
13acab81fad0 more ST80 compatibility
ca
parents: 572
diff changeset
   854
!
13acab81fad0 more ST80 compatibility
ca
parents: 572
diff changeset
   855
4570
39e965ca8d06 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4568
diff changeset
   856
newTCPclientToAddress:aSocketAddressOrByteArray port:aService withTimeout:milliSecondsOrTimeDuration
576
13acab81fad0 more ST80 compatibility
ca
parents: 572
diff changeset
   857
    "create a new TCP client socket connecting to a service.
13acab81fad0 more ST80 compatibility
ca
parents: 572
diff changeset
   858
     Return a socket instance if ok, nil on failure.
13acab81fad0 more ST80 compatibility
ca
parents: 572
diff changeset
   859
     If the millis arg is nonNil, stop trying to connect after that many milliseconds
811
72d9ac1a7f95 comments
Claus Gittinger <cg@exept.de>
parents: 809
diff changeset
   860
     and return nil."
576
13acab81fad0 more ST80 compatibility
ca
parents: 572
diff changeset
   861
3059
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
   862
    |port socketAddress|
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
   863
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
   864
    aService isString ifTrue:[
5473
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
   865
	port := self portOfService:aService protocol:#tcp.
3059
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
   866
    ] ifFalse:[
5473
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
   867
	port := aService.
3059
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
   868
    ].
3217
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
   869
    socketAddress := aSocketAddressOrByteArray isSocketAddress
5473
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
   870
			ifTrue:[aSocketAddressOrByteArray]
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
   871
			ifFalse:[
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
   872
			    "Passing ByteArrays is obsolete and only supported for IPv4"
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
   873
			    IPSocketAddress hostAddress:aSocketAddressOrByteArray
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
   874
			].
3059
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
   875
    port notNil ifTrue:[
5473
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
   876
	socketAddress port:port.
3059
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
   877
    ].
4570
39e965ca8d06 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4568
diff changeset
   878
    ^ self newTCPclientToAddress:socketAddress withTimeout:milliSecondsOrTimeDuration
39e965ca8d06 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4568
diff changeset
   879
39e965ca8d06 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4568
diff changeset
   880
    "Modified (format): / 19-01-2018 / 18:26:51 / stefan"
576
13acab81fad0 more ST80 compatibility
ca
parents: 572
diff changeset
   881
!
13acab81fad0 more ST80 compatibility
ca
parents: 572
diff changeset
   882
4570
39e965ca8d06 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4568
diff changeset
   883
newTCPclientToAddress:aSocketAddress withTimeout:milliSecondsOrTimeDuration
126
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
   884
    "create a new TCP client socket connecting to a service.
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
   885
     Return a socket instance if ok, nil on failure.
3059
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
   886
     If the millis arg is nonNil, stop trying to connect after that many milliseconds
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
   887
     and return nil."
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
   888
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
   889
    |socket|
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
   890
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
   891
    socket := self domain:aSocketAddress domain type:#stream.
4570
39e965ca8d06 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4568
diff changeset
   892
    ^ [
5473
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
   893
	(socket connectTo:aSocketAddress withTimeout:milliSecondsOrTimeDuration)
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
   894
	ifTrue:[socket] ifFalse:[socket close. nil]
4570
39e965ca8d06 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4568
diff changeset
   895
    ] ifCurtailed:[
5473
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
   896
	socket close.
3059
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
   897
    ].
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
   898
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
   899
    "
5473
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
   900
	self newTCPclientToAddress:(IPv6SocketAddress hostName:'www.exept.de' port:80) withTimeout:nil
3059
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
   901
    "
4570
39e965ca8d06 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4568
diff changeset
   902
39e965ca8d06 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4568
diff changeset
   903
    "Modified (format): / 19-01-2018 / 18:22:30 / stefan"
3059
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
   904
!
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
   905
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
   906
newTCPclientToHost:hostNameOrAddress port:aPortOrServiceName
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
   907
    "create a new TCP client socket connecting to a service.
3985
f4df11cffecf #OTHER by mawalch
mawalch
parents: 3843
diff changeset
   908
     If hostNameOrAddress is a string, try all the resolved addresses regardless
3988
7bf762b79544 #DOCUMENTATION by mawalch
mawalch
parents: 3985
diff changeset
   909
     whether for IPv4 or IPv6.
3059
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
   910
     Return a socket instance if ok, nil on failure.
126
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
   911
     Block until a connection is established (but only the current thread;
1485
d8578cf3504b gcc3.3.1 insn-scheduler bug workaround
Claus Gittinger <cg@exept.de>
parents: 1474
diff changeset
   912
     not the whole smalltalk).
126
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
   913
     See also: #newTCPclientToHost:port:withTimeout:"
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
   914
3590
3487165a9cdf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3550
diff changeset
   915
    ^ self
5473
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
   916
	newTCPclientToHost:hostNameOrAddress
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
   917
	port:aPortOrServiceName
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
   918
	domain:self defaultIpDomainForConnect
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
   919
	withTimeout:nil
126
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
   920
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
   921
    "
4239
827d8755965f #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4234
diff changeset
   922
      Socket newTCPclientToHost:'www.exept.de' port:'https'
126
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
   923
    "
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
   924
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
   925
    "Created: 31.10.1995 / 18:54:11 / cg"
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
   926
!
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
   927
5476
7355a4b11cb6 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5474
diff changeset
   928
newTCPclientToHost:hostNameOrAddress port:aPortOrServiceName domain:aDomainSymbolOrNil domainOrder:orderOrNil withTimeout:milliSecondsOrTimeDuration
3059
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
   929
    "create a new TCP client socket connecting to a service on hostNameOrAddress.
3985
f4df11cffecf #OTHER by mawalch
mawalch
parents: 3843
diff changeset
   930
     If hostNameOrAddress is a string, try all the resolved addresses.
126
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
   931
     Return a socket instance if ok, nil on failure.
3059
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
   932
     Set aDomainSymbolOrNil to #AF_INET of #AF_INET6 to connect via a defined protocol.
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
   933
     Set aDomainSymbolOrNil to nil, to try all protocols.
4570
39e965ca8d06 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4568
diff changeset
   934
     If the milliSecondsOrTimeDuration arg is nonNil, stop trying to connect after that many milliSecondsOrTimeDurationeconds
3059
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
   935
     and return nil."
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
   936
4570
39e965ca8d06 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4568
diff changeset
   937
    |socket addressList lastDomainSymbol lastNotification|
3059
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
   938
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
   939
    hostNameOrAddress isString ifFalse:[
5476
7355a4b11cb6 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5474
diff changeset
   940
        ^ self newTCPclientToAddress:hostNameOrAddress port:aPortOrServiceName withTimeout:milliSecondsOrTimeDuration.
126
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
   941
    ].
3059
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
   942
4341
2b08cb3ff1a3 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 4320
diff changeset
   943
    addressList := SocketAddress
5476
7355a4b11cb6 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5474
diff changeset
   944
                        allForHostName:hostNameOrAddress
7355a4b11cb6 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5474
diff changeset
   945
                        serviceName:aPortOrServiceName
7355a4b11cb6 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5474
diff changeset
   946
                        domain:aDomainSymbolOrNil
7355a4b11cb6 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5474
diff changeset
   947
                        type:#stream.
7355a4b11cb6 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5474
diff changeset
   948
7355a4b11cb6 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5474
diff changeset
   949
    orderOrNil notNil ifTrue:[
7355a4b11cb6 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5474
diff changeset
   950
        addressList sort:[:a1 :a2 | (orderOrNil indexOf:a1 domain) < (orderOrNil indexOf:a2 domain)].
7355a4b11cb6 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5474
diff changeset
   951
    ].
4341
2b08cb3ff1a3 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 4320
diff changeset
   952
2b08cb3ff1a3 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 4320
diff changeset
   953
    addressList do:[:eachAddress|
5476
7355a4b11cb6 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5474
diff changeset
   954
        |domainSymbol|
7355a4b11cb6 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5474
diff changeset
   955
7355a4b11cb6 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5474
diff changeset
   956
        domainSymbol := eachAddress domain.
7355a4b11cb6 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5474
diff changeset
   957
        domainSymbol ~~ lastDomainSymbol ifTrue:[
7355a4b11cb6 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5474
diff changeset
   958
            socket notNil ifTrue:[
7355a4b11cb6 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5474
diff changeset
   959
                socket close.
7355a4b11cb6 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5474
diff changeset
   960
            ].
7355a4b11cb6 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5474
diff changeset
   961
            socket := self new domain:domainSymbol type:#stream.
7355a4b11cb6 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5474
diff changeset
   962
            lastDomainSymbol := domainSymbol.
7355a4b11cb6 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5474
diff changeset
   963
        ].
7355a4b11cb6 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5474
diff changeset
   964
        [
7355a4b11cb6 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5474
diff changeset
   965
            (socket connectTo:eachAddress withTimeout:milliSecondsOrTimeDuration) ifTrue:[
7355a4b11cb6 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5474
diff changeset
   966
                ^ socket.
7355a4b11cb6 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5474
diff changeset
   967
            ].
7355a4b11cb6 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5474
diff changeset
   968
        ] on:SocketErrorNotification do:[:ex|
7355a4b11cb6 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5474
diff changeset
   969
            lastNotification := ex.
7355a4b11cb6 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5474
diff changeset
   970
        ].
3059
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
   971
    ].
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
   972
    socket notNil ifTrue:[
5476
7355a4b11cb6 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5474
diff changeset
   973
        socket close.
4570
39e965ca8d06 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4568
diff changeset
   974
    ].
39e965ca8d06 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4568
diff changeset
   975
    lastNotification notNil ifTrue:[
5476
7355a4b11cb6 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5474
diff changeset
   976
        "if someone is interested in the notification - raise the last one"
7355a4b11cb6 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5474
diff changeset
   977
        lastNotification raiseRequest.
3059
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
   978
    ].
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
   979
    ^ nil.
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
   980
4791
1323fc4dc376 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4774
diff changeset
   981
    "<<EOC
3059
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
   982
      Socket newTCPclientToHost:'www.exept.de' port:80 domain:#'AF_INET' withTimeout:1000.
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
   983
      Socket newTCPclientToHost:'www.exept.de' port:80 domain:#'AF_INET6' withTimeout:1000.
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
   984
      Socket newTCPclientToHost:'www.exept.de' port:80 domain:nil withTimeout:1000.
4791
1323fc4dc376 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4774
diff changeset
   985
1323fc4dc376 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4774
diff changeset
   986
      [
5476
7355a4b11cb6 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5474
diff changeset
   987
        "if nobody is listening (Connection refused") the timeout does not apply"
7355a4b11cb6 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5474
diff changeset
   988
        Socket newTCPclientToHost:'localhost' port:'nntp' withTimeout:10s
4791
1323fc4dc376 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4774
diff changeset
   989
      ] on:SocketErrorNotification do:[:ex|
5476
7355a4b11cb6 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5474
diff changeset
   990
        ex halt.
4791
1323fc4dc376 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4774
diff changeset
   991
      ].
1323fc4dc376 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4774
diff changeset
   992
EOC"
604
b302a21afece Remove redundant code.
Stefan Vogel <sv@exept.de>
parents: 589
diff changeset
   993
5476
7355a4b11cb6 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5474
diff changeset
   994
    "Created: / 02-05-2020 / 21:24:28 / cg"
7355a4b11cb6 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5474
diff changeset
   995
!
7355a4b11cb6 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5474
diff changeset
   996
7355a4b11cb6 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5474
diff changeset
   997
newTCPclientToHost:hostNameOrAddress port:aPortOrServiceName domain:aDomainSymbolOrNil withTimeout:milliSecondsOrTimeDuration
7355a4b11cb6 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5474
diff changeset
   998
    "create a new TCP client socket connecting to a service on hostNameOrAddress.
7355a4b11cb6 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5474
diff changeset
   999
     If hostNameOrAddress is a string, try all the resolved addresses.
7355a4b11cb6 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5474
diff changeset
  1000
     Return a socket instance if ok, nil on failure.
7355a4b11cb6 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5474
diff changeset
  1001
     Set aDomainSymbolOrNil to #AF_INET of #AF_INET6 to connect via a defined protocol.
7355a4b11cb6 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5474
diff changeset
  1002
     Set aDomainSymbolOrNil to nil, to try all protocols.
7355a4b11cb6 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5474
diff changeset
  1003
     If the milliSecondsOrTimeDuration arg is nonNil, stop trying to connect after that many milliSecondsOrTimeDurationeconds
7355a4b11cb6 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5474
diff changeset
  1004
     and return nil."
7355a4b11cb6 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5474
diff changeset
  1005
7355a4b11cb6 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5474
diff changeset
  1006
    ^ self
7355a4b11cb6 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5474
diff changeset
  1007
        newTCPclientToHost:hostNameOrAddress port:aPortOrServiceName domain:aDomainSymbolOrNil 
7355a4b11cb6 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5474
diff changeset
  1008
        domainOrder:nil withTimeout:milliSecondsOrTimeDuration
7355a4b11cb6 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5474
diff changeset
  1009
4570
39e965ca8d06 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4568
diff changeset
  1010
    "Modified: / 19-01-2018 / 18:12:29 / stefan"
4791
1323fc4dc376 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4774
diff changeset
  1011
    "Modified: / 28-01-2019 / 10:48:18 / Stefan Vogel"
5476
7355a4b11cb6 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5474
diff changeset
  1012
    "Modified: / 02-05-2020 / 21:39:18 / cg"
126
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
  1013
!
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
  1014
4570
39e965ca8d06 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4568
diff changeset
  1015
newTCPclientToHost:hostNameOrAddress port:aPortOrServiceName withTimeout:milliSecondsOrTimeDuration
3059
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  1016
    "create a new TCP client socket connecting to a service on hostNameOrAddress.
3985
f4df11cffecf #OTHER by mawalch
mawalch
parents: 3843
diff changeset
  1017
     If hostNameOrAddress is a string, try all the resolved addresses regardless
3988
7bf762b79544 #DOCUMENTATION by mawalch
mawalch
parents: 3985
diff changeset
  1018
     whether for IPv4 or IPv6.
3059
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  1019
     Return a socket instance if ok, nil on failure.
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  1020
     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
  1021
     and return nil."
3217
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  1022
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  1023
    ^ self
5473
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  1024
	newTCPclientToHost:hostNameOrAddress
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  1025
	port:aPortOrServiceName
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  1026
	domain:self defaultIpDomainForConnect
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  1027
	withTimeout:milliSecondsOrTimeDuration
4570
39e965ca8d06 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4568
diff changeset
  1028
39e965ca8d06 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4568
diff changeset
  1029
    "Modified (format): / 19-01-2018 / 18:24:57 / stefan"
3059
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  1030
!
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  1031
506
11ef93d12870 support anonymous (OS_specified) ports. (for FTP-protocol)
Claus Gittinger <cg@exept.de>
parents: 486
diff changeset
  1032
newTCPserverAtAnonymousPort
11ef93d12870 support anonymous (OS_specified) ports. (for FTP-protocol)
Claus Gittinger <cg@exept.de>
parents: 486
diff changeset
  1033
    "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
  1034
     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
  1035
811
72d9ac1a7f95 comments
Claus Gittinger <cg@exept.de>
parents: 809
diff changeset
  1036
    ^ self newTCPserverAtPort:0
506
11ef93d12870 support anonymous (OS_specified) ports. (for FTP-protocol)
Claus Gittinger <cg@exept.de>
parents: 486
diff changeset
  1037
11ef93d12870 support anonymous (OS_specified) ports. (for FTP-protocol)
Claus Gittinger <cg@exept.de>
parents: 486
diff changeset
  1038
!
11ef93d12870 support anonymous (OS_specified) ports. (for FTP-protocol)
Claus Gittinger <cg@exept.de>
parents: 486
diff changeset
  1039
4944
f4f8254bfb3b #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 4942
diff changeset
  1040
newTCPserverAtPort:portNrOrServiceName
126
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
  1041
    "create a new TCP server socket providing service."
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
  1042
4944
f4f8254bfb3b #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 4942
diff changeset
  1043
    ^ self newTCP:portNrOrServiceName
f4f8254bfb3b #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 4942
diff changeset
  1044
f4f8254bfb3b #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 4942
diff changeset
  1045
    "Modified (format): / 17-05-2019 / 13:10:33 / Claus Gittinger"
126
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
  1046
!
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
  1047
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
  1048
newUDP
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
  1049
    "create a UDP socket - no binding or other setup is done,
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
  1050
     neither connect nor connect-wait is done."
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
  1051
3059
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  1052
    ^ self new domain:#'AF_INET' type:#datagram
126
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
  1053
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
  1054
    "Socket newUDP"
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
  1055
!
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
  1056
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
  1057
newUDP:aServiceOrNil
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
  1058
    "create a UDP socket for a service -
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
  1059
     neither connect nor connect-wait is done."
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
  1060
3059
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  1061
    |newSock socketAddressClass socketAddress|
126
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
  1062
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
  1063
    newSock := self newUDP.
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
  1064
    (newSock notNil and:[aServiceOrNil notNil]) ifTrue:[
5473
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  1065
	[
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  1066
	    socketAddressClass := newSock socketAddressClass.
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  1067
	    socketAddress := socketAddressClass hostName:nil serviceName:aServiceOrNil type:#stream.
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  1068
	    socketAddress hostAddress:socketAddressClass anyAddress.
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  1069
	    newSock bindTo:socketAddress reuseAddress:true.
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  1070
	] ifCurtailed:[
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  1071
	    newSock close.
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  1072
	]
126
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
  1073
    ].
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
  1074
    ^ newSock
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
  1075
1911
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
  1076
    "
5473
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  1077
	Socket newUDP:4444.
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  1078
	Socket newUDP:'activesync'.
1911
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
  1079
    "
126
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
  1080
!
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
  1081
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
  1082
newUDPserverAtPort:aService
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
  1083
    "create a new UDP server socket providing service."
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
  1084
1911
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
  1085
    ^ self newUDP:aService
126
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
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
  1088
newUNIX
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
  1089
    "create a UNIX domain socket - no binding or other setup is done,
811
72d9ac1a7f95 comments
Claus Gittinger <cg@exept.de>
parents: 809
diff changeset
  1090
     neither connect nor connect-wait is done.
72d9ac1a7f95 comments
Claus Gittinger <cg@exept.de>
parents: 809
diff changeset
  1091
     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
  1092
     return nil."
126
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
  1093
3059
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  1094
    ^ self new domain:#'AF_UNIX' type:#stream
126
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
  1095
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
  1096
    "
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
  1097
     Socket newUNIX
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
  1098
    "
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
  1099
!
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
  1100
1485
d8578cf3504b gcc3.3.1 insn-scheduler bug workaround
Claus Gittinger <cg@exept.de>
parents: 1474
diff changeset
  1101
newUNIXclientTo:pathName
126
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
  1102
    "create a new UNIX client socket connecting to a pathname.
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
  1103
     Return a socket instance if ok, nil on failure.
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
  1104
     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
  1105
     not the whole smalltalk).
811
72d9ac1a7f95 comments
Claus Gittinger <cg@exept.de>
parents: 809
diff changeset
  1106
     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
  1107
     return nil.
126
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
  1108
     See also: #newUNIXclientTo:withTimeout:"
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
  1109
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
  1110
    ^ self newUNIXclientTo:pathName withTimeout:nil
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
  1111
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
  1112
!
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
  1113
4570
39e965ca8d06 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4568
diff changeset
  1114
newUNIXclientTo:pathName withTimeout:milliSecondsOrTimeDuration
126
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
  1115
    "create a new UNIX client socket connecting to a pathname.
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
  1116
     Return a socket instance if ok, nil on failure.
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
  1117
     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
  1118
     and return nil.
72d9ac1a7f95 comments
Claus Gittinger <cg@exept.de>
parents: 809
diff changeset
  1119
     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
  1120
     return nil."
126
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
  1121
4570
39e965ca8d06 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4568
diff changeset
  1122
    |socket|
39e965ca8d06 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4568
diff changeset
  1123
39e965ca8d06 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4568
diff changeset
  1124
    socket := self newUNIX.
39e965ca8d06 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4568
diff changeset
  1125
    socket isNil ifTrue:[
5473
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  1126
	^ nil.
126
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
  1127
    ].
4570
39e965ca8d06 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4568
diff changeset
  1128
    ^ [
5473
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  1129
	(socket connectTo:(UDSocketAddress name:pathName) withTimeout:milliSecondsOrTimeDuration)
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  1130
	ifTrue:[socket] ifFalse:[socket close. nil]
4570
39e965ca8d06 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4568
diff changeset
  1131
    ] ifCurtailed:[
5473
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  1132
	socket close.
4570
39e965ca8d06 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4568
diff changeset
  1133
    ].
126
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
  1134
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
  1135
    "
5473
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  1136
	Socket newUNIXclientTo:'/tmp/foo'
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  1137
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  1138
	[
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  1139
	    Socket newUNIXclientTo:'/tmp/foo'
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  1140
	] on:SocketErrorNotification do:[:ex|
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  1141
	    ex halt.
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  1142
	]
126
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
  1143
    "
4570
39e965ca8d06 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4568
diff changeset
  1144
39e965ca8d06 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4568
diff changeset
  1145
    "Modified (format): / 19-01-2018 / 18:23:24 / stefan"
126
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
  1146
!
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
  1147
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
  1148
newUNIXserverAt:pathName
811
72d9ac1a7f95 comments
Claus Gittinger <cg@exept.de>
parents: 809
diff changeset
  1149
    "create a new UNIX server socket providing service at a pathname.
72d9ac1a7f95 comments
Claus Gittinger <cg@exept.de>
parents: 809
diff changeset
  1150
     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
  1151
     return nil."
126
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
  1152
3059
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  1153
    ^ self bindTo:(UDSocketAddress name:pathName) type:#stream.
126
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
  1154
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
  1155
    "
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
  1156
     |s s2|
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
  1157
3059
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  1158
    '/tmp/foo' asFilename remove.
126
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
  1159
     s := Socket newUNIXserverAt:'/tmp/foo'.
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
  1160
     s listenFor:5.
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
  1161
     s2 := s accept.
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
  1162
    "
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
  1163
! !
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
  1164
1462
5602fce52b42 squeak stuff
Claus Gittinger <cg@exept.de>
parents: 1413
diff changeset
  1165
!Socket class methodsFor:'Compatibility-ST80'!
5602fce52b42 squeak stuff
Claus Gittinger <cg@exept.de>
parents: 1413
diff changeset
  1166
5602fce52b42 squeak stuff
Claus Gittinger <cg@exept.de>
parents: 1413
diff changeset
  1167
family:domainSymbol type:typeSymbol
5602fce52b42 squeak stuff
Claus Gittinger <cg@exept.de>
parents: 1413
diff changeset
  1168
    "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
  1169
     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
  1170
     Type must be #stream, #datagram or #raw."
1462
5602fce52b42 squeak stuff
Claus Gittinger <cg@exept.de>
parents: 1413
diff changeset
  1171
5602fce52b42 squeak stuff
Claus Gittinger <cg@exept.de>
parents: 1413
diff changeset
  1172
    ^ self domain:domainSymbol type:typeSymbol
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
    "
3059
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  1175
     Socket family:#AF_INET type:#stream
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  1176
     Socket family:#AF_INET type:#datagram
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  1177
     Socket family:#AF_UNIX type:#stream
1462
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
!
5602fce52b42 squeak stuff
Claus Gittinger <cg@exept.de>
parents: 1413
diff changeset
  1180
5602fce52b42 squeak stuff
Claus Gittinger <cg@exept.de>
parents: 1413
diff changeset
  1181
getHostname
3462
cfdc47761d0f class: Socket
Claus Gittinger <cg@exept.de>
parents: 3281
diff changeset
  1182
    "return the computer's hostname string"
1462
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
    ^ OperatingSystem getHostName
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
    "Created: / 27.2.1998 / 02:32:17 / cg"
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
sockStream
5602fce52b42 squeak stuff
Claus Gittinger <cg@exept.de>
parents: 1413
diff changeset
  1190
    "return the type code for stream sockets"
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
    ^ #stream
5602fce52b42 squeak stuff
Claus Gittinger <cg@exept.de>
parents: 1413
diff changeset
  1193
! !
5602fce52b42 squeak stuff
Claus Gittinger <cg@exept.de>
parents: 1413
diff changeset
  1194
1600
f3acd5382fa1 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1584
diff changeset
  1195
!Socket class methodsFor:'Compatibility-Squeak'!
f3acd5382fa1 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1584
diff changeset
  1196
2900
0e8b305e9a98 class: Socket
Claus Gittinger <cg@exept.de>
parents: 2899
diff changeset
  1197
deadlineSecs:seconds
0e8b305e9a98 class: Socket
Claus Gittinger <cg@exept.de>
parents: 2899
diff changeset
  1198
    ^ Timestamp now addSeconds:seconds
0e8b305e9a98 class: Socket
Claus Gittinger <cg@exept.de>
parents: 2899
diff changeset
  1199
!
0e8b305e9a98 class: Socket
Claus Gittinger <cg@exept.de>
parents: 2899
diff changeset
  1200
1600
f3acd5382fa1 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1584
diff changeset
  1201
initializeNetwork
f3acd5382fa1 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1584
diff changeset
  1202
    "/ intentionally left blank here
f3acd5382fa1 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1584
diff changeset
  1203
!
f3acd5382fa1 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1584
diff changeset
  1204
4587
caa262d036d2 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4570
diff changeset
  1205
openConnectionToHostNamed:hostName port:portNr
caa262d036d2 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4570
diff changeset
  1206
    ^ self newTCPclientToHost:hostName port:portNr
caa262d036d2 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4570
diff changeset
  1207
!
caa262d036d2 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4570
diff changeset
  1208
3485
2afd6854bff9 class: Socket
Claus Gittinger <cg@exept.de>
parents: 3484
diff changeset
  1209
standardDeadline
2afd6854bff9 class: Socket
Claus Gittinger <cg@exept.de>
parents: 3484
diff changeset
  1210
    "a standard timeout in seconds for connection setup;
2afd6854bff9 class: Socket
Claus Gittinger <cg@exept.de>
parents: 3484
diff changeset
  1211
     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
  1212
2afd6854bff9 class: Socket
Claus Gittinger <cg@exept.de>
parents: 3484
diff changeset
  1213
    ^ 30
2afd6854bff9 class: Socket
Claus Gittinger <cg@exept.de>
parents: 3484
diff changeset
  1214
!
2afd6854bff9 class: Socket
Claus Gittinger <cg@exept.de>
parents: 3484
diff changeset
  1215
2292
c4b0b901278e added: #standardTimeout
Claus Gittinger <cg@exept.de>
parents: 1940
diff changeset
  1216
standardTimeout
3485
2afd6854bff9 class: Socket
Claus Gittinger <cg@exept.de>
parents: 3484
diff changeset
  1217
    "a standard timeout in seconds for transfers;
2afd6854bff9 class: Socket
Claus Gittinger <cg@exept.de>
parents: 3484
diff changeset
  1218
     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
  1219
2292
c4b0b901278e added: #standardTimeout
Claus Gittinger <cg@exept.de>
parents: 1940
diff changeset
  1220
    ^ 30
c4b0b901278e added: #standardTimeout
Claus Gittinger <cg@exept.de>
parents: 1940
diff changeset
  1221
!
c4b0b901278e added: #standardTimeout
Claus Gittinger <cg@exept.de>
parents: 1940
diff changeset
  1222
1600
f3acd5382fa1 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1584
diff changeset
  1223
wildcardPort
f3acd5382fa1 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1584
diff changeset
  1224
    ^ nil
f3acd5382fa1 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1584
diff changeset
  1225
! !
f3acd5382fa1 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1584
diff changeset
  1226
1462
5602fce52b42 squeak stuff
Claus Gittinger <cg@exept.de>
parents: 1413
diff changeset
  1227
!Socket class methodsFor:'Compatibility-VW'!
5602fce52b42 squeak stuff
Claus Gittinger <cg@exept.de>
parents: 1413
diff changeset
  1228
1485
d8578cf3504b gcc3.3.1 insn-scheduler bug workaround
Claus Gittinger <cg@exept.de>
parents: 1474
diff changeset
  1229
AF_INET
1462
5602fce52b42 squeak stuff
Claus Gittinger <cg@exept.de>
parents: 1413
diff changeset
  1230
    ^ #AF_INET
5602fce52b42 squeak stuff
Claus Gittinger <cg@exept.de>
parents: 1413
diff changeset
  1231
!
5602fce52b42 squeak stuff
Claus Gittinger <cg@exept.de>
parents: 1413
diff changeset
  1232
5602fce52b42 squeak stuff
Claus Gittinger <cg@exept.de>
parents: 1413
diff changeset
  1233
SOCK_STREAM
5602fce52b42 squeak stuff
Claus Gittinger <cg@exept.de>
parents: 1413
diff changeset
  1234
    ^ #SOCK_STREAM
5602fce52b42 squeak stuff
Claus Gittinger <cg@exept.de>
parents: 1413
diff changeset
  1235
! !
5602fce52b42 squeak stuff
Claus Gittinger <cg@exept.de>
parents: 1413
diff changeset
  1236
5602fce52b42 squeak stuff
Claus Gittinger <cg@exept.de>
parents: 1413
diff changeset
  1237
!Socket class methodsFor:'Signal constants'!
5602fce52b42 squeak stuff
Claus Gittinger <cg@exept.de>
parents: 1413
diff changeset
  1238
5602fce52b42 squeak stuff
Claus Gittinger <cg@exept.de>
parents: 1413
diff changeset
  1239
brokenConnectionSignal
5602fce52b42 squeak stuff
Claus Gittinger <cg@exept.de>
parents: 1413
diff changeset
  1240
    "return the signal used to tell broken connections.
5602fce52b42 squeak stuff
Claus Gittinger <cg@exept.de>
parents: 1413
diff changeset
  1241
     Since in unix, this is the same as the broken pipe signal,
5602fce52b42 squeak stuff
Claus Gittinger <cg@exept.de>
parents: 1413
diff changeset
  1242
     return that one.
5602fce52b42 squeak stuff
Claus Gittinger <cg@exept.de>
parents: 1413
diff changeset
  1243
     (for other Operatingsystems, this may change ..)"
5602fce52b42 squeak stuff
Claus Gittinger <cg@exept.de>
parents: 1413
diff changeset
  1244
5602fce52b42 squeak stuff
Claus Gittinger <cg@exept.de>
parents: 1413
diff changeset
  1245
    ^ PipeStream brokenPipeSignal
5602fce52b42 squeak stuff
Claus Gittinger <cg@exept.de>
parents: 1413
diff changeset
  1246
!
5602fce52b42 squeak stuff
Claus Gittinger <cg@exept.de>
parents: 1413
diff changeset
  1247
5602fce52b42 squeak stuff
Claus Gittinger <cg@exept.de>
parents: 1413
diff changeset
  1248
invalidArgumentsSignal
5602fce52b42 squeak stuff
Claus Gittinger <cg@exept.de>
parents: 1413
diff changeset
  1249
    "dummy for compatibility"
5602fce52b42 squeak stuff
Claus Gittinger <cg@exept.de>
parents: 1413
diff changeset
  1250
5602fce52b42 squeak stuff
Claus Gittinger <cg@exept.de>
parents: 1413
diff changeset
  1251
    ^ self errorSignal
5602fce52b42 squeak stuff
Claus Gittinger <cg@exept.de>
parents: 1413
diff changeset
  1252
! !
5602fce52b42 squeak stuff
Claus Gittinger <cg@exept.de>
parents: 1413
diff changeset
  1253
5602fce52b42 squeak stuff
Claus Gittinger <cg@exept.de>
parents: 1413
diff changeset
  1254
!Socket class methodsFor:'debugging'!
5602fce52b42 squeak stuff
Claus Gittinger <cg@exept.de>
parents: 1413
diff changeset
  1255
5602fce52b42 squeak stuff
Claus Gittinger <cg@exept.de>
parents: 1413
diff changeset
  1256
debug:aBoolean
5602fce52b42 squeak stuff
Claus Gittinger <cg@exept.de>
parents: 1413
diff changeset
  1257
    "turn on/off internal debugprints.
5602fce52b42 squeak stuff
Claus Gittinger <cg@exept.de>
parents: 1413
diff changeset
  1258
     This method is for ST/X debugging only and
5602fce52b42 squeak stuff
Claus Gittinger <cg@exept.de>
parents: 1413
diff changeset
  1259
     may  be removed in later versions"
5602fce52b42 squeak stuff
Claus Gittinger <cg@exept.de>
parents: 1413
diff changeset
  1260
5602fce52b42 squeak stuff
Claus Gittinger <cg@exept.de>
parents: 1413
diff changeset
  1261
%{  /* NOCONTEXT */
5602fce52b42 squeak stuff
Claus Gittinger <cg@exept.de>
parents: 1413
diff changeset
  1262
5602fce52b42 squeak stuff
Claus Gittinger <cg@exept.de>
parents: 1413
diff changeset
  1263
    __debugging__ = (aBoolean == true);
5602fce52b42 squeak stuff
Claus Gittinger <cg@exept.de>
parents: 1413
diff changeset
  1264
%}
5602fce52b42 squeak stuff
Claus Gittinger <cg@exept.de>
parents: 1413
diff changeset
  1265
    "
5602fce52b42 squeak stuff
Claus Gittinger <cg@exept.de>
parents: 1413
diff changeset
  1266
     Socket debug:true
5602fce52b42 squeak stuff
Claus Gittinger <cg@exept.de>
parents: 1413
diff changeset
  1267
     Socket debug:false
5602fce52b42 squeak stuff
Claus Gittinger <cg@exept.de>
parents: 1413
diff changeset
  1268
    "
5602fce52b42 squeak stuff
Claus Gittinger <cg@exept.de>
parents: 1413
diff changeset
  1269
! !
5602fce52b42 squeak stuff
Claus Gittinger <cg@exept.de>
parents: 1413
diff changeset
  1270
3059
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  1271
!Socket class methodsFor:'defaults'!
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  1272
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  1273
defaultIpDomainForConnect
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  1274
    "answer the domain used to look up host names for connect:
5473
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  1275
	#AF_INET    use only IPv4
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  1276
	#AF_INET6   use only IPv6
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  1277
	nil         use both IPv4 and IPv6"
4239
827d8755965f #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4234
diff changeset
  1278
827d8755965f #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4234
diff changeset
  1279
    ^ nil
3059
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  1280
! !
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  1281
1911
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
  1282
!Socket class methodsFor:'obsolete'!
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
  1283
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
  1284
connectTo:service on:host
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
  1285
    <resource: #obsolete>
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
  1286
    "standard & easy client setup:
5473
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  1287
	create new client tcp socket, bind and connect;
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  1288
	return the socket.
1911
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
  1289
     The thread blocks (interruptable), until the connection is established."
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
  1290
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
  1291
    ^ self newTCPclientToHost:host port:(self portOfService:service).
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
  1292
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
  1293
    "
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
  1294
     Socket connectTo:9995 on:'clam'
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
  1295
     Socket connectTo:4711 on:'exept'
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
  1296
     Socket connectTo:'finger' on:'clam'
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
  1297
     Socket connectTo:'ftp' on:'exept'
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
  1298
     Socket connectTo:'nntp' on:(OperatingSystem getEnvironment:'NNTPSERVER')
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
  1299
    "
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
  1300
!
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
  1301
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
  1302
networkLongOrderIsMSB
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
  1303
    "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
  1304
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
  1305
    <resource: #obsolete>
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
  1306
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
  1307
    ^ true
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
  1308
!
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
  1309
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
  1310
networkShortOrderIsMSB
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
  1311
    "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
  1312
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
  1313
    <resource: #obsolete>
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
  1314
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
  1315
    ^ true
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
  1316
!
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
  1317
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
  1318
provide:aService
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
  1319
    "standard & easy server setup:
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
  1320
     create a new TCP server socket providing a service."
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
  1321
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
  1322
    <resource:#obsolete>
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
  1323
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
  1324
    |newSock|
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
  1325
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
  1326
    self obsoleteMethodWarning:'use #newTCPserverAtPort: / #listen'.
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
  1327
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
  1328
    newSock := self newTCPserverAtPort:(self portOfService:aService).
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
  1329
    newSock notNil ifTrue:[
5473
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  1330
	newSock listenFor:5.
1911
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
  1331
    ].
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
  1332
    ^ newSock
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
  1333
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
  1334
    "
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
  1335
     Socket provide:9995
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
  1336
     (Socket provide:9996) accept
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
  1337
     Socket provide:'nntp'
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
  1338
    "
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
  1339
! !
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
  1340
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
  1341
!Socket class methodsFor:'obsolete host queries'!
525
5891518d17a3 appletalk support - untested
Claus Gittinger <cg@exept.de>
parents: 524
diff changeset
  1342
5891518d17a3 appletalk support - untested
Claus Gittinger <cg@exept.de>
parents: 524
diff changeset
  1343
appletalkAddressOfHost:aHostName
1911
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
  1344
    <resource: #obsolete>
525
5891518d17a3 appletalk support - untested
Claus Gittinger <cg@exept.de>
parents: 524
diff changeset
  1345
    "return the APPLETALK address for a hostname as a byteArray,
819
4cc15700d123 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 817
diff changeset
  1346
     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
  1347
     followed by the node byte.
525
5891518d17a3 appletalk support - untested
Claus Gittinger <cg@exept.de>
parents: 524
diff changeset
  1348
     If the host is unknown, return nil.
812
c8101ea70e6c *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 811
diff changeset
  1349
     This is the reverse operation to #hostWithAppletalkAddress:.
c8101ea70e6c *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 811
diff changeset
  1350
     WARNING: untested code - I have no appletalk to test this."
525
5891518d17a3 appletalk support - untested
Claus Gittinger <cg@exept.de>
parents: 524
diff changeset
  1351
1485
d8578cf3504b gcc3.3.1 insn-scheduler bug workaround
Claus Gittinger <cg@exept.de>
parents: 1474
diff changeset
  1352
    NameLookupError
5473
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  1353
	handle:[:ex |
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  1354
	    ^ nil
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  1355
	]
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  1356
	do:[
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  1357
	    ^ (AppletalkSocketAddress hostName:aHostName) address
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  1358
	]
525
5891518d17a3 appletalk support - untested
Claus Gittinger <cg@exept.de>
parents: 524
diff changeset
  1359
!
5891518d17a3 appletalk support - untested
Claus Gittinger <cg@exept.de>
parents: 524
diff changeset
  1360
1278
7251c65b8d38 use nameLookup from SocketAddress for all addr-families
Claus Gittinger <cg@exept.de>
parents: 1274
diff changeset
  1361
hostWithAppletalkAddress:addrByteArray
1911
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
  1362
    <resource: #obsolete>
525
5891518d17a3 appletalk support - untested
Claus Gittinger <cg@exept.de>
parents: 524
diff changeset
  1363
    "return the hostname for an APPLETALK address.
5891518d17a3 appletalk support - untested
Claus Gittinger <cg@exept.de>
parents: 524
diff changeset
  1364
     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
  1365
     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
  1366
     The last byte is the node number.
4320
5b7848099dea #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 4293
diff changeset
  1367
     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
  1368
     This is is the reverse operation to #appletalkAddressOfHost:.
c8101ea70e6c *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 811
diff changeset
  1369
     WARNING: untested code - I have no appletalk to test this."
525
5891518d17a3 appletalk support - untested
Claus Gittinger <cg@exept.de>
parents: 524
diff changeset
  1370
1485
d8578cf3504b gcc3.3.1 insn-scheduler bug workaround
Claus Gittinger <cg@exept.de>
parents: 1474
diff changeset
  1371
    NameLookupError
5473
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  1372
	handle:[:ex |
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  1373
	    ^ nil
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  1374
	]
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  1375
	do:[
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  1376
	    ^ (AppletalkSocketAddress hostAddress:addrByteArray) hostName
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  1377
	]
1278
7251c65b8d38 use nameLookup from SocketAddress for all addr-families
Claus Gittinger <cg@exept.de>
parents: 1274
diff changeset
  1378
525
5891518d17a3 appletalk support - untested
Claus Gittinger <cg@exept.de>
parents: 524
diff changeset
  1379
    "
1278
7251c65b8d38 use nameLookup from SocketAddress for all addr-families
Claus Gittinger <cg@exept.de>
parents: 1274
diff changeset
  1380
     Socket appletalkAddressOfHost:'yourAppleHere'
1485
d8578cf3504b gcc3.3.1 insn-scheduler bug workaround
Claus Gittinger <cg@exept.de>
parents: 1474
diff changeset
  1381
     Socket hostWithAppletalkAddress:#[1 2 3]
525
5891518d17a3 appletalk support - untested
Claus Gittinger <cg@exept.de>
parents: 524
diff changeset
  1382
     "
4320
5b7848099dea #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 4293
diff changeset
  1383
5b7848099dea #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 4293
diff changeset
  1384
    "Modified (comment): / 13-02-2017 / 20:30:56 / cg"
126
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
  1385
!
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
  1386
1278
7251c65b8d38 use nameLookup from SocketAddress for all addr-families
Claus Gittinger <cg@exept.de>
parents: 1274
diff changeset
  1387
hostWithIpAddress:addrByteArray
1911
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
  1388
    <resource: #obsolete>
126
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
  1389
    "return the hostname for an IP (internet-) address.
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
  1390
     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
  1391
     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
  1392
     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
  1393
     This is the reverse operation to #ipAddressOfHost:."
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
  1394
1485
d8578cf3504b gcc3.3.1 insn-scheduler bug workaround
Claus Gittinger <cg@exept.de>
parents: 1474
diff changeset
  1395
    NameLookupError
5473
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  1396
	handle:[:ex |
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  1397
	    ^ nil
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  1398
	]
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  1399
	do:[
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  1400
	    ^ (IPSocketAddress hostAddress:addrByteArray) hostName
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  1401
	]
126
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
  1402
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
  1403
    "
1485
d8578cf3504b gcc3.3.1 insn-scheduler bug workaround
Claus Gittinger <cg@exept.de>
parents: 1474
diff changeset
  1404
     Socket ipAddressOfHost:'clam'
d8578cf3504b gcc3.3.1 insn-scheduler bug workaround
Claus Gittinger <cg@exept.de>
parents: 1474
diff changeset
  1405
     Socket hostWithIpAddress:(Socket ipAddressOfHost:'clam')
d8578cf3504b gcc3.3.1 insn-scheduler bug workaround
Claus Gittinger <cg@exept.de>
parents: 1474
diff changeset
  1406
     Socket ipAddressOfHost:'porty'
1278
7251c65b8d38 use nameLookup from SocketAddress for all addr-families
Claus Gittinger <cg@exept.de>
parents: 1274
diff changeset
  1407
     Socket hostWithIpAddress:(Socket ipAddressOfHost:'porty')
1485
d8578cf3504b gcc3.3.1 insn-scheduler bug workaround
Claus Gittinger <cg@exept.de>
parents: 1474
diff changeset
  1408
     Socket hostWithIpAddress:#[1 2 3 4]
d8578cf3504b gcc3.3.1 insn-scheduler bug workaround
Claus Gittinger <cg@exept.de>
parents: 1474
diff changeset
  1409
     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
  1410
     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
  1411
     Socket hostWithIpAddress:(Socket ipAddressOfHost:'www.altavista.com')
126
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
  1412
     "
4320
5b7848099dea #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 4293
diff changeset
  1413
5b7848099dea #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 4293
diff changeset
  1414
    "Modified (comment): / 13-02-2017 / 20:31:01 / cg"
126
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
  1415
!
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
  1416
1278
7251c65b8d38 use nameLookup from SocketAddress for all addr-families
Claus Gittinger <cg@exept.de>
parents: 1274
diff changeset
  1417
hostWithIpV6Address:addrByteArray
1911
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
  1418
    <resource: #obsolete>
820
b6860c3660c8 Fix address sizes when calling gethostbyaddr
Stefan Vogel <sv@exept.de>
parents: 819
diff changeset
  1419
    "return the hostname for an IPv6 (internet-) address.
b6860c3660c8 Fix address sizes when calling gethostbyaddr
Stefan Vogel <sv@exept.de>
parents: 819
diff changeset
  1420
     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
  1421
     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
  1422
     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
  1423
     This is the reverse operation to #ipV6AddressOfHost:."
b6860c3660c8 Fix address sizes when calling gethostbyaddr
Stefan Vogel <sv@exept.de>
parents: 819
diff changeset
  1424
1485
d8578cf3504b gcc3.3.1 insn-scheduler bug workaround
Claus Gittinger <cg@exept.de>
parents: 1474
diff changeset
  1425
    NameLookupError
5473
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  1426
	handle:[:ex |
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  1427
	    ^ nil
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  1428
	]
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  1429
	do:[
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  1430
	    ^ (IPv6SocketAddress hostAddress:addrByteArray) hostName
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  1431
	]
820
b6860c3660c8 Fix address sizes when calling gethostbyaddr
Stefan Vogel <sv@exept.de>
parents: 819
diff changeset
  1432
b6860c3660c8 Fix address sizes when calling gethostbyaddr
Stefan Vogel <sv@exept.de>
parents: 819
diff changeset
  1433
    "
1485
d8578cf3504b gcc3.3.1 insn-scheduler bug workaround
Claus Gittinger <cg@exept.de>
parents: 1474
diff changeset
  1434
     Socket ipV6AddressOfHost:'clam'
d8578cf3504b gcc3.3.1 insn-scheduler bug workaround
Claus Gittinger <cg@exept.de>
parents: 1474
diff changeset
  1435
     Socket hostWithIpV6Address:(Socket ipAddressOfHost:'clam')
d8578cf3504b gcc3.3.1 insn-scheduler bug workaround
Claus Gittinger <cg@exept.de>
parents: 1474
diff changeset
  1436
     Socket ipV6AddressOfHost:'porty'
d8578cf3504b gcc3.3.1 insn-scheduler bug workaround
Claus Gittinger <cg@exept.de>
parents: 1474
diff changeset
  1437
     Socket hostWithIpV6Address:(Socket ipAddressOfHost:'porty')
d8578cf3504b gcc3.3.1 insn-scheduler bug workaround
Claus Gittinger <cg@exept.de>
parents: 1474
diff changeset
  1438
     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
  1439
     Socket ipV6AddressOfHost:'www.exept.de'
820
b6860c3660c8 Fix address sizes when calling gethostbyaddr
Stefan Vogel <sv@exept.de>
parents: 819
diff changeset
  1440
     "
4320
5b7848099dea #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 4293
diff changeset
  1441
5b7848099dea #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 4293
diff changeset
  1442
    "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
  1443
!
b6860c3660c8 Fix address sizes when calling gethostbyaddr
Stefan Vogel <sv@exept.de>
parents: 819
diff changeset
  1444
6
claus
parents: 4
diff changeset
  1445
ipAddressOfHost:aHostName
1911
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
  1446
    <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
  1447
    "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
  1448
     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
  1449
     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
  1450
     This is the reverse operation to #hostWithIpAddress:."
6
claus
parents: 4
diff changeset
  1451
1485
d8578cf3504b gcc3.3.1 insn-scheduler bug workaround
Claus Gittinger <cg@exept.de>
parents: 1474
diff changeset
  1452
    NameLookupError
5473
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  1453
	handle:[:ex |
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  1454
	    ^ nil
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  1455
	]
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  1456
	do:[
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  1457
	    ^ (IPSocketAddress hostName:aHostName) address
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  1458
	]
21
33eb5ffad09d *** empty log message ***
claus
parents: 8
diff changeset
  1459
71
claus
parents: 63
diff changeset
  1460
    "
1485
d8578cf3504b gcc3.3.1 insn-scheduler bug workaround
Claus Gittinger <cg@exept.de>
parents: 1474
diff changeset
  1461
     Socket ipAddressOfHost:'localhost'
d8578cf3504b gcc3.3.1 insn-scheduler bug workaround
Claus Gittinger <cg@exept.de>
parents: 1474
diff changeset
  1462
     Socket ipAddressOfHost:'exept'
d8578cf3504b gcc3.3.1 insn-scheduler bug workaround
Claus Gittinger <cg@exept.de>
parents: 1474
diff changeset
  1463
     Socket ipAddressOfHost:'1.2.3.4'
1274
f257a1b16b4d use naemLookup from SocketAddress for ipv6
Claus Gittinger <cg@exept.de>
parents: 1263
diff changeset
  1464
     Socket ipAddressOfHost:'193.15.16.17'
1485
d8578cf3504b gcc3.3.1 insn-scheduler bug workaround
Claus Gittinger <cg@exept.de>
parents: 1474
diff changeset
  1465
     Socket ipAddressOfHost:'josef'
d8578cf3504b gcc3.3.1 insn-scheduler bug workaround
Claus Gittinger <cg@exept.de>
parents: 1474
diff changeset
  1466
     Socket ipAddressOfHost:'styx.com'
d8578cf3504b gcc3.3.1 insn-scheduler bug workaround
Claus Gittinger <cg@exept.de>
parents: 1474
diff changeset
  1467
     Socket hostWithIpAddress:(Socket ipAddressOfHost:'localhost')
d8578cf3504b gcc3.3.1 insn-scheduler bug workaround
Claus Gittinger <cg@exept.de>
parents: 1474
diff changeset
  1468
     Socket ipAddressOfHost:(Socket hostWithIpAddress:'127.0.0.1')
71
claus
parents: 63
diff changeset
  1469
    "
819
4cc15700d123 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 817
diff changeset
  1470
!
4cc15700d123 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 817
diff changeset
  1471
4cc15700d123 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 817
diff changeset
  1472
ipV6AddressOfHost:aHostName
1911
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
  1473
    <resource: #obsolete>
819
4cc15700d123 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 817
diff changeset
  1474
    "return the IPv6 (internet-) number for a hostname as a byteArray,
4cc15700d123 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 817
diff changeset
  1475
     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
  1476
     If the host is unknown, return nil.
4cc15700d123 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 817
diff changeset
  1477
     This is the reverse operation to #hostWithIpV6Address:."
4cc15700d123 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 817
diff changeset
  1478
1485
d8578cf3504b gcc3.3.1 insn-scheduler bug workaround
Claus Gittinger <cg@exept.de>
parents: 1474
diff changeset
  1479
    NameLookupError
5473
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  1480
	handle:[:ex |
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  1481
	    ^ nil
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  1482
	]
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  1483
	do:[
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  1484
	    ^ (IPv6SocketAddress hostName:aHostName) address
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  1485
	]
819
4cc15700d123 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 817
diff changeset
  1486
4cc15700d123 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 817
diff changeset
  1487
    "
1485
d8578cf3504b gcc3.3.1 insn-scheduler bug workaround
Claus Gittinger <cg@exept.de>
parents: 1474
diff changeset
  1488
     Socket ipV6AddressOfHost:'localhost'
d8578cf3504b gcc3.3.1 insn-scheduler bug workaround
Claus Gittinger <cg@exept.de>
parents: 1474
diff changeset
  1489
     Socket ipV6AddressOfHost:'exept'
d8578cf3504b gcc3.3.1 insn-scheduler bug workaround
Claus Gittinger <cg@exept.de>
parents: 1474
diff changeset
  1490
     Socket ipV6AddressOfHost:'exept.exept.de'
d8578cf3504b gcc3.3.1 insn-scheduler bug workaround
Claus Gittinger <cg@exept.de>
parents: 1474
diff changeset
  1491
     Socket ipV6AddressOfHost:'www.google.de'
d8578cf3504b gcc3.3.1 insn-scheduler bug workaround
Claus Gittinger <cg@exept.de>
parents: 1474
diff changeset
  1492
     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
  1493
     Socket ipV6AddressOfHost:'josef'
d8578cf3504b gcc3.3.1 insn-scheduler bug workaround
Claus Gittinger <cg@exept.de>
parents: 1474
diff changeset
  1494
     Socket ipV6AddressOfHost:'styx.com'
d8578cf3504b gcc3.3.1 insn-scheduler bug workaround
Claus Gittinger <cg@exept.de>
parents: 1474
diff changeset
  1495
     Socket hostWithIpV6Address:(Socket ipV6AddressOfHost:'localhost')
d8578cf3504b gcc3.3.1 insn-scheduler bug workaround
Claus Gittinger <cg@exept.de>
parents: 1474
diff changeset
  1496
     Socket ipV6AddressOfHost:(Socket hostV6WithIpAddress:'127.0.0.1')
819
4cc15700d123 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 817
diff changeset
  1497
    "
531
ca4c73813531 category changes
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
  1498
! !
ca4c73813531 category changes
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
  1499
ca4c73813531 category changes
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
  1500
!Socket class methodsFor:'queries'!
ca4c73813531 category changes
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
  1501
1260
9a8fb2391174 instance creation of peer refactored
Claus Gittinger <cg@exept.de>
parents: 1235
diff changeset
  1502
peerFromDomain:domain name:peerName port:port
9a8fb2391174 instance creation of peer refactored
Claus Gittinger <cg@exept.de>
parents: 1235
diff changeset
  1503
    |addrClass|
9a8fb2391174 instance creation of peer refactored
Claus Gittinger <cg@exept.de>
parents: 1235
diff changeset
  1504
9a8fb2391174 instance creation of peer refactored
Claus Gittinger <cg@exept.de>
parents: 1235
diff changeset
  1505
    addrClass := self socketAddressClassForDomain:domain.
1263
23161346a162 no longer callBack into sockets getHostName/getAddress code.
Claus Gittinger <cg@exept.de>
parents: 1260
diff changeset
  1506
    ^ 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
  1507
!
7e5f2f6b177d getHostByAddr - call is now done lazy, when the socket is asked for the peer
Claus Gittinger <cg@exept.de>
parents: 1186
diff changeset
  1508
7e5f2f6b177d getHostByAddr - call is now done lazy, when the socket is asked for the peer
Claus Gittinger <cg@exept.de>
parents: 1186
diff changeset
  1509
peerNameFromDomain:domain peer:peer
1260
9a8fb2391174 instance creation of peer refactored
Claus Gittinger <cg@exept.de>
parents: 1235
diff changeset
  1510
    |addrClass|
9a8fb2391174 instance creation of peer refactored
Claus Gittinger <cg@exept.de>
parents: 1235
diff changeset
  1511
9a8fb2391174 instance creation of peer refactored
Claus Gittinger <cg@exept.de>
parents: 1235
diff changeset
  1512
    addrClass := self socketAddressClassForDomain:domain.
9a8fb2391174 instance creation of peer refactored
Claus Gittinger <cg@exept.de>
parents: 1235
diff changeset
  1513
    ^ 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
  1514
!
7e5f2f6b177d getHostByAddr - call is now done lazy, when the socket is asked for the peer
Claus Gittinger <cg@exept.de>
parents: 1186
diff changeset
  1515
0
1cf8d1747859 Initial revision
claus
parents:
diff changeset
  1516
portOfService:aNameOrNumber
819
4cc15700d123 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 817
diff changeset
  1517
    "returns the port-number for a given IP-service
0
1cf8d1747859 Initial revision
claus
parents:
diff changeset
  1518
     or nil if no such service exists;
1cf8d1747859 Initial revision
claus
parents:
diff changeset
  1519
     - used to convert service names to portNumbers"
1cf8d1747859 Initial revision
claus
parents:
diff changeset
  1520
91
Claus Gittinger <cg@exept.de>
parents: 85
diff changeset
  1521
    ^ self portOfService:aNameOrNumber protocol:nil
Claus Gittinger <cg@exept.de>
parents: 85
diff changeset
  1522
28
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1523
    "
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1524
     Socket portOfService:'finger'
1485
d8578cf3504b gcc3.3.1 insn-scheduler bug workaround
Claus Gittinger <cg@exept.de>
parents: 1474
diff changeset
  1525
     Socket portOfService:'nntp'
d8578cf3504b gcc3.3.1 insn-scheduler bug workaround
Claus Gittinger <cg@exept.de>
parents: 1474
diff changeset
  1526
     Socket portOfService:'echo'
d8578cf3504b gcc3.3.1 insn-scheduler bug workaround
Claus Gittinger <cg@exept.de>
parents: 1474
diff changeset
  1527
     Socket portOfService:'snmp'
28
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1528
    "
0
1cf8d1747859 Initial revision
claus
parents:
diff changeset
  1529
!
1cf8d1747859 Initial revision
claus
parents:
diff changeset
  1530
91
Claus Gittinger <cg@exept.de>
parents: 85
diff changeset
  1531
portOfService:aNameOrNumber protocol:aProtocol
819
4cc15700d123 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 817
diff changeset
  1532
    "returns the port-number for a given IP-service
91
Claus Gittinger <cg@exept.de>
parents: 85
diff changeset
  1533
     or nil if no such service exists;
Claus Gittinger <cg@exept.de>
parents: 85
diff changeset
  1534
     - used to convert service names to portNumbers"
Claus Gittinger <cg@exept.de>
parents: 85
diff changeset
  1535
2909
aacef77a1697 64bit fixes
Claus Gittinger <cg@exept.de>
parents: 2904
diff changeset
  1536
%{ /* UNLIMITEDSTACK(noWIN32) */
418
317e55c6c281 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 403
diff changeset
  1537
#ifndef NO_SOCKET
91
Claus Gittinger <cg@exept.de>
parents: 85
diff changeset
  1538
    struct servent *servent = NULL;
Claus Gittinger <cg@exept.de>
parents: 85
diff changeset
  1539
    char *protocol;
Claus Gittinger <cg@exept.de>
parents: 85
diff changeset
  1540
    int tryBoth = 0;
524
8287da54eccf more empty code for other domains;
Claus Gittinger <cg@exept.de>
parents: 513
diff changeset
  1541
    short portNo;
91
Claus Gittinger <cg@exept.de>
parents: 85
diff changeset
  1542
604
b302a21afece Remove redundant code.
Stefan Vogel <sv@exept.de>
parents: 589
diff changeset
  1543
    if (__isSmallInteger(aNameOrNumber)) {
5473
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  1544
	RETURN ( aNameOrNumber );
92
Claus Gittinger <cg@exept.de>
parents: 91
diff changeset
  1545
    }
Claus Gittinger <cg@exept.de>
parents: 91
diff changeset
  1546
2331
b5280e1b3b9f changed:
Stefan Vogel <sv@exept.de>
parents: 2327
diff changeset
  1547
    if (__isStringLike(aProtocol)) {
5473
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  1548
	protocol = (char *)__stringVal(aProtocol);
604
b302a21afece Remove redundant code.
Stefan Vogel <sv@exept.de>
parents: 589
diff changeset
  1549
    } else {
5473
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  1550
	protocol = "tcp";
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  1551
	tryBoth = 1;
91
Claus Gittinger <cg@exept.de>
parents: 85
diff changeset
  1552
    }
524
8287da54eccf more empty code for other domains;
Claus Gittinger <cg@exept.de>
parents: 513
diff changeset
  1553
2331
b5280e1b3b9f changed:
Stefan Vogel <sv@exept.de>
parents: 2327
diff changeset
  1554
    if (__isStringLike(aNameOrNumber)) {
5473
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  1555
	servent = getservbyname((char *) __stringVal(aNameOrNumber), protocol);
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  1556
	if (servent != NULL) {
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  1557
	    RETURN ( __MKSMALLINT(ntohs(servent->s_port)) );
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  1558
	}
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  1559
	if (tryBoth) {
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  1560
	    servent = getservbyname((char *) __stringVal(aNameOrNumber), "udp");
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  1561
	    if (servent != NULL) {
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  1562
		RETURN ( __MKSMALLINT(ntohs(servent->s_port)) );
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  1563
	    }
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  1564
	}
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  1565
	RETURN ( nil );
91
Claus Gittinger <cg@exept.de>
parents: 85
diff changeset
  1566
    }
418
317e55c6c281 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 403
diff changeset
  1567
#endif
91
Claus Gittinger <cg@exept.de>
parents: 85
diff changeset
  1568
    RETURN ( nil );
Claus Gittinger <cg@exept.de>
parents: 85
diff changeset
  1569
%}
Claus Gittinger <cg@exept.de>
parents: 85
diff changeset
  1570
    "
Claus Gittinger <cg@exept.de>
parents: 85
diff changeset
  1571
     Socket portOfService:'echo' protocol:'udp'
Claus Gittinger <cg@exept.de>
parents: 85
diff changeset
  1572
     Socket portOfService:'echo' protocol:'tcp'
Claus Gittinger <cg@exept.de>
parents: 85
diff changeset
  1573
    "
Claus Gittinger <cg@exept.de>
parents: 85
diff changeset
  1574
!
Claus Gittinger <cg@exept.de>
parents: 85
diff changeset
  1575
0
1cf8d1747859 Initial revision
claus
parents:
diff changeset
  1576
protocolOfService:aNameOrNumber
819
4cc15700d123 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 817
diff changeset
  1577
    "returns the protocol (as string) for a given IP-service
28
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1578
     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
  1579
92005eec5c9d fixed moving-object-when-interrupted-with-scavenge bugs;
Claus Gittinger <cg@exept.de>
parents: 1503
diff changeset
  1580
%{  /* UNLIMITEDSTACK(noWIN32) */
418
317e55c6c281 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 403
diff changeset
  1581
#ifndef NO_SOCKET
0
1cf8d1747859 Initial revision
claus
parents:
diff changeset
  1582
    struct servent *servent = NULL;
524
8287da54eccf more empty code for other domains;
Claus Gittinger <cg@exept.de>
parents: 513
diff changeset
  1583
    short portNo;
0
1cf8d1747859 Initial revision
claus
parents:
diff changeset
  1584
58
bd6753bf0401 *** empty log message ***
claus
parents: 51
diff changeset
  1585
    if (__isSmallInteger(aNameOrNumber)) {
5473
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  1586
	portNo = __intVal(aNameOrNumber);
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  1587
	servent = getservbyport(htons(portNo), "tcp") ;
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  1588
	if (servent == NULL) {
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  1589
	    servent = getservbyport(htons(portNo), "udp") ;
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  1590
	    if (servent == NULL) {
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  1591
		RETURN ( nil );
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  1592
	    }
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  1593
	}
0
1cf8d1747859 Initial revision
claus
parents:
diff changeset
  1594
    } else {
5473
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  1595
	if (__isStringLike(aNameOrNumber)) {
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  1596
	    servent = getservbyname((char *) __stringVal(aNameOrNumber), "tcp");
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  1597
	    if (servent == NULL) {
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  1598
		servent = getservbyname((char *) __stringVal(aNameOrNumber), "udp");
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  1599
		if (servent == NULL) {
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  1600
		    RETURN ( nil );
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  1601
		}
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  1602
	    }
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  1603
	}
0
1cf8d1747859 Initial revision
claus
parents:
diff changeset
  1604
    }
1cf8d1747859 Initial revision
claus
parents:
diff changeset
  1605
    if (servent) {
5473
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  1606
	RETURN ( __MKSTRING(servent->s_proto) );
0
1cf8d1747859 Initial revision
claus
parents:
diff changeset
  1607
    }
1504
92005eec5c9d fixed moving-object-when-interrupted-with-scavenge bugs;
Claus Gittinger <cg@exept.de>
parents: 1503
diff changeset
  1608
#endif /* !NO_SOCKET */
0
1cf8d1747859 Initial revision
claus
parents:
diff changeset
  1609
    RETURN ( nil );
1cf8d1747859 Initial revision
claus
parents:
diff changeset
  1610
%}
28
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1611
    "
1485
d8578cf3504b gcc3.3.1 insn-scheduler bug workaround
Claus Gittinger <cg@exept.de>
parents: 1474
diff changeset
  1612
     Socket protocolOfService:'finger'
d8578cf3504b gcc3.3.1 insn-scheduler bug workaround
Claus Gittinger <cg@exept.de>
parents: 1474
diff changeset
  1613
     Socket protocolOfService:'nntp'
28
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1614
     Socket protocolOfService:'xxx'
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1615
     Socket protocolOfService:79
1485
d8578cf3504b gcc3.3.1 insn-scheduler bug workaround
Claus Gittinger <cg@exept.de>
parents: 1474
diff changeset
  1616
     Socket protocolOfService:'snmp'
28
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1617
    "
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1618
!
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1619
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
  1620
socketAddressClassForDomain:domain
1230
2cfb8c270cb5 more functionality moved to SocketAccessor
Claus Gittinger <cg@exept.de>
parents: 1224
diff changeset
  1621
    ^ SocketAddress knownClassFromCode:domain
2cfb8c270cb5 more functionality moved to SocketAccessor
Claus Gittinger <cg@exept.de>
parents: 1224
diff changeset
  1622
2cfb8c270cb5 more functionality moved to SocketAccessor
Claus Gittinger <cg@exept.de>
parents: 1224
diff changeset
  1623
    "
3059
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  1624
     self socketAddressClassForDomain:#AF_INET
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  1625
     self socketAddressClassForDomain:#AF_UNIX
1230
2cfb8c270cb5 more functionality moved to SocketAccessor
Claus Gittinger <cg@exept.de>
parents: 1224
diff changeset
  1626
    "
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
  1627
!
7e5f2f6b177d getHostByAddr - call is now done lazy, when the socket is asked for the peer
Claus Gittinger <cg@exept.de>
parents: 1186
diff changeset
  1628
532
f997c3873602 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 531
diff changeset
  1629
supportedProtocolFamilies
f997c3873602 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 531
diff changeset
  1630
    "return a collection of supported protocol families.
f997c3873602 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 531
diff changeset
  1631
     This list specifies what the Socket class supports -
f997c3873602 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 531
diff changeset
  1632
     socket creation may still fail, if your system was built
f997c3873602 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 531
diff changeset
  1633
     without it."
f997c3873602 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 531
diff changeset
  1634
1280
b973855bfe74 moved all socket constant queries from SocketHandle
Claus Gittinger <cg@exept.de>
parents: 1278
diff changeset
  1635
    ^ OperatingSystem supportedProtocolFamilies
532
f997c3873602 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 531
diff changeset
  1636
f997c3873602 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 531
diff changeset
  1637
    "
f997c3873602 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 531
diff changeset
  1638
     Socket supportedProtocolFamilies
f997c3873602 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 531
diff changeset
  1639
    "
559
61012867ebed cleanup if #connect is interrupted
Claus Gittinger <cg@exept.de>
parents: 551
diff changeset
  1640
!
61012867ebed cleanup if #connect is interrupted
Claus Gittinger <cg@exept.de>
parents: 551
diff changeset
  1641
61012867ebed cleanup if #connect is interrupted
Claus Gittinger <cg@exept.de>
parents: 551
diff changeset
  1642
typeOfProtocol:aProtocol
61012867ebed cleanup if #connect is interrupted
Claus Gittinger <cg@exept.de>
parents: 551
diff changeset
  1643
    "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
  1644
     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
  1645
61012867ebed cleanup if #connect is interrupted
Claus Gittinger <cg@exept.de>
parents: 551
diff changeset
  1646
    (aProtocol = 'tcp') ifTrue:[^ #stream].
61012867ebed cleanup if #connect is interrupted
Claus Gittinger <cg@exept.de>
parents: 551
diff changeset
  1647
    (aProtocol = 'udp') ifTrue:[^ #datagram].
61012867ebed cleanup if #connect is interrupted
Claus Gittinger <cg@exept.de>
parents: 551
diff changeset
  1648
    (aProtocol = 'ip')  ifTrue:[^ #raw].
61012867ebed cleanup if #connect is interrupted
Claus Gittinger <cg@exept.de>
parents: 551
diff changeset
  1649
    "
61012867ebed cleanup if #connect is interrupted
Claus Gittinger <cg@exept.de>
parents: 551
diff changeset
  1650
     unix domain
61012867ebed cleanup if #connect is interrupted
Claus Gittinger <cg@exept.de>
parents: 551
diff changeset
  1651
    "
61012867ebed cleanup if #connect is interrupted
Claus Gittinger <cg@exept.de>
parents: 551
diff changeset
  1652
    (aProtocol = 'ud')  ifTrue:[^ #stream].
61012867ebed cleanup if #connect is interrupted
Claus Gittinger <cg@exept.de>
parents: 551
diff changeset
  1653
    "
61012867ebed cleanup if #connect is interrupted
Claus Gittinger <cg@exept.de>
parents: 551
diff changeset
  1654
     add x25 stuff (if any) here ...
61012867ebed cleanup if #connect is interrupted
Claus Gittinger <cg@exept.de>
parents: 551
diff changeset
  1655
    "
61012867ebed cleanup if #connect is interrupted
Claus Gittinger <cg@exept.de>
parents: 551
diff changeset
  1656
    "
61012867ebed cleanup if #connect is interrupted
Claus Gittinger <cg@exept.de>
parents: 551
diff changeset
  1657
     add appletalk stuff (if any) here ...
61012867ebed cleanup if #connect is interrupted
Claus Gittinger <cg@exept.de>
parents: 551
diff changeset
  1658
    "
61012867ebed cleanup if #connect is interrupted
Claus Gittinger <cg@exept.de>
parents: 551
diff changeset
  1659
    "
61012867ebed cleanup if #connect is interrupted
Claus Gittinger <cg@exept.de>
parents: 551
diff changeset
  1660
     add other stuff (if any) here ...
61012867ebed cleanup if #connect is interrupted
Claus Gittinger <cg@exept.de>
parents: 551
diff changeset
  1661
    "
61012867ebed cleanup if #connect is interrupted
Claus Gittinger <cg@exept.de>
parents: 551
diff changeset
  1662
    ^ nil
61012867ebed cleanup if #connect is interrupted
Claus Gittinger <cg@exept.de>
parents: 551
diff changeset
  1663
61012867ebed cleanup if #connect is interrupted
Claus Gittinger <cg@exept.de>
parents: 551
diff changeset
  1664
    "
61012867ebed cleanup if #connect is interrupted
Claus Gittinger <cg@exept.de>
parents: 551
diff changeset
  1665
     Socket typeOfProtocol:'tcp'
61012867ebed cleanup if #connect is interrupted
Claus Gittinger <cg@exept.de>
parents: 551
diff changeset
  1666
     Socket typeOfProtocol:'ucp'
61012867ebed cleanup if #connect is interrupted
Claus Gittinger <cg@exept.de>
parents: 551
diff changeset
  1667
     Socket typeOfProtocol:(Socket protocolOfService:'nntp')
61012867ebed cleanup if #connect is interrupted
Claus Gittinger <cg@exept.de>
parents: 551
diff changeset
  1668
     Socket typeOfProtocol:(Socket protocolOfService:'echo')
61012867ebed cleanup if #connect is interrupted
Claus Gittinger <cg@exept.de>
parents: 551
diff changeset
  1669
    "
28
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1670
! !
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1671
1202
c52279df60d8 method category rename
Claus Gittinger <cg@exept.de>
parents: 1187
diff changeset
  1672
!Socket methodsFor:'Compatibility-Dolphin'!
1110
0876a3d30fd2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1035
diff changeset
  1673
0876a3d30fd2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1035
diff changeset
  1674
setReceiveTimeout: milliseconds
0876a3d30fd2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1035
diff changeset
  1675
    self receiveTimeout:(milliseconds / 1000)
0876a3d30fd2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1035
diff changeset
  1676
!
0876a3d30fd2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1035
diff changeset
  1677
0876a3d30fd2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1035
diff changeset
  1678
setSendTimeout: milliseconds
0876a3d30fd2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1035
diff changeset
  1679
    self sendTimeout:(milliseconds / 1000)
0876a3d30fd2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1035
diff changeset
  1680
! !
0876a3d30fd2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1035
diff changeset
  1681
1202
c52279df60d8 method category rename
Claus Gittinger <cg@exept.de>
parents: 1187
diff changeset
  1682
!Socket methodsFor:'Compatibility-ST80'!
28
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1683
887
2b2dc6b59b5a more VW compatibility
Claus Gittinger <cg@exept.de>
parents: 876
diff changeset
  1684
acceptNonBlock
2b2dc6b59b5a more VW compatibility
Claus Gittinger <cg@exept.de>
parents: 876
diff changeset
  1685
    ^ self accept
2b2dc6b59b5a more VW compatibility
Claus Gittinger <cg@exept.de>
parents: 876
diff changeset
  1686
!
2b2dc6b59b5a more VW compatibility
Claus Gittinger <cg@exept.de>
parents: 876
diff changeset
  1687
1485
d8578cf3504b gcc3.3.1 insn-scheduler bug workaround
Claus Gittinger <cg@exept.de>
parents: 1474
diff changeset
  1688
ioConnection
887
2b2dc6b59b5a more VW compatibility
Claus Gittinger <cg@exept.de>
parents: 876
diff changeset
  1689
    ^ self
2b2dc6b59b5a more VW compatibility
Claus Gittinger <cg@exept.de>
parents: 876
diff changeset
  1690
!
2b2dc6b59b5a more VW compatibility
Claus Gittinger <cg@exept.de>
parents: 876
diff changeset
  1691
126
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
  1692
notReadySignal
781
4d61e7588ff3 added #waitForNewConnectionOrDataOnAny:timeout:
Claus Gittinger <cg@exept.de>
parents: 776
diff changeset
  1693
    "ST-80 mimicry.
4d61e7588ff3 added #waitForNewConnectionOrDataOnAny:timeout:
Claus Gittinger <cg@exept.de>
parents: 776
diff changeset
  1694
     for now - this is not yet raised"
71
claus
parents: 63
diff changeset
  1695
126
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
  1696
    ^ Signal new
486
ed4e215e83ef ST-80 mimicry
Claus Gittinger <cg@exept.de>
parents: 470
diff changeset
  1697
!
ed4e215e83ef ST-80 mimicry
Claus Gittinger <cg@exept.de>
parents: 470
diff changeset
  1698
576
13acab81fad0 more ST80 compatibility
ca
parents: 572
diff changeset
  1699
readAppendStream
781
4d61e7588ff3 added #waitForNewConnectionOrDataOnAny:timeout:
Claus Gittinger <cg@exept.de>
parents: 776
diff changeset
  1700
    "ST-80 mimicry.
4293
82b9928ddcae #OTHER by mawalch
mawalch
parents: 4288
diff changeset
  1701
     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
  1702
     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
  1703
     the actual stream.
781
4d61e7588ff3 added #waitForNewConnectionOrDataOnAny:timeout:
Claus Gittinger <cg@exept.de>
parents: 776
diff changeset
  1704
     In ST/X, sockets inherit from stream, so
4d61e7588ff3 added #waitForNewConnectionOrDataOnAny:timeout:
Claus Gittinger <cg@exept.de>
parents: 776
diff changeset
  1705
     this method returns the receiver, for transparency"
4d61e7588ff3 added #waitForNewConnectionOrDataOnAny:timeout:
Claus Gittinger <cg@exept.de>
parents: 776
diff changeset
  1706
576
13acab81fad0 more ST80 compatibility
ca
parents: 572
diff changeset
  1707
    ^ self
13acab81fad0 more ST80 compatibility
ca
parents: 572
diff changeset
  1708
!
13acab81fad0 more ST80 compatibility
ca
parents: 572
diff changeset
  1709
486
ed4e215e83ef ST-80 mimicry
Claus Gittinger <cg@exept.de>
parents: 470
diff changeset
  1710
readStream
ed4e215e83ef ST-80 mimicry
Claus Gittinger <cg@exept.de>
parents: 470
diff changeset
  1711
    "ST-80 mimicry.
4293
82b9928ddcae #OTHER by mawalch
mawalch
parents: 4288
diff changeset
  1712
     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
  1713
     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
  1714
     the actual stream.
781
4d61e7588ff3 added #waitForNewConnectionOrDataOnAny:timeout:
Claus Gittinger <cg@exept.de>
parents: 776
diff changeset
  1715
     In ST/X, sockets inherit from stream, so
4d61e7588ff3 added #waitForNewConnectionOrDataOnAny:timeout:
Claus Gittinger <cg@exept.de>
parents: 776
diff changeset
  1716
     this method returns the receiver, for transparency"
486
ed4e215e83ef ST-80 mimicry
Claus Gittinger <cg@exept.de>
parents: 470
diff changeset
  1717
ed4e215e83ef ST-80 mimicry
Claus Gittinger <cg@exept.de>
parents: 470
diff changeset
  1718
    ^ self
ed4e215e83ef ST-80 mimicry
Claus Gittinger <cg@exept.de>
parents: 470
diff changeset
  1719
ed4e215e83ef ST-80 mimicry
Claus Gittinger <cg@exept.de>
parents: 470
diff changeset
  1720
    "Created: 24.1.1997 / 23:52:57 / cg"
ed4e215e83ef ST-80 mimicry
Claus Gittinger <cg@exept.de>
parents: 470
diff changeset
  1721
!
ed4e215e83ef ST-80 mimicry
Claus Gittinger <cg@exept.de>
parents: 470
diff changeset
  1722
ed4e215e83ef ST-80 mimicry
Claus Gittinger <cg@exept.de>
parents: 470
diff changeset
  1723
writeStream
ed4e215e83ef ST-80 mimicry
Claus Gittinger <cg@exept.de>
parents: 470
diff changeset
  1724
    "ST-80 mimicry.
4293
82b9928ddcae #OTHER by mawalch
mawalch
parents: 4288
diff changeset
  1725
     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
  1726
     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
  1727
     the actual stream.
781
4d61e7588ff3 added #waitForNewConnectionOrDataOnAny:timeout:
Claus Gittinger <cg@exept.de>
parents: 776
diff changeset
  1728
     In ST/X, sockets inherit from stream, so
4d61e7588ff3 added #waitForNewConnectionOrDataOnAny:timeout:
Claus Gittinger <cg@exept.de>
parents: 776
diff changeset
  1729
     this method returns the receiver, for transparency"
486
ed4e215e83ef ST-80 mimicry
Claus Gittinger <cg@exept.de>
parents: 470
diff changeset
  1730
ed4e215e83ef ST-80 mimicry
Claus Gittinger <cg@exept.de>
parents: 470
diff changeset
  1731
    ^ self
ed4e215e83ef ST-80 mimicry
Claus Gittinger <cg@exept.de>
parents: 470
diff changeset
  1732
ed4e215e83ef ST-80 mimicry
Claus Gittinger <cg@exept.de>
parents: 470
diff changeset
  1733
    "Created: 24.1.1997 / 10:34:35 / cg"
ed4e215e83ef ST-80 mimicry
Claus Gittinger <cg@exept.de>
parents: 470
diff changeset
  1734
    "Modified: 24.1.1997 / 23:52:52 / cg"
71
claus
parents: 63
diff changeset
  1735
! !
claus
parents: 63
diff changeset
  1736
1202
c52279df60d8 method category rename
Claus Gittinger <cg@exept.de>
parents: 1187
diff changeset
  1737
!Socket methodsFor:'Compatibility-Squeak'!
771
74abb04ef57c checkin from browser
Claus Gittinger <cg@exept.de>
parents: 752
diff changeset
  1738
1462
5602fce52b42 squeak stuff
Claus Gittinger <cg@exept.de>
parents: 1413
diff changeset
  1739
address
5602fce52b42 squeak stuff
Claus Gittinger <cg@exept.de>
parents: 1413
diff changeset
  1740
    ^ self getSocketAddress
5602fce52b42 squeak stuff
Claus Gittinger <cg@exept.de>
parents: 1413
diff changeset
  1741
!
5602fce52b42 squeak stuff
Claus Gittinger <cg@exept.de>
parents: 1413
diff changeset
  1742
2308
d8b410a4f38b added: #connectToHostNamed:port:
Claus Gittinger <cg@exept.de>
parents: 2292
diff changeset
  1743
connectToHostNamed:hostName port:portNr
d8b410a4f38b added: #connectToHostNamed:port:
Claus Gittinger <cg@exept.de>
parents: 2292
diff changeset
  1744
    self connectTo:hostName port:portNr
d8b410a4f38b added: #connectToHostNamed:port:
Claus Gittinger <cg@exept.de>
parents: 2292
diff changeset
  1745
!
d8b410a4f38b added: #connectToHostNamed:port:
Claus Gittinger <cg@exept.de>
parents: 2292
diff changeset
  1746
1462
5602fce52b42 squeak stuff
Claus Gittinger <cg@exept.de>
parents: 1413
diff changeset
  1747
dataAvailable
5602fce52b42 squeak stuff
Claus Gittinger <cg@exept.de>
parents: 1413
diff changeset
  1748
    ^ self canReadWithoutBlocking
5602fce52b42 squeak stuff
Claus Gittinger <cg@exept.de>
parents: 1413
diff changeset
  1749
!
5602fce52b42 squeak stuff
Claus Gittinger <cg@exept.de>
parents: 1413
diff changeset
  1750
1886
e0d23764c809 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1885
diff changeset
  1751
destroy
e0d23764c809 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1885
diff changeset
  1752
    self close
e0d23764c809 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1885
diff changeset
  1753
e0d23764c809 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1885
diff changeset
  1754
    "Created: / 04-06-2007 / 21:29:03 / cg"
e0d23764c809 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1885
diff changeset
  1755
!
e0d23764c809 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1885
diff changeset
  1756
1462
5602fce52b42 squeak stuff
Claus Gittinger <cg@exept.de>
parents: 1413
diff changeset
  1757
listenOn:aPortNr
1882
6f818f33c85a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1863
diff changeset
  1758
    self listenOn:aPortNr backlogSize:5
6f818f33c85a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1863
diff changeset
  1759
6f818f33c85a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1863
diff changeset
  1760
    "Modified: / 31-05-2007 / 17:59:53 / cg"
6f818f33c85a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1863
diff changeset
  1761
!
6f818f33c85a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1863
diff changeset
  1762
6f818f33c85a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1863
diff changeset
  1763
listenOn:aPortNr backlogSize:aNumber
1462
5602fce52b42 squeak stuff
Claus Gittinger <cg@exept.de>
parents: 1413
diff changeset
  1764
    self bindTo:aPortNr address:nil.
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  1765
    self listenFor:aNumber
1882
6f818f33c85a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1863
diff changeset
  1766
6f818f33c85a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1863
diff changeset
  1767
    "Created: / 31-05-2007 / 17:59:47 / cg"
1462
5602fce52b42 squeak stuff
Claus Gittinger <cg@exept.de>
parents: 1413
diff changeset
  1768
!
5602fce52b42 squeak stuff
Claus Gittinger <cg@exept.de>
parents: 1413
diff changeset
  1769
4587
caa262d036d2 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4570
diff changeset
  1770
noTimeout
caa262d036d2 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4570
diff changeset
  1771
    "disable timeouts - dummy for now"
caa262d036d2 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4570
diff changeset
  1772
5001
11cbbbcbc87e warnings
Claus Gittinger <cg@exept.de>
parents: 4961
diff changeset
  1773
    ^ self
4587
caa262d036d2 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4570
diff changeset
  1774
!
caa262d036d2 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 4570
diff changeset
  1775
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  1776
peerName
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  1777
    "return my peer (i.e. ipAddr + port);
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  1778
     May return nil if not yet setup completely."
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  1779
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  1780
    ^ self getPeer
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  1781
!
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  1782
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  1783
sendData: aStringOrByteArray
3155
d1884a37375c Initialize in instance initialize method insted in #new
Stefan Vogel <sv@exept.de>
parents: 3152
diff changeset
  1784
    "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
  1785
     Return the number of bytes sent."
d1884a37375c Initialize in instance initialize method insted in #new
Stefan Vogel <sv@exept.de>
parents: 3152
diff changeset
  1786
d1884a37375c Initialize in instance initialize method insted in #new
Stefan Vogel <sv@exept.de>
parents: 3152
diff changeset
  1787
    ^ self nextPutBytes:aStringOrByteArray size from:aStringOrByteArray startingAt:1.
771
74abb04ef57c checkin from browser
Claus Gittinger <cg@exept.de>
parents: 752
diff changeset
  1788
! !
74abb04ef57c checkin from browser
Claus Gittinger <cg@exept.de>
parents: 752
diff changeset
  1789
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  1790
!Socket methodsFor:'accepting connections'!
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  1791
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  1792
accept
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  1793
    "create a new TCP socket from accepting on the receiver.
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  1794
     This method will suspend the current process if no connection is waiting.
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  1795
     For ST-80 compatibility"
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  1796
3633
3a21f142432e #REFACTORING
Stefan Vogel <sv@exept.de>
parents: 3620
diff changeset
  1797
    ^ self waitForNewConnectionWithTimeout:nil
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  1798
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  1799
    "
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  1800
     |sock newSock|
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  1801
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  1802
     sock := Socket provide:8004.
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  1803
     sock listenFor:5.
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  1804
     newSock := sock accept.
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  1805
    "
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  1806
!
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
blockingAccept
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  1809
    "create a new TCP socket from accepting on the receiver.
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  1810
     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
  1811
     For ST-80 compatibility"
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  1812
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  1813
    |newSock|
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  1814
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  1815
    newSock := self class new.
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  1816
    (newSock primAcceptOn:self blocking:true) ifFalse:[
5473
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  1817
	"should raise an error here - primitive code raises a notification"
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  1818
	^ nil
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  1819
    ].
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  1820
    ^ newSock
4568
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  1821
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  1822
    "Modified (format): / 19-01-2018 / 13:32:25 / stefan"
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  1823
! !
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  1824
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  1825
!Socket methodsFor:'binding'!
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
bindAnonymously
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  1828
    "bind to any address. A free port will be allocated.
4942
9f424bed67c4 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 4796
diff changeset
  1829
     Our own socket address will be determined after connection set up.
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  1830
     This is the default after the socket has been created"
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  1831
3059
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  1832
    ^ self bindTo:nil reuseAddress:false
2321
6f4cc7b644db filePointer -> handle migration
Claus Gittinger <cg@exept.de>
parents: 2308
diff changeset
  1833
6f4cc7b644db filePointer -> handle migration
Claus Gittinger <cg@exept.de>
parents: 2308
diff changeset
  1834
    "
1938
831af28cc848 comments
Stefan Vogel <sv@exept.de>
parents: 1935
diff changeset
  1835
      self newTCP bindAnonymously; listenFor:1; yourself
4206
ac9a6e096796 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4203
diff changeset
  1836
      self newTCP bindAnonymously; port
1938
831af28cc848 comments
Stefan Vogel <sv@exept.de>
parents: 1935
diff changeset
  1837
    "
4942
9f424bed67c4 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 4796
diff changeset
  1838
9f424bed67c4 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 4796
diff changeset
  1839
    "Modified (comment): / 08-05-2019 / 14:40:11 / Claus Gittinger"
1935
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
bindAnonymouslyToAddress:aSocketAddress
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  1843
    "bind to address addressString.
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  1844
     A free port will be allocated"
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  1845
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  1846
    ^ self
5473
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  1847
	bindTo:0
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  1848
	address:aSocketAddress
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  1849
	reuseAddress:false
2321
6f4cc7b644db filePointer -> handle migration
Claus Gittinger <cg@exept.de>
parents: 2308
diff changeset
  1850
6f4cc7b644db filePointer -> handle migration
Claus Gittinger <cg@exept.de>
parents: 2308
diff changeset
  1851
    "
3059
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  1852
      self newTCP bindAnonymouslyToAddress:IPSocketAddress localHost; listenFor:1; yourself
1938
831af28cc848 comments
Stefan Vogel <sv@exept.de>
parents: 1935
diff changeset
  1853
    "
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  1854
!
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  1855
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  1856
bindTo:aSocketAddress
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  1857
    "ST80 compatible bind, expecting a socketAddress argument.
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  1858
     The socketAddress object (an instance of SocketAddress)
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  1859
     is supposed to respond to #portOrName and #address requests."
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  1860
3059
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  1861
    ^ self bindTo:aSocketAddress reuseAddress:true
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  1862
!
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  1863
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  1864
bindTo:portNrOrNameString address:addressString
3059
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  1865
    "Old interface: bind the socket to an address
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  1866
     - returns true if ok, false otherwise.
4568
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  1867
     Notify with a SocketErrorNotification on error.
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
     The interpretation of hostOrPathNameOrSocketAddrOrNil portNrOrName depends on the domain:
5473
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  1870
	Best use a SocketAddress
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  1871
	For backward compatibility:
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  1872
	    AF_INET domain can also use (4byte) byteArray like internet numbers,
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  1873
	    AF_UNIX domain cab use pathname strings."
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  1874
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  1875
    ^ self
5473
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  1876
	bindTo:portNrOrNameString
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  1877
	address:addressString
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  1878
	reuseAddress:true
4568
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  1879
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  1880
    "Modified (comment): / 19-01-2018 / 13:36:54 / stefan"
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  1881
!
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  1882
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  1883
bindTo:portNrOrNameOrNil address:hostOrPathNameOrSocketAddrOrNil reuseAddress:reuse
3059
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  1884
    "Old interface: bind the socket to an address
4568
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  1885
     Notify with a SocketErrorNotification on error.
3059
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  1886
     - returns true if ok, false otherwise.
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
     The interpretation of hostOrPathNameOrSocketAddrOrNil portNrOrName depends on the domain:
5473
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  1889
	Best use a SocketAddress
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  1890
	For backward compatibility:
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  1891
	    AF_INET domain can also use (4byte) byteArray like internet numbers,
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  1892
	    AF_UNIX domain can use pathname strings.
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  1893
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  1894
     The reuse boolean argument controls if the SO_REUSEADDR socket option
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  1895
     is to be set (to avoid the 'bind: address in use' error).
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  1896
    "
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  1897
3059
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  1898
    |socketAddress|
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  1899
2321
6f4cc7b644db filePointer -> handle migration
Claus Gittinger <cg@exept.de>
parents: 2308
diff changeset
  1900
    handle isNil ifTrue:[
5473
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  1901
	^ self errorNotOpen
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  1902
    ].
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  1903
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  1904
    hostOrPathNameOrSocketAddrOrNil isNil ifTrue:[
5473
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  1905
	socketAddress := self socketAddressClass anyHost.
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  1906
    ] ifFalse:[
5473
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  1907
	(hostOrPathNameOrSocketAddrOrNil isSocketAddress) ifTrue:[
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  1908
	    socketAddress := hostOrPathNameOrSocketAddrOrNil.
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  1909
	] ifFalse:[
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  1910
	    "backward compatibility: support for byteArray and string arg"
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  1911
	    hostOrPathNameOrSocketAddrOrNil isString ifTrue:[
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  1912
		socketAddress := self socketAddressClass hostName:hostOrPathNameOrSocketAddrOrNil.
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  1913
	    ] ifFalse:[
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  1914
		hostOrPathNameOrSocketAddrOrNil isByteCollection ifFalse:[
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  1915
		    ^ self error:'bindTo: bad host (socketAddress) argument'
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  1916
		].
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  1917
		socketAddress := self socketAddressClass hostAddress:hostOrPathNameOrSocketAddrOrNil.
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  1918
	    ].
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  1919
	].
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  1920
    ].
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  1921
    portNrOrNameOrNil notNil ifTrue:[
5473
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  1922
	socketAddress port:portNrOrNameOrNil.
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  1923
    ].
3059
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  1924
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  1925
    ^ self bindTo:socketAddress reuseAddress:reuse.
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  1926
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  1927
    "
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  1928
     (Socket domain:#'AF_INET' type:#stream)
5473
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  1929
	 bindTo:2144 address:nil; yourself
3059
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  1930
    "
4568
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  1931
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  1932
    "Modified (comment): / 19-01-2018 / 13:37:13 / stefan"
3059
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  1933
!
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  1934
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  1935
bindTo:aSocketAddress reuseAddress:reuse
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  1936
    "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
  1937
     Notify with a SocketErrorNotification on error.
3059
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  1938
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  1939
     The reuse boolean argument controls if the SO_REUSEADDR socket option
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  1940
     is to be set (to avoid the 'bind: address in use' error).
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  1941
3137
df3e9cebf52c class: Socket
Stefan Vogel <sv@exept.de>
parents: 3127
diff changeset
  1942
     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
  1943
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  1944
    |ok error socketAddress|
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  1945
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  1946
    handle isNil ifTrue:[
5473
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  1947
	^ self errorNotOpen
3059
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  1948
    ].
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  1949
    socketAddress := aSocketAddress.
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  1950
    socketAddress isNil ifTrue:[
5473
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  1951
	"ok, get an all zero socket address, so it is for anyHost
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  1952
	 and the port will be assigned"
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  1953
	socketAddress := self socketAddressClass new.
3513
8105bf370769 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3485
diff changeset
  1954
    ].
8105bf370769 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3485
diff changeset
  1955
    domain == #'AF_INET6' ifTrue:[
5473
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  1956
	"accept also IPv4 connections on IPv6 sockets (this is off by default for windows"
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  1957
	self setSocketOption:#'IPV6_V6ONLY' argument:false argument:nil.
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  1958
    ].
2321
6f4cc7b644db filePointer -> handle migration
Claus Gittinger <cg@exept.de>
parents: 2308
diff changeset
  1959
    ok := false.
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  1960
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  1961
%{  /* STACK: 100000 */
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  1962
#ifndef NO_SOCKET
2321
6f4cc7b644db filePointer -> handle migration
Claus Gittinger <cg@exept.de>
parents: 2308
diff changeset
  1963
    OBJ fp = __INST(handle);
6f4cc7b644db filePointer -> handle migration
Claus Gittinger <cg@exept.de>
parents: 2308
diff changeset
  1964
    SOCKET sock;
6f4cc7b644db filePointer -> handle migration
Claus Gittinger <cg@exept.de>
parents: 2308
diff changeset
  1965
    union sockaddr_u sa;
6f4cc7b644db filePointer -> handle migration
Claus Gittinger <cg@exept.de>
parents: 2308
diff changeset
  1966
    int sockaddr_size;
2909
aacef77a1697 64bit fixes
Claus Gittinger <cg@exept.de>
parents: 2904
diff changeset
  1967
    INT ret;
2321
6f4cc7b644db filePointer -> handle migration
Claus Gittinger <cg@exept.de>
parents: 2308
diff changeset
  1968
    int sockAddrOffs;
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  1969
3059
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  1970
    if (fp == nil) {
5473
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  1971
	goto getOutOfHere;
2321
6f4cc7b644db filePointer -> handle migration
Claus Gittinger <cg@exept.de>
parents: 2308
diff changeset
  1972
    }
3059
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  1973
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  1974
    if (! __isBytes(socketAddress)) {
5473
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  1975
	error = __mkSmallInteger(-1);
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  1976
	goto getOutOfHere;
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  1977
    }
2321
6f4cc7b644db filePointer -> handle migration
Claus Gittinger <cg@exept.de>
parents: 2308
diff changeset
  1978
    /* get the socket-address */
3059
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  1979
    if (__isNonNilObject(socketAddress)){
5473
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  1980
	int nIndex;
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  1981
	OBJ cls = __qClass(socketAddress);
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  1982
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  1983
	sockAddrOffs = __OBJS2BYTES__(__intVal(__ClassInstPtr(cls)->c_ninstvars));
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  1984
	nIndex = __qSize(socketAddress) - OHDR_SIZE;
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  1985
	sockaddr_size = nIndex - sockAddrOffs;
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  1986
	if (sockaddr_size > sizeof(sa)) {
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  1987
	    error=__mkSmallInteger(-2);
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  1988
	    goto getOutOfHere;
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  1989
	}
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  1990
	memcpy(&sa, __byteArrayVal(socketAddress) + sockAddrOffs, sockaddr_size);
2321
6f4cc7b644db filePointer -> handle migration
Claus Gittinger <cg@exept.de>
parents: 2308
diff changeset
  1991
    }
6f4cc7b644db filePointer -> handle migration
Claus Gittinger <cg@exept.de>
parents: 2308
diff changeset
  1992
6f4cc7b644db filePointer -> handle migration
Claus Gittinger <cg@exept.de>
parents: 2308
diff changeset
  1993
    sock = SOCKET_FROM_FILE_OBJECT(fp);
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  1994
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  1995
# ifdef SO_REUSEADDR
2321
6f4cc7b644db filePointer -> handle migration
Claus Gittinger <cg@exept.de>
parents: 2308
diff changeset
  1996
    if (reuse == true) {
5473
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  1997
	int on = 1;
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  1998
	if (setsockopt(sock, SOL_SOCKET, SO_REUSEADDR, (char *) &on, sizeof (on)) < 0) {
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  1999
	    DBGPRINTF(("SOCKET: setsockopt - SO_REUSEADDR failed\n"));
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  2000
	}
2321
6f4cc7b644db filePointer -> handle migration
Claus Gittinger <cg@exept.de>
parents: 2308
diff changeset
  2001
    }
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2002
# endif /* SO_REUSEADDR */
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
# ifdef BIND_BLOCKS
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2005
#  ifdef DO_WRAP_CALLS
2321
6f4cc7b644db filePointer -> handle migration
Claus Gittinger <cg@exept.de>
parents: 2308
diff changeset
  2006
    do {
5473
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  2007
	__threadErrno = 0;
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  2008
	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
  2009
    } while ((ret < 0) && (__threadErrno == EINTR));
3126
d95cc55a4fb5 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3123
diff changeset
  2010
    if (ret < 0) {
5473
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  2011
	errno = __threadErrno;
3126
d95cc55a4fb5 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3123
diff changeset
  2012
    }
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2013
#  else
2321
6f4cc7b644db filePointer -> handle migration
Claus Gittinger <cg@exept.de>
parents: 2308
diff changeset
  2014
    __BEGIN_INTERRUPTABLE__
6f4cc7b644db filePointer -> handle migration
Claus Gittinger <cg@exept.de>
parents: 2308
diff changeset
  2015
    do {
5473
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  2016
	ret = bind(sock, (struct sockaddr *)&sa, sockaddr_size);
2321
6f4cc7b644db filePointer -> handle migration
Claus Gittinger <cg@exept.de>
parents: 2308
diff changeset
  2017
    } while ((ret < 0) && (errno == EINTR));
6f4cc7b644db filePointer -> handle migration
Claus Gittinger <cg@exept.de>
parents: 2308
diff changeset
  2018
    __END_INTERRUPTABLE__
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2019
#  endif
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2020
# else
3126
d95cc55a4fb5 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3123
diff changeset
  2021
    errno = 0;
2321
6f4cc7b644db filePointer -> handle migration
Claus Gittinger <cg@exept.de>
parents: 2308
diff changeset
  2022
    ret = bind(sock, (struct sockaddr *)&sa, sockaddr_size);
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2023
# endif
2321
6f4cc7b644db filePointer -> handle migration
Claus Gittinger <cg@exept.de>
parents: 2308
diff changeset
  2024
    if (ret < 0) {
3843
fbced69597a7 oops - error check was disabled
Claus Gittinger <cg@exept.de>
parents: 3742
diff changeset
  2025
# ifdef __win32__
5473
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  2026
	if (errno == 0) {
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  2027
	    errno = WSAGetLastError();
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  2028
	}
3126
d95cc55a4fb5 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3123
diff changeset
  2029
# endif
5473
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  2030
	DBGPRINTF(("SOCKET: bind failed errno=%d\n", errno));
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  2031
	error = __INST(lastErrorNumber) = __MKSMALLINT(errno);
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  2032
	goto getOutOfHere;
2321
6f4cc7b644db filePointer -> handle migration
Claus Gittinger <cg@exept.de>
parents: 2308
diff changeset
  2033
    } else {
5473
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  2034
	ok = true;
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
#endif /* NO_SOCKET */
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2037
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2038
getOutOfHere: ;
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2039
%}.
4234
eb1b470a27ee #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 4206
diff changeset
  2040
    ok ifFalse:[
5473
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  2041
	|errorHolder errorString|
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  2042
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  2043
	error isInteger ifTrue:[
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  2044
	    errorHolder := OperatingSystem errorHolderForNumber:error.
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  2045
	    errorString := errorHolder errorString.
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  2046
	] ifFalse:[
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  2047
	    errorString := error.
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  2048
	].
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  2049
	OpenError newException
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  2050
	    errorString:('cannot bind socket to address: %1 (%2)'
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  2051
			    bindWith:socketAddress
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  2052
			    with:errorString);
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  2053
	    errorCode:error;
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  2054
	    osErrorHolder:errorHolder;
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  2055
	    parameter:self;
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  2056
	    raiseRequest.
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  2057
	"maybe someone catches the error and binds to some other port..."
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  2058
	^ true.
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2059
    ].
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2060
3059
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  2061
    port := socketAddress port.
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  2062
    port == 0 ifTrue:[
5473
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  2063
	"this is a bind to a random port, now we can get the real port"
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  2064
	port := self getFullSocketAddress port.
3059
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  2065
    ].
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2066
    ^ true
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2067
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2068
    "
3059
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  2069
     (Socket domain:#'AF_INET' type:#stream)
5473
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  2070
	bindTo:(IPSocketAddress anyHost port:445) reuseAddress:false;
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  2071
	yourself.
3059
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  2072
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  2073
     (Socket domain:#'AF_INET' type:#stream)
5473
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  2074
	bindTo:139 reuseAddress:false;
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  2075
	yourself.
3059
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  2076
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  2077
     (Socket domain:#'AF_INET6' type:#stream)
5473
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  2078
	bindTo:nil reuseAddress:false;
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  2079
	yourself.
3059
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  2080
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  2081
     (Socket domain:#'AF_INET' type:#stream)
5473
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  2082
	bindTo:(IPSocketAddress localHost port:2122) reuseAddress:false;
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  2083
	yourself.
3059
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  2084
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  2085
     (Socket domain:#'AF_UNIX' type:#stream)
5473
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  2086
	bindTo:nil reuseAddress:false;
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  2087
	yourself.
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2088
    "
4568
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  2089
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  2090
    "Modified: / 19-01-2018 / 13:37:21 / stefan"
4942
9f424bed67c4 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 4796
diff changeset
  2091
    "Modified (format): / 08-05-2019 / 14:41:18 / Claus Gittinger"
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2092
!
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2093
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2094
listenFor:aNumber
4568
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  2095
    "start listening; return true if ok, false on error.
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  2096
     Notify with a SocketErrorNotification on error.
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2097
     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
  2098
4568
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  2099
    |err|
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  2100
2321
6f4cc7b644db filePointer -> handle migration
Claus Gittinger <cg@exept.de>
parents: 2308
diff changeset
  2101
    handle isNil ifTrue:[
5473
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  2102
	^ self errorNotOpen
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2103
    ].
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2104
%{
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2105
#ifndef NO_SOCKET
2321
6f4cc7b644db filePointer -> handle migration
Claus Gittinger <cg@exept.de>
parents: 2308
diff changeset
  2106
    OBJ fp = __INST(handle);
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2107
    SOCKET sock;
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2108
    int ret;
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2109
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2110
    if (! __isSmallInteger(aNumber)) {
5473
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  2111
	DBGPRINTF(("SOCKET: invalid arg\n"));
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  2112
	err = @symbol(badArgument);
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  2113
	goto out;
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2114
    }
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2115
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2116
    sock = SOCKET_FROM_FILE_OBJECT(fp);
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2117
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2118
#ifdef LISTEN_BLOCKS
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2119
# ifdef DO_WRAP_CALLS
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2120
    do {
5473
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  2121
	__threadErrno = 0;
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  2122
	ret = STX_WSA_NOINT_CALL2("listen", listen, sock, __intVal(aNumber));
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2123
    } while ((ret < 0) && (__threadErrno == EINTR));
3126
d95cc55a4fb5 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3123
diff changeset
  2124
    if (ret < 0) {
5473
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  2125
	errno = __threadErrno;
3126
d95cc55a4fb5 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3123
diff changeset
  2126
    }
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2127
# else
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2128
    __BEGIN_INTERRUPTABLE__
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2129
    do {
5473
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  2130
	ret = listen(sock, __intVal(aNumber));
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2131
    } while ((ret < 0) && (errno == EINTR));
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2132
    __END_INTERRUPTABLE__
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2133
# endif
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2134
#else
3126
d95cc55a4fb5 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3123
diff changeset
  2135
    errno = 0;
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2136
    ret = listen(sock, __intVal(aNumber));
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2137
#endif
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2138
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2139
    if (ret < 0) {
3843
fbced69597a7 oops - error check was disabled
Claus Gittinger <cg@exept.de>
parents: 3742
diff changeset
  2140
# ifdef __win32__
5473
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  2141
	if (errno == 0) {
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  2142
	    errno = WSAGetLastError();
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  2143
	}
3126
d95cc55a4fb5 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3123
diff changeset
  2144
# endif
5473
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  2145
	err = __MKSMALLINT(errno);
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  2146
	DBGPRINTF(("SOCKET: listen call failed errno=%d\n", errno));
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  2147
	goto out;
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2148
    }
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2149
#else
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2150
    RETURN (false);
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2151
#endif
4568
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  2152
out:;
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2153
%}.
4568
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  2154
    err notNil ifTrue:[
5473
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  2155
	err isSymbol ifTrue:[
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  2156
	    self error:err.
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  2157
	].
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  2158
	^ self reportError:err.
4568
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  2159
    ].
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  2160
3157
44f5f9f79256 initialize methods
Stefan Vogel <sv@exept.de>
parents: 3155
diff changeset
  2161
    listening := aNumber.
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2162
    ^ true
4568
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  2163
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  2164
    "
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  2165
       [
5473
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  2166
	   |sock|
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  2167
	   sock := Socket newTCP.
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  2168
	   sock listenFor:1.
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  2169
	   sock
4568
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  2170
       ] on:SocketErrorNotification do:[:ex|
5473
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  2171
	   ex halt.
4568
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  2172
       ].
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  2173
    "
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  2174
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  2175
    "Modified (comment): / 19-01-2018 / 13:50:09 / stefan"
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2176
! !
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2177
1576
a2ffb22c5f5e New: #shutDownInput #shutDownOutput
Stefan Vogel <sv@exept.de>
parents: 1568
diff changeset
  2178
!Socket methodsFor:'closing'!
a2ffb22c5f5e New: #shutDownInput #shutDownOutput
Stefan Vogel <sv@exept.de>
parents: 1568
diff changeset
  2179
4172
2a6544c030fc #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 4091
diff changeset
  2180
abortAndClose
2a6544c030fc #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 4091
diff changeset
  2181
    "immediately abort the connection:
5473
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  2182
	discard buffered data and close the stream"
4414
42edc97b2323 bcopy -> memcpy
Claus Gittinger <cg@exept.de>
parents: 4341
diff changeset
  2183
42edc97b2323 bcopy -> memcpy
Claus Gittinger <cg@exept.de>
parents: 4341
diff changeset
  2184
    self linger:0.
42edc97b2323 bcopy -> memcpy
Claus Gittinger <cg@exept.de>
parents: 4341
diff changeset
  2185
    self close.
3224
bad706c50347 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3223
diff changeset
  2186
!
bad706c50347 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3223
diff changeset
  2187
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2188
shutDown
4414
42edc97b2323 bcopy -> memcpy
Claus Gittinger <cg@exept.de>
parents: 4341
diff changeset
  2189
    "shutDown (initiate a graceful close)
4172
2a6544c030fc #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 4091
diff changeset
  2190
     and close (free the filedescriptor) the socket.
4414
42edc97b2323 bcopy -> memcpy
Claus Gittinger <cg@exept.de>
parents: 4341
diff changeset
  2191
     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
  2192
     background, unless you set linger"
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2193
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2194
    self shutdown:2.
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2195
    self close
1576
a2ffb22c5f5e New: #shutDownInput #shutDownOutput
Stefan Vogel <sv@exept.de>
parents: 1568
diff changeset
  2196
!
a2ffb22c5f5e New: #shutDownInput #shutDownOutput
Stefan Vogel <sv@exept.de>
parents: 1568
diff changeset
  2197
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2198
shutDownInput
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2199
    "shutDown the input side of the socket.
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2200
     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
  2201
     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
  2202
     (e.g. setting the TCP-Windowsize to 0)"
a2ffb22c5f5e New: #shutDownInput #shutDownOutput
Stefan Vogel <sv@exept.de>
parents: 1568
diff changeset
  2203
a2ffb22c5f5e New: #shutDownInput #shutDownOutput
Stefan Vogel <sv@exept.de>
parents: 1568
diff changeset
  2204
    self shutdown:0.
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2205
!
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2206
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2207
shutDownOutput
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2208
    "shutDown the output side of the socket.
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2209
     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
  2210
     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
  2211
     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
  2212
     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
  2213
     has been delivered to the peer.
2a6544c030fc #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 4091
diff changeset
  2214
     Otherwise the operation returns immediately."
1343
cc3bed115c0a definitions cleanup with stxOSDefs.h
penk
parents: 1342
diff changeset
  2215
1884
ee0d640a25a7 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1882
diff changeset
  2216
    self shutdown:1.
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2217
! !
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2218
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2219
!Socket methodsFor:'connecting'!
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2220
3059
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  2221
connectTo:aSocketAddress
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  2222
    ^ self connectTo:aSocketAddress withTimeout:nil
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  2223
!
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  2224
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2225
connectTo:hostOrPathName port:portNrOrName
3655
eb81fa3d8407 #REFACTORING
Stefan Vogel <sv@exept.de>
parents: 3633
diff changeset
  2226
    <resource: #obsolete>
3059
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  2227
    "Backward compatibility connect; connect to port, portNrOrNameOrNil on host, hostOrPathNameOrSocketAddr.
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  2228
     For backward compatibility, hostOrPathNameOrSocketAddr may be also a string or a byteArray,
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  2229
     but it is recommended to pass SocketAddress instances.
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2230
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2231
     Return true if ok, false otherwise.
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2232
     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
  2233
     See also: #connectTo:port:withTimeout: for a somewhat nicer interface."
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2234
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2235
    ^ self connectTo:hostOrPathName port:portNrOrName withTimeout:nil
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2236
!
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2237
4570
39e965ca8d06 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4568
diff changeset
  2238
connectTo:hostOrPathNameOrSocketAddr port:portNrOrNameOrNil withTimeout:milliSecondsOrTimeDuration
3655
eb81fa3d8407 #REFACTORING
Stefan Vogel <sv@exept.de>
parents: 3633
diff changeset
  2239
    <resource: #obsolete>
3059
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  2240
    "Backward compatibility connect; connect to port, portNrOrNameOrNil on host, hostOrPathNameOrSocketAddr.
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  2241
     For backward compatibility, hostOrPathNameOrSocketAddr may be also a string or a byteArray,
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  2242
     but it is recommended to pass SocketAddress instances.
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2243
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2244
     Return true if ok, false otherwise.
4568
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  2245
     Notify with a SocketErrorNotification on error.
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  2246
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2247
     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
  2248
     or milliSecondsOrTimeDuration milliseconds have passed."
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2249
3059
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  2250
    |domainClass socketAddress|
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  2251
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  2252
    (hostOrPathNameOrSocketAddr isSocketAddress) ifTrue:[
5473
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  2253
	socketAddress := hostOrPathNameOrSocketAddr.
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  2254
	portNrOrNameOrNil notNil ifTrue:[
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  2255
	    socketAddress port:portNrOrNameOrNil.
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  2256
	].
3059
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  2257
    ] ifFalse:[
5473
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  2258
	"backward compatibility: support for byteArray and string arg"
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  2259
	domainClass := self class socketAddressClassForDomain:domain.
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  2260
	domainClass isNil ifTrue:[
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  2261
	    ^ self error:'invalid (unsupported) domain'.
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  2262
	].
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  2263
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  2264
	hostOrPathNameOrSocketAddr isString ifTrue:[
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  2265
	    socketAddress := domainClass hostName:hostOrPathNameOrSocketAddr serviceName:portNrOrNameOrNil type:#SOCK_STREAM.
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  2266
	    peerName := hostOrPathNameOrSocketAddr.
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  2267
	] ifFalse:[
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  2268
	    hostOrPathNameOrSocketAddr isByteCollection ifFalse:[
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  2269
		^ self error:'connectTo: bad host (socketAddress) argument'
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  2270
	    ].
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  2271
	    socketAddress := domainClass hostAddress:hostOrPathNameOrSocketAddr port:portNrOrNameOrNil.
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  2272
	].
3059
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  2273
    ].
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  2274
4570
39e965ca8d06 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4568
diff changeset
  2275
    ^ self connectTo:socketAddress withTimeout:milliSecondsOrTimeDuration.
3059
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  2276
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  2277
    "
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  2278
       |sock|
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  2279
       sock := Socket newTCP.
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  2280
       sock connectTo:'localhost' port:21 withTimeout:1000.
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  2281
       sock
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  2282
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  2283
       |sock|
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  2284
       sock := Socket newTCP.
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  2285
       sock connectTo:'localhost' port:9876 withTimeout:2000.
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  2286
       sock
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  2287
    "
4568
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  2288
4570
39e965ca8d06 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4568
diff changeset
  2289
    "Modified (comment): / 19-01-2018 / 17:48:08 / stefan"
3059
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  2290
!
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  2291
4570
39e965ca8d06 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4568
diff changeset
  2292
connectTo:aSocketAddress withTimeout:milliSecondsOrTimeDuration
3059
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  2293
    "Connect to a SocketAddress.
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  2294
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  2295
     Return true if ok, false otherwise.
4568
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  2296
     Notify with a SocketErrorNotification on error.
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  2297
3059
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  2298
     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
  2299
     or timeout milliseconds have passed."
3059
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  2300
4570
39e965ca8d06 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4568
diff changeset
  2301
    |isAsync err timeoutMs milliSeconds|
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2302
2321
6f4cc7b644db filePointer -> handle migration
Claus Gittinger <cg@exept.de>
parents: 2308
diff changeset
  2303
    handle isNil ifTrue:[
5473
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  2304
	^ self errorNotOpen
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2305
    ].
4234
eb1b470a27ee #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 4206
diff changeset
  2306
    isAsync := false.
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2307
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2308
%{  /* STACK: 100000 */
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2309
#ifndef NO_SOCKET
3123
55ef9ca4f09f class: Socket
Stefan Vogel <sv@exept.de>
parents: 3077
diff changeset
  2310
//#define DUMP_ADDRESS 1
2321
6f4cc7b644db filePointer -> handle migration
Claus Gittinger <cg@exept.de>
parents: 2308
diff changeset
  2311
    OBJ fp = __INST(handle);
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2312
    union sockaddr_u sa;
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2313
    SOCKET sock;
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2314
    int a;
2909
aacef77a1697 64bit fixes
Claus Gittinger <cg@exept.de>
parents: 2904
diff changeset
  2315
    INT ret;
aacef77a1697 64bit fixes
Claus Gittinger <cg@exept.de>
parents: 2904
diff changeset
  2316
    int oldFlags;
3741
2a39a558012f mingw change
Claus Gittinger <cg@exept.de>
parents: 3657
diff changeset
  2317
# ifdef __MINGW64__
2a39a558012f mingw change
Claus Gittinger <cg@exept.de>
parents: 3657
diff changeset
  2318
    unsigned long on = 1;
2a39a558012f mingw change
Claus Gittinger <cg@exept.de>
parents: 3657
diff changeset
  2319
# else
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2320
    int on = 1;
3741
2a39a558012f mingw change
Claus Gittinger <cg@exept.de>
parents: 3657
diff changeset
  2321
#endif
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2322
    int sockaddr_size;
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2323
3059
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  2324
    if (!__isNonNilObject(aSocketAddress) || !__isBytes(aSocketAddress)) {
5473
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  2325
	DBGPRINTF(("SOCKET: invalid socketAddress\n"));
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  2326
	err = @symbol(argumentError);
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  2327
	goto out;
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2328
    }
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2329
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2330
    {
5473
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  2331
	int sockAddrOffs = 0;
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  2332
	int nIndex =__byteArraySize(aSocketAddress);
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  2333
	OBJ cls = __qClass(aSocketAddress);
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  2334
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  2335
	//if (cls != @global(ByteArray))
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  2336
	//    sockAddrOffs = __OBJS2BYTES__(__intVal(__ClassInstPtr(cls)->c_ninstvars));
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  2337
	sockaddr_size = nIndex - sockAddrOffs;
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  2338
	if (sockaddr_size > sizeof(sa)) {
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  2339
	    DBGPRINTF(("SOCKET: invalid (short) socketAddress\n"));
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  2340
	    err = @symbol(argumentError);
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  2341
	    goto out;
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  2342
	}
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  2343
	memcpy(&sa, __byteArrayVal(aSocketAddress) + sockAddrOffs, sockaddr_size);
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2344
    }
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2345
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2346
    sock = SOCKET_FROM_FILE_OBJECT(fp);
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2347
3843
fbced69597a7 oops - error check was disabled
Claus Gittinger <cg@exept.de>
parents: 3742
diff changeset
  2348
#ifdef __win32__
3657
Stefan Vogel <sv@exept.de>
parents: 3655
diff changeset
  2349
     ioctlsocket(sock, FIONBIO, &on);
Stefan Vogel <sv@exept.de>
parents: 3655
diff changeset
  2350
#elif defined(O_NONBLOCK)
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2351
    /*
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2352
     * set to non-blocking and wait later
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2353
     */
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2354
    oldFlags = fcntl(sock, F_GETFL, 0);
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2355
    /* on SUNOS4.x, would use fcntl(osfd, F_SETFL, flags | FNDELAY); */
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2356
    fcntl(sock, F_SETFL, oldFlags | O_NONBLOCK);
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2357
# endif
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2358
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2359
    /*
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2360
     * connect
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2361
     */
3123
55ef9ca4f09f class: Socket
Stefan Vogel <sv@exept.de>
parents: 3077
diff changeset
  2362
4039
87f0dc2e89d8 #OTHER by mawalch
mawalch
parents: 4038
diff changeset
  2363
// we do not use wrap calls any longer, because they have problems with aborting.
3657
Stefan Vogel <sv@exept.de>
parents: 3655
diff changeset
  2364
// we use nonblocking accept() instead.
Stefan Vogel <sv@exept.de>
parents: 3655
diff changeset
  2365
# if 0 && defined(DO_WRAP_CALLS)
3217
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  2366
    // __setWrapCallDebugging(1,1);
2414
886ecf4b36cd changed:
ab
parents: 2340
diff changeset
  2367
3123
55ef9ca4f09f class: Socket
Stefan Vogel <sv@exept.de>
parents: 3077
diff changeset
  2368
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2369
    do {
5473
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  2370
	DBGFPRINTF((stderr, "SOCKET: (sock=%d) connect...\n", sock));
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  2371
	ret = STX_WSA_NOINT_CALL3("connect", connect, sock, &sa, (INT)sockaddr_size);
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  2372
	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
  2373
    } while ((ret < 0) && (__threadErrno == EINTR));
3123
55ef9ca4f09f class: Socket
Stefan Vogel <sv@exept.de>
parents: 3077
diff changeset
  2374
3077
032905ddd57a class: Socket
Claus Gittinger <cg@exept.de>
parents: 3072
diff changeset
  2375
    if (ret < 0) {
5473
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  2376
	int optLen = sizeof(errno);
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  2377
	errno = __threadErrno;
3123
55ef9ca4f09f class: Socket
Stefan Vogel <sv@exept.de>
parents: 3077
diff changeset
  2378
#if 0
5473
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  2379
	if (getsockopt(sock, SOL_SOCKET, SO_ERROR, &errno, &optLen) == SOCKET_ERROR) {
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  2380
	    DBGFPRINTF((stderr, "SOCKET: getsockopt(SO_ERROR) failed: %d\n", WSAGetLastError()));
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  2381
	}
3657
Stefan Vogel <sv@exept.de>
parents: 3655
diff changeset
  2382
#endif // 0
3077
032905ddd57a class: Socket
Claus Gittinger <cg@exept.de>
parents: 3072
diff changeset
  2383
    }
032905ddd57a class: Socket
Claus Gittinger <cg@exept.de>
parents: 3072
diff changeset
  2384
032905ddd57a class: Socket
Claus Gittinger <cg@exept.de>
parents: 3072
diff changeset
  2385
    // __setWrapCallDebugging(1,0);
3657
Stefan Vogel <sv@exept.de>
parents: 3655
diff changeset
  2386
# else // !DO_WRAP_CALLS
Stefan Vogel <sv@exept.de>
parents: 3655
diff changeset
  2387
3843
fbced69597a7 oops - error check was disabled
Claus Gittinger <cg@exept.de>
parents: 3742
diff changeset
  2388
#  if !defined(__win32__) && !defined(O_NONBLOCK)
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2389
    __BEGIN_INTERRUPTABLE__
3657
Stefan Vogel <sv@exept.de>
parents: 3655
diff changeset
  2390
#  endif
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2391
    do {
5473
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  2392
	ret = connect(sock, (struct sockaddr *)&sa, sockaddr_size);
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2393
    } while ((ret < 0)
3843
fbced69597a7 oops - error check was disabled
Claus Gittinger <cg@exept.de>
parents: 3742
diff changeset
  2394
#  ifdef __win32__
5473
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  2395
	     && (errno = WSAGetLastError())
3657
Stefan Vogel <sv@exept.de>
parents: 3655
diff changeset
  2396
#  endif
5473
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  2397
	     && ((errno == EINTR)
3657
Stefan Vogel <sv@exept.de>
parents: 3655
diff changeset
  2398
#  ifdef EAGAIN
5473
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  2399
		 || (errno == EAGAIN)
3657
Stefan Vogel <sv@exept.de>
parents: 3655
diff changeset
  2400
#  endif
5473
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  2401
		));
3843
fbced69597a7 oops - error check was disabled
Claus Gittinger <cg@exept.de>
parents: 3742
diff changeset
  2402
#  if !defined(__win32__) && !defined(O_NONBLOCK)
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2403
    __END_INTERRUPTABLE__
3657
Stefan Vogel <sv@exept.de>
parents: 3655
diff changeset
  2404
#  endif
Stefan Vogel <sv@exept.de>
parents: 3655
diff changeset
  2405
#endif
Stefan Vogel <sv@exept.de>
parents: 3655
diff changeset
  2406
3843
fbced69597a7 oops - error check was disabled
Claus Gittinger <cg@exept.de>
parents: 3742
diff changeset
  2407
#if defined(__win32__) && !defined(EINPROGRESS)
3657
Stefan Vogel <sv@exept.de>
parents: 3655
diff changeset
  2408
# define EINPROGRESSS WSAEINPROGRESSS
Stefan Vogel <sv@exept.de>
parents: 3655
diff changeset
  2409
# define EALREADY WSAEALREADY
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2410
#endif
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2411
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2412
    if (ret < 0) {
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2413
# if defined(EINPROGRESS) || defined(EALREADY)
5473
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  2414
	if (0
3843
fbced69597a7 oops - error check was disabled
Claus Gittinger <cg@exept.de>
parents: 3742
diff changeset
  2415
#  ifdef __win32__
5473
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  2416
	    || (errno == WSAEWOULDBLOCK)
3657
Stefan Vogel <sv@exept.de>
parents: 3655
diff changeset
  2417
#  endif
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2418
#  ifdef EINPROGRESS
5473
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  2419
	    || (errno == EINPROGRESS)
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2420
#  endif
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2421
#  ifdef EALREADY
5473
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  2422
	    || (errno == EALREADY)
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2423
#  endif
5473
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  2424
	) {
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  2425
	    /*
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  2426
	     * This was a nonblocking operation that will take some time.
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  2427
	     * Do a select on read to get informed when the operation is ready.
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  2428
	     */
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  2429
	    DBGFPRINTF((stderr, "SOCKET: isAsync is true\n"));
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  2430
	    isAsync = true;
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  2431
	} else
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2432
# endif /* EINPROGRESS or EALREADY */
5473
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  2433
	{
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  2434
	    DBGFPRINTF((stderr, "SOCKET: connect failed ret=%"_ld_" errno=%d __threadErrno=%d\n",
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  2435
			(INT)ret, errno, __threadErrno ));
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2436
# ifdef DUMP_ADDRESS
5473
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  2437
	    {
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  2438
		unsigned char *cp = (unsigned char *)(&sa);
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  2439
		int i;
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  2440
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  2441
		console_printf("address data:\n");
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  2442
		for (i=0; i<sockaddr_size; i++) {
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  2443
		    console_printf(" %02x\n", *cp++);
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  2444
		}
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  2445
	    }
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2446
# endif
5473
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  2447
	    err = __MKSMALLINT(errno);
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  2448
	}
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2449
    }
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2450
3843
fbced69597a7 oops - error check was disabled
Claus Gittinger <cg@exept.de>
parents: 3742
diff changeset
  2451
# ifdef __win32__
3657
Stefan Vogel <sv@exept.de>
parents: 3655
diff changeset
  2452
    {
5473
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  2453
	int off = 0;
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  2454
	ioctlsocket(sock, FIONBIO, &off);
3657
Stefan Vogel <sv@exept.de>
parents: 3655
diff changeset
  2455
    }
Stefan Vogel <sv@exept.de>
parents: 3655
diff changeset
  2456
# elif defined(O_NONBLOCK) // Linux / Unix
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2457
    fcntl(sock, F_SETFL, oldFlags);
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2458
# endif
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2459
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2460
# else /* NO_SOCKET */
3077
032905ddd57a class: Socket
Claus Gittinger <cg@exept.de>
parents: 3072
diff changeset
  2461
    err = @symbol(notSupported);
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2462
# endif /* NO_SOCKET */
3077
032905ddd57a class: Socket
Claus Gittinger <cg@exept.de>
parents: 3072
diff changeset
  2463
out:;
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2464
%}.
3217
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  2465
3077
032905ddd57a class: Socket
Claus Gittinger <cg@exept.de>
parents: 3072
diff changeset
  2466
    err notNil ifTrue:[
5473
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  2467
	err isSymbol ifTrue:[
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  2468
	    self primitiveFailed:err.
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  2469
	].
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  2470
	^ self reportError:err.
3077
032905ddd57a class: Socket
Claus Gittinger <cg@exept.de>
parents: 3072
diff changeset
  2471
    ].
4234
eb1b470a27ee #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 4206
diff changeset
  2472
    isAsync ifTrue:[
5473
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  2473
	milliSeconds := milliSecondsOrTimeDuration.
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  2474
	milliSecondsOrTimeDuration isTimeDuration ifTrue:[
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  2475
	    milliSeconds := milliSecondsOrTimeDuration asMilliseconds.
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  2476
	].
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  2477
	(self writeExceptionWaitWithTimeoutMs:milliSeconds) ifTrue:[
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  2478
	    "/ a timeout occurred
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  2479
	    "/ should I cancel the connect?
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  2480
	    ^ self reportError:(OperatingSystem errorNumberFor:#ETIMEDOUT).
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  2481
	].
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  2482
	err := self getSocketError.
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  2483
	err ~~ 0 ifTrue:[
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  2484
	    ^ self reportError:err.
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  2485
	].
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2486
    ].
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2487
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
  2488
3059
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  2489
    peer := aSocketAddress.
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2490
    port isNil ifTrue:[
5473
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  2491
	"socket has not been explicitly bound,
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  2492
	 after connect it has been bound implicitly - fetch the port"
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  2493
	port := self getFullSocketAddress port.
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2494
    ].
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2495
    ^ true
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2496
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2497
    "
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2498
       |sock|
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2499
       sock := Socket newTCP.
3059
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  2500
       sock connectTo:(IPSocketAddress localHost port:21) withTimeout:1000.
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2501
       sock
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2502
4568
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  2503
       [
5473
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  2504
	   |sock|
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  2505
	   sock := Socket newTCP.
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  2506
	   sock connectTo:(IPSocketAddress localHost port:21) withTimeout:1000.
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  2507
	   sock
4568
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  2508
       ] on:SocketErrorNotification do:[:ex|
5473
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  2509
	   ex halt.
4568
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  2510
       ].
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  2511
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2512
       |sock|
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2513
       sock := Socket newTCP.
3059
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  2514
       sock connectTo:(IPSocketAddress localHost port:9876) withTimeout:2000.
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2515
       sock
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2516
    "
4568
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  2517
4570
39e965ca8d06 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4568
diff changeset
  2518
    "Modified: / 19-01-2018 / 17:57:36 / stefan"
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2519
! !
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  2520
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2521
!Socket methodsFor:'datagram transmission'!
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2522
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2523
receiveBuffer:aDataBuffer start:startIndex for:nBytes
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2524
    "receive data
4626
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2525
     Return the number of bytes received.
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2526
     The thread blocks until data arrives - you may want to wait before
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2527
     receiving, using #readWait or #readWaitWithTimeout:."
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2528
3126
d95cc55a4fb5 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3123
diff changeset
  2529
    |nReceived error|
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2530
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2531
%{
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2532
#ifndef NO_SOCKET
2321
6f4cc7b644db filePointer -> handle migration
Claus Gittinger <cg@exept.de>
parents: 2308
diff changeset
  2533
    OBJ fp = __INST(handle);
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2534
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2535
    if (fp != nil) {
5473
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  2536
	SOCKET sock;
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  2537
	INT objSize, offs;
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  2538
	INT n;
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  2539
	char *extPtr;
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  2540
	unsigned char *buffer;
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  2541
	unsigned char *allocatedBuffer = NULL;
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  2542
	INT flags = 0;
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  2543
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  2544
	sock = SOCKET_FROM_FILE_OBJECT(fp);
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  2545
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  2546
	if (! setupBufferParameters(aDataBuffer, startIndex, &extPtr, &offs, &objSize)) goto bad;
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  2547
	if (__isSmallInteger(nBytes)) {
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  2548
	    if (__intVal(nBytes) < objSize) {
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  2549
		objSize = __intVal(nBytes);
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  2550
	    }
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  2551
	}
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2552
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2553
# ifdef DO_WRAP_CALLS
5473
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  2554
	if (extPtr) {
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  2555
	    buffer = extPtr + offs;
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  2556
	} else {
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  2557
	    allocatedBuffer = buffer = (char *)malloc(objSize);
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  2558
	}
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  2559
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  2560
	do {
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  2561
	    __threadErrno = 0;
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  2562
	    n = (INT)STX_WSA_NOINT_CALL4("recv", recv, sock, buffer, objSize, flags);
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  2563
	} while ((n < 0) && (__threadErrno == EINTR));
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  2564
	if (n < 0) {
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  2565
	    errno = __threadErrno;
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  2566
	}
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  2567
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  2568
	if (allocatedBuffer) {
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  2569
	    if (n > 0) {
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  2570
		memcpy((char *)__InstPtr(aDataBuffer) + offs, allocatedBuffer, n);
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  2571
	    }
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  2572
	    free(allocatedBuffer);
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  2573
	}
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2574
# else
5473
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  2575
	__BEGIN_INTERRUPTABLE__
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  2576
	do {
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  2577
	    if (extPtr) {
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  2578
		n = recv(sock, extPtr + offs, objSize, flags);
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  2579
	    } else {
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  2580
		n = recv(sock, (char *)__InstPtr(aDataBuffer) + offs, objSize, flags);
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  2581
	    }
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  2582
	} while ((n < 0) && (errno == EINTR));
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  2583
	__END_INTERRUPTABLE__
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2584
# endif
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2585
5473
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  2586
	if (n < 0) {
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  2587
	    error = __INST(lastErrorNumber) = __MKSMALLINT(errno);
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  2588
	} else {
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  2589
	    RETURN(__MKSMALLINT(n));
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  2590
	}
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2591
    }
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2592
#endif
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2593
bad: ;
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2594
%}.
3126
d95cc55a4fb5 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3123
diff changeset
  2595
    error notNil ifTrue:[
5473
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  2596
	^ self readError:error.
915
3dc0e3cd838a added interface to send() and recv()
Claus Gittinger <cg@exept.de>
parents: 898
diff changeset
  2597
    ].
3dc0e3cd838a added interface to send() and recv()
Claus Gittinger <cg@exept.de>
parents: 898
diff changeset
  2598
    "
1282
7e4ffdfd19f6 remove historic leftover
Claus Gittinger <cg@exept.de>
parents: 1280
diff changeset
  2599
     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
  2600
    "
3dc0e3cd838a added interface to send() and recv()
Claus Gittinger <cg@exept.de>
parents: 898
diff changeset
  2601
    self primitiveFailed
4626
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2602
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2603
    "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
  2604
!
7d016cc30052 fixed & moved pingWalk from SNMPSession to here;
Claus Gittinger <cg@exept.de>
parents: 98
diff changeset
  2605
4626
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2606
receiveFrom:aSocketAddress buffer:aDataBuffer
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2607
    "receive datagramm data - put address of originating host into
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2608
     aSocketAddress, data into aDataBuffer.
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2609
     aDataBuffer must be ByteArray-like.
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2610
     For backward compatibility, aSocketAddress may be a non-SocketAddress;
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2611
     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
  2612
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2613
     Return the number of bytes received.
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2614
     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
  2615
     receiving, using #readWait or #readWaitWithTimeout:."
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2616
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2617
    ^ 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
  2618
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2619
    "Modified (comment): / 21-03-2018 / 19:33:59 / stefan"
3615
ffe86e1b14ed #BUGFIX
Stefan Vogel <sv@exept.de>
parents: 3614
diff changeset
  2620
!
ffe86e1b14ed #BUGFIX
Stefan Vogel <sv@exept.de>
parents: 3614
diff changeset
  2621
4626
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2622
receiveFrom:aSocketAddress buffer:aDataBuffer start:startIndex for:nBytes
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2623
    ^ self receiveFrom:aSocketAddress buffer:aDataBuffer start:startIndex for:nBytes flags:0
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2624
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2625
    "Modified (format): / 21-03-2018 / 19:32:27 / stefan"
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
receiveFrom:aSocketAddress buffer:aDataBuffer start:startIndex for:nBytes flags:flags
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2629
    "receive datagramm data
4626
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2630
     - put address of originating host into aSocketAddress, data into aDataBuffer.
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2631
     aDataBuffer must be ByteArray-like.
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2632
     For backward compatibility, aSocketAddress may be a non-SocketAddress;
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2633
     then, it must be a byteArray with appropriate size for the addressBytes.
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2634
4626
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2635
     Return the number of bytes received.
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2636
     The thread blocks until data arrives - you may want to wait before
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2637
     receiving, using #readWait or #readWaitWithTimeout:."
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2638
3126
d95cc55a4fb5 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3123
diff changeset
  2639
    |domainClass addr addrLen nReceived error|
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2640
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2641
    domainClass := self class socketAddressClassForDomain:domain.
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2642
    domainClass isNil ifTrue:[
5474
99d731df2a80 #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 5473
diff changeset
  2643
        ^ self error:'invalid (unsupported) domain'.
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2644
    ].
4626
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2645
    aSocketAddress isSocketAddress ifTrue:[
5474
99d731df2a80 #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 5473
diff changeset
  2646
        aSocketAddress class == domainClass ifFalse:[
99d731df2a80 #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 5473
diff changeset
  2647
            ^ self error:'addressBuffer class mismatch (domain)'.
99d731df2a80 #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 5473
diff changeset
  2648
        ].
99d731df2a80 #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 5473
diff changeset
  2649
        addr := aSocketAddress.
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2650
    ] ifFalse:[
5474
99d731df2a80 #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 5473
diff changeset
  2651
        aSocketAddress notNil ifTrue:[
99d731df2a80 #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 5473
diff changeset
  2652
            addr := domainClass new.
99d731df2a80 #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 5473
diff changeset
  2653
        ].
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2654
    ].
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2655
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2656
%{
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2657
#ifndef NO_SOCKET
2321
6f4cc7b644db filePointer -> handle migration
Claus Gittinger <cg@exept.de>
parents: 2308
diff changeset
  2658
    OBJ fp = __INST(handle);
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2659
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2660
    if (fp != nil) {
5474
99d731df2a80 #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 5473
diff changeset
  2661
        SOCKET sock;
99d731df2a80 #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 5473
diff changeset
  2662
        size_t objSize;
99d731df2a80 #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 5473
diff changeset
  2663
        union sockaddr_u sa;
99d731df2a80 #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 5473
diff changeset
  2664
        socklen_t alen = 0;
99d731df2a80 #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 5473
diff changeset
  2665
        INT n, offs;
99d731df2a80 #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 5473
diff changeset
  2666
        INT _flags = __unsignedLongIntVal(flags);
99d731df2a80 #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 5473
diff changeset
  2667
        char *extPtr;
99d731df2a80 #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 5473
diff changeset
  2668
        unsigned char *allocatedBuffer = NULL, *buffer = NULL;
99d731df2a80 #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 5473
diff changeset
  2669
99d731df2a80 #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 5473
diff changeset
  2670
        sock = SOCKET_FROM_FILE_OBJECT(fp);
99d731df2a80 #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 5473
diff changeset
  2671
99d731df2a80 #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 5473
diff changeset
  2672
        if (! setupBufferParameters(aDataBuffer, startIndex, &extPtr, &offs, &objSize)) goto bad;
99d731df2a80 #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 5473
diff changeset
  2673
        if (__isSmallInteger(nBytes)) {
99d731df2a80 #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 5473
diff changeset
  2674
            if (__intVal(nBytes) < objSize) {
99d731df2a80 #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 5473
diff changeset
  2675
                objSize = __intVal(nBytes);
99d731df2a80 #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 5473
diff changeset
  2676
            }
99d731df2a80 #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 5473
diff changeset
  2677
        }
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2678
# ifdef DO_WRAP_CALLS
5474
99d731df2a80 #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 5473
diff changeset
  2679
        if (extPtr) {
99d731df2a80 #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 5473
diff changeset
  2680
            buffer = extPtr + offs;
99d731df2a80 #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 5473
diff changeset
  2681
        } else {
99d731df2a80 #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 5473
diff changeset
  2682
            allocatedBuffer = buffer = (unsigned char *)malloc(objSize);
99d731df2a80 #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 5473
diff changeset
  2683
        }
99d731df2a80 #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 5473
diff changeset
  2684
99d731df2a80 #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 5473
diff changeset
  2685
        do {
99d731df2a80 #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 5473
diff changeset
  2686
            __threadErrno = 0;
99d731df2a80 #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 5473
diff changeset
  2687
            alen = sizeof(sa);
99d731df2a80 #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 5473
diff changeset
  2688
            n = (INT)STX_WSA_NOINT_CALL6("recvfrom", recvfrom, sock, buffer, objSize, _flags, (struct sockaddr *)&sa, &alen);
99d731df2a80 #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 5473
diff changeset
  2689
        } while ((n < 0) && (__threadErrno == EINTR));
99d731df2a80 #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 5473
diff changeset
  2690
99d731df2a80 #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 5473
diff changeset
  2691
        if (n == -1) {
99d731df2a80 #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 5473
diff changeset
  2692
            error = __INST(lastErrorNumber) = __MKSMALLINT(__threadErrno);
99d731df2a80 #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 5473
diff changeset
  2693
        }
99d731df2a80 #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 5473
diff changeset
  2694
99d731df2a80 #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 5473
diff changeset
  2695
        if (allocatedBuffer) {
99d731df2a80 #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 5473
diff changeset
  2696
            if (n > 0) {
99d731df2a80 #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 5473
diff changeset
  2697
                memcpy((char *)__InstPtr(aDataBuffer) + offs, allocatedBuffer, n);
99d731df2a80 #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 5473
diff changeset
  2698
            }
99d731df2a80 #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 5473
diff changeset
  2699
            free(allocatedBuffer);
99d731df2a80 #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 5473
diff changeset
  2700
        }
99d731df2a80 #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 5473
diff changeset
  2701
        if (n == -1) {
99d731df2a80 #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 5473
diff changeset
  2702
            goto bad;
99d731df2a80 #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 5473
diff changeset
  2703
        }
99d731df2a80 #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 5473
diff changeset
  2704
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2705
# else
5474
99d731df2a80 #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 5473
diff changeset
  2706
        __BEGIN_INTERRUPTABLE__
99d731df2a80 #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 5473
diff changeset
  2707
        do {
99d731df2a80 #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 5473
diff changeset
  2708
            alen = sizeof(sa);
99d731df2a80 #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 5473
diff changeset
  2709
            if (extPtr) {
99d731df2a80 #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 5473
diff changeset
  2710
                n = recvfrom(sock, extPtr + offs, objSize, _flags, (struct sockaddr *) &sa, &alen);
99d731df2a80 #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 5473
diff changeset
  2711
            } else {
99d731df2a80 #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 5473
diff changeset
  2712
                n = recvfrom(sock, (char *)__InstPtr(aDataBuffer) + offs, objSize, _flags, (struct sockaddr *) &sa, &alen);
99d731df2a80 #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 5473
diff changeset
  2713
            }
99d731df2a80 #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 5473
diff changeset
  2714
        } while ((n < 0) && (errno == EINTR));
99d731df2a80 #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 5473
diff changeset
  2715
        __END_INTERRUPTABLE__
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2716
# endif
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2717
5474
99d731df2a80 #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 5473
diff changeset
  2718
        if (n >= 0 && __isNonNilObject(addr)) {
99d731df2a80 #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 5473
diff changeset
  2719
            char *addrPtr;
99d731df2a80 #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 5473
diff changeset
  2720
            int nInstVars, nInstBytes, objSize;
99d731df2a80 #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 5473
diff changeset
  2721
            OBJ oClass = __qClass(addr);
99d731df2a80 #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 5473
diff changeset
  2722
99d731df2a80 #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 5473
diff changeset
  2723
            if (! __isBytes(addr))
99d731df2a80 #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 5473
diff changeset
  2724
                goto bad;
99d731df2a80 #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 5473
diff changeset
  2725
            nInstVars = __intVal(__ClassInstPtr(oClass)->c_ninstvars);
99d731df2a80 #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 5473
diff changeset
  2726
            nInstBytes = OHDR_SIZE + (nInstVars * sizeof(OBJ));
99d731df2a80 #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 5473
diff changeset
  2727
            objSize = __qSize(addr) - nInstBytes;
99d731df2a80 #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 5473
diff changeset
  2728
            addrPtr = (char *)__InstPtr(addr) + nInstBytes;
99d731df2a80 #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 5473
diff changeset
  2729
            if (objSize < alen)
99d731df2a80 #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 5473
diff changeset
  2730
                goto bad;
99d731df2a80 #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 5473
diff changeset
  2731
99d731df2a80 #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 5473
diff changeset
  2732
            /*
99d731df2a80 #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 5473
diff changeset
  2733
             * extract the datagrams address
99d731df2a80 #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 5473
diff changeset
  2734
             */
99d731df2a80 #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 5473
diff changeset
  2735
            memcpy(addrPtr, (char *)&sa, alen);
99d731df2a80 #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 5473
diff changeset
  2736
            addrLen = __MKSMALLINT(alen);
99d731df2a80 #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 5473
diff changeset
  2737
        }
99d731df2a80 #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 5473
diff changeset
  2738
        if (n < 0) {
99d731df2a80 #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 5473
diff changeset
  2739
            error = __INST(lastErrorNumber) = __MKSMALLINT(errno);
99d731df2a80 #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 5473
diff changeset
  2740
        }
99d731df2a80 #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 5473
diff changeset
  2741
        nReceived = __MKSMALLINT(n);
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2742
    }
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2743
#endif
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2744
bad: ;
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2745
%}.
3126
d95cc55a4fb5 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3123
diff changeset
  2746
    error notNil ifTrue:[
5474
99d731df2a80 #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 5473
diff changeset
  2747
        ^ self readError:error.
3126
d95cc55a4fb5 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3123
diff changeset
  2748
    ].
d95cc55a4fb5 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3123
diff changeset
  2749
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2750
    nReceived notNil ifTrue:[
5474
99d731df2a80 #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 5473
diff changeset
  2751
        (addrLen notNil and:[addr ~~ aSocketAddress]) ifTrue:[
99d731df2a80 #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 5473
diff changeset
  2752
            self obsoleteFeatureWarning:'please use a socketAddress argument'.
99d731df2a80 #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 5473
diff changeset
  2753
99d731df2a80 #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 5473
diff changeset
  2754
            "can be a ByteArray for backward compatibility"
99d731df2a80 #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 5473
diff changeset
  2755
            aSocketAddress replaceFrom:1 to:addrLen with:(addr hostAddress).
99d731df2a80 #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 5473
diff changeset
  2756
        ].
99d731df2a80 #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 5473
diff changeset
  2757
        ^ nReceived
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2758
    ].
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2759
    "
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2760
     arrive here if you try to receive into an invalid buffer
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2761
     (i.e. not ByteArray-like),
1485
d8578cf3504b gcc3.3.1 insn-scheduler bug workaround
Claus Gittinger <cg@exept.de>
parents: 1474
diff changeset
  2762
     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
  2763
     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
  2764
    "
126
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
  2765
    self primitiveFailed
4626
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2766
5474
99d731df2a80 #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 5473
diff changeset
  2767
    "Modified: / 08-04-2020 / 20:50:46 / stefan"
116
7789fb1c9fa2 more UD socket fixes (at least client side seems to work now)
Claus Gittinger <cg@exept.de>
parents: 115
diff changeset
  2768
!
7789fb1c9fa2 more UD socket fixes (at least client side seems to work now)
Claus Gittinger <cg@exept.de>
parents: 115
diff changeset
  2769
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2770
sendBuffer:aDataBuffer start:startIndex for:nBytes flags:flags
4626
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2771
    "send data. aDataBuffer be ByteArray-like.
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2772
     Return the number of bytes transmitted, or a negative number on error."
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2773
3126
d95cc55a4fb5 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3123
diff changeset
  2774
    |error|
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2775
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2776
%{
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2777
#ifndef NO_SOCKET
2321
6f4cc7b644db filePointer -> handle migration
Claus Gittinger <cg@exept.de>
parents: 2308
diff changeset
  2778
    OBJ fp = __INST(handle);
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2779
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2780
    if ((fp != nil)
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2781
     && __isSmallInteger(startIndex)
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2782
     && __isSmallInteger(nBytes)) {
5473
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  2783
	SOCKET sock;
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  2784
	INT objSize, n, offs;
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  2785
	char *extPtr;
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  2786
	int _flags = __longIntVal(flags);
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  2787
	unsigned long norder;
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  2788
	unsigned char *buffer, *allocatedBuffer = NULL;
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  2789
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  2790
	sock = SOCKET_FROM_FILE_OBJECT(fp);
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  2791
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  2792
	if (! setupBufferParameters(aDataBuffer, startIndex, &extPtr, &offs, &objSize)) goto bad;
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  2793
	if (__isSmallInteger(nBytes)) {
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  2794
	    if (__intVal(nBytes) < objSize) {
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  2795
		objSize = __intVal(nBytes);
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  2796
	    }
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  2797
	}
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2798
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2799
# ifdef DGRAM_DEBUG
5473
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  2800
	console_printf("sending %d bytes ...\n", nBytes);
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2801
# endif
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2802
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2803
#ifdef DO_WRAP_CALLS
5473
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  2804
	if (extPtr) {
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  2805
	    buffer = extPtr + offs;
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  2806
	} else {
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  2807
	    allocatedBuffer = buffer = (char *)malloc(objSize);
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  2808
	    memcpy(allocatedBuffer, (char *)__InstPtr(aDataBuffer) + offs, objSize);
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  2809
	}
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  2810
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  2811
	do {
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  2812
	    __threadErrno = 0;
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  2813
	    n = (INT)STX_WSA_NOINT_CALL4("send", send, sock, buffer, objSize, _flags);
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  2814
	} while ((n < 0) && (__threadErrno == EINTR));
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  2815
	if (n < 0) {
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  2816
	    errno = __threadErrno;
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  2817
	}
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  2818
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  2819
	if (allocatedBuffer) {
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  2820
	    free(allocatedBuffer);
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  2821
	}
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2822
#else
5473
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  2823
	__BEGIN_INTERRUPTABLE__
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  2824
	do {
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  2825
	    if (extPtr) {
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  2826
		n = send(sock, extPtr + offs, objSize, _flags);
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  2827
	    } else {
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  2828
		n = send(sock, (char *)__InstPtr(aDataBuffer) + offs, objSize, _flags);
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  2829
	    }
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  2830
	} while ((n < 0) && (errno == EINTR));
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  2831
	__END_INTERRUPTABLE__
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2832
#endif
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2833
5473
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  2834
	if (n < 0) {
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  2835
	    error = __INST(lastErrorNumber) = __MKSMALLINT(errno);
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  2836
	} else {
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  2837
	    RETURN (__MKSMALLINT(n));
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  2838
	}
915
3dc0e3cd838a added interface to send() and recv()
Claus Gittinger <cg@exept.de>
parents: 898
diff changeset
  2839
    }
3dc0e3cd838a added interface to send() and recv()
Claus Gittinger <cg@exept.de>
parents: 898
diff changeset
  2840
#endif
3dc0e3cd838a added interface to send() and recv()
Claus Gittinger <cg@exept.de>
parents: 898
diff changeset
  2841
bad: ;
3dc0e3cd838a added interface to send() and recv()
Claus Gittinger <cg@exept.de>
parents: 898
diff changeset
  2842
%}.
3126
d95cc55a4fb5 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3123
diff changeset
  2843
    error notNil ifTrue:[
5473
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  2844
	self writeError:error.
3126
d95cc55a4fb5 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3123
diff changeset
  2845
    ].
d95cc55a4fb5 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3123
diff changeset
  2846
915
3dc0e3cd838a added interface to send() and recv()
Claus Gittinger <cg@exept.de>
parents: 898
diff changeset
  2847
    "
1485
d8578cf3504b gcc3.3.1 insn-scheduler bug workaround
Claus Gittinger <cg@exept.de>
parents: 1474
diff changeset
  2848
     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
  2849
    "
3dc0e3cd838a added interface to send() and recv()
Claus Gittinger <cg@exept.de>
parents: 898
diff changeset
  2850
    self primitiveFailed
4626
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2851
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2852
    "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
  2853
!
3dc0e3cd838a added interface to send() and recv()
Claus Gittinger <cg@exept.de>
parents: 898
diff changeset
  2854
4626
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2855
sendTo:aSocketAddress buffer:buffer
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2856
    "send datagramm data - fetch address of destination host from
4626
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2857
     aSocketAddress, data from aDataBuffer.
5001
11cbbbcbc87e warnings
Claus Gittinger <cg@exept.de>
parents: 4961
diff changeset
  2858
     aDataBuffer must be ByteArray-like.
11cbbbcbc87e warnings
Claus Gittinger <cg@exept.de>
parents: 4961
diff changeset
  2859
     aSocketAddress must be a valid SocketAddress for my domain
4626
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2860
     (i.e. for IPv4, an IPSocketAddress).
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2861
     For backward compatibility, a ByteArray is still supported in aSocketAddress
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2862
     (i.e. for IPv4, a 4-byte byteArray).
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2863
     Return the number of bytes transmitted."
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2864
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2865
    ^ 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
  2866
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2867
    "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
  2868
!
7789fb1c9fa2 more UD socket fixes (at least client side seems to work now)
Claus Gittinger <cg@exept.de>
parents: 115
diff changeset
  2869
4626
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2870
sendTo:aSocketAddress buffer:buffer start:startIndex for:count
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2871
    "send datagramm data - fetch address of destination host from
4626
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2872
     aSocketAddress, data from aDataBuffer.
5001
11cbbbcbc87e warnings
Claus Gittinger <cg@exept.de>
parents: 4961
diff changeset
  2873
     aDataBuffer must be ByteArray-like.
11cbbbcbc87e warnings
Claus Gittinger <cg@exept.de>
parents: 4961
diff changeset
  2874
     aSocketAddress must be a valid SocketAddress for my domain
4626
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2875
     (i.e. for IPv4, an IPSocketAddress).
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2876
     For backward compatibility, a ByteArray is still supported in aSocketAddress
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2877
     (i.e. for IPv4, a 4-byte byteArray).
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2878
     Return the number of bytes transmitted."
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2879
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2880
    ^ self sendTo:aSocketAddress buffer:buffer start:startIndex for:count flags:0
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
    "Modified (comment): / 21-03-2018 / 19:29:07 / stefan"
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2883
!
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2884
4626
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2885
sendTo:aSocketAddress buffer:aDataBuffer start:startIndex for:nBytes flags:flags
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2886
    "send datagramm data - fetch address of destination host from
4626
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2887
     aSocketAddress, data from aDataBuffer starting at startIndex,
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2888
     sending count bytes.
5001
11cbbbcbc87e warnings
Claus Gittinger <cg@exept.de>
parents: 4961
diff changeset
  2889
     aDataBuffer must be ByteArray-like.
11cbbbcbc87e warnings
Claus Gittinger <cg@exept.de>
parents: 4961
diff changeset
  2890
     aSocketAddress must be a valid SocketAddress for my domain
4626
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2891
     (i.e. for IPv4, an IPSocketAddress).
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2892
     For backward compatibility, a ByteArray is still supported in aSocketAddress
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2893
     (i.e. for IPv4, a 4-byte byteArray).
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2894
     Return the number of bytes transmitted."
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2895
3126
d95cc55a4fb5 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3123
diff changeset
  2896
    |domainClass addr error|
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2897
4626
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  2898
    aSocketAddress isSocketAddress ifTrue:[
5473
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  2899
	addr := aSocketAddress.
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2900
    ] ifFalse:[
5473
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  2901
	aSocketAddress isByteArray ifFalse:[
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  2902
	    ^ self error:'bad socketAddress argument'
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  2903
	].
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  2904
	domainClass := self class socketAddressClassForDomain:domain.
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  2905
	domainClass isNil ifTrue:[
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  2906
	    ^ self error:'invalid (unsupported) domain'.
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  2907
	].
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  2908
	addr := domainClass hostAddress:aSocketAddress.
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2909
    ].
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2910
%{
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2911
#ifndef NO_SOCKET
2321
6f4cc7b644db filePointer -> handle migration
Claus Gittinger <cg@exept.de>
parents: 2308
diff changeset
  2912
    OBJ fp = __INST(handle);
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2913
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2914
    if ((fp != nil)
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2915
     && __isSmallInteger(startIndex)
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2916
     && __isSmallInteger(nBytes)) {
5473
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  2917
	SOCKET sock;
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  2918
	INT objSize;
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  2919
	struct sockaddr *sockaddr_ptr;
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  2920
	union sockaddr_u sa;
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  2921
	socklen_t sockaddr_size, alen = 0;
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  2922
	INT sockAddrOffs;
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  2923
	INT n, offs;
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  2924
	char *extPtr;
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  2925
	int _flags = __longIntVal(flags);
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  2926
	unsigned long norder;
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  2927
	unsigned char *buffer;
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  2928
	unsigned char *allocatedBuffer = NULL;
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  2929
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  2930
	sock = SOCKET_FROM_FILE_OBJECT(fp);
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  2931
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  2932
	if (! __isBytes(addr)) {
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  2933
	    sockaddr_size = 0;
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  2934
	    sockaddr_ptr = (struct sockaddr *)0;
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  2935
	} else {
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  2936
	    int nIndex;
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  2937
	    OBJ cls;
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  2938
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  2939
	    sockAddrOffs = 0;
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  2940
	    if ((cls = __qClass(addr)) != @global(ByteArray))
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  2941
		sockAddrOffs += __OBJS2BYTES__(__intVal(__ClassInstPtr(cls)->c_ninstvars));
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  2942
	    nIndex = __qSize(addr) - OHDR_SIZE;
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  2943
	    sockaddr_size = nIndex - sockAddrOffs;
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  2944
	    if (sockaddr_size > sizeof(sa)) {
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  2945
		console_fprintf(stderr, "Socket [warning]: bad socketAddr\n");
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  2946
		goto bad;
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  2947
	    }
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  2948
	    memcpy(&sa, (__byteArrayVal(addr) + sockAddrOffs), sockaddr_size);
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  2949
	    sockaddr_ptr = (struct sockaddr *)(&sa);
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  2950
	}
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  2951
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  2952
	if (! setupBufferParameters(aDataBuffer, startIndex, &extPtr, &offs, &objSize)) goto bad;
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  2953
	if (__isSmallInteger(nBytes)) {
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  2954
	    if (__intVal(nBytes) < objSize) {
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  2955
		objSize = __intVal(nBytes);
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  2956
	    }
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  2957
	}
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2958
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2959
#ifdef DO_WRAP_CALLS
5473
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  2960
	if (extPtr) {
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  2961
	    buffer = extPtr + offs;
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  2962
	} else {
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  2963
	    allocatedBuffer = buffer = (char *)malloc(objSize);
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  2964
	    memcpy(allocatedBuffer, (char *)__InstPtr(aDataBuffer) + offs, objSize);
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  2965
	}
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  2966
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  2967
	do {
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  2968
	    __threadErrno = 0;
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  2969
	    n = (INT)STX_WSA_NOINT_CALL6("sendto", sendto, sock, buffer, objSize, _flags, sockaddr_ptr, sockaddr_size);
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  2970
	} while ((n < 0) && (__threadErrno == EINTR));
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  2971
	if (n < 0) {
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  2972
	    errno = __threadErrno;
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  2973
	}
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  2974
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  2975
	if (allocatedBuffer) {
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  2976
	    free(allocatedBuffer);
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  2977
	}
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2978
#else
5473
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  2979
	__BEGIN_INTERRUPTABLE__
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  2980
	do {
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  2981
	    if (extPtr) {
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  2982
		n = sendto(sock, extPtr + offs, objSize, _flags, sockaddr_ptr, sockaddr_size);
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  2983
	    } else {
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  2984
		n = sendto(sock, (char *)__InstPtr(aDataBuffer) + offs, objSize, _flags, sockaddr_ptr, sockaddr_size);
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  2985
	    }
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  2986
	} while ((n < 0) && (errno == EINTR));
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  2987
	__END_INTERRUPTABLE__
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2988
#endif
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2989
5473
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  2990
	if (n < 0) {
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  2991
	    error = __INST(lastErrorNumber) = __MKSMALLINT(errno);
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  2992
	} else {
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  2993
	    RETURN (__MKSMALLINT(n));
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  2994
	}
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2995
    }
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2996
#endif
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2997
bad: ;
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2998
%}.
3126
d95cc55a4fb5 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3123
diff changeset
  2999
    error notNil ifTrue:[
5473
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  3000
	self writeError:error.
3126
d95cc55a4fb5 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3123
diff changeset
  3001
    ].
d95cc55a4fb5 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3123
diff changeset
  3002
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3003
    "
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3004
     arrive here if you try to send from an invalid buffer
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3005
     (i.e. not ByteArray-like),
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3006
     or if the addressBuffer is nonNil AND not a ByteArray/String
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3007
     or if the addressBuffer is nonNil AND too small.
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3008
    "
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3009
    self primitiveFailed
4626
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  3010
5e6419fb6699 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4587
diff changeset
  3011
    "Modified: / 21-03-2018 / 19:27:51 / stefan"
0
1cf8d1747859 Initial revision
claus
parents:
diff changeset
  3012
! !
1cf8d1747859 Initial revision
claus
parents:
diff changeset
  3013
4568
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  3014
!Socket methodsFor:'error reporting'!
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  3015
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  3016
reportError:osErrorNumber
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  3017
    "report an error to the initiator of a Socket operation.
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  3018
     We raise a notification for newer code, and also
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  3019
     return false for old code not catching the notification."
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  3020
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  3021
    |errorHolder|
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  3022
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  3023
    lastErrorNumber := osErrorNumber.
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  3024
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  3025
    errorHolder := OperatingSystem errorHolderForNumber:osErrorNumber.
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  3026
    SocketErrorNotification raiseRequestWith:errorHolder.
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  3027
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  3028
    ^ false.
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  3029
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  3030
    "Created: / 19-01-2018 / 12:50:00 / stefan"
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  3031
! !
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  3032
4172
2a6544c030fc #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 4091
diff changeset
  3033
!Socket methodsFor:'finalization'!
2a6544c030fc #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 4091
diff changeset
  3034
2a6544c030fc #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 4091
diff changeset
  3035
finalize
2a6544c030fc #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 4091
diff changeset
  3036
    self linger:0.      "/ do an abortive release - discard buffered data
2a6544c030fc #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 4091
diff changeset
  3037
    self closeFile.     "/ does not wait due to abortive release.
2a6544c030fc #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 4091
diff changeset
  3038
! !
2a6544c030fc #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 4091
diff changeset
  3039
3484
ccd8683e4e7e class: Socket
Claus Gittinger <cg@exept.de>
parents: 3481
diff changeset
  3040
!Socket methodsFor:'initialization'!
ccd8683e4e7e class: Socket
Claus Gittinger <cg@exept.de>
parents: 3481
diff changeset
  3041
ccd8683e4e7e class: Socket
Claus Gittinger <cg@exept.de>
parents: 3481
diff changeset
  3042
initialize
ccd8683e4e7e class: Socket
Claus Gittinger <cg@exept.de>
parents: 3481
diff changeset
  3043
    super initialize.
ccd8683e4e7e class: Socket
Claus Gittinger <cg@exept.de>
parents: 3481
diff changeset
  3044
    "/ transparent
ccd8683e4e7e class: Socket
Claus Gittinger <cg@exept.de>
parents: 3481
diff changeset
  3045
    eolMode := nil.
ccd8683e4e7e class: Socket
Claus Gittinger <cg@exept.de>
parents: 3481
diff changeset
  3046
! !
ccd8683e4e7e class: Socket
Claus Gittinger <cg@exept.de>
parents: 3481
diff changeset
  3047
3123
55ef9ca4f09f class: Socket
Stefan Vogel <sv@exept.de>
parents: 3077
diff changeset
  3048
!Socket methodsFor:'low level'!
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3049
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  3050
getSocketAdress
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  3051
    "BAD SPELLING, of #getSocketAddress, kept for compatibility with swazoo"
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  3052
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  3053
    <resource: #obsolete>
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  3054
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  3055
    ^ self getSocketAddress
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  3056
!
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  3057
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3058
getSocketError
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3059
    "get the SO_ERROR form the socket, which indicates the
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3060
     result of an asynchronous operation"
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3061
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3062
%{
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3063
#ifndef NO_SOCKET
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3064
    OBJ fp;
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3065
    int err;
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3066
2321
6f4cc7b644db filePointer -> handle migration
Claus Gittinger <cg@exept.de>
parents: 2308
diff changeset
  3067
    fp = __INST(handle);
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3068
    if (fp == nil) {
5473
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  3069
	err = EBADF;
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3070
    } else {
5473
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  3071
	unsigned int sz;
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  3072
	SOCKET sock;
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  3073
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  3074
	sock = SOCKET_FROM_FILE_OBJECT(fp);
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  3075
	sz = sizeof(err);
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  3076
	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
  3077
# ifdef __win32__
5473
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  3078
	    errno = WSAGetLastError();
1558
a563aac90660 No need to ask Socket>>#networkXXXOrderIsMSB, because the return value is
Stefan Vogel <sv@exept.de>
parents: 1542
diff changeset
  3079
# endif
5473
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  3080
	    err = errno;
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  3081
	}
1558
a563aac90660 No need to ask Socket>>#networkXXXOrderIsMSB, because the return value is
Stefan Vogel <sv@exept.de>
parents: 1542
diff changeset
  3082
    }
a563aac90660 No need to ask Socket>>#networkXXXOrderIsMSB, because the return value is
Stefan Vogel <sv@exept.de>
parents: 1542
diff changeset
  3083
a563aac90660 No need to ask Socket>>#networkXXXOrderIsMSB, because the return value is
Stefan Vogel <sv@exept.de>
parents: 1542
diff changeset
  3084
    RETURN(__MKSMALLINT(err));
a563aac90660 No need to ask Socket>>#networkXXXOrderIsMSB, because the return value is
Stefan Vogel <sv@exept.de>
parents: 1542
diff changeset
  3085
#endif
a563aac90660 No need to ask Socket>>#networkXXXOrderIsMSB, because the return value is
Stefan Vogel <sv@exept.de>
parents: 1542
diff changeset
  3086
%}
a563aac90660 No need to ask Socket>>#networkXXXOrderIsMSB, because the return value is
Stefan Vogel <sv@exept.de>
parents: 1542
diff changeset
  3087
!
a563aac90660 No need to ask Socket>>#networkXXXOrderIsMSB, because the return value is
Stefan Vogel <sv@exept.de>
parents: 1542
diff changeset
  3088
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  3089
listenWithBacklog:aNumber
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  3090
    <resource: #obsolete>
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  3091
    "same as listenFor: - backward compatibility with old ST/X"
3059
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  3092
    self obsoleteMethodWarning.
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  3093
    ^ self listenFor:aNumber
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3094
!
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3095
3246
c75a006f9a7a Win32 sockets use handles instead of file pointers
Stefan Vogel <sv@exept.de>
parents: 3224
diff changeset
  3096
primAcceptOn:aServerSocket blocking:blocking
3059
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  3097
    "accept a connection on a server port (created with:'Socket>>newTCP:')
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  3098
     usage is: (Socket basicNew acceptOn:(Socket newTCP:9999)).
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  3099
     Return the true if ok; false if not.
4568
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  3100
     Notify with a SocketErrorNotification on error.
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  3101
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  3102
     If blocking is true, the accept() syscall (and the whole smalltalk image)
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  3103
     will block, until a connection is accepted.
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  3104
     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
  3105
4568
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  3106
    |serverSocketHandle addr domainClass newHandle err|
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  3107
2321
6f4cc7b644db filePointer -> handle migration
Claus Gittinger <cg@exept.de>
parents: 2308
diff changeset
  3108
    handle notNil ifTrue:[
5473
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  3109
	^ self errorAlreadyOpen.
4180
f2539f82b744 #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4172
diff changeset
  3110
    ].
f2539f82b744 #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4172
diff changeset
  3111
    serverSocketHandle := aServerSocket fileHandle.
f2539f82b744 #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4172
diff changeset
  3112
    serverSocketHandle isNil ifTrue:[
5473
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  3113
	"socket is not open"
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  3114
	^ self errorNotOpen
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  3115
    ].
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  3116
3246
c75a006f9a7a Win32 sockets use handles instead of file pointers
Stefan Vogel <sv@exept.de>
parents: 3224
diff changeset
  3117
    domain := aServerSocket domain.
c75a006f9a7a Win32 sockets use handles instead of file pointers
Stefan Vogel <sv@exept.de>
parents: 3224
diff changeset
  3118
    socketType := aServerSocket type.
c75a006f9a7a Win32 sockets use handles instead of file pointers
Stefan Vogel <sv@exept.de>
parents: 3224
diff changeset
  3119
    handleType := aServerSocket handleType.
3059
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  3120
    "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
  3121
    domainClass := self class socketAddressClassForDomain:domain.
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  3122
    domainClass isNil ifTrue:[
5473
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  3123
	^ self error:'invalid (unsupported) domain'.
1935
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
    addr := domainClass new.
3246
c75a006f9a7a Win32 sockets use handles instead of file pointers
Stefan Vogel <sv@exept.de>
parents: 3224
diff changeset
  3126
    newHandle := OperatingSystem socketAccessor new.
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  3127
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  3128
%{  /* STACK: 100000 */
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3129
#ifndef NO_SOCKET
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  3130
    FILE *fp;
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  3131
    int flags;
3246
c75a006f9a7a Win32 sockets use handles instead of file pointers
Stefan Vogel <sv@exept.de>
parents: 3224
diff changeset
  3132
    SOCKET serverSocket, newSock;
c75a006f9a7a Win32 sockets use handles instead of file pointers
Stefan Vogel <sv@exept.de>
parents: 3224
diff changeset
  3133
    int _fd;
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  3134
    union sockaddr_u sa;
3059
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  3135
    unsigned int alen;
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  3136
3843
fbced69597a7 oops - error check was disabled
Claus Gittinger <cg@exept.de>
parents: 3742
diff changeset
  3137
# ifdef __win32__
3246
c75a006f9a7a Win32 sockets use handles instead of file pointers
Stefan Vogel <sv@exept.de>
parents: 3224
diff changeset
  3138
    serverSocket = SOCKET_FROM_FILE_OBJECT(serverSocketHandle);
3843
fbced69597a7 oops - error check was disabled
Claus Gittinger <cg@exept.de>
parents: 3742
diff changeset
  3139
# else
3247
259f71b89b6e class: Socket
Stefan Vogel <sv@exept.de>
parents: 3246
diff changeset
  3140
    serverSocket = __intVal(serverSocketHandle);
3843
fbced69597a7 oops - error check was disabled
Claus Gittinger <cg@exept.de>
parents: 3742
diff changeset
  3141
# endif
3246
c75a006f9a7a Win32 sockets use handles instead of file pointers
Stefan Vogel <sv@exept.de>
parents: 3224
diff changeset
  3142
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  3143
# 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
  3144
    if (blocking == false) {
5473
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  3145
	flags = fcntl(serverSocket, F_GETFL);
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  3146
	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
  3147
    }
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  3148
# endif
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  3149
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3150
# ifdef DO_WRAP_CALLS
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3151
    do {
5473
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  3152
	__threadErrno = 0;
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  3153
	alen = sizeof(sa);
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  3154
	newSock = (SOCKET)STX_WSA_CALL3("accept", accept, serverSocket, &sa, &alen);
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  3155
    } while ((newSock < 0) && (__threadErrno == EINTR));
4568
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  3156
    if (newSock == -1) {
5473
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  3157
	err = __MKSMALLINT(__threadErrno);
3126
d95cc55a4fb5 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3123
diff changeset
  3158
    }
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3159
# else
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3160
    __BEGIN_INTERRUPTABLE__
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3161
    do {
5473
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  3162
	alen = sizeof(sa);
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  3163
	newSock = accept(serverSocket, (struct sockaddr *) &sa, &alen);
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  3164
    } while ((newSock < 0) && (errno == EINTR));
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3165
    __END_INTERRUPTABLE__
4568
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  3166
    if (newSock == -1) {
5473
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  3167
	err = __MKSMALLINT(errno);
4568
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  3168
    }
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3169
# endif
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  3170
    DBGFPRINTF((stderr, "SOCKET: accept newSock=%d\n", newSock));
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  3171
3246
c75a006f9a7a Win32 sockets use handles instead of file pointers
Stefan Vogel <sv@exept.de>
parents: 3224
diff changeset
  3172
# if defined(O_NDELAY) && defined(SET_NDELAY)
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  3173
    if (blocking == false) {
5473
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  3174
	fcntl(serverSocket, F_SETFL, flags);
3246
c75a006f9a7a Win32 sockets use handles instead of file pointers
Stefan Vogel <sv@exept.de>
parents: 3224
diff changeset
  3175
    }
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  3176
# endif
3246
c75a006f9a7a Win32 sockets use handles instead of file pointers
Stefan Vogel <sv@exept.de>
parents: 3224
diff changeset
  3177
    if (newSock == -1) {
5473
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  3178
	DBGPRINTF(("SOCKET: accept call failed errno=%d\n", (int)(__intVal(err))));
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  3179
	goto out;
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  3180
    }
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  3181
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  3182
    if (__isNonNilObject(addr)) {
5473
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  3183
	OBJ oClass = __qClass(addr);
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  3184
	int nInstVars, nInstBytes, objSize;
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  3185
	char *addrP;
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  3186
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  3187
	if (! __isBytes(addr)) {
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  3188
	    DBGPRINTF(("SOCKET: bad addr\n"));
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  3189
	    closesocket(newSock);
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  3190
	    err = @symbol(badAddressArg);
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  3191
	    goto out;
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  3192
	}
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  3193
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  3194
	nInstVars = __intVal(__ClassInstPtr(oClass)->c_ninstvars);
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  3195
	nInstBytes = OHDR_SIZE + (nInstVars * sizeof(OBJ));
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  3196
	objSize = __qSize(addr) - nInstBytes;
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  3197
	addrP = (char *)__InstPtr(addr) + nInstBytes;
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  3198
	if (objSize < alen) {
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  3199
	    DBGPRINTF(("SOCKET: bad addr\n"));
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  3200
	    closesocket(newSock);
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  3201
	    err = @symbol(badAddressArgLen);
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  3202
	    goto out;
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  3203
	}
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  3204
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  3205
	/*
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  3206
	 * extract the partners address
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  3207
	 */
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  3208
	memcpy(addrP, (char *)&sa, alen);
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  3209
    }
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  3210
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  3211
    /*
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  3212
     * make it a FILE *
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  3213
     */
3843
fbced69597a7 oops - error check was disabled
Claus Gittinger <cg@exept.de>
parents: 3742
diff changeset
  3214
# ifdef __win32__
3246
c75a006f9a7a Win32 sockets use handles instead of file pointers
Stefan Vogel <sv@exept.de>
parents: 3224
diff changeset
  3215
#  if 0 && (defined( __BORLANDC__ ) || defined( __MINGW__ ))
c75a006f9a7a Win32 sockets use handles instead of file pointers
Stefan Vogel <sv@exept.de>
parents: 3224
diff changeset
  3216
    __stxWrapApiEnterCritical();
c75a006f9a7a Win32 sockets use handles instead of file pointers
Stefan Vogel <sv@exept.de>
parents: 3224
diff changeset
  3217
    _fd = _open_osfhandle((long)newSock, 0);
c75a006f9a7a Win32 sockets use handles instead of file pointers
Stefan Vogel <sv@exept.de>
parents: 3224
diff changeset
  3218
    __stxWrapApiLeaveCritical();
c75a006f9a7a Win32 sockets use handles instead of file pointers
Stefan Vogel <sv@exept.de>
parents: 3224
diff changeset
  3219
    DBGPRINTF(("SOCKET: sock=%d fd=%d\n", newSock, _fd));
2773
ab3049f4a351 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2748
diff changeset
  3220
#  else
3246
c75a006f9a7a Win32 sockets use handles instead of file pointers
Stefan Vogel <sv@exept.de>
parents: 3224
diff changeset
  3221
    _fd = (int)newSock;
2773
ab3049f4a351 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2748
diff changeset
  3222
#  endif
3843
fbced69597a7 oops - error check was disabled
Claus Gittinger <cg@exept.de>
parents: 3742
diff changeset
  3223
# else // ! __win32__
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  3224
    fp = fdopen(newSock, "r+");
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  3225
    if (! fp) {
5473
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  3226
	DBGPRINTF(("SOCKET: fdopen call failed\n"));
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  3227
	err = __MKSMALLINT(errno);
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  3228
	closesocket(newSock);
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  3229
	DBGFPRINTF((stderr, "SOCKET: close (fdopen failed) (%d)\n", newSock));
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  3230
	goto out;
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  3231
    }
3843
fbced69597a7 oops - error check was disabled
Claus Gittinger <cg@exept.de>
parents: 3742
diff changeset
  3232
# endif // ! __win32__
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  3233
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  3234
    if ((@global(FileOpenTrace) == true) || __debugging__) {
3843
fbced69597a7 oops - error check was disabled
Claus Gittinger <cg@exept.de>
parents: 3742
diff changeset
  3235
# ifdef __win32__
5473
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  3236
	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
  3237
# else
5473
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  3238
	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
  3239
# endif
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  3240
    }
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  3241
3843
fbced69597a7 oops - error check was disabled
Claus Gittinger <cg@exept.de>
parents: 3742
diff changeset
  3242
# ifdef __win32__
3246
c75a006f9a7a Win32 sockets use handles instead of file pointers
Stefan Vogel <sv@exept.de>
parents: 3224
diff changeset
  3243
    __externalAddressVal(newHandle) = _fd;
c75a006f9a7a Win32 sockets use handles instead of file pointers
Stefan Vogel <sv@exept.de>
parents: 3224
diff changeset
  3244
    __INST(handleType) = @symbol(socketHandle);
c75a006f9a7a Win32 sockets use handles instead of file pointers
Stefan Vogel <sv@exept.de>
parents: 3224
diff changeset
  3245
# else
c75a006f9a7a Win32 sockets use handles instead of file pointers
Stefan Vogel <sv@exept.de>
parents: 3224
diff changeset
  3246
    __externalAddressVal(newHandle) = fp;
c75a006f9a7a Win32 sockets use handles instead of file pointers
Stefan Vogel <sv@exept.de>
parents: 3224
diff changeset
  3247
    __INST(handleType) = @symbol(socketFilePointer);
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  3248
# endif
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  3249
#endif /* not NO_SOCKET */
4568
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  3250
out:;
1558
a563aac90660 No need to ask Socket>>#networkXXXOrderIsMSB, because the return value is
Stefan Vogel <sv@exept.de>
parents: 1542
diff changeset
  3251
%}.
3246
c75a006f9a7a Win32 sockets use handles instead of file pointers
Stefan Vogel <sv@exept.de>
parents: 3224
diff changeset
  3252
4568
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  3253
    err notNil ifTrue:[
5473
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  3254
	err isSymbol ifTrue:[
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  3255
	    self error:err.
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  3256
	].
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  3257
	^ self reportError:err.
4568
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  3258
    ].
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  3259
3246
c75a006f9a7a Win32 sockets use handles instead of file pointers
Stefan Vogel <sv@exept.de>
parents: 3224
diff changeset
  3260
    handle := newHandle.
c75a006f9a7a Win32 sockets use handles instead of file pointers
Stefan Vogel <sv@exept.de>
parents: 3224
diff changeset
  3261
    buffered := false.
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  3262
    mode := #readwrite.
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  3263
    binary := false.
3620
c648d063bccc #REFACTORING
Stefan Vogel <sv@exept.de>
parents: 3617
diff changeset
  3264
    self registerForFinalization.
3059
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  3265
    peer := addr.
3246
c75a006f9a7a Win32 sockets use handles instead of file pointers
Stefan Vogel <sv@exept.de>
parents: 3224
diff changeset
  3266
    port := aServerSocket port.
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  3267
1558
a563aac90660 No need to ask Socket>>#networkXXXOrderIsMSB, because the return value is
Stefan Vogel <sv@exept.de>
parents: 1542
diff changeset
  3268
    ^ true
4568
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  3269
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  3270
    "Modified (comment): / 19-01-2018 / 13:35:57 / stefan"
2551
6da1bc89b74a changed:
Stefan Vogel <sv@exept.de>
parents: 2516
diff changeset
  3271
!
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3272
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3273
setSocketOption:option argument:arg1 argument:arg2
3513
8105bf370769 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3485
diff changeset
  3274
    |ok error|
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3275
2551
6da1bc89b74a changed:
Stefan Vogel <sv@exept.de>
parents: 2516
diff changeset
  3276
    handle isNil ifTrue:[
5473
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  3277
	^ self errorNotOpen
2551
6da1bc89b74a changed:
Stefan Vogel <sv@exept.de>
parents: 2516
diff changeset
  3278
    ].
6da1bc89b74a changed:
Stefan Vogel <sv@exept.de>
parents: 2516
diff changeset
  3279
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3280
%{  /* STACK: 32000 */
2818
94d67df5c00d compilable with tcc
Claus Gittinger <cg@exept.de>
parents: 2773
diff changeset
  3281
#ifndef NO_SOCKET
2321
6f4cc7b644db filePointer -> handle migration
Claus Gittinger <cg@exept.de>
parents: 2308
diff changeset
  3282
    OBJ fp = __INST(handle);
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3283
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3284
    if (fp != nil) {
5473
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  3285
	SOCKET sock = SOCKET_FROM_FILE_OBJECT(fp);
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  3286
	int opt = -1;
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  3287
	int level = -1;
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  3288
	int usize = -1;
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  3289
	int ret;
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  3290
	union u {
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  3291
	    BOOL        u_bool;
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  3292
	    int         u_int;
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  3293
	    struct linger  u_linger;
2516
592619f82885 Add setsockopt for Multicast stuff
Stefan Vogel <sv@exept.de>
parents: 2465
diff changeset
  3294
# ifdef IP_ADD_MEMBERSHIP
5473
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  3295
	    struct ip_mreq u_ip_mreq;
2516
592619f82885 Add setsockopt for Multicast stuff
Stefan Vogel <sv@exept.de>
parents: 2465
diff changeset
  3296
# endif
3467
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
  3297
# if defined(SO_RCVTIMEO) || defined(SO_SNDTIMEO)
5473
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  3298
	    struct timeval u_tv;
3467
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
  3299
# endif
5473
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  3300
	} u;
2516
592619f82885 Add setsockopt for Multicast stuff
Stefan Vogel <sv@exept.de>
parents: 2465
diff changeset
  3301
592619f82885 Add setsockopt for Multicast stuff
Stefan Vogel <sv@exept.de>
parents: 2465
diff changeset
  3302
# ifdef IP_ADD_MEMBERSHIP
5473
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  3303
	if (option == @symbol(IP_DROP_MEMBERSHIP)) {
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  3304
	    opt = IP_DROP_MEMBERSHIP;
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  3305
	    goto dropOrAdd;
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  3306
	}
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  3307
	if (option == @symbol(IP_ADD_MEMBERSHIP)) {
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  3308
	    /* add membership to a multicast group */
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  3309
	    opt = IP_ADD_MEMBERSHIP;
2516
592619f82885 Add setsockopt for Multicast stuff
Stefan Vogel <sv@exept.de>
parents: 2465
diff changeset
  3310
dropOrAdd:
5473
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  3311
	    level = IPPROTO_IP;
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  3312
	    usize = sizeof(u.u_ip_mreq);
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  3313
	    if (__isByteArrayLike(arg1) && __isByteArrayLike(arg2)) {
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  3314
		memcpy(&u.u_ip_mreq.imr_multiaddr, __byteArrayVal(arg1), sizeof(u.u_ip_mreq.imr_multiaddr));
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  3315
		memcpy(&u.u_ip_mreq.imr_interface, __byteArrayVal(arg2), sizeof(u.u_ip_mreq.imr_interface));
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  3316
		// once we use the struct ip_mreqn:
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  3317
		// u.u_ip_mreqn.imr_ifindex = 0;
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  3318
	    }
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  3319
	    else
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  3320
		goto argError;
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  3321
	}
2516
592619f82885 Add setsockopt for Multicast stuff
Stefan Vogel <sv@exept.de>
parents: 2465
diff changeset
  3322
# endif /* IP_ADD_MEMBERSHIP */
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3323
4738
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
  3324
# ifdef IP_TTL
5473
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  3325
	if (option == @symbol(IP_TTL)) {
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  3326
	    opt = IP_TTL;
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  3327
	    level = IPPROTO_IP;
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  3328
	    usize = sizeof(u.u_int);
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  3329
	    if (__isSmallInteger(arg1))u.u_int = __intVal(arg1);
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  3330
	    else goto argError;
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  3331
	}
4738
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
  3332
# endif /* IP_TTL */
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
  3333
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
  3334
# ifdef IP_MULTICAST_TTL
5473
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  3335
	if (option == @symbol(IP_MULTICAST_TTL)) {
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  3336
	    opt = IP_MULTICAST_TTL;
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  3337
	    level = IPPROTO_IP;
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  3338
	    usize = sizeof(u.u_int);
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  3339
	    if (__isSmallInteger(arg1))u.u_int = __intVal(arg1);
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  3340
	    else goto argError;
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  3341
	}
4738
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
  3342
# endif /* IP_TTL */
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
  3343
f915f985a54c #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4736
diff changeset
  3344
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3345
# ifdef SO_BROADCAST
5473
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  3346
	if (option == @symbol(SO_BROADCAST)) {
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  3347
	    /* Enables transmission and receipt of broadcast messages on the socket. */
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  3348
	    opt = SO_BROADCAST;
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  3349
	    level = SOL_SOCKET;
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  3350
	    usize = sizeof(u.u_bool);
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  3351
	    if (arg1 == true) u.u_bool = TRUE;
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  3352
	    else if (arg1 == false) u.u_bool = FALSE;
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  3353
	    else goto argError;
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  3354
	}
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3355
# endif /* SO_BROADCAST */
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3356
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3357
# ifdef SO_CONDITIONAL
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3358
#  if 0
5473
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  3359
	if (option == @symbol(SO_CONDITIONAL)) {
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  3360
	    /* Enables sockets to delay the acknowledgment of a connection until after the WSAAccept condition function is called. */
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  3361
	    opt = SO_CONDITIONAL;
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  3362
	    level = SOL_SOCKET;
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  3363
	    usize = sizeof(u.u_bool);
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  3364
	    if (arg1 == true) u.u_bool = TRUE;
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  3365
	    else if (arg1 == false) u.u_bool = FALSE;
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  3366
	    else goto argError;
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  3367
	}
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3368
#  endif
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3369
# endif /* SO_CONDITIONAL */
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3370
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3371
# ifdef SO_DEBUG
5473
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  3372
	if (option == @symbol(SO_DEBUG)) {
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  3373
	    /* Records debugging information. */
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  3374
	    opt = SO_DEBUG;
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  3375
	    level = SOL_SOCKET;
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  3376
	    usize = sizeof(u.u_bool);
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  3377
	    if (arg1 == true) u.u_bool = TRUE;
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  3378
	    else if (arg1 == false) u.u_bool = FALSE;
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  3379
	    else goto argError;
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  3380
	}
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3381
# endif /* SO_DEBUG */
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3382
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3383
# ifdef SO_DONTLINGER
5473
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  3384
	if (option == @symbol(SO_DONTLINGER)) {
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  3385
	    /* Does not block close waiting for unsent data to be sent.
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  3386
	       Setting this option is equivalent to setting SO_LINGER with l_onoff set to zero. */
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  3387
	    opt = SO_DONTLINGER;
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  3388
	    level = SOL_SOCKET;
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  3389
	    usize = sizeof(u.u_bool);
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  3390
	    if (arg1 == true) u.u_bool = TRUE;
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  3391
	    else if (arg1 == false) u.u_bool = FALSE;
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  3392
	    else goto argError;
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  3393
	}
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3394
# endif /* SO_DONTLINGER */
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3395
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3396
# ifdef SO_DONTROUTE
5473
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  3397
	if (option == @symbol(SO_DONTROUTE)) {
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  3398
	    /* Does not route: sends directly to interface.
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  3399
	       Succeeds but is ignored on AF_INET sockets;
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  3400
	       fails on AF_INET6 sockets with WSAENOPROTOOPT.
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  3401
	       Not supported on ATM sockets (results in an error). */
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  3402
	    opt = SO_DONTROUTE;
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  3403
	    level = SOL_SOCKET;
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  3404
	    usize = sizeof(u.u_bool);
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  3405
	    if (arg1 == true) u.u_bool = TRUE;
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  3406
	    else if (arg1 == false) u.u_bool = FALSE;
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  3407
	    else goto argError;
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  3408
	}
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3409
# endif /* SO_DONTROUTE */
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3410
2516
592619f82885 Add setsockopt for Multicast stuff
Stefan Vogel <sv@exept.de>
parents: 2465
diff changeset
  3411
#if defined(IPPROTO_TCP) && defined(TCP_NODELAY)
5473
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  3412
	if (option == @symbol(TCP_NODELAY)) {
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  3413
	    /* enable/disable TCP_NODELAY (i.e. disable/enable the Nagle algorithm) */
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  3414
	    opt = TCP_NODELAY;
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  3415
	    level = IPPROTO_TCP;
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  3416
	    usize = sizeof(u.u_bool);
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  3417
	    if (arg1 == true) u.u_bool = TRUE;
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  3418
	    else if (arg1 == false) u.u_bool = FALSE;
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  3419
	    else goto argError;
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  3420
	}
2516
592619f82885 Add setsockopt for Multicast stuff
Stefan Vogel <sv@exept.de>
parents: 2465
diff changeset
  3421
# endif /* TCP_NODELAY */
592619f82885 Add setsockopt for Multicast stuff
Stefan Vogel <sv@exept.de>
parents: 2465
diff changeset
  3422
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3423
# ifdef SO_KEEPALIVE
5473
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  3424
	if (option == @symbol(SO_KEEPALIVE)) {
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  3425
	    /* Sends keep-alives. Not supported on ATM sockets (results in an error). */
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  3426
	    opt = SO_KEEPALIVE;
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  3427
	    level = SOL_SOCKET;
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  3428
	    usize = sizeof(u.u_bool);
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  3429
	    if (arg1 == true) u.u_bool = TRUE;
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  3430
	    else if (arg1 == false) u.u_bool = FALSE;
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  3431
	    else goto argError;
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  3432
	}
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3433
# endif /* SO_KEEPALIVE */
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3434
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3435
# ifdef SO_LINGER
5473
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  3436
	if (option == @symbol(SO_LINGER)) {
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  3437
	    /* Lingers on close if unsent data is present. */
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  3438
	    opt = SO_LINGER;
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  3439
	    level = SOL_SOCKET;
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  3440
	    usize = sizeof(u.u_linger);
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  3441
	    if (arg1 == true) u.u_linger.l_onoff = TRUE;
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  3442
	    else if (arg1 == false) u.u_linger.l_onoff = FALSE;
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  3443
	    else goto argError;
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  3444
	    if (arg2 == nil) u.u_linger.l_linger = 0;
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  3445
	    else if (__isSmallInteger(arg2))u.u_linger.l_linger = __intVal(arg2);
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  3446
	    else goto argError;
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  3447
	    DBGPRINTF(("SOCKET: SO_LINGER %d %d\n", u.u_linger.l_onoff, u.u_linger.l_linger));
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  3448
	}
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3449
# endif /* SO_LINGER */
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3450
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3451
# ifdef SO_OOBINLINE
5473
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  3452
	if (option == @symbol(SO_OOBINLINE)) {
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  3453
	    /* Receives OOB data in the normal data stream. */
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  3454
	    opt = SO_OOBINLINE;
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  3455
	    level = SOL_SOCKET;
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  3456
	    usize = sizeof(u.u_bool);
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  3457
	    if (arg1 == true) u.u_bool = TRUE;
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  3458
	    else if (arg1 == false) u.u_bool = FALSE;
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  3459
	    else goto argError;
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  3460
	}
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3461
# endif /* SO_OOBINLINE */
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3462
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3463
# ifdef SO_RCVBUF
5473
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  3464
	if (option == @symbol(SO_RCVBUF)) {
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  3465
	    /* Specifies the total per-socket buffer space reserved for receives.
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  3466
	       This is unrelated to SO_MAX_MSG_SIZE or the size of a TCP window. */
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  3467
	    opt = SO_RCVBUF;
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  3468
	    level = SOL_SOCKET;
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  3469
	    usize = sizeof(u.u_int);
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  3470
	    if (__isSmallInteger(arg1))u.u_int = __intVal(arg1);
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  3471
	    else goto argError;
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  3472
	}
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3473
# endif /* SO_RCVBUF */
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3474
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3475
# ifdef SO_SNDBUF
5473
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  3476
	if (option == @symbol(SO_SNDBUF)) {
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  3477
	    /* Specifies the total per-socket buffer space reserved for sends.
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  3478
	       This is unrelated to SO_MAX_MSG_SIZE or the size of a TCP window. */
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  3479
	    opt = SO_SNDBUF;
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  3480
	    level = SOL_SOCKET;
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  3481
	    usize = sizeof(u.u_int);
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  3482
	    if (__isSmallInteger(arg1))u.u_int = __intVal(arg1);
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  3483
	    else goto argError;
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  3484
	}
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3485
# endif /* SO_SNDBUF */
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3486
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3487
# ifdef SO_REUSEADDR
5473
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  3488
	if (option == @symbol(SO_REUSEADDR)) {
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  3489
	    /* Allows the socket to be bound to an address that is already in use.  */
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  3490
	    opt = SO_REUSEADDR;
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  3491
	    level = SOL_SOCKET;
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  3492
	    usize = sizeof(u.u_bool);
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  3493
	    if (arg1 == true) u.u_bool = TRUE;
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  3494
	    else if (arg1 == false) u.u_bool = FALSE;
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  3495
	    else goto argError;
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  3496
	}
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3497
# endif /* SO_OOBINLINE */
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3498
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3499
# ifdef SO_EXCLUSIVEADDRUSE
5473
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  3500
	if (option == @symbol(SO_EXCLUSIVEADDRUSE)) {
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  3501
	    /* Enables a socket to be bound for exclusive access.
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  3502
	       Does not require administrative privilege.  */
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  3503
	    opt = SO_EXCLUSIVEADDRUSE;
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  3504
	    level = SOL_SOCKET;
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  3505
	    usize = sizeof(u.u_bool);
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  3506
	    if (arg1 == true) u.u_bool = TRUE;
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  3507
	    else if (arg1 == false) u.u_bool = FALSE;
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  3508
	    else goto argError;
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  3509
	}
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3510
# endif /* SO_OOBINLINE */
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3511
3467
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
  3512
# ifdef SO_RCVTIMEO
5473
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  3513
	if ((option == @symbol(SO_RCVTIMEO))
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  3514
	 && __isSmallInteger(arg1)
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  3515
	 && __isSmallInteger(arg2)) {
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  3516
	    opt = SO_RCVTIMEO;
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  3517
	    level = SOL_SOCKET;
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  3518
	    u.u_tv.tv_sec = __intVal(arg1);
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  3519
	    u.u_tv.tv_usec = __intVal(arg2);
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  3520
	    usize = sizeof(u.u_tv);
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  3521
	}
3467
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
  3522
# endif /* SO_RCVTIMEO */
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
  3523
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
  3524
# ifdef SO_SNDTIMEO
5473
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  3525
	if ((option == @symbol(SO_SNDTIMEO))
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  3526
	 && __isSmallInteger(arg1)
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  3527
	 && __isSmallInteger(arg2)) {
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  3528
	    opt = SO_SNDTIMEO;
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  3529
	    level = SOL_SOCKET;
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  3530
	    u.u_tv.tv_sec = __intVal(arg1);
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  3531
	    u.u_tv.tv_usec = __intVal(arg2);
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  3532
	    usize = sizeof(u.u_tv);
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  3533
	}
3467
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
  3534
# endif /* SO_SNDTIMEO */
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
  3535
3843
fbced69597a7 oops - error check was disabled
Claus Gittinger <cg@exept.de>
parents: 3742
diff changeset
  3536
# if !defined(IPV6_V6ONLY) && defined(__win32__)
3513
8105bf370769 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3485
diff changeset
  3537
#  define IPPROTO_IPV6 41
8105bf370769 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3485
diff changeset
  3538
#  define IPV6_V6ONLY 27
8105bf370769 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3485
diff changeset
  3539
# endif
8105bf370769 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3485
diff changeset
  3540
8105bf370769 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3485
diff changeset
  3541
# if defined(IPV6_V6ONLY)
5473
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  3542
	if (option == @symbol(IPV6_V6ONLY)) {
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  3543
	    opt = IPV6_V6ONLY;
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  3544
	    level = IPPROTO_IPV6;
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  3545
	    usize = sizeof(u.u_bool);
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  3546
	    if (arg1 == true) u.u_bool = TRUE;
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  3547
	    else if (arg1 == false) u.u_bool = FALSE;
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  3548
	    else goto argError;
3843
fbced69597a7 oops - error check was disabled
Claus Gittinger <cg@exept.de>
parents: 3742
diff changeset
  3549
#  ifdef __win32__
5473
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  3550
	    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
  3551
#  endif
5473
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  3552
	}
3513
8105bf370769 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3485
diff changeset
  3553
# endif /* IPV6_V6ONLY */
8105bf370769 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3485
diff changeset
  3554
5473
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  3555
	if (usize == -1) goto argError;
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  3556
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  3557
	ok = (setsockopt(sock, level, opt, (char *)&u, usize) >= 0) ? true : false;
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  3558
	if (ok == false) {
3843
fbced69597a7 oops - error check was disabled
Claus Gittinger <cg@exept.de>
parents: 3742
diff changeset
  3559
# ifdef __win32__
5473
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  3560
	    error = __mkSmallInteger(WSAGetLastError());
3843
fbced69597a7 oops - error check was disabled
Claus Gittinger <cg@exept.de>
parents: 3742
diff changeset
  3561
# else
5473
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  3562
	    error = __mkSmallInteger(errno);
3843
fbced69597a7 oops - error check was disabled
Claus Gittinger <cg@exept.de>
parents: 3742
diff changeset
  3563
# endif
5473
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  3564
	}
3513
8105bf370769 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3485
diff changeset
  3565
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3566
    }
1529
911273d090c1 Re-unified Win32 and Unix code into single Socket.st.
Claus Gittinger <cg@exept.de>
parents: 1505
diff changeset
  3567
argError: ;
2818
94d67df5c00d compilable with tcc
Claus Gittinger <cg@exept.de>
parents: 2773
diff changeset
  3568
#endif /* NO_SOCKET */
1529
911273d090c1 Re-unified Win32 and Unix code into single Socket.st.
Claus Gittinger <cg@exept.de>
parents: 1505
diff changeset
  3569
%}.
911273d090c1 Re-unified Win32 and Unix code into single Socket.st.
Claus Gittinger <cg@exept.de>
parents: 1505
diff changeset
  3570
    ok isNil ifTrue:[
5473
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  3571
	self primitiveFailed
1529
911273d090c1 Re-unified Win32 and Unix code into single Socket.st.
Claus Gittinger <cg@exept.de>
parents: 1505
diff changeset
  3572
    ].
911273d090c1 Re-unified Win32 and Unix code into single Socket.st.
Claus Gittinger <cg@exept.de>
parents: 1505
diff changeset
  3573
    ok ifFalse:[
5473
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  3574
	'++++ 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
  3575
    ].
2551
6da1bc89b74a changed:
Stefan Vogel <sv@exept.de>
parents: 2516
diff changeset
  3576
!
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3577
2823
10179ccfae5d Default for close - linger in background instead 30s in foreground
Stefan Vogel <sv@exept.de>
parents: 2818
diff changeset
  3578
shutdown:howNum
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3579
    "shutDown the socket - inform it that no more I/O will be performed.
5473
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  3580
	 0 - read side   (no further reads)
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  3581
	     the tcp receive window is closed, so the peer cannot send more data.
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  3582
	 1 - write side  (no further writes)
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  3583
	     first, all queued data will be delivered to the peer.
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  3584
	     Then, an orderly release (TCP FIN) is sent to signal the peer,
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  3585
	     that we will not send more data.
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  3586
	 2 - both read side and write side."
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3587
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3588
%{
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3589
#ifndef NO_SOCKET
2823
10179ccfae5d Default for close - linger in background instead 30s in foreground
Stefan Vogel <sv@exept.de>
parents: 2818
diff changeset
  3590
    OBJ __handle = __INST(handle);
3246
c75a006f9a7a Win32 sockets use handles instead of file pointers
Stefan Vogel <sv@exept.de>
parents: 3224
diff changeset
  3591
2823
10179ccfae5d Default for close - linger in background instead 30s in foreground
Stefan Vogel <sv@exept.de>
parents: 2818
diff changeset
  3592
    if ((__handle != nil) && __isSmallInteger(howNum)) {
5473
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  3593
	SOCKET sock = SOCKET_FROM_FILE_OBJECT(__handle);
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  3594
	INT how = __intVal(howNum);
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  3595
	INT ret;
2823
10179ccfae5d Default for close - linger in background instead 30s in foreground
Stefan Vogel <sv@exept.de>
parents: 2818
diff changeset
  3596
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3597
# ifdef DO_WRAP_CALLS
5473
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  3598
	do {
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  3599
	    __threadErrno = 0;
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  3600
	    DBGFPRINTF((stderr, "SOCKET: shutDown...\n"));
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  3601
	    ret = (INT)STX_WSA_NOINT_CALL2("shutdown", shutdown, sock, how);
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  3602
	    DBGFPRINTF((stderr, "SOCKET: shutDown -> %d (%d)\n", ret, __threadErrno));
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  3603
	} 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
  3604
# else
5473
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  3605
	__BEGIN_INTERRUPTABLE__
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  3606
	shutdown(sock, how);
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  3607
	__END_INTERRUPTABLE__
1529
911273d090c1 Re-unified Win32 and Unix code into single Socket.st.
Claus Gittinger <cg@exept.de>
parents: 1505
diff changeset
  3608
# endif
781
4d61e7588ff3 added #waitForNewConnectionOrDataOnAny:timeout:
Claus Gittinger <cg@exept.de>
parents: 776
diff changeset
  3609
    }
4d61e7588ff3 added #waitForNewConnectionOrDataOnAny:timeout:
Claus Gittinger <cg@exept.de>
parents: 776
diff changeset
  3610
#endif
1339
cc973a42aa54 shutdown: added
Claus Gittinger <cg@exept.de>
parents: 1338
diff changeset
  3611
%}.
781
4d61e7588ff3 added #waitForNewConnectionOrDataOnAny:timeout:
Claus Gittinger <cg@exept.de>
parents: 776
diff changeset
  3612
! !
4d61e7588ff3 added #waitForNewConnectionOrDataOnAny:timeout:
Claus Gittinger <cg@exept.de>
parents: 776
diff changeset
  3613
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3614
!Socket methodsFor:'printing & storing'!
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3615
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3616
printOn:aStream
3530
ce2171c0fe57 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3514
diff changeset
  3617
    aStream nextPutAll:self className; nextPutAll:'('.
5464
7f31945df4b1 #QUALITY by stefan
Stefan Vogel <sv@exept.de>
parents: 5460
diff changeset
  3618
    self isOpen ifFalse:[
5473
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  3619
	aStream nextPutAll:'*closed* '.
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  3620
    ].
3530
ce2171c0fe57 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3514
diff changeset
  3621
    domain printOn:aStream.
ce2171c0fe57 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3514
diff changeset
  3622
    aStream nextPutAll:' protocol='.
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3623
    protocol printOn:aStream.
4736
c5a3e2dae276 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 4671
diff changeset
  3624
    aStream nextPutAll:' type='.
c5a3e2dae276 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 4671
diff changeset
  3625
    socketType printOn:aStream.
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3626
    aStream nextPutAll:' port='.
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  3627
    self port printOn:aStream.
4636
7e1e0ce3e0b4 #QUALITY by stefan
Stefan Vogel <sv@exept.de>
parents: 4630
diff changeset
  3628
    peer notNil ifTrue:[
5473
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  3629
	aStream nextPutAll:' peer='.
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  3630
	peer printOn:aStream.
4636
7e1e0ce3e0b4 #QUALITY by stefan
Stefan Vogel <sv@exept.de>
parents: 4630
diff changeset
  3631
    ].
7e1e0ce3e0b4 #QUALITY by stefan
Stefan Vogel <sv@exept.de>
parents: 4630
diff changeset
  3632
    listening notNil ifTrue:[
5473
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  3633
	aStream nextPutAll:' *listening('.
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  3634
	listening printOn:aStream.
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  3635
	aStream nextPutAll:')*'.
4636
7e1e0ce3e0b4 #QUALITY by stefan
Stefan Vogel <sv@exept.de>
parents: 4630
diff changeset
  3636
    ].
1842
88c04d1e9e6b changed #printOn:
Stefan Vogel <sv@exept.de>
parents: 1839
diff changeset
  3637
    aStream nextPut:$).
4636
7e1e0ce3e0b4 #QUALITY by stefan
Stefan Vogel <sv@exept.de>
parents: 4630
diff changeset
  3638
7e1e0ce3e0b4 #QUALITY by stefan
Stefan Vogel <sv@exept.de>
parents: 4630
diff changeset
  3639
    "Modified: / 23-04-2018 / 19:44:24 / stefan"
4736
c5a3e2dae276 #UI_ENHANCEMENT by cg
Claus Gittinger <cg@exept.de>
parents: 4671
diff changeset
  3640
    "Modified: / 19-09-2018 / 18:30:20 / Claus Gittinger"
5464
7f31945df4b1 #QUALITY by stefan
Stefan Vogel <sv@exept.de>
parents: 5460
diff changeset
  3641
    "Modified: / 02-03-2020 / 19:25:40 / Stefan Vogel"
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3642
! !
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3643
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3644
!Socket methodsFor:'queries'!
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3645
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3646
domain
3059
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  3647
    "return the sockets addressing domain (i.e. #AF_INET, #AF_INET6, #AF_UNIX, ...)"
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3648
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3649
    ^ domain
126
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
  3650
!
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
  3651
3059
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  3652
getFullPeerAddress
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  3653
    "implemented for swazoo project (primitive code can't be loaded as extension)
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3654
     Answer my own address (I am bound to this address).
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3655
     Note that this address may change after a connect or accept."
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3656
3059
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  3657
    |error domainClass addr|
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3658
2321
6f4cc7b644db filePointer -> handle migration
Claus Gittinger <cg@exept.de>
parents: 2308
diff changeset
  3659
    handle isNil ifTrue:[
5473
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  3660
	^ self errorNotOpen
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3661
    ].
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3662
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3663
    domainClass := self class socketAddressClassForDomain:domain.
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3664
    domainClass isNil ifTrue:[
5473
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  3665
	^ self error:'invalid (unsupported) domain'.
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3666
    ].
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3667
    addr := domainClass new.
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3668
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3669
%{
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3670
#ifndef NO_SOCKET
2321
6f4cc7b644db filePointer -> handle migration
Claus Gittinger <cg@exept.de>
parents: 2308
diff changeset
  3671
    OBJ fp = __INST(handle);
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3672
    SOCKET sock;
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3673
    int ret;
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3674
    union sockaddr_u sa;
3059
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  3675
    unsigned int alen = sizeof(sa);
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3676
    char *addrP;
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3677
    int addrObjSize, nAddrInstBytes;
3059
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  3678
    OBJ addrClass;
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  3679
    int nAddrInstVars;
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3680
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3681
    if (!__isNonNilObject(addr) || !__isBytes(addr)) {
5473
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  3682
	DBGPRINTF(("SOCKET: bad addr\n"));
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  3683
	error = @symbol(badArgument);
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  3684
	goto err;
3059
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  3685
    }
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  3686
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  3687
    addrClass = __qClass(addr);
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  3688
    nAddrInstVars = __intVal(__ClassInstPtr(addrClass)->c_ninstvars);
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  3689
    nAddrInstBytes = OHDR_SIZE + (nAddrInstVars * sizeof(OBJ));
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  3690
    addrObjSize = __qSize(addr) - nAddrInstBytes;
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  3691
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  3692
    sock = SOCKET_FROM_FILE_OBJECT(fp);
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  3693
    ret = getpeername(sock, (struct sockaddr *)&sa, &alen);
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  3694
    if (ret < 0) {
3843
fbced69597a7 oops - error check was disabled
Claus Gittinger <cg@exept.de>
parents: 3742
diff changeset
  3695
# ifdef __win32__
5473
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  3696
	errno = WSAGetLastError();
3059
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  3697
# endif
5473
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  3698
	DBGPRINTF(("SOCKET: getsocketname failed ret=%d errno=%d\n", ret, errno));
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  3699
	error = __MKSMALLINT(errno);
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  3700
	goto err;
3059
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  3701
    }
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  3702
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  3703
    if (addrObjSize < alen) {
5473
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  3704
	DBGPRINTF(("SOCKET: bad addr\n"));
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  3705
	error = @symbol(badArgument);
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  3706
	goto err;
3059
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  3707
    }
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  3708
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  3709
    addrP = (char *)__InstPtr(addr) + nAddrInstBytes;
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  3710
    memcpy(addrP, (char *)&sa, alen);
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  3711
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  3712
err:;
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  3713
#else /* NO_SOCKET */
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  3714
    error = @symbol(notImplemented);
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  3715
#endif /* NO_SOCKET */
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  3716
%}.
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  3717
    error notNil ifTrue:[
5473
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  3718
	^ self errorReporter reportOn:error
3059
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  3719
    ].
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  3720
    ^ addr
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  3721
!
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  3722
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  3723
getFullSocketAddress
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  3724
    "implemented for swazoo project (primitive code can't be loaded as extension)
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  3725
     Answer my own address (I am bound to this address).
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  3726
     Note that this address may change after a connect or accept."
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  3727
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  3728
    |error domainClass addr|
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  3729
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  3730
    handle isNil ifTrue:[
5473
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  3731
	^ self errorNotOpen
3059
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  3732
    ].
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  3733
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  3734
    domainClass := self class socketAddressClassForDomain:domain.
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  3735
    domainClass isNil ifTrue:[
5473
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  3736
	^ self error:'invalid (unsupported) domain'.
3059
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  3737
    ].
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  3738
    addr := domainClass new.
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  3739
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  3740
%{
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  3741
#ifndef NO_SOCKET
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  3742
    OBJ fp = __INST(handle);
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  3743
    SOCKET sock;
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  3744
    int ret;
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  3745
    union sockaddr_u sa;
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  3746
    unsigned int alen = sizeof(sa);
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  3747
    char *addrP;
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  3748
    int addrObjSize, nAddrInstBytes;
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  3749
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  3750
    if (!__isNonNilObject(addr) || !__isBytes(addr)) {
5473
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  3751
	DBGPRINTF(("SOCKET: bad addr\n"));
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  3752
	error = @symbol(badArgument);
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  3753
	goto err;
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3754
    }
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3755
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3756
    {
5473
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  3757
	OBJ addrClass;
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  3758
	int nAddrInstVars;
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  3759
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  3760
	addrClass = __qClass(addr);
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  3761
	nAddrInstVars = __intVal(__ClassInstPtr(addrClass)->c_ninstvars);
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  3762
	nAddrInstBytes = OHDR_SIZE + (nAddrInstVars * sizeof(OBJ));
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  3763
	addrObjSize = __qSize(addr) - nAddrInstBytes;
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3764
    }
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3765
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3766
    sock = SOCKET_FROM_FILE_OBJECT(fp);
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3767
    ret = getsockname(sock, (struct sockaddr *)&sa, &alen);
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3768
    if (ret < 0) {
3843
fbced69597a7 oops - error check was disabled
Claus Gittinger <cg@exept.de>
parents: 3742
diff changeset
  3769
# ifdef __win32__
5473
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  3770
	errno = WSAGetLastError();
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3771
# endif
5473
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  3772
	DBGPRINTF(("SOCKET: getsocketname failed ret=%d errno=%d\n", ret, errno));
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  3773
	error = __MKSMALLINT(errno);
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  3774
	goto err;
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3775
    }
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3776
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3777
    if (addrObjSize < alen) {
5473
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  3778
	DBGPRINTF(("SOCKET: bad addr\n"));
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  3779
	error = @symbol(badArgument);
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  3780
	goto err;
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3781
    }
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3782
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3783
    addrP = (char *)__InstPtr(addr) + nAddrInstBytes;
3059
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  3784
    memcpy(addrP, (char *)&sa, alen);
1535
f6aa0fc8c3cc getSocketAddress
Claus Gittinger <cg@exept.de>
parents: 1533
diff changeset
  3785
f6aa0fc8c3cc getSocketAddress
Claus Gittinger <cg@exept.de>
parents: 1533
diff changeset
  3786
err:;
f6aa0fc8c3cc getSocketAddress
Claus Gittinger <cg@exept.de>
parents: 1533
diff changeset
  3787
#else /* NO_SOCKET */
f6aa0fc8c3cc getSocketAddress
Claus Gittinger <cg@exept.de>
parents: 1533
diff changeset
  3788
    error = @symbol(notImplemented);
f6aa0fc8c3cc getSocketAddress
Claus Gittinger <cg@exept.de>
parents: 1533
diff changeset
  3789
#endif /* NO_SOCKET */
f6aa0fc8c3cc getSocketAddress
Claus Gittinger <cg@exept.de>
parents: 1533
diff changeset
  3790
%}.
f6aa0fc8c3cc getSocketAddress
Claus Gittinger <cg@exept.de>
parents: 1533
diff changeset
  3791
    error notNil ifTrue:[
5473
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  3792
	^ self errorReporter reportOn:error
1535
f6aa0fc8c3cc getSocketAddress
Claus Gittinger <cg@exept.de>
parents: 1533
diff changeset
  3793
    ].
f6aa0fc8c3cc getSocketAddress
Claus Gittinger <cg@exept.de>
parents: 1533
diff changeset
  3794
    ^ addr
f6aa0fc8c3cc getSocketAddress
Claus Gittinger <cg@exept.de>
parents: 1533
diff changeset
  3795
!
f6aa0fc8c3cc getSocketAddress
Claus Gittinger <cg@exept.de>
parents: 1533
diff changeset
  3796
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3797
getName
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3798
    "return the name; here, we return the ports name"
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3799
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  3800
    ^ self port printString
126
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
  3801
!
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
  3802
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3803
getPeer
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3804
    "ST-80 compatibility: return an IPSocketAddress instance representing
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3805
     my hostname/port combination.
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3806
     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
  3807
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
  3808
    ^ peer
102
5dc264007513 added getPeer for ST-80 compatibility
Claus Gittinger <cg@exept.de>
parents: 99
diff changeset
  3809
!
5dc264007513 added getPeer for ST-80 compatibility
Claus Gittinger <cg@exept.de>
parents: 99
diff changeset
  3810
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3811
getPeerName
4091
ff4070ceffad #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 4039
diff changeset
  3812
    "return the peer name; that's the hostname (or dotted name) of the
25
996051271ce9 *** empty log message ***
claus
parents: 21
diff changeset
  3813
     partners host after an accept."
996051271ce9 *** empty log message ***
claus
parents: 21
diff changeset
  3814
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
  3815
    peerName isNil ifTrue:[
5473
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  3816
	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
  3817
    ].
25
996051271ce9 *** empty log message ***
claus
parents: 21
diff changeset
  3818
    ^ peerName
28
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  3819
!
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  3820
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3821
getSocketAddress
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3822
    "implemented for swazoo project primitive code cant load as extension
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3823
     answer my own address (I am bound to this address).
1146
71a9df78ba9e bad spelling
Stefan Vogel <sv@exept.de>
parents: 1136
diff changeset
  3824
     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
  3825
1535
f6aa0fc8c3cc getSocketAddress
Claus Gittinger <cg@exept.de>
parents: 1533
diff changeset
  3826
    ^ self getFullSocketAddress hostAddress
1146
71a9df78ba9e bad spelling
Stefan Vogel <sv@exept.de>
parents: 1136
diff changeset
  3827
!
71a9df78ba9e bad spelling
Stefan Vogel <sv@exept.de>
parents: 1136
diff changeset
  3828
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3829
isActive
4795
58f0486fe4ba #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4791
diff changeset
  3830
    "return true, if the receiver has a connection or is bound or listening"
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3831
2321
6f4cc7b644db filePointer -> handle migration
Claus Gittinger <cg@exept.de>
parents: 2308
diff changeset
  3832
    ^ handle notNil
4795
58f0486fe4ba #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4791
diff changeset
  3833
58f0486fe4ba #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 4791
diff changeset
  3834
    "Modified (comment): / 05-02-2019 / 17:19:35 / Stefan Vogel"
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3835
!
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3836
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3837
isConnected
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3838
    "return true, if the receiver has a connection"
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3839
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3840
    ^ self isActive
5473
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  3841
	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
  3842
!
a563aac90660 No need to ask Socket>>#networkXXXOrderIsMSB, because the return value is
Stefan Vogel <sv@exept.de>
parents: 1542
diff changeset
  3843
5196
f2b4c109c24f #FEATURE by exept
Claus Gittinger <cg@exept.de>
parents: 5001
diff changeset
  3844
isListening
f2b4c109c24f #FEATURE by exept
Claus Gittinger <cg@exept.de>
parents: 5001
diff changeset
  3845
    ^ listening notNil
f2b4c109c24f #FEATURE by exept
Claus Gittinger <cg@exept.de>
parents: 5001
diff changeset
  3846
!
f2b4c109c24f #FEATURE by exept
Claus Gittinger <cg@exept.de>
parents: 5001
diff changeset
  3847
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3848
port
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  3849
    "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
  3850
     - so this is the local port."
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  3851
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  3852
"/    port isNil ifTrue:[
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  3853
"/        port := self getFullSocketAddress port.
1505
Stefan Vogel <sv@exept.de>
parents: 1504
diff changeset
  3854
"/    ].
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  3855
71
claus
parents: 63
diff changeset
  3856
    ^ port
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3857
!
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3858
3059
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  3859
socketAddressClass
4288
00e575acf898 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 4261
diff changeset
  3860
    "get the matching SocketAddress class for this socket"
3059
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  3861
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  3862
    |domainClass|
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  3863
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  3864
    domainClass := self class socketAddressClassForDomain:domain.
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  3865
    domainClass isNil ifTrue:[
5473
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  3866
	^ self error:'invalid (unsupported) domain'.
3059
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  3867
    ].
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  3868
    ^ domainClass.
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  3869
!
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  3870
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3871
type
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3872
    "return the sockets connection type (i.e. #datagram, #stream etc)"
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3873
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3874
    ^ socketType
81
claus
parents: 79
diff changeset
  3875
! !
claus
parents: 79
diff changeset
  3876
126
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
  3877
!Socket methodsFor:'socket setup'!
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
  3878
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3879
domain:domainArg type:typeArg
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3880
    "set up socket with domain and type.
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3881
     This is a low level entry; no binding, listening or connect
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3882
     is done. Both arguments must be symbols from one of
3059
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  3883
      #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
  3884
3137
df3e9cebf52c class: Socket
Stefan Vogel <sv@exept.de>
parents: 3127
diff changeset
  3885
    ^ self domain:domainArg type:typeArg protocol:nil
126
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
  3886
!
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
  3887
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3888
domain:domainArg type:typeArg protocol:protocolNumber
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3889
    "set up socket with domain, type and protocol number.
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3890
     This is a low level entry; no binding, listening or connect
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3891
     is done. Both arguments must be symbols from one of
3059
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  3892
     #AF_INET, #AF_INET6, #AF_UNIX ... and #stream, #datagram, #raw resp."
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3893
3246
c75a006f9a7a Win32 sockets use handles instead of file pointers
Stefan Vogel <sv@exept.de>
parents: 3224
diff changeset
  3894
    |domainName domainCode typeCode error newHandle|
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3895
2321
6f4cc7b644db filePointer -> handle migration
Claus Gittinger <cg@exept.de>
parents: 2308
diff changeset
  3896
    handle notNil ifTrue:[
5473
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  3897
	^ self errorAlreadyOpen
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3898
    ].
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3899
    domainName := SocketAddress domainCodeFromName:domainArg.
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3900
    domainCode := OperatingSystem domainCodeOf:domainName.
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3901
    typeCode := OperatingSystem socketTypeCodeOf:typeArg.
3246
c75a006f9a7a Win32 sockets use handles instead of file pointers
Stefan Vogel <sv@exept.de>
parents: 3224
diff changeset
  3902
    newHandle := OperatingSystem socketAccessor new.
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3903
%{
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3904
#ifndef NO_SOCKET
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3905
    FILE *fp;
3137
df3e9cebf52c class: Socket
Stefan Vogel <sv@exept.de>
parents: 3127
diff changeset
  3906
    int dom, typ, proto = 0;
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3907
    int on = 1;
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3908
    SOCKET sock;
3246
c75a006f9a7a Win32 sockets use handles instead of file pointers
Stefan Vogel <sv@exept.de>
parents: 3224
diff changeset
  3909
    int _fd;
c75a006f9a7a Win32 sockets use handles instead of file pointers
Stefan Vogel <sv@exept.de>
parents: 3224
diff changeset
  3910
3843
fbced69597a7 oops - error check was disabled
Claus Gittinger <cg@exept.de>
parents: 3742
diff changeset
  3911
# ifdef __win32__
3123
55ef9ca4f09f class: Socket
Stefan Vogel <sv@exept.de>
parents: 3077
diff changeset
  3912
#  ifndef WSA_FLAG_NO_HANDLE_INHERIT
55ef9ca4f09f class: Socket
Stefan Vogel <sv@exept.de>
parents: 3077
diff changeset
  3913
#   define WSA_FLAG_NO_HANDLE_INHERIT 0x80
55ef9ca4f09f class: Socket
Stefan Vogel <sv@exept.de>
parents: 3077
diff changeset
  3914
#  endif
55ef9ca4f09f class: Socket
Stefan Vogel <sv@exept.de>
parents: 3077
diff changeset
  3915
    static int noInheritFlag = WSA_FLAG_NO_HANDLE_INHERIT;
55ef9ca4f09f class: Socket
Stefan Vogel <sv@exept.de>
parents: 3077
diff changeset
  3916
# endif
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3917
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3918
    if (! __isSmallInteger(domainCode)) {
5473
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  3919
	error = @symbol(badArgument1);
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  3920
	goto out;
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3921
    }
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3922
    if (! __isSmallInteger(typeCode)) {
5473
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  3923
	error = @symbol(badArgument2);
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  3924
	goto out;
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3925
    }
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3926
    if (protocolNumber != nil) {
5473
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  3927
	if (!__isSmallInteger(protocolNumber)) {
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  3928
	    error = @symbol(badArgument3);
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  3929
	    goto out;
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  3930
	}
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  3931
	proto = __intVal(protocolNumber);
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3932
    }
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3933
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3934
    /*
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3935
     * get address and protocol-family
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3936
     */
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3937
    dom = __intVal(domainCode);
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3938
    typ = __intVal(typeCode);
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3939
3843
fbced69597a7 oops - error check was disabled
Claus Gittinger <cg@exept.de>
parents: 3742
diff changeset
  3940
# ifdef __win32__
3123
55ef9ca4f09f class: Socket
Stefan Vogel <sv@exept.de>
parents: 3077
diff changeset
  3941
    sock = WSASocket(dom, typ, proto, 0, 0, noInheritFlag);
55ef9ca4f09f class: Socket
Stefan Vogel <sv@exept.de>
parents: 3077
diff changeset
  3942
    if (sock == INVALID_SOCKET && noInheritFlag) {
5473
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  3943
	// tried to open socket with WSA_FLAG_NO_HANDLE_INHERIT
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  3944
	// This fails on older windows versions, e.g. Windows XP
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  3945
	sock = WSASocket(dom, typ, proto, 0, 0, 0);
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  3946
	if (sock != INVALID_SOCKET) {
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  3947
	    // no error without WSA_FLAG_NO_HANDLE_INHERIT,
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  3948
	    // never use this flag again!
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  3949
	    noInheritFlag = 0;
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  3950
	}
3123
55ef9ca4f09f class: Socket
Stefan Vogel <sv@exept.de>
parents: 3077
diff changeset
  3951
    }
55ef9ca4f09f class: Socket
Stefan Vogel <sv@exept.de>
parents: 3077
diff changeset
  3952
    if (sock == INVALID_SOCKET) {
5473
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  3953
	errno = WSAGetLastError();
3123
55ef9ca4f09f class: Socket
Stefan Vogel <sv@exept.de>
parents: 3077
diff changeset
  3954
3843
fbced69597a7 oops - error check was disabled
Claus Gittinger <cg@exept.de>
parents: 3742
diff changeset
  3955
# else  // !__win32__
3123
55ef9ca4f09f class: Socket
Stefan Vogel <sv@exept.de>
parents: 3077
diff changeset
  3956
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3957
    sock = socket(dom, typ, proto);
3123
55ef9ca4f09f class: Socket
Stefan Vogel <sv@exept.de>
parents: 3077
diff changeset
  3958
# if defined(EPROTONOSUPPORT) /* for SGI */
55ef9ca4f09f class: Socket
Stefan Vogel <sv@exept.de>
parents: 3077
diff changeset
  3959
    if ((sock < 0) && (proto != 0) && (errno == EPROTONOSUPPORT)) {
5473
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  3960
	DBGPRINTF(("SOCKET: retry with UNSPEC protocol\n"));
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  3961
	proto = 0;
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  3962
	sock = socket(dom, typ, 0);
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3963
    }
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3964
# endif
3123
55ef9ca4f09f class: Socket
Stefan Vogel <sv@exept.de>
parents: 3077
diff changeset
  3965
    if (sock < 0) {
3843
fbced69597a7 oops - error check was disabled
Claus Gittinger <cg@exept.de>
parents: 3742
diff changeset
  3966
# endif // !__win32__
3123
55ef9ca4f09f class: Socket
Stefan Vogel <sv@exept.de>
parents: 3077
diff changeset
  3967
5473
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  3968
	DBGPRINTF(("SOCKET: socket(dom=%d typ=%d proto=%d) call failed errno=%d\n", dom, typ, proto, errno));
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  3969
	error = __MKSMALLINT(errno);
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3970
    } else {
3123
55ef9ca4f09f class: Socket
Stefan Vogel <sv@exept.de>
parents: 3077
diff changeset
  3971
# if defined(SET_LINGER_WHEN_CREATING_SOCKET) && defined(SO_LINGER)
5473
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  3972
	{
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  3973
	    struct linger l;
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  3974
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  3975
	    l.l_onoff = 1;
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  3976
	    l.l_linger = 30;
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  3977
	    setsockopt(sock, SOL_SOCKET, SO_LINGER, &l, sizeof(l));
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  3978
	}
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3979
# endif
3843
fbced69597a7 oops - error check was disabled
Claus Gittinger <cg@exept.de>
parents: 3742
diff changeset
  3980
# ifdef __win32__
5473
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  3981
	/*
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  3982
	 * make it blocking
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  3983
	 */
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  3984
	{
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  3985
	    unsigned long zero = 0;
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  3986
	    ioctlsocket(sock, FIONBIO, &zero);
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  3987
	}
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  3988
	{
3246
c75a006f9a7a Win32 sockets use handles instead of file pointers
Stefan Vogel <sv@exept.de>
parents: 3224
diff changeset
  3989
#  if 0 && (defined( __BORLANDC__ ) || defined( __MINGW__ ))
5473
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  3990
	    /*
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  3991
	     * make it a FILE *
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  3992
	     */
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  3993
	    __stxWrapApiEnterCritical();
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  3994
	    _fd = _open_osfhandle((long)sock, 0);
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  3995
	    __stxWrapApiLeaveCritical();
2773
ab3049f4a351 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2748
diff changeset
  3996
#  else
5473
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  3997
	    _fd = (int)sock;
2773
ab3049f4a351 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2748
diff changeset
  3998
#  endif
5473
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  3999
	    DBGPRINTF(("SOCKET: sock=%d fd=%d\n", sock, _fd));
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  4000
	}
3843
fbced69597a7 oops - error check was disabled
Claus Gittinger <cg@exept.de>
parents: 3742
diff changeset
  4001
# else  // !__win32__
5473
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  4002
	fp = fdopen(sock, "r+");
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  4003
	if (! fp) {
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  4004
	    DBGPRINTF(("SOCKET: fdopen call failed\n"));
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  4005
	    error = __MKSMALLINT(errno);
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  4006
	    __BEGIN_INTERRUPTABLE__
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  4007
	    closesocket(sock);
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  4008
	    DBGFPRINTF((stderr, "SOCKET: fdopen failed (%d)\n", sock));
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  4009
	    __END_INTERRUPTABLE__
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  4010
	    goto out;
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  4011
	}
3843
fbced69597a7 oops - error check was disabled
Claus Gittinger <cg@exept.de>
parents: 3742
diff changeset
  4012
# endif // !__win32__
3246
c75a006f9a7a Win32 sockets use handles instead of file pointers
Stefan Vogel <sv@exept.de>
parents: 3224
diff changeset
  4013
5473
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  4014
	if (@global(FileOpenTrace) == true) {
3843
fbced69597a7 oops - error check was disabled
Claus Gittinger <cg@exept.de>
parents: 3742
diff changeset
  4015
# ifdef __win32__
5473
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  4016
	    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
  4017
# else
5473
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  4018
	    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
  4019
# endif
5473
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  4020
	}
3246
c75a006f9a7a Win32 sockets use handles instead of file pointers
Stefan Vogel <sv@exept.de>
parents: 3224
diff changeset
  4021
3843
fbced69597a7 oops - error check was disabled
Claus Gittinger <cg@exept.de>
parents: 3742
diff changeset
  4022
# ifdef __win32__
5473
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  4023
	__externalAddressVal(newHandle) = _fd;
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  4024
	__INST(handleType) = @symbol(socketHandle);
3246
c75a006f9a7a Win32 sockets use handles instead of file pointers
Stefan Vogel <sv@exept.de>
parents: 3224
diff changeset
  4025
# else
5473
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  4026
	__externalAddressVal(newHandle) = fp;
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  4027
	__INST(handleType) = @symbol(socketFilePointer);
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  4028
# endif
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  4029
    }
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  4030
#endif
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  4031
out:;
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  4032
%}.
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  4033
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  4034
    "all ok?"
3246
c75a006f9a7a Win32 sockets use handles instead of file pointers
Stefan Vogel <sv@exept.de>
parents: 3224
diff changeset
  4035
    handleType notNil ifTrue:[
5473
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  4036
	handle := newHandle.
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  4037
	domain := domainArg.
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  4038
	socketType := typeArg.
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  4039
	self registerForFinalization.
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  4040
	^ self.
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  4041
    ].
3217
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  4042
    error isInteger ifTrue:[
5473
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  4043
	lastErrorNumber := error.
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  4044
	^ self openError:error.
3217
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  4045
    ].
6950d2d3aecf class: Socket
Stefan Vogel <sv@exept.de>
parents: 3215
diff changeset
  4046
    ^ self primitiveFailed:error.
126
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
  4047
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
  4048
    "
3059
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  4049
     Socket new domain:#AF_INET type:#stream
8be3c1e8dc05 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3043
diff changeset
  4050
     Socket new domain:#AF_UNIX type:#stream
126
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
  4051
    "
28
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  4052
! !
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  4053
5466
50ae296c9744 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 5465
diff changeset
  4054
28
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  4055
!Socket methodsFor:'specials'!
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  4056
3467
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
  4057
linger:anIntegerOrNil
3224
bad706c50347 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3223
diff changeset
  4058
    "set the linger behavior on close:
bad706c50347 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3223
diff changeset
  4059
      anIntegerOrNil == nil: close returns immediately, socket tries
5473
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  4060
			     to send buffered data in background.
3224
bad706c50347 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3223
diff changeset
  4061
      anIntegerOrNil == 0:   close returns immediately, bufferd data is discarded.
bad706c50347 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3223
diff changeset
  4062
      anIntegerOrNil > 0:    close waits this many seconds for buffered data
5473
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  4063
			     to be delivered, after this time buffered data is
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  4064
			     discarded and close returns with an error.
4796
3d3c49ddabdb #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 4795
diff changeset
  4065
     (returns false, if unsupported)"
3467
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
  4066
24d35ef42e17 socket options rcvtimeout and sndtimeout added
Claus Gittinger <cg@exept.de>
parents: 3462
diff changeset
  4067
    ^ self
5473
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  4068
	setSocketOption:#'SO_LINGER'
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  4069
	argument:anIntegerOrNil notNil
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  4070
	argument:anIntegerOrNil.
4796
3d3c49ddabdb #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 4795
diff changeset
  4071
3d3c49ddabdb #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 4795
diff changeset
  4072
    "Modified (comment): / 08-02-2019 / 22:33:14 / Claus Gittinger"
3224
bad706c50347 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3223
diff changeset
  4073
!
bad706c50347 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3223
diff changeset
  4074
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  4075
receiveBufferSize
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  4076
    "get the send buffer size - for special applications only.
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  4077
     Not all operatingSystems offer this functionality
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  4078
     (returns nil, if unsupported)"
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  4079
2321
6f4cc7b644db filePointer -> handle migration
Claus Gittinger <cg@exept.de>
parents: 2308
diff changeset
  4080
    handle isNil ifTrue:[
5473
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  4081
	^ self errorNotOpen
1335
0fafb78d7a80 sockopt utilities added
Claus Gittinger <cg@exept.de>
parents: 1316
diff changeset
  4082
    ].
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  4083
%{
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  4084
#if defined(SO_RCVBUF) && defined(SOL_SOCKET)
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  4085
    {
5473
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  4086
	OBJ fp = __INST(handle);
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  4087
	SOCKET sock;
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  4088
	int opt;
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  4089
	unsigned int size;
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  4090
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  4091
	sock = SOCKET_FROM_FILE_OBJECT(fp);
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  4092
	if (getsockopt(sock, SOL_SOCKET, SO_RCVBUF, (char *)&opt, &size) >= 0) {
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  4093
	    RETURN( __MKSMALLINT(opt) );
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  4094
	}
1335
0fafb78d7a80 sockopt utilities added
Claus Gittinger <cg@exept.de>
parents: 1316
diff changeset
  4095
    }
0fafb78d7a80 sockopt utilities added
Claus Gittinger <cg@exept.de>
parents: 1316
diff changeset
  4096
#endif
0fafb78d7a80 sockopt utilities added
Claus Gittinger <cg@exept.de>
parents: 1316
diff changeset
  4097
%}.
0fafb78d7a80 sockopt utilities added
Claus Gittinger <cg@exept.de>
parents: 1316
diff changeset
  4098
    ^ nil
0fafb78d7a80 sockopt utilities added
Claus Gittinger <cg@exept.de>
parents: 1316
diff changeset
  4099
!
0fafb78d7a80 sockopt utilities added
Claus Gittinger <cg@exept.de>
parents: 1316
diff changeset
  4100
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  4101
receiveBufferSize:size
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  4102
    "set the receive buffer size - for special applications only.
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  4103
     Not all operatingSystems offer this functionality
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  4104
     (returns false, if unsupported)"
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  4105
2321
6f4cc7b644db filePointer -> handle migration
Claus Gittinger <cg@exept.de>
parents: 2308
diff changeset
  4106
    handle isNil ifTrue:[
5473
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  4107
	^ self errorNotOpen
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  4108
    ].
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  4109
%{
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  4110
#if defined(SO_RCVBUF) && defined(SOL_SOCKET)
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  4111
    if (__isSmallInteger(size)) {
5473
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  4112
	OBJ fp = __INST(handle);
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  4113
	SOCKET sock;
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  4114
	int opt;
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  4115
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  4116
	sock = SOCKET_FROM_FILE_OBJECT(fp);
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  4117
	opt = __intVal(size);
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  4118
	if (setsockopt(sock, SOL_SOCKET, SO_RCVBUF, (char *)&opt, sizeof(int)) >= 0 ) {
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  4119
	    RETURN(true);
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  4120
	}
1335
0fafb78d7a80 sockopt utilities added
Claus Gittinger <cg@exept.de>
parents: 1316
diff changeset
  4121
    }
0fafb78d7a80 sockopt utilities added
Claus Gittinger <cg@exept.de>
parents: 1316
diff changeset
  4122
#endif
0fafb78d7a80 sockopt utilities added
Claus Gittinger <cg@exept.de>
parents: 1316
diff changeset
  4123
%}.
0fafb78d7a80 sockopt utilities added
Claus Gittinger <cg@exept.de>
parents: 1316
diff changeset
  4124
    ^ false
0fafb78d7a80 sockopt utilities added
Claus Gittinger <cg@exept.de>
parents: 1316
diff changeset
  4125
!
0fafb78d7a80 sockopt utilities added
Claus Gittinger <cg@exept.de>
parents: 1316
diff changeset
  4126
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  4127
receiveTimeout
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  4128
    "get the receive timeout in millis - for special applications only.
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  4129
     Not all operatingSystems offer this functionality
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  4130
     (returns nil, if unsupported)"
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  4131
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  4132
    |millis|
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  4133
2321
6f4cc7b644db filePointer -> handle migration
Claus Gittinger <cg@exept.de>
parents: 2308
diff changeset
  4134
    handle isNil ifTrue:[
5473
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  4135
	^ self errorNotOpen
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  4136
    ].
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  4137
%{
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  4138
#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
  4139
    OBJ fp = __INST(handle);
c75a006f9a7a Win32 sockets use handles instead of file pointers
Stefan Vogel <sv@exept.de>
parents: 3224
diff changeset
  4140
    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
  4141
    int len;
c75a006f9a7a Win32 sockets use handles instead of file pointers
Stefan Vogel <sv@exept.de>
parents: 3224
diff changeset
  4142
    int __millis;
c75a006f9a7a Win32 sockets use handles instead of file pointers
Stefan Vogel <sv@exept.de>
parents: 3224
diff changeset
  4143
    struct timeval tv = {0, 0};
c75a006f9a7a Win32 sockets use handles instead of file pointers
Stefan Vogel <sv@exept.de>
parents: 3224
diff changeset
  4144
c75a006f9a7a Win32 sockets use handles instead of file pointers
Stefan Vogel <sv@exept.de>
parents: 3224
diff changeset
  4145
    len = sizeof(struct timeval);
c75a006f9a7a Win32 sockets use handles instead of file pointers
Stefan Vogel <sv@exept.de>
parents: 3224
diff changeset
  4146
    if (getsockopt(sock, SOL_SOCKET, SO_RCVTIMEO, (void *)&tv, &len) == 0) {
5473
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  4147
	__millis = (tv.tv_sec * 1000) + (tv.tv_usec / 1000);
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  4148
	millis = __mkSmallInteger(__millis);
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  4149
# if 0
5473
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  4150
	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
  4151
# endif
3246
c75a006f9a7a Win32 sockets use handles instead of file pointers
Stefan Vogel <sv@exept.de>
parents: 3224
diff changeset
  4152
    } else {
5473
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  4153
	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
  4154
    }
3bca500e0c7a send and receiveTimeout fixed
Claus Gittinger <cg@exept.de>
parents: 1561
diff changeset
  4155
#endif
3bca500e0c7a send and receiveTimeout fixed
Claus Gittinger <cg@exept.de>
parents: 1561
diff changeset
  4156
%}.
4570
39e965ca8d06 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4568
diff changeset
  4157
    ^ millis
39e965ca8d06 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4568
diff changeset
  4158
39e965ca8d06 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4568
diff changeset
  4159
    "
5473
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  4160
	Socket newTCP receiveTimeout
4570
39e965ca8d06 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4568
diff changeset
  4161
    "
39e965ca8d06 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4568
diff changeset
  4162
39e965ca8d06 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4568
diff changeset
  4163
    "Modified: / 19-01-2018 / 19:15:17 / stefan"
1568
3bca500e0c7a send and receiveTimeout fixed
Claus Gittinger <cg@exept.de>
parents: 1561
diff changeset
  4164
!
3bca500e0c7a send and receiveTimeout fixed
Claus Gittinger <cg@exept.de>
parents: 1561
diff changeset
  4165
4570
39e965ca8d06 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4568
diff changeset
  4166
receiveTimeout:secondsOrTimeDuration
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  4167
    "set the receive timeout - for special applications only.
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  4168
     Not all operatingSystems offer this functionality
4570
39e965ca8d06 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4568
diff changeset
  4169
     (returns false, if unsupported).
39e965ca8d06 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4568
diff changeset
  4170
39e965ca8d06 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4568
diff changeset
  4171
     From linux manpage:
5473
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  4172
	  SO_RCVTIMEO and SO_SNDTIMEO
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  4173
	      Specify  the  receiving  or  sending  timeouts  until reporting an error.  The argument is a
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  4174
	      struct timeval.  If an input or output function blocks for this period of time, and data has
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  4175
	      been  sent  or received, the return value of that function will be the amount of data trans-
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  4176
	      ferred; if no data has been transferred and  the  timeout  has  been  reached,  then  -1  is
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  4177
	      returned with errno set to EAGAIN or EWOULDBLOCK, or EINPROGRESS (for connect(2)) just as if
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  4178
	      the socket was specified to be nonblocking.  If the timeout is set to  zero  (the  default),
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  4179
	      then the operation will never timeout.  Timeouts only have effect for system calls that per-
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  4180
	      form socket I/O (e.g., read(2), recvmsg(2), send(2), sendmsg(2)); timeouts  have  no  effect
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  4181
	      for select(2), poll(2), epoll_wait(2), and so on."
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  4182
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  4183
    |millis|
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  4184
2321
6f4cc7b644db filePointer -> handle migration
Claus Gittinger <cg@exept.de>
parents: 2308
diff changeset
  4185
    handle isNil ifTrue:[
5473
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  4186
	^ self errorNotOpen
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  4187
    ].
4570
39e965ca8d06 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4568
diff changeset
  4188
    secondsOrTimeDuration isTimeDuration ifTrue:[
5473
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  4189
	millis := secondsOrTimeDuration getMilliseconds.
4570
39e965ca8d06 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4568
diff changeset
  4190
    ] ifFalse:[
5473
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  4191
	millis := (secondsOrTimeDuration * 1000) rounded.
4570
39e965ca8d06 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4568
diff changeset
  4192
    ].
39e965ca8d06 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4568
diff changeset
  4193
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  4194
%{
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  4195
#if defined(SO_RCVTIMEO) && defined(SOL_SOCKET)
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  4196
    if (__isSmallInteger(millis)) {
5473
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  4197
	OBJ fp = __INST(handle);
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  4198
	SOCKET sock = SOCKET_FROM_FILE_OBJECT(fp);
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  4199
	int __millis = __intVal(millis);
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  4200
	struct timeval tv = {0, 0};
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  4201
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  4202
	tv.tv_sec = __millis / 1000;
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  4203
	tv.tv_usec = (__millis % 1000) * 1000;
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  4204
# if 0
5473
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  4205
	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
  4206
# endif
5473
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  4207
	if (setsockopt(sock, SOL_SOCKET, SO_RCVTIMEO, (void *)&tv, sizeof(struct timeval)) == 0) {
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  4208
	    RETURN(true);
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  4209
	}
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  4210
	console_fprintf(stderr, "Socket [warning]: setsockopt %d failed; errno=%d\n", sock, errno);
28
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  4211
    }
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  4212
#endif
71
claus
parents: 63
diff changeset
  4213
%}.
28
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  4214
    ^ false
4570
39e965ca8d06 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4568
diff changeset
  4215
39e965ca8d06 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4568
diff changeset
  4216
    "
5473
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  4217
	Socket newTCP
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  4218
	    receiveTimeout:5s;
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  4219
	    receiveTimeout
4570
39e965ca8d06 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4568
diff changeset
  4220
    "
39e965ca8d06 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4568
diff changeset
  4221
39e965ca8d06 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4568
diff changeset
  4222
    "Modified (comment): / 19-01-2018 / 19:14:49 / stefan"
81
claus
parents: 79
diff changeset
  4223
!
claus
parents: 79
diff changeset
  4224
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  4225
sendBufferSize
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  4226
    "get the send buffer size - for special applications only.
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  4227
     Not all operatingSystems offer this functionality
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  4228
     (returns nil, if unsupported)"
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  4229
2321
6f4cc7b644db filePointer -> handle migration
Claus Gittinger <cg@exept.de>
parents: 2308
diff changeset
  4230
    handle isNil ifTrue:[
5473
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  4231
	^ self errorNotOpen
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  4232
    ].
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  4233
%{
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  4234
#if defined(SO_SNDBUF) && defined(SOL_SOCKET)
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  4235
    {
5473
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  4236
	OBJ fp = __INST(handle);
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  4237
	SOCKET sock;
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  4238
	int opt;
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  4239
	unsigned int size;
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  4240
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  4241
	sock = SOCKET_FROM_FILE_OBJECT(fp);
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  4242
	if (getsockopt(sock, SOL_SOCKET, SO_SNDBUF, (char *)&opt, &size) >= 0) {
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  4243
	    RETURN( __MKSMALLINT(opt) );
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  4244
	}
1335
0fafb78d7a80 sockopt utilities added
Claus Gittinger <cg@exept.de>
parents: 1316
diff changeset
  4245
    }
0fafb78d7a80 sockopt utilities added
Claus Gittinger <cg@exept.de>
parents: 1316
diff changeset
  4246
#endif
0fafb78d7a80 sockopt utilities added
Claus Gittinger <cg@exept.de>
parents: 1316
diff changeset
  4247
%}.
0fafb78d7a80 sockopt utilities added
Claus Gittinger <cg@exept.de>
parents: 1316
diff changeset
  4248
    ^ nil
0fafb78d7a80 sockopt utilities added
Claus Gittinger <cg@exept.de>
parents: 1316
diff changeset
  4249
!
0fafb78d7a80 sockopt utilities added
Claus Gittinger <cg@exept.de>
parents: 1316
diff changeset
  4250
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  4251
sendBufferSize:size
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  4252
    "set the send buffer size - for special applications only.
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  4253
     Not all operatingSystems offer this functionality
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  4254
     (returns false, if unsupported)"
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  4255
2321
6f4cc7b644db filePointer -> handle migration
Claus Gittinger <cg@exept.de>
parents: 2308
diff changeset
  4256
    handle isNil ifTrue:[
5473
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  4257
	^ self errorNotOpen
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  4258
    ].
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  4259
%{
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  4260
#if defined(SO_SNDBUF) && defined(SOL_SOCKET)
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  4261
    if (__isSmallInteger(size)) {
5473
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  4262
	OBJ fp = __INST(handle);
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  4263
	SOCKET sock;
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  4264
	int opt;
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  4265
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  4266
	sock = SOCKET_FROM_FILE_OBJECT(fp);
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  4267
	opt = __intVal(size);
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  4268
	if (setsockopt(sock, SOL_SOCKET, SO_SNDBUF, (char *)&opt, sizeof(int)) >= 0) {
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  4269
	    RETURN(true);
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  4270
	}
1335
0fafb78d7a80 sockopt utilities added
Claus Gittinger <cg@exept.de>
parents: 1316
diff changeset
  4271
    }
0fafb78d7a80 sockopt utilities added
Claus Gittinger <cg@exept.de>
parents: 1316
diff changeset
  4272
#endif
0fafb78d7a80 sockopt utilities added
Claus Gittinger <cg@exept.de>
parents: 1316
diff changeset
  4273
%}.
0fafb78d7a80 sockopt utilities added
Claus Gittinger <cg@exept.de>
parents: 1316
diff changeset
  4274
    ^ false
0fafb78d7a80 sockopt utilities added
Claus Gittinger <cg@exept.de>
parents: 1316
diff changeset
  4275
!
0fafb78d7a80 sockopt utilities added
Claus Gittinger <cg@exept.de>
parents: 1316
diff changeset
  4276
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  4277
sendTimeout
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  4278
    "get the send timeout in millis - for special applications only.
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  4279
     Not all operatingSystems offer this functionality
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  4280
     (returns nil, if unsupported)"
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  4281
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  4282
    |millis|
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  4283
2321
6f4cc7b644db filePointer -> handle migration
Claus Gittinger <cg@exept.de>
parents: 2308
diff changeset
  4284
    handle isNil ifTrue:[
5473
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  4285
	^ self errorNotOpen
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  4286
    ].
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  4287
%{
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  4288
#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
  4289
    OBJ fp = __INST(handle);
c75a006f9a7a Win32 sockets use handles instead of file pointers
Stefan Vogel <sv@exept.de>
parents: 3224
diff changeset
  4290
    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
  4291
    int len;
c75a006f9a7a Win32 sockets use handles instead of file pointers
Stefan Vogel <sv@exept.de>
parents: 3224
diff changeset
  4292
    int __millis;
c75a006f9a7a Win32 sockets use handles instead of file pointers
Stefan Vogel <sv@exept.de>
parents: 3224
diff changeset
  4293
    struct timeval tv = {0, 0};
c75a006f9a7a Win32 sockets use handles instead of file pointers
Stefan Vogel <sv@exept.de>
parents: 3224
diff changeset
  4294
c75a006f9a7a Win32 sockets use handles instead of file pointers
Stefan Vogel <sv@exept.de>
parents: 3224
diff changeset
  4295
    len = sizeof(struct timeval);
c75a006f9a7a Win32 sockets use handles instead of file pointers
Stefan Vogel <sv@exept.de>
parents: 3224
diff changeset
  4296
    if (getsockopt(sock, SOL_SOCKET, SO_SNDTIMEO, (void *)&tv, &len) == 0) {
5473
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  4297
	__millis = (tv.tv_sec * 1000) + (tv.tv_usec / 1000);
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  4298
	millis = __mkSmallInteger(__millis);
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  4299
# if 0
5473
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  4300
	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
  4301
# endif
3246
c75a006f9a7a Win32 sockets use handles instead of file pointers
Stefan Vogel <sv@exept.de>
parents: 3224
diff changeset
  4302
    } else {
5473
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  4303
	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
  4304
    }
3bca500e0c7a send and receiveTimeout fixed
Claus Gittinger <cg@exept.de>
parents: 1561
diff changeset
  4305
#endif
3bca500e0c7a send and receiveTimeout fixed
Claus Gittinger <cg@exept.de>
parents: 1561
diff changeset
  4306
%}.
4570
39e965ca8d06 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4568
diff changeset
  4307
    ^ millis
39e965ca8d06 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4568
diff changeset
  4308
39e965ca8d06 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4568
diff changeset
  4309
    "
5473
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  4310
	Socket newTCP sendTimeout
4570
39e965ca8d06 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4568
diff changeset
  4311
    "
39e965ca8d06 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4568
diff changeset
  4312
39e965ca8d06 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4568
diff changeset
  4313
    "Modified (comment): / 19-01-2018 / 19:16:23 / stefan"
1568
3bca500e0c7a send and receiveTimeout fixed
Claus Gittinger <cg@exept.de>
parents: 1561
diff changeset
  4314
!
3bca500e0c7a send and receiveTimeout fixed
Claus Gittinger <cg@exept.de>
parents: 1561
diff changeset
  4315
4570
39e965ca8d06 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4568
diff changeset
  4316
sendTimeout:secondsOrTimeDuration
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  4317
    "set the send timeout - for special applications only.
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  4318
     Not all operatingSystems offer this functionality
4570
39e965ca8d06 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4568
diff changeset
  4319
     (returns false, if unsupported).
39e965ca8d06 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4568
diff changeset
  4320
     From linux manpage:
5473
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  4321
	  SO_RCVTIMEO and SO_SNDTIMEO
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  4322
	      Specify  the  receiving  or  sending  timeouts  until reporting an error.  The argument is a
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  4323
	      struct timeval.  If an input or output function blocks for this period of time, and data has
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  4324
	      been  sent  or received, the return value of that function will be the amount of data trans-
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  4325
	      ferred; if no data has been transferred and  the  timeout  has  been  reached,  then  -1  is
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  4326
	      returned with errno set to EAGAIN or EWOULDBLOCK, or EINPROGRESS (for connect(2)) just as if
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  4327
	      the socket was specified to be nonblocking.  If the timeout is set to  zero  (the  default),
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  4328
	      then the operation will never timeout.  Timeouts only have effect for system calls that per-
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  4329
	      form socket I/O (e.g., read(2), recvmsg(2), send(2), sendmsg(2)); timeouts  have  no  effect
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  4330
	      for select(2), poll(2), epoll_wait(2), and so on."
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  4331
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  4332
    |millis|
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  4333
2321
6f4cc7b644db filePointer -> handle migration
Claus Gittinger <cg@exept.de>
parents: 2308
diff changeset
  4334
    handle isNil ifTrue:[
5473
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  4335
	^ self errorNotOpen
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  4336
    ].
4570
39e965ca8d06 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4568
diff changeset
  4337
    secondsOrTimeDuration isTimeDuration ifTrue:[
5473
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  4338
	millis := secondsOrTimeDuration getMilliseconds.
4570
39e965ca8d06 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4568
diff changeset
  4339
    ] ifFalse:[
5473
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  4340
	millis := (secondsOrTimeDuration * 1000) rounded.
4570
39e965ca8d06 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4568
diff changeset
  4341
    ].
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  4342
%{
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  4343
#if defined(SO_SNDTIMEO) && defined(SOL_SOCKET)
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  4344
    if (__isSmallInteger(millis)) {
5473
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  4345
	OBJ fp = __INST(handle);
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  4346
	SOCKET sock = SOCKET_FROM_FILE_OBJECT(fp);
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  4347
	int __millis = __intVal(millis);
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  4348
	struct timeval tv = {0, 0};
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  4349
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  4350
	tv.tv_sec = __millis / 1000;
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  4351
	tv.tv_usec = (__millis % 1000) * 1000;
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  4352
# if 0
5473
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  4353
	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
  4354
# endif
5473
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  4355
	if (setsockopt(sock, SOL_SOCKET, SO_SNDTIMEO, (void *)&tv, sizeof(struct timeval)) == 0) {
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  4356
	    RETURN(true);
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  4357
	}
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  4358
	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
  4359
    }
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
  4360
#endif
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
  4361
%}.
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
  4362
    ^ false
4570
39e965ca8d06 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4568
diff changeset
  4363
39e965ca8d06 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4568
diff changeset
  4364
    "
5473
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  4365
	Socket newTCP
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  4366
	    sendTimeout:5s;
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  4367
	    sendTimeout
4570
39e965ca8d06 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4568
diff changeset
  4368
    "
39e965ca8d06 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4568
diff changeset
  4369
39e965ca8d06 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4568
diff changeset
  4370
    "Modified (comment): / 19-01-2018 / 19:12:51 / stefan"
1340
eb9b1f1340e5 setTCP_NODELAY
Claus Gittinger <cg@exept.de>
parents: 1339
diff changeset
  4371
!
eb9b1f1340e5 setTCP_NODELAY
Claus Gittinger <cg@exept.de>
parents: 1339
diff changeset
  4372
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  4373
setTCPCork:aBoolean
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  4374
    "enable/disable TCP_CORK (do-not-send-partial-frames)
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  4375
     For special applications only.
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  4376
     Not all OperatingSystems offer this functionality
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  4377
     (returns false, if unsupported)"
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  4378
2551
6da1bc89b74a changed:
Stefan Vogel <sv@exept.de>
parents: 2516
diff changeset
  4379
    ^ self setSocketOption:#'TCP_CORK' argument:aBoolean argument:nil.
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  4380
!
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  4381
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  4382
setTCPNoDelay:aBoolean
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  4383
    "enable/disable TCP_NODELAY (i.e. disable/enable the Nagle algorithm)
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  4384
     For special applications only.
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  4385
     Not all OperatingSystems offer this functionality
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  4386
     (returns false, if unsupported)"
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  4387
2551
6da1bc89b74a changed:
Stefan Vogel <sv@exept.de>
parents: 2516
diff changeset
  4388
    ^ self setSocketOption:#'TCP_NODELAY' argument:aBoolean argument:nil.
126
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
  4389
! !
82
claus
parents: 81
diff changeset
  4390
5441
bdf6b4e8c68b #BUGFIX by Stefan Reise
sr
parents: 5440
diff changeset
  4391
!Socket methodsFor:'support websocket'!
bdf6b4e8c68b #BUGFIX by Stefan Reise
sr
parents: 5440
diff changeset
  4392
5467
914f6955a10a #REFACTORING by Stefan Reise
sr
parents: 5466
diff changeset
  4393
blockingNextPutAllForNonBlockingSocket:someBytes
914f6955a10a #REFACTORING by Stefan Reise
sr
parents: 5466
diff changeset
  4394
    "explanation of the method name:
914f6955a10a #REFACTORING by Stefan Reise
sr
parents: 5466
diff changeset
  4395
     blocking -> this method blocks its STX process until all bytes have been written
914f6955a10a #REFACTORING by Stefan Reise
sr
parents: 5466
diff changeset
  4396
     ForNonBlockingSocket -> this method only works with non-blocking sockets
914f6955a10a #REFACTORING by Stefan Reise
sr
parents: 5466
diff changeset
  4397
5473
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  4398
     the write is done within the current thread,
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  4399
     but the primitiv #send returns because the socket is non-blocking (in case of would block).
5467
914f6955a10a #REFACTORING by Stefan Reise
sr
parents: 5466
diff changeset
  4400
     of cause if you write big data at once and the socket never would block, STX will freeze,
914f6955a10a #REFACTORING by Stefan Reise
sr
parents: 5466
diff changeset
  4401
     so please split big data into small packages"
914f6955a10a #REFACTORING by Stefan Reise
sr
parents: 5466
diff changeset
  4402
914f6955a10a #REFACTORING by Stefan Reise
sr
parents: 5466
diff changeset
  4403
    "PROBLEM \ BUG:
5473
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  4404
	currently STX will freeze when writing and reading concurrently on the same blocking socket from both ends.
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  4405
	even when all those writers and readers have their own thread (by calling via __NOINT_CALL).
5467
914f6955a10a #REFACTORING by Stefan Reise
sr
parents: 5466
diff changeset
  4406
914f6955a10a #REFACTORING by Stefan Reise
sr
parents: 5466
diff changeset
  4407
     WORKAROUND (or Other Concept):
5473
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  4408
	using a non-blocking socket
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  4409
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  4410
	NEW PROBLEM:
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  4411
	with non-blocking sockets you can not use the default #nextPut:
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  4412
	because #nextPut: ends up in __NOINT_CALL('send') and probably due to until now not supported non-blocking sockets,
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  4413
	it does not set __threadErrno correctly to WOULDBLOCK in case of would block.
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  4414
	so by using default #nextPut: with an non-blocking socket you will miss some bytes or
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  4415
	falsely get an error instead of WOULBLOCK
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  4416
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  4417
	NEXT WORKAROUND:
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  4418
	use a your own #nextPut: method (#blockingNextPutAllForNonBlockingSocket:) and handle WOULDBLOCK correctly
5467
914f6955a10a #REFACTORING by Stefan Reise
sr
parents: 5466
diff changeset
  4419
914f6955a10a #REFACTORING by Stefan Reise
sr
parents: 5466
diff changeset
  4420
     Notes:
914f6955a10a #REFACTORING by Stefan Reise
sr
parents: 5466
diff changeset
  4421
     - all sockets under windows are created as blocking sockets by default
914f6955a10a #REFACTORING by Stefan Reise
sr
parents: 5466
diff changeset
  4422
     - there is NO query in windows to ask if a socket is blocking or non-blocking"
5441
bdf6b4e8c68b #BUGFIX by Stefan Reise
sr
parents: 5440
diff changeset
  4423
bdf6b4e8c68b #BUGFIX by Stefan Reise
sr
parents: 5440
diff changeset
  4424
    |bytes countRemainingBytesToWrite result|
bdf6b4e8c68b #BUGFIX by Stefan Reise
sr
parents: 5440
diff changeset
  4425
bdf6b4e8c68b #BUGFIX by Stefan Reise
sr
parents: 5440
diff changeset
  4426
    OperatingSystem isMSWINDOWSlike ifFalse:[
5473
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  4427
	"this method supports non blocking socket for windows,
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  4428
	 for other os use the default behavior"
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  4429
	self nextPutAll:someBytes.
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  4430
	^ self
5441
bdf6b4e8c68b #BUGFIX by Stefan Reise
sr
parents: 5440
diff changeset
  4431
    ].
bdf6b4e8c68b #BUGFIX by Stefan Reise
sr
parents: 5440
diff changeset
  4432
bdf6b4e8c68b #BUGFIX by Stefan Reise
sr
parents: 5440
diff changeset
  4433
    bytes := someBytes asByteArray.
bdf6b4e8c68b #BUGFIX by Stefan Reise
sr
parents: 5440
diff changeset
  4434
    countRemainingBytesToWrite := bytes size.
bdf6b4e8c68b #BUGFIX by Stefan Reise
sr
parents: 5440
diff changeset
  4435
bdf6b4e8c68b #BUGFIX by Stefan Reise
sr
parents: 5440
diff changeset
  4436
    [
5473
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  4437
	result := self systemBlockingNextPutAll:bytes. "/ may just writes a subset or may 0 -> would block
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  4438
	result >= 0 "/ 0 or more bytes has been written
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  4439
	and:[result ~= countRemainingBytesToWrite] "/ there are remaining bytes to write
5441
bdf6b4e8c68b #BUGFIX by Stefan Reise
sr
parents: 5440
diff changeset
  4440
    ] whileTrue:[
5473
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  4441
	result > 0 ifTrue:[
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  4442
	    bytes := bytes copyFrom:result + 1.
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  4443
	    countRemainingBytesToWrite := bytes size.
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  4444
	].
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  4445
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  4446
	"/ timeout does not matter, we wait indefinitely (due to loop)
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  4447
	self writeWaitWithTimeoutMs:1000.
5441
bdf6b4e8c68b #BUGFIX by Stefan Reise
sr
parents: 5440
diff changeset
  4448
    ].
bdf6b4e8c68b #BUGFIX by Stefan Reise
sr
parents: 5440
diff changeset
  4449
5467
914f6955a10a #REFACTORING by Stefan Reise
sr
parents: 5466
diff changeset
  4450
    "Created: / 05-03-2020 / 10:35:54 / Stefan Reise"
5441
bdf6b4e8c68b #BUGFIX by Stefan Reise
sr
parents: 5440
diff changeset
  4451
!
bdf6b4e8c68b #BUGFIX by Stefan Reise
sr
parents: 5440
diff changeset
  4452
5467
914f6955a10a #REFACTORING by Stefan Reise
sr
parents: 5466
diff changeset
  4453
setNonBlocking
5473
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  4454
    "DO NO move this functionality into Win32OperatingSystem #setBlocking:fd:,
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  4455
     because it will not work correctly, caused by the following problems.
5467
914f6955a10a #REFACTORING by Stefan Reise
sr
parents: 5466
diff changeset
  4456
     and even if the problems has been fixed, it would change the behavior for all sockets (not only websockets)"
914f6955a10a #REFACTORING by Stefan Reise
sr
parents: 5466
diff changeset
  4457
914f6955a10a #REFACTORING by Stefan Reise
sr
parents: 5466
diff changeset
  4458
    "PROBLEM \ BUG:
5473
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  4459
	currently STX will freeze when writing and reading concurrently on the same blocking socket from both ends.
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  4460
	even when all those writers and readers have their own thread (by calling via __NOINT_CALL).
5467
914f6955a10a #REFACTORING by Stefan Reise
sr
parents: 5466
diff changeset
  4461
914f6955a10a #REFACTORING by Stefan Reise
sr
parents: 5466
diff changeset
  4462
     WORKAROUND (or Other Concept):
5473
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  4463
	using a non-blocking socket
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  4464
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  4465
	NEW PROBLEM:
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  4466
	with non-blocking sockets you can not use the default #nextPut:
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  4467
	because #nextPut: ends up in __NOINT_CALL('send') and probably due to until now not supported non-blocking sockets,
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  4468
	it does not set __threadErrno correctly to WOULDBLOCK in case of would block.
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  4469
	so by using default #nextPut: with an non-blocking socket you will miss some bytes or
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  4470
	falsely get an error instead of WOULBLOCK
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  4471
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  4472
	NEXT WORKAROUND:
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  4473
	use a your own #nextPut: method (#blockingNextPutAllForNonBlockingSocket:) and handle WOULDBLOCK correctly
5467
914f6955a10a #REFACTORING by Stefan Reise
sr
parents: 5466
diff changeset
  4474
914f6955a10a #REFACTORING by Stefan Reise
sr
parents: 5466
diff changeset
  4475
     Notes:
914f6955a10a #REFACTORING by Stefan Reise
sr
parents: 5466
diff changeset
  4476
     - all sockets under windows are created as blocking sockets by default
914f6955a10a #REFACTORING by Stefan Reise
sr
parents: 5466
diff changeset
  4477
     - there is NO query in windows to ask if a socket is blocking or non-blocking"
914f6955a10a #REFACTORING by Stefan Reise
sr
parents: 5466
diff changeset
  4478
914f6955a10a #REFACTORING by Stefan Reise
sr
parents: 5466
diff changeset
  4479
    OperatingSystem isMSWINDOWSlike ifFalse:[
5473
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  4480
	"/ this method is for windows os only
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  4481
	^ self
5467
914f6955a10a #REFACTORING by Stefan Reise
sr
parents: 5466
diff changeset
  4482
    ].
914f6955a10a #REFACTORING by Stefan Reise
sr
parents: 5466
diff changeset
  4483
914f6955a10a #REFACTORING by Stefan Reise
sr
parents: 5466
diff changeset
  4484
%{
914f6955a10a #REFACTORING by Stefan Reise
sr
parents: 5466
diff changeset
  4485
# ifdef __win32__
914f6955a10a #REFACTORING by Stefan Reise
sr
parents: 5466
diff changeset
  4486
    OBJ fp = __INST(handle);
914f6955a10a #REFACTORING by Stefan Reise
sr
parents: 5466
diff changeset
  4487
914f6955a10a #REFACTORING by Stefan Reise
sr
parents: 5466
diff changeset
  4488
    // ALWAYS check for proper arguments, please
914f6955a10a #REFACTORING by Stefan Reise
sr
parents: 5466
diff changeset
  4489
    if (fp != NULL) {
5473
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  4490
	int result;
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  4491
	u_long nonBlocking = 1;
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  4492
	SOCKET socket = SOCKET_FROM_FILE_OBJECT(fp);
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  4493
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  4494
	result = ioctlsocket(socket, FIONBIO, &nonBlocking);
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  4495
	if (result == SOCKET_ERROR) {
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  4496
	    console_fprintf(stderr, "Win32OS [info]: ioctlsocket failed with %d\n", WSAGetLastError());
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  4497
	    RETURN(false);
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  4498
	}
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  4499
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  4500
	RETURN(true);
5467
914f6955a10a #REFACTORING by Stefan Reise
sr
parents: 5466
diff changeset
  4501
    }
914f6955a10a #REFACTORING by Stefan Reise
sr
parents: 5466
diff changeset
  4502
#endif // __win32__
914f6955a10a #REFACTORING by Stefan Reise
sr
parents: 5466
diff changeset
  4503
%}.
914f6955a10a #REFACTORING by Stefan Reise
sr
parents: 5466
diff changeset
  4504
914f6955a10a #REFACTORING by Stefan Reise
sr
parents: 5466
diff changeset
  4505
    self primitiveFailed.
914f6955a10a #REFACTORING by Stefan Reise
sr
parents: 5466
diff changeset
  4506
914f6955a10a #REFACTORING by Stefan Reise
sr
parents: 5466
diff changeset
  4507
    "Modified: / 03-03-2020 / 15:29:26 / Stefan Vogel"
914f6955a10a #REFACTORING by Stefan Reise
sr
parents: 5466
diff changeset
  4508
    "Modified: / 05-03-2020 / 10:37:12 / Stefan Reise"
914f6955a10a #REFACTORING by Stefan Reise
sr
parents: 5466
diff changeset
  4509
!
914f6955a10a #REFACTORING by Stefan Reise
sr
parents: 5466
diff changeset
  4510
914f6955a10a #REFACTORING by Stefan Reise
sr
parents: 5466
diff changeset
  4511
systemBlockingNextPutAll:someBytes
914f6955a10a #REFACTORING by Stefan Reise
sr
parents: 5466
diff changeset
  4512
    "explanation of the method name:
5473
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  4513
     systemBlocking -> this method blocks the entire STX
5467
914f6955a10a #REFACTORING by Stefan Reise
sr
parents: 5466
diff changeset
  4514
     until all bytes have been written or until the socket would block
914f6955a10a #REFACTORING by Stefan Reise
sr
parents: 5466
diff changeset
  4515
914f6955a10a #REFACTORING by Stefan Reise
sr
parents: 5466
diff changeset
  4516
     so please split big data into small packages"
914f6955a10a #REFACTORING by Stefan Reise
sr
parents: 5466
diff changeset
  4517
914f6955a10a #REFACTORING by Stefan Reise
sr
parents: 5466
diff changeset
  4518
    "PROBLEM \ BUG:
5473
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  4519
	currently STX will freeze when writing and reading concurrently on the same blocking socket from both ends.
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  4520
	even when all those writers and readers have their own thread (by calling via __NOINT_CALL).
5467
914f6955a10a #REFACTORING by Stefan Reise
sr
parents: 5466
diff changeset
  4521
914f6955a10a #REFACTORING by Stefan Reise
sr
parents: 5466
diff changeset
  4522
     WORKAROUND (or Other Concept):
5473
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  4523
	using a non-blocking socket
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  4524
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  4525
	NEW PROBLEM:
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  4526
	with non-blocking sockets you can not use the default #nextPut:
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  4527
	because #nextPut: ends up in __NOINT_CALL('send') and probably due to until now not supported non-blocking sockets,
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  4528
	it does not set __threadErrno correctly to WOULDBLOCK in case of would block.
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  4529
	so by using default #nextPut: with an non-blocking socket you will miss some bytes or
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  4530
	falsely get an error instead of WOULBLOCK
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  4531
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  4532
	NEXT WORKAROUND:
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  4533
	use a your own #nextPut: method (#blockingNextPutAllForNonBlockingSocket:) and handle WOULDBLOCK correctly
5467
914f6955a10a #REFACTORING by Stefan Reise
sr
parents: 5466
diff changeset
  4534
914f6955a10a #REFACTORING by Stefan Reise
sr
parents: 5466
diff changeset
  4535
     Notes:
914f6955a10a #REFACTORING by Stefan Reise
sr
parents: 5466
diff changeset
  4536
     - all sockets under windows are created as blocking sockets by default
914f6955a10a #REFACTORING by Stefan Reise
sr
parents: 5466
diff changeset
  4537
     - there is NO query in windows to ask if a socket is blocking or non-blocking"
5441
bdf6b4e8c68b #BUGFIX by Stefan Reise
sr
parents: 5440
diff changeset
  4538
5451
d98c8a76546d #FEATURE by Stefan Reise
sr
parents: 5450
diff changeset
  4539
    |bytes byteLength returnValue wsaError|
5441
bdf6b4e8c68b #BUGFIX by Stefan Reise
sr
parents: 5440
diff changeset
  4540
bdf6b4e8c68b #BUGFIX by Stefan Reise
sr
parents: 5440
diff changeset
  4541
    OperatingSystem isMSWINDOWSlike ifFalse:[
5473
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  4542
	self error:'this method is for windows os only'.
5441
bdf6b4e8c68b #BUGFIX by Stefan Reise
sr
parents: 5440
diff changeset
  4543
    ].
bdf6b4e8c68b #BUGFIX by Stefan Reise
sr
parents: 5440
diff changeset
  4544
bdf6b4e8c68b #BUGFIX by Stefan Reise
sr
parents: 5440
diff changeset
  4545
    bytes := someBytes asExternalBytes.
bdf6b4e8c68b #BUGFIX by Stefan Reise
sr
parents: 5440
diff changeset
  4546
    byteLength := bytes size.
bdf6b4e8c68b #BUGFIX by Stefan Reise
sr
parents: 5440
diff changeset
  4547
bdf6b4e8c68b #BUGFIX by Stefan Reise
sr
parents: 5440
diff changeset
  4548
    "
5473
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  4549
	-1      error
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  4550
	0       0 bytes sent or would block -> try again after wait
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  4551
	> 0     bytes sent (recall myself with the remaining bytes)
5441
bdf6b4e8c68b #BUGFIX by Stefan Reise
sr
parents: 5440
diff changeset
  4552
    "
5473
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  4553
    returnValue := -1.
5441
bdf6b4e8c68b #BUGFIX by Stefan Reise
sr
parents: 5440
diff changeset
  4554
5464
7f31945df4b1 #QUALITY by stefan
Stefan Vogel <sv@exept.de>
parents: 5460
diff changeset
  4555
%{
5443
3eac683cfb1d put #ifdef around win32 only code
Stefan Vogel <sv@exept.de>
parents: 5442
diff changeset
  4556
# ifdef __win32__
5467
914f6955a10a #REFACTORING by Stefan Reise
sr
parents: 5466
diff changeset
  4557
    OBJ fp = __INST(handle);
914f6955a10a #REFACTORING by Stefan Reise
sr
parents: 5466
diff changeset
  4558
5464
7f31945df4b1 #QUALITY by stefan
Stefan Vogel <sv@exept.de>
parents: 5460
diff changeset
  4559
    // ALWAYS check for proper arguments, please
5467
914f6955a10a #REFACTORING by Stefan Reise
sr
parents: 5466
diff changeset
  4560
    if (
5473
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  4561
	__isExternalAddressLike(bytes)
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  4562
	&& __isSmallInteger(byteLength)
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  4563
	&& (fp != NULL)
5465
52c1146e9b95 #BUGFIX by Stefan Reise
sr
parents: 5464
diff changeset
  4564
    ) {
5473
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  4565
	int sendResult;
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  4566
	int wsaErrorNo;
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  4567
	char *pBytes = __externalAddressVal(bytes);
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  4568
	SOCKET socket = SOCKET_FROM_FILE_OBJECT(fp);
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  4569
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  4570
	sendResult = send(socket, pBytes, __intVal(byteLength), 0);
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  4571
	if (sendResult == SOCKET_ERROR) {
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  4572
	    wsaErrorNo = WSAGetLastError();
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  4573
	    if (wsaErrorNo == WSAEWOULDBLOCK) {
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  4574
		returnValue = __MKSMALLINT(0);
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  4575
	    } else {
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  4576
		console_printf("send failed with: %d\n", wsaErrorNo);
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  4577
		wsaError = __MKSMALLINT(wsaErrorNo);
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  4578
	    }
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  4579
	} else {
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  4580
	    returnValue = __MKSMALLINT(sendResult);
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  4581
	}
5464
7f31945df4b1 #QUALITY by stefan
Stefan Vogel <sv@exept.de>
parents: 5460
diff changeset
  4582
    }
5443
3eac683cfb1d put #ifdef around win32 only code
Stefan Vogel <sv@exept.de>
parents: 5442
diff changeset
  4583
#endif // __win32__
5464
7f31945df4b1 #QUALITY by stefan
Stefan Vogel <sv@exept.de>
parents: 5460
diff changeset
  4584
%}.
5441
bdf6b4e8c68b #BUGFIX by Stefan Reise
sr
parents: 5440
diff changeset
  4585
bdf6b4e8c68b #BUGFIX by Stefan Reise
sr
parents: 5440
diff changeset
  4586
    returnValue < 0 ifTrue:[
5473
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  4587
	WriteError raiseWith:wsaError.
5441
bdf6b4e8c68b #BUGFIX by Stefan Reise
sr
parents: 5440
diff changeset
  4588
    ].
bdf6b4e8c68b #BUGFIX by Stefan Reise
sr
parents: 5440
diff changeset
  4589
bdf6b4e8c68b #BUGFIX by Stefan Reise
sr
parents: 5440
diff changeset
  4590
    ^ returnValue
bdf6b4e8c68b #BUGFIX by Stefan Reise
sr
parents: 5440
diff changeset
  4591
5467
914f6955a10a #REFACTORING by Stefan Reise
sr
parents: 5466
diff changeset
  4592
    "Created: / 05-03-2020 / 10:48:56 / Stefan Reise"
5441
bdf6b4e8c68b #BUGFIX by Stefan Reise
sr
parents: 5440
diff changeset
  4593
! !
bdf6b4e8c68b #BUGFIX by Stefan Reise
sr
parents: 5440
diff changeset
  4594
5450
7bc191b240c5 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5445
diff changeset
  4595
!Socket methodsFor:'testing'!
7bc191b240c5 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5445
diff changeset
  4596
7bc191b240c5 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5445
diff changeset
  4597
isSSLSocket
7bc191b240c5 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5445
diff changeset
  4598
    ^ false
7bc191b240c5 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5445
diff changeset
  4599
! !
7bc191b240c5 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5445
diff changeset
  4600
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  4601
!Socket methodsFor:'waiting'!
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  4602
5454
f4227aa5c07b #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5452
diff changeset
  4603
waitForConnection:secondsOrTimeDurationOrNil
f4227aa5c07b #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5452
diff changeset
  4604
    "wait for the connection secondsOrTimeDurationOrNil.
f4227aa5c07b #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5452
diff changeset
  4605
     Return true if connected"
f4227aa5c07b #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5452
diff changeset
  4606
f4227aa5c07b #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5452
diff changeset
  4607
    self readWaitWithTimeout:secondsOrTimeDurationOrNil.
f4227aa5c07b #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5452
diff changeset
  4608
    ^ self isConnected
f4227aa5c07b #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5452
diff changeset
  4609
f4227aa5c07b #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5452
diff changeset
  4610
    "Created: / 17-02-2020 / 20:02:53 / Stefan Vogel"
f4227aa5c07b #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5452
diff changeset
  4611
!
f4227aa5c07b #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5452
diff changeset
  4612
f4227aa5c07b #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5452
diff changeset
  4613
waitForConnectionUntil:aTimestamp
f4227aa5c07b #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5452
diff changeset
  4614
    "return true if connected"
f4227aa5c07b #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5452
diff changeset
  4615
f4227aa5c07b #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5452
diff changeset
  4616
    self readWaitWithTimeoutMs: (aTimestamp millisecondDeltaFrom:Timestamp now).
f4227aa5c07b #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5452
diff changeset
  4617
    ^ self isConnected
f4227aa5c07b #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5452
diff changeset
  4618
!
f4227aa5c07b #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5452
diff changeset
  4619
f4227aa5c07b #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5452
diff changeset
  4620
waitForConnectionWithErrorOnTimeout:secondsOrTimeDurationOrNil
f4227aa5c07b #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5452
diff changeset
  4621
    "wait for the connection secondsOrTimeDurationOrNil.
f4227aa5c07b #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5452
diff changeset
  4622
     Raise an error if not connected."
f4227aa5c07b #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5452
diff changeset
  4623
f4227aa5c07b #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5452
diff changeset
  4624
    self readWaitWithTimeout:secondsOrTimeDurationOrNil.
f4227aa5c07b #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5452
diff changeset
  4625
    self isConnected ifFalse:[
5473
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  4626
	OpenError
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  4627
	    raiseRequestWith:self
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  4628
	    errorString:('Failed to connect to: %1 timeout:%2'
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  4629
			    bindWith:self getPeer with:secondsOrTimeDurationOrNil).
5454
f4227aa5c07b #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5452
diff changeset
  4630
    ].
f4227aa5c07b #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5452
diff changeset
  4631
f4227aa5c07b #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5452
diff changeset
  4632
    "Created: / 19-02-2020 / 22:55:04 / Stefan Vogel"
f4227aa5c07b #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5452
diff changeset
  4633
!
f4227aa5c07b #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5452
diff changeset
  4634
4570
39e965ca8d06 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4568
diff changeset
  4635
waitForNewConnectionOrDataOnAny:otherConnections timeout:secondsOrTimeDurationOrNil
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  4636
    "suspend the current process, until either a new connection comes
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  4637
     in at the receiver, or data arrives on any of the otherConnections.
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  4638
     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
  4639
     For an old connection, that socket is returned.
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  4640
     In any case, the caller gets a socket to operate on as return value,
4032
24df60dcd5f4 #OTHER by mawalch
mawalch
parents: 3989
diff changeset
  4641
     or nil, if a timeout occurred.
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  4642
     This method implements the inner wait-primitive of a multi-connection
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  4643
     server application."
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  4644
5466
50ae296c9744 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 5465
diff changeset
  4645
    |wasBlocked sema|
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  4646
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  4647
    "first, a quick check if data is already available"
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  4648
    self canReadWithoutBlocking ifTrue:[
5473
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  4649
	^ self accept.
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  4650
    ].
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  4651
    otherConnections do:[:aConnection |
5473
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  4652
	aConnection canReadWithoutBlocking ifTrue:[
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  4653
	    ^ aConnection
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  4654
	]
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  4655
    ].
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  4656
3281
bd9392932db1 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3247
diff changeset
  4657
    "check again - prevent incoming interrupts from disturbing our setup"
4570
39e965ca8d06 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4568
diff changeset
  4658
3281
bd9392932db1 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3247
diff changeset
  4659
    wasBlocked := OperatingSystem blockInterrupts.
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  4660
    [
5473
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  4661
	sema := Semaphore name:'Socket-multiReadWait'.
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  4662
	otherConnections do:[:aConnection |
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  4663
	    Processor signal:sema onInput:(aConnection fileDescriptor).
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  4664
	].
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  4665
	Processor signal:sema onInput:(self fileDescriptor).
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  4666
	secondsOrTimeDurationOrNil notNil ifTrue:[
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  4667
	    Processor signal:sema after:secondsOrTimeDurationOrNil
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  4668
	].
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  4669
	Processor activeProcess state:#ioWait.
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  4670
	sema wait.
3281
bd9392932db1 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3247
diff changeset
  4671
    ] ifCurtailed:[
5473
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  4672
	sema notNil ifTrue:[Processor disableSemaphore:sema].
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  4673
	wasBlocked ifFalse:[OperatingSystem unblockInterrupts].
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  4674
    ].
3281
bd9392932db1 class: Socket
Stefan Vogel <sv@exept.de>
parents: 3247
diff changeset
  4675
    wasBlocked ifFalse:[OperatingSystem unblockInterrupts].
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  4676
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  4677
    "see who it was ..."
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  4678
    self canReadWithoutBlocking ifTrue:[
5473
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  4679
	^ self accept.
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  4680
    ].
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  4681
    otherConnections do:[:aConnection |
5473
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  4682
	aConnection canReadWithoutBlocking ifTrue:[
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  4683
	    ^ aConnection
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  4684
	]
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  4685
    ].
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  4686
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  4687
    "none - a timeout"
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  4688
    ^ nil
4497
bf5e9d5ec532 #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 4414
diff changeset
  4689
bf5e9d5ec532 #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 4414
diff changeset
  4690
    "Modified: / 09-08-2017 / 11:59:50 / cg"
4570
39e965ca8d06 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4568
diff changeset
  4691
    "Modified: / 19-01-2018 / 18:59:17 / stefan"
5466
50ae296c9744 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 5465
diff changeset
  4692
    "Modified: / 04-03-2020 / 14:35:04 / Stefan Vogel"
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  4693
!
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  4694
4570
39e965ca8d06 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4568
diff changeset
  4695
waitForNewConnectionWithTimeout:secondsOrTimeDurationOrNil
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  4696
    "suspend the current process, until a new connection comes
5454
f4227aa5c07b #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5452
diff changeset
  4697
     in at the listening receiver or a timeout occurs.
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  4698
     For a new connection, an accept is performed and the new socket is returned.
4032
24df60dcd5f4 #OTHER by mawalch
mawalch
parents: 3989
diff changeset
  4699
     Returns nil, if a timeout occurred.
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  4700
     This method implements the inner wait-primitive of a single-connection
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  4701
     server application."
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  4702
3633
3a21f142432e #REFACTORING
Stefan Vogel <sv@exept.de>
parents: 3620
diff changeset
  4703
    |newSock|
3a21f142432e #REFACTORING
Stefan Vogel <sv@exept.de>
parents: 3620
diff changeset
  4704
4570
39e965ca8d06 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4568
diff changeset
  4705
    (self readWaitWithTimeout:secondsOrTimeDurationOrNil) ifTrue:[
5473
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  4706
	"a timeout occurred - no connection within timeout"
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  4707
	self reportError:(OperatingSystem errorNumberFor:#ETIMEDOUT).
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  4708
	^ nil.
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  4709
    ].
4180
f2539f82b744 #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4172
diff changeset
  4710
    self isOpen ifFalse:[
5473
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  4711
	"I have been closed while waiting"
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  4712
	^ self errorNotOpen.
4180
f2539f82b744 #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 4172
diff changeset
  4713
    ].
4568
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  4714
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  4715
    "ok, a connection is present - accept it"
3633
3a21f142432e #REFACTORING
Stefan Vogel <sv@exept.de>
parents: 3620
diff changeset
  4716
    newSock := self class new.
3a21f142432e #REFACTORING
Stefan Vogel <sv@exept.de>
parents: 3620
diff changeset
  4717
    (newSock primAcceptOn:self blocking:false) ifFalse:[
5473
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  4718
	"should raise an error here - primitive code raises a notification"
de911f462862 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 5472
diff changeset
  4719
	^ nil
3633
3a21f142432e #REFACTORING
Stefan Vogel <sv@exept.de>
parents: 3620
diff changeset
  4720
    ].
3a21f142432e #REFACTORING
Stefan Vogel <sv@exept.de>
parents: 3620
diff changeset
  4721
    ^ newSock
4568
c2b933093d63 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4506
diff changeset
  4722
4570
39e965ca8d06 #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 4568
diff changeset
  4723
    "Modified (format): / 19-01-2018 / 18:53:15 / stefan"
5454
f4227aa5c07b #FEATURE by stefan
Stefan Vogel <sv@exept.de>
parents: 5452
diff changeset
  4724
    "Modified (comment): / 19-02-2020 / 23:32:32 / Stefan Vogel"
1935
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  4725
! !
326f8d31e7ca Clean up:
Stefan Vogel <sv@exept.de>
parents: 1911
diff changeset
  4726
464
600b101a7035 alen in accept
Claus Gittinger <cg@exept.de>
parents: 463
diff changeset
  4727
!Socket class methodsFor:'documentation'!
206
77166a6b3ee6 For ST80 style socket creation: register socket in Lobby.
Stefan Vogel <sv@exept.de>
parents: 203
diff changeset
  4728
77166a6b3ee6 For ST80 style socket creation: register socket in Lobby.
Stefan Vogel <sv@exept.de>
parents: 203
diff changeset
  4729
version
3590
3487165a9cdf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3550
diff changeset
  4730
    ^ '$Header$'
2292
c4b0b901278e added: #standardTimeout
Claus Gittinger <cg@exept.de>
parents: 1940
diff changeset
  4731
!
c4b0b901278e added: #standardTimeout
Claus Gittinger <cg@exept.de>
parents: 1940
diff changeset
  4732
c4b0b901278e added: #standardTimeout
Claus Gittinger <cg@exept.de>
parents: 1940
diff changeset
  4733
version_CVS
3590
3487165a9cdf *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3550
diff changeset
  4734
    ^ '$Header$'
206
77166a6b3ee6 For ST80 style socket creation: register socket in Lobby.
Stefan Vogel <sv@exept.de>
parents: 203
diff changeset
  4735
! !
5474
99d731df2a80 #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 5473
diff changeset
  4736