Socket.st
author Claus Gittinger <cg@exept.de>
Tue, 26 Feb 2008 11:29:14 +0100
changeset 1930 935b2870be2e
parent 1911 cb6a52d6944a
child 1935 326f8d31e7ca
permissions -rw-r--r--
arrow points reusable (class protocol)
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
0
1cf8d1747859 Initial revision
claus
parents:
diff changeset
     1
"
4
1f66800df351 *** empty log message ***
claus
parents: 3
diff changeset
     2
 COPYRIGHT (c) 1992 by Claus Gittinger
42
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
     3
	      All Rights Reserved
0
1cf8d1747859 Initial revision
claus
parents:
diff changeset
     4
1cf8d1747859 Initial revision
claus
parents:
diff changeset
     5
 This software is furnished under a license and may be used
1cf8d1747859 Initial revision
claus
parents:
diff changeset
     6
 only in accordance with the terms of that license and with the
1cf8d1747859 Initial revision
claus
parents:
diff changeset
     7
 inclusion of the above copyright notice.   This software may not
1cf8d1747859 Initial revision
claus
parents:
diff changeset
     8
 be provided or otherwise made available to, or used by, any
1cf8d1747859 Initial revision
claus
parents:
diff changeset
     9
 other person.  No title to or ownership of the software is
1cf8d1747859 Initial revision
claus
parents:
diff changeset
    10
 hereby transferred.
1cf8d1747859 Initial revision
claus
parents:
diff changeset
    11
"
888
a868b0e54a2b ipAddress stuff
Claus Gittinger <cg@exept.de>
parents: 887
diff changeset
    12
"{ Package: 'stx:libbasic2' }"
a868b0e54a2b ipAddress stuff
Claus Gittinger <cg@exept.de>
parents: 887
diff changeset
    13
63
7dd3d5b7877e *** empty log message ***
claus
parents: 58
diff changeset
    14
NonPositionableExternalStream subclass:#Socket
1505
Stefan Vogel <sv@exept.de>
parents: 1504
diff changeset
    15
	instanceVariableNames:'domain socketType protocol port serviceName peer peerName
Stefan Vogel <sv@exept.de>
parents: 1504
diff changeset
    16
		listening'
206
77166a6b3ee6 For ST80 style socket creation: register socket in Lobby.
Stefan Vogel <sv@exept.de>
parents: 203
diff changeset
    17
	classVariableNames:''
77166a6b3ee6 For ST80 style socket creation: register socket in Lobby.
Stefan Vogel <sv@exept.de>
parents: 203
diff changeset
    18
	poolDictionaries:''
77166a6b3ee6 For ST80 style socket creation: register socket in Lobby.
Stefan Vogel <sv@exept.de>
parents: 203
diff changeset
    19
	category:'Streams-External'
0
1cf8d1747859 Initial revision
claus
parents:
diff changeset
    20
!
1cf8d1747859 Initial revision
claus
parents:
diff changeset
    21
126
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
    22
!Socket primitiveDefinitions!
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
    23
%{
444
9ba31a1fba38 always unbuffered on linux
Claus Gittinger <cg@exept.de>
parents: 430
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
1343
cc3bed115c0a definitions cleanup with stxOSDefs.h
penk
parents: 1342
diff changeset
    27
#include "stxOSDefs.h"
126
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
    28
1503
4d97e4191d04 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1499
diff changeset
    29
#ifdef WIN32
4d97e4191d04 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1499
diff changeset
    30
4d97e4191d04 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1499
diff changeset
    31
# undef __BEGIN_INTERRUPTABLE__
4d97e4191d04 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1499
diff changeset
    32
# undef __END_INTERRUPTABLE__
4d97e4191d04 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1499
diff changeset
    33
# define __BEGIN_INTERRUPTABLE__ ..
4d97e4191d04 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1499
diff changeset
    34
# define __END_INTERRUPTABLE__ ..
4d97e4191d04 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1499
diff changeset
    35
1504
92005eec5c9d fixed moving-object-when-interrupted-with-scavenge bugs;
Claus Gittinger <cg@exept.de>
parents: 1503
diff changeset
    36
# define WRAP_STDIO
1529
911273d090c1 Re-unified Win32 and Unix code into single Socket.st.
Claus Gittinger <cg@exept.de>
parents: 1505
diff changeset
    37
# define SET_LINGER_WHEN_CREATING_SOCKET
911273d090c1 Re-unified Win32 and Unix code into single Socket.st.
Claus Gittinger <cg@exept.de>
parents: 1505
diff changeset
    38
1845
df4d79bfba9d closesocket is still tricky
Claus Gittinger <cg@exept.de>
parents: 1844
diff changeset
    39
/*
df4d79bfba9d closesocket is still tricky
Claus Gittinger <cg@exept.de>
parents: 1844
diff changeset
    40
 * mhmh - WIN32-fclose  has a problem in trying to close() the socket
df4d79bfba9d closesocket is still tricky
Claus Gittinger <cg@exept.de>
parents: 1844
diff changeset
    41
 * instead of closesocket()'ing it
df4d79bfba9d closesocket is still tricky
Claus Gittinger <cg@exept.de>
parents: 1844
diff changeset
    42
 */
df4d79bfba9d closesocket is still tricky
Claus Gittinger <cg@exept.de>
parents: 1844
diff changeset
    43
# ifdef WIN32
df4d79bfba9d closesocket is still tricky
Claus Gittinger <cg@exept.de>
parents: 1844
diff changeset
    44
#  define CLOSESOCKET_AFTER_FCLOSE
df4d79bfba9d closesocket is still tricky
Claus Gittinger <cg@exept.de>
parents: 1844
diff changeset
    45
#  define xxCLOSESOCKET_BEFORE_FCLOSE
df4d79bfba9d closesocket is still tricky
Claus Gittinger <cg@exept.de>
parents: 1844
diff changeset
    46
# endif
df4d79bfba9d closesocket is still tricky
Claus Gittinger <cg@exept.de>
parents: 1844
diff changeset
    47
1529
911273d090c1 Re-unified Win32 and Unix code into single Socket.st.
Claus Gittinger <cg@exept.de>
parents: 1505
diff changeset
    48
# define SOCKET_FROM_FD(fd)               (_get_osfhandle(fd))
1504
92005eec5c9d fixed moving-object-when-interrupted-with-scavenge bugs;
Claus Gittinger <cg@exept.de>
parents: 1503
diff changeset
    49
92005eec5c9d fixed moving-object-when-interrupted-with-scavenge bugs;
Claus Gittinger <cg@exept.de>
parents: 1503
diff changeset
    50
#else /* not WIN32 */
92005eec5c9d fixed moving-object-when-interrupted-with-scavenge bugs;
Claus Gittinger <cg@exept.de>
parents: 1503
diff changeset
    51
1529
911273d090c1 Re-unified Win32 and Unix code into single Socket.st.
Claus Gittinger <cg@exept.de>
parents: 1505
diff changeset
    52
# define SOCKET_FROM_FD(fd)               (fd)
911273d090c1 Re-unified Win32 and Unix code into single Socket.st.
Claus Gittinger <cg@exept.de>
parents: 1505
diff changeset
    53
1504
92005eec5c9d fixed moving-object-when-interrupted-with-scavenge bugs;
Claus Gittinger <cg@exept.de>
parents: 1503
diff changeset
    54
#endif /* WIN32 */
1503
4d97e4191d04 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1499
diff changeset
    55
1843
8ee90d243b49 closeSocket after fclose: no longer (Q: is this the right thing)
Claus Gittinger <cg@exept.de>
parents: 1842
diff changeset
    56
#define SOCKET_FROM_FILE(f)             (SOCKET_FROM_FD(fileno(f)))
8ee90d243b49 closeSocket after fclose: no longer (Q: is this the right thing)
Claus Gittinger <cg@exept.de>
parents: 1842
diff changeset
    57
#define SOCKET_FROM_FILE_OBJECT(f)      (SOCKET_FROM_FILE(__FILEVal(f)))
1539
c0e89dcb58b3 non blocking stuff done right here;
Claus Gittinger <cg@exept.de>
parents: 1538
diff changeset
    58
1529
911273d090c1 Re-unified Win32 and Unix code into single Socket.st.
Claus Gittinger <cg@exept.de>
parents: 1505
diff changeset
    59
#ifndef WIN32
911273d090c1 Re-unified Win32 and Unix code into single Socket.st.
Claus Gittinger <cg@exept.de>
parents: 1505
diff changeset
    60
# define closesocket(sock)    close(sock)
1539
c0e89dcb58b3 non blocking stuff done right here;
Claus Gittinger <cg@exept.de>
parents: 1538
diff changeset
    61
# define SOCKET               int
1529
911273d090c1 Re-unified Win32 and Unix code into single Socket.st.
Claus Gittinger <cg@exept.de>
parents: 1505
diff changeset
    62
#endif
911273d090c1 Re-unified Win32 and Unix code into single Socket.st.
Claus Gittinger <cg@exept.de>
parents: 1505
diff changeset
    63
126
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
    64
#include <stdio.h>
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
    65
#include <errno.h>
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
    66
1343
cc3bed115c0a definitions cleanup with stxOSDefs.h
penk
parents: 1342
diff changeset
    67
#ifdef WANT__TCP_DOT_H
cc3bed115c0a definitions cleanup with stxOSDefs.h
penk
parents: 1342
diff changeset
    68
# include <netinet/tcp.h>
cc3bed115c0a definitions cleanup with stxOSDefs.h
penk
parents: 1342
diff changeset
    69
#endif
cc3bed115c0a definitions cleanup with stxOSDefs.h
penk
parents: 1342
diff changeset
    70
1344
70d73917ac78 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1343
diff changeset
    71
#ifdef WANT__NETDB_DOT_H
70d73917ac78 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1343
diff changeset
    72
# include <netdb.h>
1343
cc3bed115c0a definitions cleanup with stxOSDefs.h
penk
parents: 1342
diff changeset
    73
#endif
cc3bed115c0a definitions cleanup with stxOSDefs.h
penk
parents: 1342
diff changeset
    74
739
eb3878300c3b removed WIN32 ifdef's - win32 uses Socket_win32.st anyway.
Claus Gittinger <cg@exept.de>
parents: 726
diff changeset
    75
#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
    76
# define USE_H_ERRNO
eb3878300c3b removed WIN32 ifdef's - win32 uses Socket_win32.st anyway.
Claus Gittinger <cg@exept.de>
parents: 726
diff changeset
    77
#endif
eb3878300c3b removed WIN32 ifdef's - win32 uses Socket_win32.st anyway.
Claus Gittinger <cg@exept.de>
parents: 726
diff changeset
    78
126
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
    79
/*
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
    80
 * on some systems errno is a macro ... check for it here
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
    81
 */
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
    82
#ifndef errno
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
    83
 extern errno;
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
    84
#endif
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
    85
648
58e11a70ddaf gethostbyname behaves strange, if a name-server lookup is involved.
Claus Gittinger <cg@exept.de>
parents: 617
diff changeset
    86
#ifdef USE_H_ERRNO
58e11a70ddaf gethostbyname behaves strange, if a name-server lookup is involved.
Claus Gittinger <cg@exept.de>
parents: 617
diff changeset
    87
# ifndef h_errno
58e11a70ddaf gethostbyname behaves strange, if a name-server lookup is involved.
Claus Gittinger <cg@exept.de>
parents: 617
diff changeset
    88
 extern h_errno;
58e11a70ddaf gethostbyname behaves strange, if a name-server lookup is involved.
Claus Gittinger <cg@exept.de>
parents: 617
diff changeset
    89
# endif
58e11a70ddaf gethostbyname behaves strange, if a name-server lookup is involved.
Claus Gittinger <cg@exept.de>
parents: 617
diff changeset
    90
#endif
58e11a70ddaf gethostbyname behaves strange, if a name-server lookup is involved.
Claus Gittinger <cg@exept.de>
parents: 617
diff changeset
    91
126
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
    92
#ifdef DEBUG
1839
c10cd58ec334 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1781
diff changeset
    93
# define DBGPRINTF(x)    { if (__debugging__) console_printf x; }
c10cd58ec334 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1781
diff changeset
    94
# define DBGFPRINTF(x)   { if (__debugging__) console_fprintf x; }
126
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
    95
#else
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
    96
# define DBGPRINTF(x)    /* as nothing */
821
40b0b69bf4b5 more debugs; fixed at-addresses
Claus Gittinger <cg@exept.de>
parents: 820
diff changeset
    97
# define DBGFPRINTF(x)   /* as nothing */
126
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
    98
#endif
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
    99
1531
ec98158988ca compilable under unix
Claus Gittinger <cg@exept.de>
parents: 1529
diff changeset
   100
#ifndef TRUE
1535
f6aa0fc8c3cc getSocketAddress
Claus Gittinger <cg@exept.de>
parents: 1533
diff changeset
   101
# define TRUE   1
1531
ec98158988ca compilable under unix
Claus Gittinger <cg@exept.de>
parents: 1529
diff changeset
   102
#endif
ec98158988ca compilable under unix
Claus Gittinger <cg@exept.de>
parents: 1529
diff changeset
   103
#ifndef FALSE
1535
f6aa0fc8c3cc getSocketAddress
Claus Gittinger <cg@exept.de>
parents: 1533
diff changeset
   104
# define FALSE  0
1531
ec98158988ca compilable under unix
Claus Gittinger <cg@exept.de>
parents: 1529
diff changeset
   105
#endif
ec98158988ca compilable under unix
Claus Gittinger <cg@exept.de>
parents: 1529
diff changeset
   106
#ifndef WIN32
ec98158988ca compilable under unix
Claus Gittinger <cg@exept.de>
parents: 1529
diff changeset
   107
typedef int BOOL;
ec98158988ca compilable under unix
Claus Gittinger <cg@exept.de>
parents: 1529
diff changeset
   108
#endif
ec98158988ca compilable under unix
Claus Gittinger <cg@exept.de>
parents: 1529
diff changeset
   109
1843
8ee90d243b49 closeSocket after fclose: no longer (Q: is this the right thing)
Claus Gittinger <cg@exept.de>
parents: 1842
diff changeset
   110
#ifdef WIN32
8ee90d243b49 closeSocket after fclose: no longer (Q: is this the right thing)
Claus Gittinger <cg@exept.de>
parents: 1842
diff changeset
   111
# undef stdout
8ee90d243b49 closeSocket after fclose: no longer (Q: is this the right thing)
Claus Gittinger <cg@exept.de>
parents: 1842
diff changeset
   112
# undef stderr
8ee90d243b49 closeSocket after fclose: no longer (Q: is this the right thing)
Claus Gittinger <cg@exept.de>
parents: 1842
diff changeset
   113
# 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
   114
# 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
   115
#endif
1531
ec98158988ca compilable under unix
Claus Gittinger <cg@exept.de>
parents: 1529
diff changeset
   116
126
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
   117
%}
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
   118
! !
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
   119
511
c071e228cb24 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 510
diff changeset
   120
!Socket primitiveVariables!
c071e228cb24 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 510
diff changeset
   121
%{
1844
decc9d62520d oops - debug
Claus Gittinger <cg@exept.de>
parents: 1843
diff changeset
   122
static int __debugging__ = 0;
511
c071e228cb24 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 510
diff changeset
   123
%}
c071e228cb24 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 510
diff changeset
   124
! !
c071e228cb24 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 510
diff changeset
   125
1504
92005eec5c9d fixed moving-object-when-interrupted-with-scavenge bugs;
Claus Gittinger <cg@exept.de>
parents: 1503
diff changeset
   126
!Socket primitiveFunctions!
92005eec5c9d fixed moving-object-when-interrupted-with-scavenge bugs;
Claus Gittinger <cg@exept.de>
parents: 1503
diff changeset
   127
%{
92005eec5c9d fixed moving-object-when-interrupted-with-scavenge bugs;
Claus Gittinger <cg@exept.de>
parents: 1503
diff changeset
   128
1529
911273d090c1 Re-unified Win32 and Unix code into single Socket.st.
Claus Gittinger <cg@exept.de>
parents: 1505
diff changeset
   129
static int
1504
92005eec5c9d fixed moving-object-when-interrupted-with-scavenge bugs;
Claus Gittinger <cg@exept.de>
parents: 1503
diff changeset
   130
setupBufferParameters(aDataBuffer, startIndex, p_extPtr, p_offs, p_objSize)
92005eec5c9d fixed moving-object-when-interrupted-with-scavenge bugs;
Claus Gittinger <cg@exept.de>
parents: 1503
diff changeset
   131
    OBJ aDataBuffer, startIndex;
92005eec5c9d fixed moving-object-when-interrupted-with-scavenge bugs;
Claus Gittinger <cg@exept.de>
parents: 1503
diff changeset
   132
    char **p_extPtr;
92005eec5c9d fixed moving-object-when-interrupted-with-scavenge bugs;
Claus Gittinger <cg@exept.de>
parents: 1503
diff changeset
   133
    int *p_offs;
92005eec5c9d fixed moving-object-when-interrupted-with-scavenge bugs;
Claus Gittinger <cg@exept.de>
parents: 1503
diff changeset
   134
    int *p_objSize;
92005eec5c9d fixed moving-object-when-interrupted-with-scavenge bugs;
Claus Gittinger <cg@exept.de>
parents: 1503
diff changeset
   135
{
92005eec5c9d fixed moving-object-when-interrupted-with-scavenge bugs;
Claus Gittinger <cg@exept.de>
parents: 1503
diff changeset
   136
	char *extPtr = 0;
92005eec5c9d fixed moving-object-when-interrupted-with-scavenge bugs;
Claus Gittinger <cg@exept.de>
parents: 1503
diff changeset
   137
	int sIdx = 0, objSize = 0, offs = 0;
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
	sIdx = 0;
92005eec5c9d fixed moving-object-when-interrupted-with-scavenge bugs;
Claus Gittinger <cg@exept.de>
parents: 1503
diff changeset
   140
	if (__isSmallInteger(startIndex)) {
92005eec5c9d fixed moving-object-when-interrupted-with-scavenge bugs;
Claus Gittinger <cg@exept.de>
parents: 1503
diff changeset
   141
	    sIdx = __intVal(startIndex) - 1;
92005eec5c9d fixed moving-object-when-interrupted-with-scavenge bugs;
Claus Gittinger <cg@exept.de>
parents: 1503
diff changeset
   142
	}
92005eec5c9d fixed moving-object-when-interrupted-with-scavenge bugs;
Claus Gittinger <cg@exept.de>
parents: 1503
diff changeset
   143
92005eec5c9d fixed moving-object-when-interrupted-with-scavenge bugs;
Claus Gittinger <cg@exept.de>
parents: 1503
diff changeset
   144
	if (__isExternalBytesLike(aDataBuffer)) {
92005eec5c9d fixed moving-object-when-interrupted-with-scavenge bugs;
Claus Gittinger <cg@exept.de>
parents: 1503
diff changeset
   145
	    OBJ sz;
92005eec5c9d fixed moving-object-when-interrupted-with-scavenge bugs;
Claus Gittinger <cg@exept.de>
parents: 1503
diff changeset
   146
92005eec5c9d fixed moving-object-when-interrupted-with-scavenge bugs;
Claus Gittinger <cg@exept.de>
parents: 1503
diff changeset
   147
	    extPtr = (char *)(__externalBytesAddress(aDataBuffer));
92005eec5c9d fixed moving-object-when-interrupted-with-scavenge bugs;
Claus Gittinger <cg@exept.de>
parents: 1503
diff changeset
   148
	    sz = __externalBytesSize(aDataBuffer);
92005eec5c9d fixed moving-object-when-interrupted-with-scavenge bugs;
Claus Gittinger <cg@exept.de>
parents: 1503
diff changeset
   149
	    if (__isSmallInteger(sz)) {
92005eec5c9d fixed moving-object-when-interrupted-with-scavenge bugs;
Claus Gittinger <cg@exept.de>
parents: 1503
diff changeset
   150
		objSize = __intVal(sz);
92005eec5c9d fixed moving-object-when-interrupted-with-scavenge bugs;
Claus Gittinger <cg@exept.de>
parents: 1503
diff changeset
   151
	    } else {
92005eec5c9d fixed moving-object-when-interrupted-with-scavenge bugs;
Claus Gittinger <cg@exept.de>
parents: 1503
diff changeset
   152
		objSize = 0; /* unknown */
92005eec5c9d fixed moving-object-when-interrupted-with-scavenge bugs;
Claus Gittinger <cg@exept.de>
parents: 1503
diff changeset
   153
	    }
92005eec5c9d fixed moving-object-when-interrupted-with-scavenge bugs;
Claus Gittinger <cg@exept.de>
parents: 1503
diff changeset
   154
	    offs = sIdx;
92005eec5c9d fixed moving-object-when-interrupted-with-scavenge bugs;
Claus Gittinger <cg@exept.de>
parents: 1503
diff changeset
   155
	} else {
92005eec5c9d fixed moving-object-when-interrupted-with-scavenge bugs;
Claus Gittinger <cg@exept.de>
parents: 1503
diff changeset
   156
	    OBJ oClass;
92005eec5c9d fixed moving-object-when-interrupted-with-scavenge bugs;
Claus Gittinger <cg@exept.de>
parents: 1503
diff changeset
   157
	    int nInstVars, nInstBytes;
92005eec5c9d fixed moving-object-when-interrupted-with-scavenge bugs;
Claus Gittinger <cg@exept.de>
parents: 1503
diff changeset
   158
1529
911273d090c1 Re-unified Win32 and Unix code into single Socket.st.
Claus Gittinger <cg@exept.de>
parents: 1505
diff changeset
   159
	    extPtr = (char *)0;
1504
92005eec5c9d fixed moving-object-when-interrupted-with-scavenge bugs;
Claus Gittinger <cg@exept.de>
parents: 1503
diff changeset
   160
	    oClass = __Class(aDataBuffer);
92005eec5c9d fixed moving-object-when-interrupted-with-scavenge bugs;
Claus Gittinger <cg@exept.de>
parents: 1503
diff changeset
   161
	    switch (__intVal(__ClassInstPtr(oClass)->c_flags) & ARRAYMASK) {
92005eec5c9d fixed moving-object-when-interrupted-with-scavenge bugs;
Claus Gittinger <cg@exept.de>
parents: 1503
diff changeset
   162
		case BYTEARRAY:
92005eec5c9d fixed moving-object-when-interrupted-with-scavenge bugs;
Claus Gittinger <cg@exept.de>
parents: 1503
diff changeset
   163
		    offs = sIdx;
92005eec5c9d fixed moving-object-when-interrupted-with-scavenge bugs;
Claus Gittinger <cg@exept.de>
parents: 1503
diff changeset
   164
		    break;
92005eec5c9d fixed moving-object-when-interrupted-with-scavenge bugs;
Claus Gittinger <cg@exept.de>
parents: 1503
diff changeset
   165
		case WORDARRAY:
92005eec5c9d fixed moving-object-when-interrupted-with-scavenge bugs;
Claus Gittinger <cg@exept.de>
parents: 1503
diff changeset
   166
		case SWORDARRAY:
92005eec5c9d fixed moving-object-when-interrupted-with-scavenge bugs;
Claus Gittinger <cg@exept.de>
parents: 1503
diff changeset
   167
		    offs = sIdx * 2;
92005eec5c9d fixed moving-object-when-interrupted-with-scavenge bugs;
Claus Gittinger <cg@exept.de>
parents: 1503
diff changeset
   168
		    break;
92005eec5c9d fixed moving-object-when-interrupted-with-scavenge bugs;
Claus Gittinger <cg@exept.de>
parents: 1503
diff changeset
   169
		case LONGARRAY:
92005eec5c9d fixed moving-object-when-interrupted-with-scavenge bugs;
Claus Gittinger <cg@exept.de>
parents: 1503
diff changeset
   170
		case SLONGARRAY:
92005eec5c9d fixed moving-object-when-interrupted-with-scavenge bugs;
Claus Gittinger <cg@exept.de>
parents: 1503
diff changeset
   171
		    offs = sIdx * 4;
92005eec5c9d fixed moving-object-when-interrupted-with-scavenge bugs;
Claus Gittinger <cg@exept.de>
parents: 1503
diff changeset
   172
		    break;
92005eec5c9d fixed moving-object-when-interrupted-with-scavenge bugs;
Claus Gittinger <cg@exept.de>
parents: 1503
diff changeset
   173
		case LONGLONGARRAY:
92005eec5c9d fixed moving-object-when-interrupted-with-scavenge bugs;
Claus Gittinger <cg@exept.de>
parents: 1503
diff changeset
   174
		case SLONGLONGARRAY:
92005eec5c9d fixed moving-object-when-interrupted-with-scavenge bugs;
Claus Gittinger <cg@exept.de>
parents: 1503
diff changeset
   175
		    offs = sIdx * 8;
92005eec5c9d fixed moving-object-when-interrupted-with-scavenge bugs;
Claus Gittinger <cg@exept.de>
parents: 1503
diff changeset
   176
# ifdef __NEED_LONGLONG_ALIGN
92005eec5c9d fixed moving-object-when-interrupted-with-scavenge bugs;
Claus Gittinger <cg@exept.de>
parents: 1503
diff changeset
   177
		    offs += 4;
92005eec5c9d fixed moving-object-when-interrupted-with-scavenge bugs;
Claus Gittinger <cg@exept.de>
parents: 1503
diff changeset
   178
# endif
92005eec5c9d fixed moving-object-when-interrupted-with-scavenge bugs;
Claus Gittinger <cg@exept.de>
parents: 1503
diff changeset
   179
		    break;
92005eec5c9d fixed moving-object-when-interrupted-with-scavenge bugs;
Claus Gittinger <cg@exept.de>
parents: 1503
diff changeset
   180
		case FLOATARRAY:
92005eec5c9d fixed moving-object-when-interrupted-with-scavenge bugs;
Claus Gittinger <cg@exept.de>
parents: 1503
diff changeset
   181
		    offs = sIdx * sizeof(float);
92005eec5c9d fixed moving-object-when-interrupted-with-scavenge bugs;
Claus Gittinger <cg@exept.de>
parents: 1503
diff changeset
   182
		    break;
92005eec5c9d fixed moving-object-when-interrupted-with-scavenge bugs;
Claus Gittinger <cg@exept.de>
parents: 1503
diff changeset
   183
		case DOUBLEARRAY:
92005eec5c9d fixed moving-object-when-interrupted-with-scavenge bugs;
Claus Gittinger <cg@exept.de>
parents: 1503
diff changeset
   184
		    offs = sIdx * sizeof(double);
92005eec5c9d fixed moving-object-when-interrupted-with-scavenge bugs;
Claus Gittinger <cg@exept.de>
parents: 1503
diff changeset
   185
# ifdef __NEED_DOUBLE_ALIGN
92005eec5c9d fixed moving-object-when-interrupted-with-scavenge bugs;
Claus Gittinger <cg@exept.de>
parents: 1503
diff changeset
   186
		    offs += 4;
92005eec5c9d fixed moving-object-when-interrupted-with-scavenge bugs;
Claus Gittinger <cg@exept.de>
parents: 1503
diff changeset
   187
# endif
92005eec5c9d fixed moving-object-when-interrupted-with-scavenge bugs;
Claus Gittinger <cg@exept.de>
parents: 1503
diff changeset
   188
		    break;
92005eec5c9d fixed moving-object-when-interrupted-with-scavenge bugs;
Claus Gittinger <cg@exept.de>
parents: 1503
diff changeset
   189
		default:
1529
911273d090c1 Re-unified Win32 and Unix code into single Socket.st.
Claus Gittinger <cg@exept.de>
parents: 1505
diff changeset
   190
		    *p_objSize = -1;
911273d090c1 Re-unified Win32 and Unix code into single Socket.st.
Claus Gittinger <cg@exept.de>
parents: 1505
diff changeset
   191
		    return 0;
1504
92005eec5c9d fixed moving-object-when-interrupted-with-scavenge bugs;
Claus Gittinger <cg@exept.de>
parents: 1503
diff changeset
   192
	    }
92005eec5c9d fixed moving-object-when-interrupted-with-scavenge bugs;
Claus Gittinger <cg@exept.de>
parents: 1503
diff changeset
   193
	    nInstVars = __intVal(__ClassInstPtr(oClass)->c_ninstvars);
92005eec5c9d fixed moving-object-when-interrupted-with-scavenge bugs;
Claus Gittinger <cg@exept.de>
parents: 1503
diff changeset
   194
	    nInstBytes = OHDR_SIZE + nInstVars * sizeof(OBJ);
92005eec5c9d fixed moving-object-when-interrupted-with-scavenge bugs;
Claus Gittinger <cg@exept.de>
parents: 1503
diff changeset
   195
	    offs = offs + nInstBytes;
92005eec5c9d fixed moving-object-when-interrupted-with-scavenge bugs;
Claus Gittinger <cg@exept.de>
parents: 1503
diff changeset
   196
	    objSize = _Size(aDataBuffer) - offs;
92005eec5c9d fixed moving-object-when-interrupted-with-scavenge bugs;
Claus Gittinger <cg@exept.de>
parents: 1503
diff changeset
   197
	}
92005eec5c9d fixed moving-object-when-interrupted-with-scavenge bugs;
Claus Gittinger <cg@exept.de>
parents: 1503
diff changeset
   198
	*p_extPtr = extPtr;
92005eec5c9d fixed moving-object-when-interrupted-with-scavenge bugs;
Claus Gittinger <cg@exept.de>
parents: 1503
diff changeset
   199
	*p_objSize = objSize;
92005eec5c9d fixed moving-object-when-interrupted-with-scavenge bugs;
Claus Gittinger <cg@exept.de>
parents: 1503
diff changeset
   200
	*p_offs = offs;
1529
911273d090c1 Re-unified Win32 and Unix code into single Socket.st.
Claus Gittinger <cg@exept.de>
parents: 1505
diff changeset
   201
	return 1;
1504
92005eec5c9d fixed moving-object-when-interrupted-with-scavenge bugs;
Claus Gittinger <cg@exept.de>
parents: 1503
diff changeset
   202
}
92005eec5c9d fixed moving-object-when-interrupted-with-scavenge bugs;
Claus Gittinger <cg@exept.de>
parents: 1503
diff changeset
   203
%}
92005eec5c9d fixed moving-object-when-interrupted-with-scavenge bugs;
Claus Gittinger <cg@exept.de>
parents: 1503
diff changeset
   204
! !
92005eec5c9d fixed moving-object-when-interrupted-with-scavenge bugs;
Claus Gittinger <cg@exept.de>
parents: 1503
diff changeset
   205
464
600b101a7035 alen in accept
Claus Gittinger <cg@exept.de>
parents: 463
diff changeset
   206
!Socket class methodsFor:'documentation'!
25
996051271ce9 *** empty log message ***
claus
parents: 21
diff changeset
   207
31
e223f3cf2995 *** empty log message ***
claus
parents: 28
diff changeset
   208
copyright
e223f3cf2995 *** empty log message ***
claus
parents: 28
diff changeset
   209
"
e223f3cf2995 *** empty log message ***
claus
parents: 28
diff changeset
   210
 COPYRIGHT (c) 1992 by Claus Gittinger
42
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   211
	      All Rights Reserved
31
e223f3cf2995 *** empty log message ***
claus
parents: 28
diff changeset
   212
e223f3cf2995 *** empty log message ***
claus
parents: 28
diff changeset
   213
 This software is furnished under a license and may be used
e223f3cf2995 *** empty log message ***
claus
parents: 28
diff changeset
   214
 only in accordance with the terms of that license and with the
e223f3cf2995 *** empty log message ***
claus
parents: 28
diff changeset
   215
 inclusion of the above copyright notice.   This software may not
e223f3cf2995 *** empty log message ***
claus
parents: 28
diff changeset
   216
 be provided or otherwise made available to, or used by, any
e223f3cf2995 *** empty log message ***
claus
parents: 28
diff changeset
   217
 other person.  No title to or ownership of the software is
e223f3cf2995 *** empty log message ***
claus
parents: 28
diff changeset
   218
 hereby transferred.
e223f3cf2995 *** empty log message ***
claus
parents: 28
diff changeset
   219
"
e223f3cf2995 *** empty log message ***
claus
parents: 28
diff changeset
   220
!
e223f3cf2995 *** empty log message ***
claus
parents: 28
diff changeset
   221
25
996051271ce9 *** empty log message ***
claus
parents: 21
diff changeset
   222
documentation
996051271ce9 *** empty log message ***
claus
parents: 21
diff changeset
   223
"
524
8287da54eccf more empty code for other domains;
Claus Gittinger <cg@exept.de>
parents: 513
diff changeset
   224
    This class provides access to sockets for interprocess communication.
25
996051271ce9 *** empty log message ***
claus
parents: 21
diff changeset
   225
    The message protocol is preliminary, until someone tells me how
31
e223f3cf2995 *** empty log message ***
claus
parents: 28
diff changeset
   226
    other smalltalk's socket interfaces look like.
25
996051271ce9 *** empty log message ***
claus
parents: 21
diff changeset
   227
1529
911273d090c1 Re-unified Win32 and Unix code into single Socket.st.
Claus Gittinger <cg@exept.de>
parents: 1505
diff changeset
   228
    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
   229
    tested and supported.
525
5891518d17a3 appletalk support - untested
Claus Gittinger <cg@exept.de>
parents: 524
diff changeset
   230
    Code for appletalk is included, but was never tested ...
5891518d17a3 appletalk support - untested
Claus Gittinger <cg@exept.de>
parents: 524
diff changeset
   231
    More may be added in the future.
5891518d17a3 appletalk support - untested
Claus Gittinger <cg@exept.de>
parents: 524
diff changeset
   232
    (the code is prepared for things like SNA or decNet;
5891518d17a3 appletalk support - untested
Claus Gittinger <cg@exept.de>
parents: 524
diff changeset
   233
     however, right now, this code is empty and needs a little work.
5891518d17a3 appletalk support - untested
Claus Gittinger <cg@exept.de>
parents: 524
diff changeset
   234
     Implementing those is pretty straight forward, once the address
5891518d17a3 appletalk support - untested
Claus Gittinger <cg@exept.de>
parents: 524
diff changeset
   235
     data structures are known.)
524
8287da54eccf more empty code for other domains;
Claus Gittinger <cg@exept.de>
parents: 513
diff changeset
   236
28
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   237
    Due to historic reasons (I started this class, before I got hold of some
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   238
    code using ST-80 Sockets i.e. RemoteInvocation), there is some old interface
1485
d8578cf3504b gcc3.3.1 insn-scheduler bug workaround
Claus Gittinger <cg@exept.de>
parents: 1474
diff changeset
   239
    still provided.
524
8287da54eccf more empty code for other domains;
Claus Gittinger <cg@exept.de>
parents: 513
diff changeset
   240
    This will vanish; use the #family:type: or #newTCPxxx and #newUDPxxx interfaces,
71
claus
parents: 63
diff changeset
   241
    together with the bind/listen and accept calls,
claus
parents: 63
diff changeset
   242
    which are meant to be compatible to ST-80's UnixSocketAccessor interface.
claus
parents: 63
diff changeset
   243
claus
parents: 63
diff changeset
   244
    TODO: cleanup historic leftovers, implement other than inet domain stuff.
524
8287da54eccf more empty code for other domains;
Claus Gittinger <cg@exept.de>
parents: 513
diff changeset
   245
	  (mhmh - how can I test those ?)
532
f997c3873602 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 531
diff changeset
   246
	  change to raise more signals on errors.
529
fc7ec265717b *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 528
diff changeset
   247
	  Help - could someone who has a linux machine connected to an appletalk
533
ced9950b551f added query about which protocols are supported
Claus Gittinger <cg@exept.de>
parents: 532
diff changeset
   248
		 net please test this (and send bug fixes ...)
259
6d36f3ac42a2 documentation
Claus Gittinger <cg@exept.de>
parents: 220
diff changeset
   249
6d36f3ac42a2 documentation
Claus Gittinger <cg@exept.de>
parents: 220
diff changeset
   250
    [author:]
425
eb8198e9f1b0 comment
Claus Gittinger <cg@exept.de>
parents: 421
diff changeset
   251
	Claus Gittinger
48
18b9353c9d07 *** empty log message ***
claus
parents: 44
diff changeset
   252
"
18b9353c9d07 *** empty log message ***
claus
parents: 44
diff changeset
   253
!
28
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   254
48
18b9353c9d07 *** empty log message ***
claus
parents: 44
diff changeset
   255
examples
18b9353c9d07 *** empty log message ***
claus
parents: 44
diff changeset
   256
"
28
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   257
    example (get help info from an nntp server):
1343
cc3bed115c0a definitions cleanup with stxOSDefs.h
penk
parents: 1342
diff changeset
   258
									[exBegin]
cc3bed115c0a definitions cleanup with stxOSDefs.h
penk
parents: 1342
diff changeset
   259
	|sock host|
cc3bed115c0a definitions cleanup with stxOSDefs.h
penk
parents: 1342
diff changeset
   260
cc3bed115c0a definitions cleanup with stxOSDefs.h
penk
parents: 1342
diff changeset
   261
	host := OperatingSystem getEnvironment:'NNTPSERVER'.
cc3bed115c0a definitions cleanup with stxOSDefs.h
penk
parents: 1342
diff changeset
   262
cc3bed115c0a definitions cleanup with stxOSDefs.h
penk
parents: 1342
diff changeset
   263
	sock := Socket newTCPclientToHost:host port:'nntp'.
cc3bed115c0a definitions cleanup with stxOSDefs.h
penk
parents: 1342
diff changeset
   264
	Transcript showCR:sock nextLine.
cc3bed115c0a definitions cleanup with stxOSDefs.h
penk
parents: 1342
diff changeset
   265
	sock buffered:false.
cc3bed115c0a definitions cleanup with stxOSDefs.h
penk
parents: 1342
diff changeset
   266
cc3bed115c0a definitions cleanup with stxOSDefs.h
penk
parents: 1342
diff changeset
   267
	sock nextPutAll:'HELP'; cr.
cc3bed115c0a definitions cleanup with stxOSDefs.h
penk
parents: 1342
diff changeset
   268
	[:exit |
cc3bed115c0a definitions cleanup with stxOSDefs.h
penk
parents: 1342
diff changeset
   269
	    |line|
cc3bed115c0a definitions cleanup with stxOSDefs.h
penk
parents: 1342
diff changeset
   270
cc3bed115c0a definitions cleanup with stxOSDefs.h
penk
parents: 1342
diff changeset
   271
	    line := sock nextLine.
cc3bed115c0a definitions cleanup with stxOSDefs.h
penk
parents: 1342
diff changeset
   272
	    line = '.' ifTrue:[exit value:nil].
cc3bed115c0a definitions cleanup with stxOSDefs.h
penk
parents: 1342
diff changeset
   273
	    Transcript showCR:line.
cc3bed115c0a definitions cleanup with stxOSDefs.h
penk
parents: 1342
diff changeset
   274
	] loopWithExit.
cc3bed115c0a definitions cleanup with stxOSDefs.h
penk
parents: 1342
diff changeset
   275
	sock close
cc3bed115c0a definitions cleanup with stxOSDefs.h
penk
parents: 1342
diff changeset
   276
									[exEnd]
209
2152fceba563 finger example
Claus Gittinger <cg@exept.de>
parents: 208
diff changeset
   277
28
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   278
209
2152fceba563 finger example
Claus Gittinger <cg@exept.de>
parents: 208
diff changeset
   279
    example (connect to finger daemon, get users entry):
1343
cc3bed115c0a definitions cleanup with stxOSDefs.h
penk
parents: 1342
diff changeset
   280
									[exBegin]
cc3bed115c0a definitions cleanup with stxOSDefs.h
penk
parents: 1342
diff changeset
   281
	|sock host entry|
cc3bed115c0a definitions cleanup with stxOSDefs.h
penk
parents: 1342
diff changeset
   282
cc3bed115c0a definitions cleanup with stxOSDefs.h
penk
parents: 1342
diff changeset
   283
	host := OperatingSystem getHostName.
cc3bed115c0a definitions cleanup with stxOSDefs.h
penk
parents: 1342
diff changeset
   284
cc3bed115c0a definitions cleanup with stxOSDefs.h
penk
parents: 1342
diff changeset
   285
	sock := Socket newTCPclientToHost:host port:'finger'.
cc3bed115c0a definitions cleanup with stxOSDefs.h
penk
parents: 1342
diff changeset
   286
	sock isNil ifTrue:[
cc3bed115c0a definitions cleanup with stxOSDefs.h
penk
parents: 1342
diff changeset
   287
	    self warn:'no finger daemon is running'.
cc3bed115c0a definitions cleanup with stxOSDefs.h
penk
parents: 1342
diff changeset
   288
	    ^ self
cc3bed115c0a definitions cleanup with stxOSDefs.h
penk
parents: 1342
diff changeset
   289
	].
cc3bed115c0a definitions cleanup with stxOSDefs.h
penk
parents: 1342
diff changeset
   290
	sock useCRLF:true.
cc3bed115c0a definitions cleanup with stxOSDefs.h
penk
parents: 1342
diff changeset
   291
	sock buffered:false.
cc3bed115c0a definitions cleanup with stxOSDefs.h
penk
parents: 1342
diff changeset
   292
	sock isNil ifTrue:[
cc3bed115c0a definitions cleanup with stxOSDefs.h
penk
parents: 1342
diff changeset
   293
	    Transcript showCR:'cannot connect to local finger daemon'
cc3bed115c0a definitions cleanup with stxOSDefs.h
penk
parents: 1342
diff changeset
   294
	] ifFalse:[
cc3bed115c0a definitions cleanup with stxOSDefs.h
penk
parents: 1342
diff changeset
   295
	    sock nextPutAll:(OperatingSystem getLoginName).
cc3bed115c0a definitions cleanup with stxOSDefs.h
penk
parents: 1342
diff changeset
   296
	    sock cr.
cc3bed115c0a definitions cleanup with stxOSDefs.h
penk
parents: 1342
diff changeset
   297
cc3bed115c0a definitions cleanup with stxOSDefs.h
penk
parents: 1342
diff changeset
   298
	    entry := sock nextLine.
cc3bed115c0a definitions cleanup with stxOSDefs.h
penk
parents: 1342
diff changeset
   299
	    Transcript showCR:entry.
cc3bed115c0a definitions cleanup with stxOSDefs.h
penk
parents: 1342
diff changeset
   300
cc3bed115c0a definitions cleanup with stxOSDefs.h
penk
parents: 1342
diff changeset
   301
	    sock close
cc3bed115c0a definitions cleanup with stxOSDefs.h
penk
parents: 1342
diff changeset
   302
	]
cc3bed115c0a definitions cleanup with stxOSDefs.h
penk
parents: 1342
diff changeset
   303
									[exEnd]
99
7d016cc30052 fixed & moved pingWalk from SNMPSession to here;
Claus Gittinger <cg@exept.de>
parents: 98
diff changeset
   304
28
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   305
    example (connect to an ftp server):
1343
cc3bed115c0a definitions cleanup with stxOSDefs.h
penk
parents: 1342
diff changeset
   306
									[exBegin]
cc3bed115c0a definitions cleanup with stxOSDefs.h
penk
parents: 1342
diff changeset
   307
	|sock host|
cc3bed115c0a definitions cleanup with stxOSDefs.h
penk
parents: 1342
diff changeset
   308
cc3bed115c0a definitions cleanup with stxOSDefs.h
penk
parents: 1342
diff changeset
   309
	host := OperatingSystem getHostName.
cc3bed115c0a definitions cleanup with stxOSDefs.h
penk
parents: 1342
diff changeset
   310
	sock := Socket newTCPclientToHost:host port:'ftp'.
cc3bed115c0a definitions cleanup with stxOSDefs.h
penk
parents: 1342
diff changeset
   311
cc3bed115c0a definitions cleanup with stxOSDefs.h
penk
parents: 1342
diff changeset
   312
	sock buffered:false.
cc3bed115c0a definitions cleanup with stxOSDefs.h
penk
parents: 1342
diff changeset
   313
	Transcript showCR:sock nextLine.
cc3bed115c0a definitions cleanup with stxOSDefs.h
penk
parents: 1342
diff changeset
   314
	sock nextPutAll:('USER ' , 'anonymous'); cr.
cc3bed115c0a definitions cleanup with stxOSDefs.h
penk
parents: 1342
diff changeset
   315
	Transcript showCR:sock nextLine.
cc3bed115c0a definitions cleanup with stxOSDefs.h
penk
parents: 1342
diff changeset
   316
	sock nextPutAll:('PASS ' , 'fooBar'); cr.
cc3bed115c0a definitions cleanup with stxOSDefs.h
penk
parents: 1342
diff changeset
   317
	Transcript showCR:sock nextLine.
cc3bed115c0a definitions cleanup with stxOSDefs.h
penk
parents: 1342
diff changeset
   318
	sock nextPutAll:'LIST'; cr.
cc3bed115c0a definitions cleanup with stxOSDefs.h
penk
parents: 1342
diff changeset
   319
	Transcript showCR:sock nextLine.
cc3bed115c0a definitions cleanup with stxOSDefs.h
penk
parents: 1342
diff changeset
   320
	sock close.
cc3bed115c0a definitions cleanup with stxOSDefs.h
penk
parents: 1342
diff changeset
   321
cc3bed115c0a definitions cleanup with stxOSDefs.h
penk
parents: 1342
diff changeset
   322
	'dont know enough of the ftp protocol to continue here ...'
cc3bed115c0a definitions cleanup with stxOSDefs.h
penk
parents: 1342
diff changeset
   323
									[exEnd]
28
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
   324
99
7d016cc30052 fixed & moved pingWalk from SNMPSession to here;
Claus Gittinger <cg@exept.de>
parents: 98
diff changeset
   325
93
Claus Gittinger <cg@exept.de>
parents: 92
diff changeset
   326
    example (connect to an snmp server [UDP]):
1343
cc3bed115c0a definitions cleanup with stxOSDefs.h
penk
parents: 1342
diff changeset
   327
									[exBegin]
cc3bed115c0a definitions cleanup with stxOSDefs.h
penk
parents: 1342
diff changeset
   328
	|sock port|
cc3bed115c0a definitions cleanup with stxOSDefs.h
penk
parents: 1342
diff changeset
   329
cc3bed115c0a definitions cleanup with stxOSDefs.h
penk
parents: 1342
diff changeset
   330
	sock := Socket newUDP.
cc3bed115c0a definitions cleanup with stxOSDefs.h
penk
parents: 1342
diff changeset
   331
	port := Socket portOfService:'snmp'.
cc3bed115c0a definitions cleanup with stxOSDefs.h
penk
parents: 1342
diff changeset
   332
	sock connectTo:(OperatingSystem getHostName) port:port.
cc3bed115c0a definitions cleanup with stxOSDefs.h
penk
parents: 1342
diff changeset
   333
	sock buffered:false.
cc3bed115c0a definitions cleanup with stxOSDefs.h
penk
parents: 1342
diff changeset
   334
	Transcript showCR:'got it'.
cc3bed115c0a definitions cleanup with stxOSDefs.h
penk
parents: 1342
diff changeset
   335
	sock close.
cc3bed115c0a definitions cleanup with stxOSDefs.h
penk
parents: 1342
diff changeset
   336
									[exEnd]
42
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   337
99
7d016cc30052 fixed & moved pingWalk from SNMPSession to here;
Claus Gittinger <cg@exept.de>
parents: 98
diff changeset
   338
42
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   339
    example (await connection from a client and read some data):
1343
cc3bed115c0a definitions cleanup with stxOSDefs.h
penk
parents: 1342
diff changeset
   340
									[exBegin]
cc3bed115c0a definitions cleanup with stxOSDefs.h
penk
parents: 1342
diff changeset
   341
	|connectSock sock|
cc3bed115c0a definitions cleanup with stxOSDefs.h
penk
parents: 1342
diff changeset
   342
1485
d8578cf3504b gcc3.3.1 insn-scheduler bug workaround
Claus Gittinger <cg@exept.de>
parents: 1474
diff changeset
   343
	connectSock := Socket newTCPserverAtPort:9998.
1343
cc3bed115c0a definitions cleanup with stxOSDefs.h
penk
parents: 1342
diff changeset
   344
	connectSock isNil ifTrue:[
cc3bed115c0a definitions cleanup with stxOSDefs.h
penk
parents: 1342
diff changeset
   345
	    Transcript showCR:'socket setup failed.'.
cc3bed115c0a definitions cleanup with stxOSDefs.h
penk
parents: 1342
diff changeset
   346
	] ifFalse:[
cc3bed115c0a definitions cleanup with stxOSDefs.h
penk
parents: 1342
diff changeset
   347
	    Transcript showCR:'listen ..'.
cc3bed115c0a definitions cleanup with stxOSDefs.h
penk
parents: 1342
diff changeset
   348
	    (connectSock listenFor:5) ifFalse:[
cc3bed115c0a definitions cleanup with stxOSDefs.h
penk
parents: 1342
diff changeset
   349
		Transcript showCR:'listen failed.'.
cc3bed115c0a definitions cleanup with stxOSDefs.h
penk
parents: 1342
diff changeset
   350
	    ] ifTrue:[
cc3bed115c0a definitions cleanup with stxOSDefs.h
penk
parents: 1342
diff changeset
   351
		Transcript showCR:'wait'.
1485
d8578cf3504b gcc3.3.1 insn-scheduler bug workaround
Claus Gittinger <cg@exept.de>
parents: 1474
diff changeset
   352
		connectSock readWait.
1343
cc3bed115c0a definitions cleanup with stxOSDefs.h
penk
parents: 1342
diff changeset
   353
		Transcript showCR:'accept'.
cc3bed115c0a definitions cleanup with stxOSDefs.h
penk
parents: 1342
diff changeset
   354
		sock := connectSock accept.
cc3bed115c0a definitions cleanup with stxOSDefs.h
penk
parents: 1342
diff changeset
   355
		sock isNil ifTrue:[
cc3bed115c0a definitions cleanup with stxOSDefs.h
penk
parents: 1342
diff changeset
   356
		    Transcript showCR:'accept failed.'.
cc3bed115c0a definitions cleanup with stxOSDefs.h
penk
parents: 1342
diff changeset
   357
		] ifFalse:[
cc3bed115c0a definitions cleanup with stxOSDefs.h
penk
parents: 1342
diff changeset
   358
		    sock buffered:false.
cc3bed115c0a definitions cleanup with stxOSDefs.h
penk
parents: 1342
diff changeset
   359
		    Transcript showCR:'server: got it'.
cc3bed115c0a definitions cleanup with stxOSDefs.h
penk
parents: 1342
diff changeset
   360
		    'can now do transfer via sock'.
cc3bed115c0a definitions cleanup with stxOSDefs.h
penk
parents: 1342
diff changeset
   361
		    Transcript showCR:'read'.
cc3bed115c0a definitions cleanup with stxOSDefs.h
penk
parents: 1342
diff changeset
   362
		    Transcript showCR:('got: ' , sock nextLine).
cc3bed115c0a definitions cleanup with stxOSDefs.h
penk
parents: 1342
diff changeset
   363
cc3bed115c0a definitions cleanup with stxOSDefs.h
penk
parents: 1342
diff changeset
   364
		    Transcript showCR:'close'.
cc3bed115c0a definitions cleanup with stxOSDefs.h
penk
parents: 1342
diff changeset
   365
		    sock close
cc3bed115c0a definitions cleanup with stxOSDefs.h
penk
parents: 1342
diff changeset
   366
		].
cc3bed115c0a definitions cleanup with stxOSDefs.h
penk
parents: 1342
diff changeset
   367
		connectSock close.
cc3bed115c0a definitions cleanup with stxOSDefs.h
penk
parents: 1342
diff changeset
   368
	    ]
cc3bed115c0a definitions cleanup with stxOSDefs.h
penk
parents: 1342
diff changeset
   369
	]
cc3bed115c0a definitions cleanup with stxOSDefs.h
penk
parents: 1342
diff changeset
   370
									[exEnd]
42
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   371
99
7d016cc30052 fixed & moved pingWalk from SNMPSession to here;
Claus Gittinger <cg@exept.de>
parents: 98
diff changeset
   372
42
506596f9a1a8 *** empty log message ***
claus
parents: 38
diff changeset
   373
    example (connect to above server and send some data):
1343
cc3bed115c0a definitions cleanup with stxOSDefs.h
penk
parents: 1342
diff changeset
   374
									[exBegin]
cc3bed115c0a definitions cleanup with stxOSDefs.h
penk
parents: 1342
diff changeset
   375
	|sock|
cc3bed115c0a definitions cleanup with stxOSDefs.h
penk
parents: 1342
diff changeset
   376
cc3bed115c0a definitions cleanup with stxOSDefs.h
penk
parents: 1342
diff changeset
   377
	sock := Socket newTCPclientToHost:(OperatingSystem getHostName) port:9998.
cc3bed115c0a definitions cleanup with stxOSDefs.h
penk
parents: 1342
diff changeset
   378
	sock isNil ifTrue:[
cc3bed115c0a definitions cleanup with stxOSDefs.h
penk
parents: 1342
diff changeset
   379
	    Transcript showCR:'nope'
cc3bed115c0a definitions cleanup with stxOSDefs.h
penk
parents: 1342
diff changeset
   380
	] ifFalse:[
cc3bed115c0a definitions cleanup with stxOSDefs.h
penk
parents: 1342
diff changeset
   381
	    sock buffered:false.
cc3bed115c0a definitions cleanup with stxOSDefs.h
penk
parents: 1342
diff changeset
   382
	    Transcript showCR:'client: got it'.
cc3bed115c0a definitions cleanup with stxOSDefs.h
penk
parents: 1342
diff changeset
   383
	    'can now do transfer via sock'.
cc3bed115c0a definitions cleanup with stxOSDefs.h
penk
parents: 1342
diff changeset
   384
	    Transcript showCR:'sending <hello>'.
cc3bed115c0a definitions cleanup with stxOSDefs.h
penk
parents: 1342
diff changeset
   385
	    sock nextPutLine:'hello'.
cc3bed115c0a definitions cleanup with stxOSDefs.h
penk
parents: 1342
diff changeset
   386
	    sock close
cc3bed115c0a definitions cleanup with stxOSDefs.h
penk
parents: 1342
diff changeset
   387
	]
cc3bed115c0a definitions cleanup with stxOSDefs.h
penk
parents: 1342
diff changeset
   388
									[exEnd]
117
03cefad7e40b UD socket example & interruptable bind
Claus Gittinger <cg@exept.de>
parents: 116
diff changeset
   389
03cefad7e40b UD socket example & interruptable bind
Claus Gittinger <cg@exept.de>
parents: 116
diff changeset
   390
    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
   391
1343
cc3bed115c0a definitions cleanup with stxOSDefs.h
penk
parents: 1342
diff changeset
   392
	|connectSock sock|
cc3bed115c0a definitions cleanup with stxOSDefs.h
penk
parents: 1342
diff changeset
   393
cc3bed115c0a definitions cleanup with stxOSDefs.h
penk
parents: 1342
diff changeset
   394
	'/tmp/ud_socket' asFilename remove.
1485
d8578cf3504b gcc3.3.1 insn-scheduler bug workaround
Claus Gittinger <cg@exept.de>
parents: 1474
diff changeset
   395
	connectSock := Socket newUNIXserverAt:'/tmp/ud_socket'.
1343
cc3bed115c0a definitions cleanup with stxOSDefs.h
penk
parents: 1342
diff changeset
   396
	connectSock isNil ifTrue:[
cc3bed115c0a definitions cleanup with stxOSDefs.h
penk
parents: 1342
diff changeset
   397
	    Transcript showCR:'socket setup failed.'.
cc3bed115c0a definitions cleanup with stxOSDefs.h
penk
parents: 1342
diff changeset
   398
	] ifFalse:[
cc3bed115c0a definitions cleanup with stxOSDefs.h
penk
parents: 1342
diff changeset
   399
	    Transcript showCR:'listen ..'.
cc3bed115c0a definitions cleanup with stxOSDefs.h
penk
parents: 1342
diff changeset
   400
	    (connectSock listenFor:5) ifFalse:[
cc3bed115c0a definitions cleanup with stxOSDefs.h
penk
parents: 1342
diff changeset
   401
		Transcript showCR:'listen failed.'.
cc3bed115c0a definitions cleanup with stxOSDefs.h
penk
parents: 1342
diff changeset
   402
	    ] ifTrue:[
cc3bed115c0a definitions cleanup with stxOSDefs.h
penk
parents: 1342
diff changeset
   403
		Transcript showCR:'wait'.
cc3bed115c0a definitions cleanup with stxOSDefs.h
penk
parents: 1342
diff changeset
   404
		connectSock buffered:false.
1485
d8578cf3504b gcc3.3.1 insn-scheduler bug workaround
Claus Gittinger <cg@exept.de>
parents: 1474
diff changeset
   405
		connectSock readWait.
1343
cc3bed115c0a definitions cleanup with stxOSDefs.h
penk
parents: 1342
diff changeset
   406
		Transcript showCR:'accept'.
cc3bed115c0a definitions cleanup with stxOSDefs.h
penk
parents: 1342
diff changeset
   407
		sock := connectSock accept.
cc3bed115c0a definitions cleanup with stxOSDefs.h
penk
parents: 1342
diff changeset
   408
		sock isNil ifTrue:[
cc3bed115c0a definitions cleanup with stxOSDefs.h
penk
parents: 1342
diff changeset
   409
		    Transcript showCR:'accept failed.'.
cc3bed115c0a definitions cleanup with stxOSDefs.h
penk
parents: 1342
diff changeset
   410
		] ifFalse:[
cc3bed115c0a definitions cleanup with stxOSDefs.h
penk
parents: 1342
diff changeset
   411
		    sock buffered:false.
cc3bed115c0a definitions cleanup with stxOSDefs.h
penk
parents: 1342
diff changeset
   412
		    Transcript showCR:'server: got it'.
cc3bed115c0a definitions cleanup with stxOSDefs.h
penk
parents: 1342
diff changeset
   413
		    'can now do transfer via sock'.
cc3bed115c0a definitions cleanup with stxOSDefs.h
penk
parents: 1342
diff changeset
   414
		    Transcript showCR:'read'.
cc3bed115c0a definitions cleanup with stxOSDefs.h
penk
parents: 1342
diff changeset
   415
		    Transcript showCR:('got: ' , sock nextLine).
cc3bed115c0a definitions cleanup with stxOSDefs.h
penk
parents: 1342
diff changeset
   416
cc3bed115c0a definitions cleanup with stxOSDefs.h
penk
parents: 1342
diff changeset
   417
		    Transcript showCR:'close'.
cc3bed115c0a definitions cleanup with stxOSDefs.h
penk
parents: 1342
diff changeset
   418
		    sock close
cc3bed115c0a definitions cleanup with stxOSDefs.h
penk
parents: 1342
diff changeset
   419
		].
cc3bed115c0a definitions cleanup with stxOSDefs.h
penk
parents: 1342
diff changeset
   420
		connectSock close.
cc3bed115c0a definitions cleanup with stxOSDefs.h
penk
parents: 1342
diff changeset
   421
	    ]
cc3bed115c0a definitions cleanup with stxOSDefs.h
penk
parents: 1342
diff changeset
   422
	]
117
03cefad7e40b UD socket example & interruptable bind
Claus Gittinger <cg@exept.de>
parents: 116
diff changeset
   423
03cefad7e40b UD socket example & interruptable bind
Claus Gittinger <cg@exept.de>
parents: 116
diff changeset
   424
118
142d5c273454 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 117
diff changeset
   425
    example (connect to above server and send some data;
1343
cc3bed115c0a definitions cleanup with stxOSDefs.h
penk
parents: 1342
diff changeset
   426
	     Notice, this fails, if above server code is executed in the same ST/X image
cc3bed115c0a definitions cleanup with stxOSDefs.h
penk
parents: 1342
diff changeset
   427
		     (at least on LINUX), since the OS does not correctly handle
cc3bed115c0a definitions cleanup with stxOSDefs.h
penk
parents: 1342
diff changeset
   428
		     a connect from within an interrupted accept system call
cc3bed115c0a definitions cleanup with stxOSDefs.h
penk
parents: 1342
diff changeset
   429
		     On SGI's SVR4, this works ok
cc3bed115c0a definitions cleanup with stxOSDefs.h
penk
parents: 1342
diff changeset
   430
									[exBegin]
cc3bed115c0a definitions cleanup with stxOSDefs.h
penk
parents: 1342
diff changeset
   431
	|sock|
cc3bed115c0a definitions cleanup with stxOSDefs.h
penk
parents: 1342
diff changeset
   432
cc3bed115c0a definitions cleanup with stxOSDefs.h
penk
parents: 1342
diff changeset
   433
	sock := Socket newUNIXclientTo:'/tmp/ud_socket'.
cc3bed115c0a definitions cleanup with stxOSDefs.h
penk
parents: 1342
diff changeset
   434
	sock isNil ifTrue:[
cc3bed115c0a definitions cleanup with stxOSDefs.h
penk
parents: 1342
diff changeset
   435
	    Transcript showCR:'nope'
cc3bed115c0a definitions cleanup with stxOSDefs.h
penk
parents: 1342
diff changeset
   436
	] ifFalse:[
cc3bed115c0a definitions cleanup with stxOSDefs.h
penk
parents: 1342
diff changeset
   437
	    sock buffered:false.
cc3bed115c0a definitions cleanup with stxOSDefs.h
penk
parents: 1342
diff changeset
   438
	    Transcript showCR:'client: got it'.
cc3bed115c0a definitions cleanup with stxOSDefs.h
penk
parents: 1342
diff changeset
   439
	    'can now do transfer via sock'.
cc3bed115c0a definitions cleanup with stxOSDefs.h
penk
parents: 1342
diff changeset
   440
	    Transcript showCR:'sending <hello>'.
cc3bed115c0a definitions cleanup with stxOSDefs.h
penk
parents: 1342
diff changeset
   441
	    sock nextPutLine:'hello'.
cc3bed115c0a definitions cleanup with stxOSDefs.h
penk
parents: 1342
diff changeset
   442
	    sock close
cc3bed115c0a definitions cleanup with stxOSDefs.h
penk
parents: 1342
diff changeset
   443
	]
cc3bed115c0a definitions cleanup with stxOSDefs.h
penk
parents: 1342
diff changeset
   444
									[exEnd]
1007
5267b5738779 UDP examples
Claus Gittinger <cg@exept.de>
parents: 1004
diff changeset
   445
5267b5738779 UDP examples
Claus Gittinger <cg@exept.de>
parents: 1004
diff changeset
   446
5267b5738779 UDP examples
Claus Gittinger <cg@exept.de>
parents: 1004
diff changeset
   447
    example (UDP await packet from a client and read some data):
1343
cc3bed115c0a definitions cleanup with stxOSDefs.h
penk
parents: 1342
diff changeset
   448
									[exBegin]
cc3bed115c0a definitions cleanup with stxOSDefs.h
penk
parents: 1342
diff changeset
   449
	|udpSock sock addr n dataBuffer|
cc3bed115c0a definitions cleanup with stxOSDefs.h
penk
parents: 1342
diff changeset
   450
1485
d8578cf3504b gcc3.3.1 insn-scheduler bug workaround
Claus Gittinger <cg@exept.de>
parents: 1474
diff changeset
   451
	udpSock := Socket newUDPserverAtPort:9999.
1343
cc3bed115c0a definitions cleanup with stxOSDefs.h
penk
parents: 1342
diff changeset
   452
	udpSock isNil ifTrue:[
cc3bed115c0a definitions cleanup with stxOSDefs.h
penk
parents: 1342
diff changeset
   453
	    Transcript showCR:'socket setup failed.'.
cc3bed115c0a definitions cleanup with stxOSDefs.h
penk
parents: 1342
diff changeset
   454
	] ifFalse:[
cc3bed115c0a definitions cleanup with stxOSDefs.h
penk
parents: 1342
diff changeset
   455
	    Transcript showCR:'wait'.
1485
d8578cf3504b gcc3.3.1 insn-scheduler bug workaround
Claus Gittinger <cg@exept.de>
parents: 1474
diff changeset
   456
	    udpSock readWait.
1343
cc3bed115c0a definitions cleanup with stxOSDefs.h
penk
parents: 1342
diff changeset
   457
cc3bed115c0a definitions cleanup with stxOSDefs.h
penk
parents: 1342
diff changeset
   458
	    addr := IPSocketAddress new.
1485
d8578cf3504b gcc3.3.1 insn-scheduler bug workaround
Claus Gittinger <cg@exept.de>
parents: 1474
diff changeset
   459
	    dataBuffer := ByteArray new:1000.
1343
cc3bed115c0a definitions cleanup with stxOSDefs.h
penk
parents: 1342
diff changeset
   460
	    n := udpSock receiveFrom:addr buffer:dataBuffer start:1 for:dataBuffer size.
cc3bed115c0a definitions cleanup with stxOSDefs.h
penk
parents: 1342
diff changeset
   461
	    n > 0 ifTrue:[
cc3bed115c0a definitions cleanup with stxOSDefs.h
penk
parents: 1342
diff changeset
   462
		Transcript showCR:('got: ' , n printString , 'bytes  from ' , addr printString).
cc3bed115c0a definitions cleanup with stxOSDefs.h
penk
parents: 1342
diff changeset
   463
		Transcript showCR:('data: ' , (dataBuffer copyTo:n) printString).
cc3bed115c0a definitions cleanup with stxOSDefs.h
penk
parents: 1342
diff changeset
   464
	    ] ifFalse:[
cc3bed115c0a definitions cleanup with stxOSDefs.h
penk
parents: 1342
diff changeset
   465
		Transcript showCR:'read failed'.
cc3bed115c0a definitions cleanup with stxOSDefs.h
penk
parents: 1342
diff changeset
   466
	    ].
cc3bed115c0a definitions cleanup with stxOSDefs.h
penk
parents: 1342
diff changeset
   467
cc3bed115c0a definitions cleanup with stxOSDefs.h
penk
parents: 1342
diff changeset
   468
	    Transcript showCR:'close'.
cc3bed115c0a definitions cleanup with stxOSDefs.h
penk
parents: 1342
diff changeset
   469
	    udpSock close
cc3bed115c0a definitions cleanup with stxOSDefs.h
penk
parents: 1342
diff changeset
   470
	]
cc3bed115c0a definitions cleanup with stxOSDefs.h
penk
parents: 1342
diff changeset
   471
									[exEnd]
1007
5267b5738779 UDP examples
Claus Gittinger <cg@exept.de>
parents: 1004
diff changeset
   472
    example (connect to above UDP server and send some data;
1343
cc3bed115c0a definitions cleanup with stxOSDefs.h
penk
parents: 1342
diff changeset
   473
									[exBegin]
cc3bed115c0a definitions cleanup with stxOSDefs.h
penk
parents: 1342
diff changeset
   474
	|sock|
cc3bed115c0a definitions cleanup with stxOSDefs.h
penk
parents: 1342
diff changeset
   475
cc3bed115c0a definitions cleanup with stxOSDefs.h
penk
parents: 1342
diff changeset
   476
	sock := Socket newUDP.
cc3bed115c0a definitions cleanup with stxOSDefs.h
penk
parents: 1342
diff changeset
   477
	sock isNil ifTrue:[
cc3bed115c0a definitions cleanup with stxOSDefs.h
penk
parents: 1342
diff changeset
   478
	    Transcript showCR:'nope'
cc3bed115c0a definitions cleanup with stxOSDefs.h
penk
parents: 1342
diff changeset
   479
	] ifFalse:[
cc3bed115c0a definitions cleanup with stxOSDefs.h
penk
parents: 1342
diff changeset
   480
	    sock sendTo:(IPSocketAddress new hostName:'localhost' port:9999) buffer:'hello world'.
cc3bed115c0a definitions cleanup with stxOSDefs.h
penk
parents: 1342
diff changeset
   481
	    sock close
cc3bed115c0a definitions cleanup with stxOSDefs.h
penk
parents: 1342
diff changeset
   482
	]
cc3bed115c0a definitions cleanup with stxOSDefs.h
penk
parents: 1342
diff changeset
   483
									[exEnd]
99
7d016cc30052 fixed & moved pingWalk from SNMPSession to here;
Claus Gittinger <cg@exept.de>
parents: 98
diff changeset
   484
7d016cc30052 fixed & moved pingWalk from SNMPSession to here;
Claus Gittinger <cg@exept.de>
parents: 98
diff changeset
   485
    example: pingWalk (try to ping hosts on the local network)
1343
cc3bed115c0a definitions cleanup with stxOSDefs.h
penk
parents: 1342
diff changeset
   486
									[exBegin]
cc3bed115c0a definitions cleanup with stxOSDefs.h
penk
parents: 1342
diff changeset
   487
	|myName myAddress list top hosts walkProcess port|
cc3bed115c0a definitions cleanup with stxOSDefs.h
penk
parents: 1342
diff changeset
   488
cc3bed115c0a definitions cleanup with stxOSDefs.h
penk
parents: 1342
diff changeset
   489
	myName := OperatingSystem getHostName.
cc3bed115c0a definitions cleanup with stxOSDefs.h
penk
parents: 1342
diff changeset
   490
	myAddress := Socket ipAddressOfHost:myName.
cc3bed115c0a definitions cleanup with stxOSDefs.h
penk
parents: 1342
diff changeset
   491
cc3bed115c0a definitions cleanup with stxOSDefs.h
penk
parents: 1342
diff changeset
   492
	port := Socket portOfService:'echo'.
cc3bed115c0a definitions cleanup with stxOSDefs.h
penk
parents: 1342
diff changeset
   493
	port isNil ifTrue:[
cc3bed115c0a definitions cleanup with stxOSDefs.h
penk
parents: 1342
diff changeset
   494
	    self error:'dont know echo port'.
cc3bed115c0a definitions cleanup with stxOSDefs.h
penk
parents: 1342
diff changeset
   495
	    ^ self
cc3bed115c0a definitions cleanup with stxOSDefs.h
penk
parents: 1342
diff changeset
   496
	].
cc3bed115c0a definitions cleanup with stxOSDefs.h
penk
parents: 1342
diff changeset
   497
cc3bed115c0a definitions cleanup with stxOSDefs.h
penk
parents: 1342
diff changeset
   498
	top := StandardSystemView new.
cc3bed115c0a definitions cleanup with stxOSDefs.h
penk
parents: 1342
diff changeset
   499
	top label:'PING net walk'.
cc3bed115c0a definitions cleanup with stxOSDefs.h
penk
parents: 1342
diff changeset
   500
cc3bed115c0a definitions cleanup with stxOSDefs.h
penk
parents: 1342
diff changeset
   501
	list := ScrollableView for:ListView in:top.
cc3bed115c0a definitions cleanup with stxOSDefs.h
penk
parents: 1342
diff changeset
   502
	list origin:0.0@0.0 corner:1.0@1.0.
cc3bed115c0a definitions cleanup with stxOSDefs.h
penk
parents: 1342
diff changeset
   503
cc3bed115c0a definitions cleanup with stxOSDefs.h
penk
parents: 1342
diff changeset
   504
	top openAndWait.
cc3bed115c0a definitions cleanup with stxOSDefs.h
penk
parents: 1342
diff changeset
   505
cc3bed115c0a definitions cleanup with stxOSDefs.h
penk
parents: 1342
diff changeset
   506
	walkProcess := [
cc3bed115c0a definitions cleanup with stxOSDefs.h
penk
parents: 1342
diff changeset
   507
	    |l low hi direction tryHostID dottedName hostName conn addr|
cc3bed115c0a definitions cleanup with stxOSDefs.h
penk
parents: 1342
diff changeset
   508
cc3bed115c0a definitions cleanup with stxOSDefs.h
penk
parents: 1342
diff changeset
   509
	    l := SortedCollection new.
cc3bed115c0a definitions cleanup with stxOSDefs.h
penk
parents: 1342
diff changeset
   510
cc3bed115c0a definitions cleanup with stxOSDefs.h
penk
parents: 1342
diff changeset
   511
	    ' only works with type C-net
cc3bed115c0a definitions cleanup with stxOSDefs.h
penk
parents: 1342
diff changeset
   512
	      the code below could simply do 1 to:254 do:[:hostID }
cc3bed115c0a definitions cleanup with stxOSDefs.h
penk
parents: 1342
diff changeset
   513
	      but, to probe likely hosts earlier, the probing is done
cc3bed115c0a definitions cleanup with stxOSDefs.h
penk
parents: 1342
diff changeset
   514
	      ping-pong like around my ip-address (assuming, that other machines
cc3bed115c0a definitions cleanup with stxOSDefs.h
penk
parents: 1342
diff changeset
   515
	      have numbers around my own)'.
cc3bed115c0a definitions cleanup with stxOSDefs.h
penk
parents: 1342
diff changeset
   516
cc3bed115c0a definitions cleanup with stxOSDefs.h
penk
parents: 1342
diff changeset
   517
	    low := hi := (myAddress at:4).
cc3bed115c0a definitions cleanup with stxOSDefs.h
penk
parents: 1342
diff changeset
   518
	    direction := 1.
cc3bed115c0a definitions cleanup with stxOSDefs.h
penk
parents: 1342
diff changeset
   519
cc3bed115c0a definitions cleanup with stxOSDefs.h
penk
parents: 1342
diff changeset
   520
	    [low > 0 or:[hi < 255]] whileTrue:[
cc3bed115c0a definitions cleanup with stxOSDefs.h
penk
parents: 1342
diff changeset
   521
		direction > 0 ifTrue:[
cc3bed115c0a definitions cleanup with stxOSDefs.h
penk
parents: 1342
diff changeset
   522
		    hi := hi + 1.
cc3bed115c0a definitions cleanup with stxOSDefs.h
penk
parents: 1342
diff changeset
   523
		    tryHostID := hi.
cc3bed115c0a definitions cleanup with stxOSDefs.h
penk
parents: 1342
diff changeset
   524
		    direction := -1.
cc3bed115c0a definitions cleanup with stxOSDefs.h
penk
parents: 1342
diff changeset
   525
		] ifFalse:[
cc3bed115c0a definitions cleanup with stxOSDefs.h
penk
parents: 1342
diff changeset
   526
		    low := low - 1.
cc3bed115c0a definitions cleanup with stxOSDefs.h
penk
parents: 1342
diff changeset
   527
		    tryHostID := low.
cc3bed115c0a definitions cleanup with stxOSDefs.h
penk
parents: 1342
diff changeset
   528
		    direction := 1.
cc3bed115c0a definitions cleanup with stxOSDefs.h
penk
parents: 1342
diff changeset
   529
		].
cc3bed115c0a definitions cleanup with stxOSDefs.h
penk
parents: 1342
diff changeset
   530
		(tryHostID between:1 and:254) ifTrue:[
cc3bed115c0a definitions cleanup with stxOSDefs.h
penk
parents: 1342
diff changeset
   531
		    dottedName := (myAddress at:1) printString
cc3bed115c0a definitions cleanup with stxOSDefs.h
penk
parents: 1342
diff changeset
   532
				  , '.' , (myAddress at:2) printString
cc3bed115c0a definitions cleanup with stxOSDefs.h
penk
parents: 1342
diff changeset
   533
				  , '.' , (myAddress at:3) printString
cc3bed115c0a definitions cleanup with stxOSDefs.h
penk
parents: 1342
diff changeset
   534
				  , '.' , tryHostID printString.
cc3bed115c0a definitions cleanup with stxOSDefs.h
penk
parents: 1342
diff changeset
   535
cc3bed115c0a definitions cleanup with stxOSDefs.h
penk
parents: 1342
diff changeset
   536
		    top label:'PING net walk - trying ' , dottedName.
cc3bed115c0a definitions cleanup with stxOSDefs.h
penk
parents: 1342
diff changeset
   537
cc3bed115c0a definitions cleanup with stxOSDefs.h
penk
parents: 1342
diff changeset
   538
		    top windowGroup withCursor:Cursor wait do:[
cc3bed115c0a definitions cleanup with stxOSDefs.h
penk
parents: 1342
diff changeset
   539
			conn := Socket newTCPclientToHost:dottedName port:port withTimeout:1000.
cc3bed115c0a definitions cleanup with stxOSDefs.h
penk
parents: 1342
diff changeset
   540
			conn notNil ifTrue:[
cc3bed115c0a definitions cleanup with stxOSDefs.h
penk
parents: 1342
diff changeset
   541
			    addr := Socket ipAddressOfHost:dottedName.
cc3bed115c0a definitions cleanup with stxOSDefs.h
penk
parents: 1342
diff changeset
   542
			    hostName := Socket hostWithIpAddress:addr.
cc3bed115c0a definitions cleanup with stxOSDefs.h
penk
parents: 1342
diff changeset
   543
			    hostName isNil ifTrue:[
cc3bed115c0a definitions cleanup with stxOSDefs.h
penk
parents: 1342
diff changeset
   544
				hostName :='?'
cc3bed115c0a definitions cleanup with stxOSDefs.h
penk
parents: 1342
diff changeset
   545
			    ].
1485
d8578cf3504b gcc3.3.1 insn-scheduler bug workaround
Claus Gittinger <cg@exept.de>
parents: 1474
diff changeset
   546
			    l add:(dottedName paddedTo:15 with:Character space)
d8578cf3504b gcc3.3.1 insn-scheduler bug workaround
Claus Gittinger <cg@exept.de>
parents: 1474
diff changeset
   547
				   , ' '
1343
cc3bed115c0a definitions cleanup with stxOSDefs.h
penk
parents: 1342
diff changeset
   548
				   , (hostName paddedTo:15 with:Character space)
cc3bed115c0a definitions cleanup with stxOSDefs.h
penk
parents: 1342
diff changeset
   549
				   , ' up & reachable'.
cc3bed115c0a definitions cleanup with stxOSDefs.h
penk
parents: 1342
diff changeset
   550
			    list list:l.
cc3bed115c0a definitions cleanup with stxOSDefs.h
penk
parents: 1342
diff changeset
   551
			    conn close.
cc3bed115c0a definitions cleanup with stxOSDefs.h
penk
parents: 1342
diff changeset
   552
			]
cc3bed115c0a definitions cleanup with stxOSDefs.h
penk
parents: 1342
diff changeset
   553
		    ].
cc3bed115c0a definitions cleanup with stxOSDefs.h
penk
parents: 1342
diff changeset
   554
		].
cc3bed115c0a definitions cleanup with stxOSDefs.h
penk
parents: 1342
diff changeset
   555
	    ].
cc3bed115c0a definitions cleanup with stxOSDefs.h
penk
parents: 1342
diff changeset
   556
	    top label:'PING reachable hosts'.
cc3bed115c0a definitions cleanup with stxOSDefs.h
penk
parents: 1342
diff changeset
   557
	] forkAt:(Processor userBackgroundPriority).
cc3bed115c0a definitions cleanup with stxOSDefs.h
penk
parents: 1342
diff changeset
   558
	walkProcess name:'ping net walker'.
cc3bed115c0a definitions cleanup with stxOSDefs.h
penk
parents: 1342
diff changeset
   559
									[exEnd]
cc3bed115c0a definitions cleanup with stxOSDefs.h
penk
parents: 1342
diff changeset
   560
cc3bed115c0a definitions cleanup with stxOSDefs.h
penk
parents: 1342
diff changeset
   561
1485
d8578cf3504b gcc3.3.1 insn-scheduler bug workaround
Claus Gittinger <cg@exept.de>
parents: 1474
diff changeset
   562
	This example creates a simple UDP server that accepts
d8578cf3504b gcc3.3.1 insn-scheduler bug workaround
Claus Gittinger <cg@exept.de>
parents: 1474
diff changeset
   563
	single packets from anybody and broadcasts them to all
d8578cf3504b gcc3.3.1 insn-scheduler bug workaround
Claus Gittinger <cg@exept.de>
parents: 1474
diff changeset
   564
	clients that have connected so far.
1343
cc3bed115c0a definitions cleanup with stxOSDefs.h
penk
parents: 1342
diff changeset
   565
cc3bed115c0a definitions cleanup with stxOSDefs.h
penk
parents: 1342
diff changeset
   566
									[exBegin]
cc3bed115c0a definitions cleanup with stxOSDefs.h
penk
parents: 1342
diff changeset
   567
	| socket address buffer msgSize clients |
cc3bed115c0a definitions cleanup with stxOSDefs.h
penk
parents: 1342
diff changeset
   568
	clients := Set new.
cc3bed115c0a definitions cleanup with stxOSDefs.h
penk
parents: 1342
diff changeset
   569
	address := IPSocketAddress new.
cc3bed115c0a definitions cleanup with stxOSDefs.h
penk
parents: 1342
diff changeset
   570
	buffer := String new: 1024.
cc3bed115c0a definitions cleanup with stxOSDefs.h
penk
parents: 1342
diff changeset
   571
cc3bed115c0a definitions cleanup with stxOSDefs.h
penk
parents: 1342
diff changeset
   572
	socket := self newUDPserverAtPort: 6666.
cc3bed115c0a definitions cleanup with stxOSDefs.h
penk
parents: 1342
diff changeset
   573
cc3bed115c0a definitions cleanup with stxOSDefs.h
penk
parents: 1342
diff changeset
   574
	Transcript showCR: 'server starting'.
cc3bed115c0a definitions cleanup with stxOSDefs.h
penk
parents: 1342
diff changeset
   575
cc3bed115c0a definitions cleanup with stxOSDefs.h
penk
parents: 1342
diff changeset
   576
	[
cc3bed115c0a definitions cleanup with stxOSDefs.h
penk
parents: 1342
diff changeset
   577
	    [true] whileTrue: [
cc3bed115c0a definitions cleanup with stxOSDefs.h
penk
parents: 1342
diff changeset
   578
		(socket readWaitWithTimeoutMs: 200) ifFalse: [
1485
d8578cf3504b gcc3.3.1 insn-scheduler bug workaround
Claus Gittinger <cg@exept.de>
parents: 1474
diff changeset
   579
		    msgSize := socket
d8578cf3504b gcc3.3.1 insn-scheduler bug workaround
Claus Gittinger <cg@exept.de>
parents: 1474
diff changeset
   580
			    receiveFrom: address
d8578cf3504b gcc3.3.1 insn-scheduler bug workaround
Claus Gittinger <cg@exept.de>
parents: 1474
diff changeset
   581
			    buffer: buffer
d8578cf3504b gcc3.3.1 insn-scheduler bug workaround
Claus Gittinger <cg@exept.de>
parents: 1474
diff changeset
   582
			    start: 1
1343
cc3bed115c0a definitions cleanup with stxOSDefs.h
penk
parents: 1342
diff changeset
   583
			    for: buffer size.
cc3bed115c0a definitions cleanup with stxOSDefs.h
penk
parents: 1342
diff changeset
   584
cc3bed115c0a definitions cleanup with stxOSDefs.h
penk
parents: 1342
diff changeset
   585
		    clients add: address copy.
1485
d8578cf3504b gcc3.3.1 insn-scheduler bug workaround
Claus Gittinger <cg@exept.de>
parents: 1474
diff changeset
   586
		    clients do: [ :clientAddress |
d8578cf3504b gcc3.3.1 insn-scheduler bug workaround
Claus Gittinger <cg@exept.de>
parents: 1474
diff changeset
   587
			    socket
d8578cf3504b gcc3.3.1 insn-scheduler bug workaround
Claus Gittinger <cg@exept.de>
parents: 1474
diff changeset
   588
				    sendTo: clientAddress
d8578cf3504b gcc3.3.1 insn-scheduler bug workaround
Claus Gittinger <cg@exept.de>
parents: 1474
diff changeset
   589
				    buffer: buffer
d8578cf3504b gcc3.3.1 insn-scheduler bug workaround
Claus Gittinger <cg@exept.de>
parents: 1474
diff changeset
   590
				    start: 1
1343
cc3bed115c0a definitions cleanup with stxOSDefs.h
penk
parents: 1342
diff changeset
   591
				    for: msgSize]]
cc3bed115c0a definitions cleanup with stxOSDefs.h
penk
parents: 1342
diff changeset
   592
	    ]
cc3bed115c0a definitions cleanup with stxOSDefs.h
penk
parents: 1342
diff changeset
   593
	] valueNowOrOnUnwindDo:[
cc3bed115c0a definitions cleanup with stxOSDefs.h
penk
parents: 1342
diff changeset
   594
	    Transcript showCR: 'server shutting down'.
cc3bed115c0a definitions cleanup with stxOSDefs.h
penk
parents: 1342
diff changeset
   595
	    socket close
cc3bed115c0a definitions cleanup with stxOSDefs.h
penk
parents: 1342
diff changeset
   596
	]
cc3bed115c0a definitions cleanup with stxOSDefs.h
penk
parents: 1342
diff changeset
   597
									[exEnd]
817
eda0065cbd47 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 814
diff changeset
   598
eda0065cbd47 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 814
diff changeset
   599
   send a datagram to above server:
1343
cc3bed115c0a definitions cleanup with stxOSDefs.h
penk
parents: 1342
diff changeset
   600
									[exBegin]
cc3bed115c0a definitions cleanup with stxOSDefs.h
penk
parents: 1342
diff changeset
   601
cc3bed115c0a definitions cleanup with stxOSDefs.h
penk
parents: 1342
diff changeset
   602
	| socket address buffer host msg |
cc3bed115c0a definitions cleanup with stxOSDefs.h
penk
parents: 1342
diff changeset
   603
cc3bed115c0a definitions cleanup with stxOSDefs.h
penk
parents: 1342
diff changeset
   604
	host := Dialog
cc3bed115c0a definitions cleanup with stxOSDefs.h
penk
parents: 1342
diff changeset
   605
		request: 'What is the name of the server''s host?'
cc3bed115c0a definitions cleanup with stxOSDefs.h
penk
parents: 1342
diff changeset
   606
		initialAnswer: 'localhost'.
cc3bed115c0a definitions cleanup with stxOSDefs.h
penk
parents: 1342
diff changeset
   607
cc3bed115c0a definitions cleanup with stxOSDefs.h
penk
parents: 1342
diff changeset
   608
	socket := self newUDP.
cc3bed115c0a definitions cleanup with stxOSDefs.h
penk
parents: 1342
diff changeset
   609
cc3bed115c0a definitions cleanup with stxOSDefs.h
penk
parents: 1342
diff changeset
   610
	address := IPSocketAddress hostName: host port: 6666.
cc3bed115c0a definitions cleanup with stxOSDefs.h
penk
parents: 1342
diff changeset
   611
cc3bed115c0a definitions cleanup with stxOSDefs.h
penk
parents: 1342
diff changeset
   612
	buffer := ByteArray new: 1000.
cc3bed115c0a definitions cleanup with stxOSDefs.h
penk
parents: 1342
diff changeset
   613
	[
cc3bed115c0a definitions cleanup with stxOSDefs.h
penk
parents: 1342
diff changeset
   614
	    [(msg := Dialog request: 'Say something') isEmpty] whileFalse:[
cc3bed115c0a definitions cleanup with stxOSDefs.h
penk
parents: 1342
diff changeset
   615
		| replySize stream |
cc3bed115c0a definitions cleanup with stxOSDefs.h
penk
parents: 1342
diff changeset
   616
cc3bed115c0a definitions cleanup with stxOSDefs.h
penk
parents: 1342
diff changeset
   617
		socket writeWait.
cc3bed115c0a definitions cleanup with stxOSDefs.h
penk
parents: 1342
diff changeset
   618
		stream := buffer writeStream.
cc3bed115c0a definitions cleanup with stxOSDefs.h
penk
parents: 1342
diff changeset
   619
		stream nextPutAll: msg.
cc3bed115c0a definitions cleanup with stxOSDefs.h
penk
parents: 1342
diff changeset
   620
		socket sendTo:address buffer:buffer start:1 for:stream position.
cc3bed115c0a definitions cleanup with stxOSDefs.h
penk
parents: 1342
diff changeset
   621
		socket readWait.
cc3bed115c0a definitions cleanup with stxOSDefs.h
penk
parents: 1342
diff changeset
   622
cc3bed115c0a definitions cleanup with stxOSDefs.h
penk
parents: 1342
diff changeset
   623
		replySize := socket receiveFrom:address buffer:buffer.
cc3bed115c0a definitions cleanup with stxOSDefs.h
penk
parents: 1342
diff changeset
   624
		replySize > 0 ifTrue: [
cc3bed115c0a definitions cleanup with stxOSDefs.h
penk
parents: 1342
diff changeset
   625
		    Transcript cr; nextPutAll: 'Server acknowledged: '.
1485
d8578cf3504b gcc3.3.1 insn-scheduler bug workaround
Claus Gittinger <cg@exept.de>
parents: 1474
diff changeset
   626
		    Transcript show: ((buffer copyFrom: 1 to: replySize) asString)
1343
cc3bed115c0a definitions cleanup with stxOSDefs.h
penk
parents: 1342
diff changeset
   627
		]
cc3bed115c0a definitions cleanup with stxOSDefs.h
penk
parents: 1342
diff changeset
   628
	    ]
cc3bed115c0a definitions cleanup with stxOSDefs.h
penk
parents: 1342
diff changeset
   629
	] valueNowOrOnUnwindDo: [socket close].
cc3bed115c0a definitions cleanup with stxOSDefs.h
penk
parents: 1342
diff changeset
   630
	Transcript cr
cc3bed115c0a definitions cleanup with stxOSDefs.h
penk
parents: 1342
diff changeset
   631
									[exEnd]
1316
ffe05bfee9b5 example
Claus Gittinger <cg@exept.de>
parents: 1313
diff changeset
   632
ffe05bfee9b5 example
Claus Gittinger <cg@exept.de>
parents: 1313
diff changeset
   633
ffe05bfee9b5 example
Claus Gittinger <cg@exept.de>
parents: 1313
diff changeset
   634
   loopBack:
1343
cc3bed115c0a definitions cleanup with stxOSDefs.h
penk
parents: 1342
diff changeset
   635
									[exBegin]
cc3bed115c0a definitions cleanup with stxOSDefs.h
penk
parents: 1342
diff changeset
   636
cc3bed115c0a definitions cleanup with stxOSDefs.h
penk
parents: 1342
diff changeset
   637
	|readerTask readingSocket writingSocket|
cc3bed115c0a definitions cleanup with stxOSDefs.h
penk
parents: 1342
diff changeset
   638
cc3bed115c0a definitions cleanup with stxOSDefs.h
penk
parents: 1342
diff changeset
   639
	readingSocket := self newTCPserverAtPort:9999.
1485
d8578cf3504b gcc3.3.1 insn-scheduler bug workaround
Claus Gittinger <cg@exept.de>
parents: 1474
diff changeset
   640
	readerTask :=
1343
cc3bed115c0a definitions cleanup with stxOSDefs.h
penk
parents: 1342
diff changeset
   641
	    [
cc3bed115c0a definitions cleanup with stxOSDefs.h
penk
parents: 1342
diff changeset
   642
		|connection|
cc3bed115c0a definitions cleanup with stxOSDefs.h
penk
parents: 1342
diff changeset
   643
cc3bed115c0a definitions cleanup with stxOSDefs.h
penk
parents: 1342
diff changeset
   644
		readingSocket listenFor:1.
cc3bed115c0a definitions cleanup with stxOSDefs.h
penk
parents: 1342
diff changeset
   645
		connection := readingSocket accept.
cc3bed115c0a definitions cleanup with stxOSDefs.h
penk
parents: 1342
diff changeset
   646
		readingSocket close.
cc3bed115c0a definitions cleanup with stxOSDefs.h
penk
parents: 1342
diff changeset
   647
		[connection atEnd] whileFalse:[
cc3bed115c0a definitions cleanup with stxOSDefs.h
penk
parents: 1342
diff changeset
   648
		    Transcript showCR:(connection nextLine).
cc3bed115c0a definitions cleanup with stxOSDefs.h
penk
parents: 1342
diff changeset
   649
		].
cc3bed115c0a definitions cleanup with stxOSDefs.h
penk
parents: 1342
diff changeset
   650
		connection close.
cc3bed115c0a definitions cleanup with stxOSDefs.h
penk
parents: 1342
diff changeset
   651
	    ] fork.
cc3bed115c0a definitions cleanup with stxOSDefs.h
penk
parents: 1342
diff changeset
   652
1485
d8578cf3504b gcc3.3.1 insn-scheduler bug workaround
Claus Gittinger <cg@exept.de>
parents: 1474
diff changeset
   653
	Delay waitForSeconds:1.
1343
cc3bed115c0a definitions cleanup with stxOSDefs.h
penk
parents: 1342
diff changeset
   654
	writingSocket := self newTCPclientToHost:(OperatingSystem getHostName) port:9999.
cc3bed115c0a definitions cleanup with stxOSDefs.h
penk
parents: 1342
diff changeset
   655
	writingSocket nextPutLine:'Hello'.
cc3bed115c0a definitions cleanup with stxOSDefs.h
penk
parents: 1342
diff changeset
   656
	writingSocket nextPutLine:'World'.
cc3bed115c0a definitions cleanup with stxOSDefs.h
penk
parents: 1342
diff changeset
   657
	writingSocket close.
cc3bed115c0a definitions cleanup with stxOSDefs.h
penk
parents: 1342
diff changeset
   658
									[exEnd]
25
996051271ce9 *** empty log message ***
claus
parents: 21
diff changeset
   659
"
996051271ce9 *** empty log message ***
claus
parents: 21
diff changeset
   660
! !
996051271ce9 *** empty log message ***
claus
parents: 21
diff changeset
   661
1462
5602fce52b42 squeak stuff
Claus Gittinger <cg@exept.de>
parents: 1413
diff changeset
   662
!Socket class methodsFor:'instance creation'!
126
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
   663
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
   664
domain:domainSymbol type:type
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
   665
    "create a socket for domain and type -
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
   666
     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
   667
     Domain must be one of the symbols:
819
4cc15700d123 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 817
diff changeset
   668
	#inet, #unix, #appletalk, #decnet, #xns, ...;
4cc15700d123 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 817
diff changeset
   669
     Type must be:
4cc15700d123 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 817
diff changeset
   670
	#stream, #datagram or #raw
126
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
   671
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
   672
     XXX: currently only the #inet domain is supported"
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
   673
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
   674
    ^ self new domain:domainSymbol type:type
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
   675
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
   676
    "
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
   677
     Socket domain:#inet type:#stream
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
   678
     Socket domain:#inet type:#datagram
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
   679
     Socket domain:#unix type:#stream
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
   680
     Socket domain:#appletalk type:#stream
819
4cc15700d123 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 817
diff changeset
   681
     Socket domain:#decnet type:#stream
869
a6e5cbe9f558 preps for AF_IRDA
Claus Gittinger <cg@exept.de>
parents: 867
diff changeset
   682
     Socket domain:#irda type:#stream
126
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
   683
    "
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
   684
!
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
   685
576
13acab81fad0 more ST80 compatibility
ca
parents: 572
diff changeset
   686
new
13acab81fad0 more ST80 compatibility
ca
parents: 572
diff changeset
   687
    "create a TCP socket"
13acab81fad0 more ST80 compatibility
ca
parents: 572
diff changeset
   688
1485
d8578cf3504b gcc3.3.1 insn-scheduler bug workaround
Claus Gittinger <cg@exept.de>
parents: 1474
diff changeset
   689
    ^ super new buffered:false
576
13acab81fad0 more ST80 compatibility
ca
parents: 572
diff changeset
   690
!
13acab81fad0 more ST80 compatibility
ca
parents: 572
diff changeset
   691
126
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
   692
newTCP
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
   693
    "create a TCP socket - no binding or other setup is done,
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
   694
     neither connect nor connect-wait is done."
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
   695
1485
d8578cf3504b gcc3.3.1 insn-scheduler bug workaround
Claus Gittinger <cg@exept.de>
parents: 1474
diff changeset
   696
    ^ self new domain:#inet type:#stream
126
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
   697
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
   698
    "Socket newUDP"
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
   699
!
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
   700
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
   701
newTCP:aServiceOrNil
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
   702
    "create a TCP socket for a service -
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
   703
     neither connect nor connect-wait is done."
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
   704
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
   705
    |newSock|
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
   706
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
   707
    newSock := self newTCP.
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
   708
    (newSock notNil and:[aServiceOrNil notNil]) ifTrue:[
1911
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
   709
        [
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
   710
            newSock bindTo:(self portOfService:aServiceOrNil) address:nil.
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
   711
        ] ifCurtailed:[
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
   712
            newSock close.
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
   713
        ]
126
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
   714
    ].
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
   715
    ^ newSock
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
   716
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
   717
1911
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
   718
    "
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
   719
        Socket newTCP:'nntp'.
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
   720
        Socket newTCP:9995.
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
   721
    "
126
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
   722
!
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
   723
576
13acab81fad0 more ST80 compatibility
ca
parents: 572
diff changeset
   724
newTCPclientToAddress:aHostAddress port:aService
13acab81fad0 more ST80 compatibility
ca
parents: 572
diff changeset
   725
    "create a new TCP client socket connecting to a service.
13acab81fad0 more ST80 compatibility
ca
parents: 572
diff changeset
   726
     Return a socket instance if ok, nil on failure.
13acab81fad0 more ST80 compatibility
ca
parents: 572
diff changeset
   727
     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
   728
     not the whole smalltalk).
576
13acab81fad0 more ST80 compatibility
ca
parents: 572
diff changeset
   729
     See also: #newTCPclientToAddress:port:withTimeout:"
13acab81fad0 more ST80 compatibility
ca
parents: 572
diff changeset
   730
13acab81fad0 more ST80 compatibility
ca
parents: 572
diff changeset
   731
    ^ self newTCPclientToAddress:aHostAddress port:aService withTimeout:nil
13acab81fad0 more ST80 compatibility
ca
parents: 572
diff changeset
   732
!
13acab81fad0 more ST80 compatibility
ca
parents: 572
diff changeset
   733
13acab81fad0 more ST80 compatibility
ca
parents: 572
diff changeset
   734
newTCPclientToAddress:aHostAddress port:aService withTimeout:millis
13acab81fad0 more ST80 compatibility
ca
parents: 572
diff changeset
   735
    "create a new TCP client socket connecting to a service.
13acab81fad0 more ST80 compatibility
ca
parents: 572
diff changeset
   736
     Return a socket instance if ok, nil on failure.
13acab81fad0 more ST80 compatibility
ca
parents: 572
diff changeset
   737
     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
   738
     and return nil."
576
13acab81fad0 more ST80 compatibility
ca
parents: 572
diff changeset
   739
13acab81fad0 more ST80 compatibility
ca
parents: 572
diff changeset
   740
    ^ self newTCPclientToHost:aHostAddress port:aService withTimeout:millis
13acab81fad0 more ST80 compatibility
ca
parents: 572
diff changeset
   741
!
13acab81fad0 more ST80 compatibility
ca
parents: 572
diff changeset
   742
126
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
   743
newTCPclientToHost:hostname port:aService
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
   744
    "create a new TCP client socket connecting to a service.
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
   745
     Return a socket instance if ok, nil on failure.
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
   746
     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
   747
     not the whole smalltalk).
126
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
   748
     See also: #newTCPclientToHost:port:withTimeout:"
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
   749
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
   750
    ^ self newTCPclientToHost:hostname port:aService withTimeout:nil
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
   751
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
   752
    "
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
   753
      Socket newTCPclientToHost:'localhost' port:'nntp'
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
   754
    "
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
    "Created: 31.10.1995 / 18:54:11 / cg"
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
   757
!
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
   758
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
   759
newTCPclientToHost:hostname port:aService withTimeout:millis
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
   760
    "create a new TCP client socket connecting to a service.
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
   761
     Return a socket instance if ok, nil on failure.
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
   762
     If the millis arg is nonNil, stop trying to connect after that many milliseconds
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
   763
     and return nil.."
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
   764
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
   765
    |newSock|
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
   766
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
   767
    newSock := self newTCP.
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
   768
    newSock notNil ifTrue:[
1485
d8578cf3504b gcc3.3.1 insn-scheduler bug workaround
Claus Gittinger <cg@exept.de>
parents: 1474
diff changeset
   769
	(newSock connectTo:hostname
d8578cf3504b gcc3.3.1 insn-scheduler bug workaround
Claus Gittinger <cg@exept.de>
parents: 1474
diff changeset
   770
		 port:(self portOfService:aService protocol:'tcp')
648
58e11a70ddaf gethostbyname behaves strange, if a name-server lookup is involved.
Claus Gittinger <cg@exept.de>
parents: 617
diff changeset
   771
		 withTimeout:millis
58e11a70ddaf gethostbyname behaves strange, if a name-server lookup is involved.
Claus Gittinger <cg@exept.de>
parents: 617
diff changeset
   772
	) ifFalse:[
58e11a70ddaf gethostbyname behaves strange, if a name-server lookup is involved.
Claus Gittinger <cg@exept.de>
parents: 617
diff changeset
   773
	    newSock close.
58e11a70ddaf gethostbyname behaves strange, if a name-server lookup is involved.
Claus Gittinger <cg@exept.de>
parents: 617
diff changeset
   774
	    ^ nil
58e11a70ddaf gethostbyname behaves strange, if a name-server lookup is involved.
Claus Gittinger <cg@exept.de>
parents: 617
diff changeset
   775
	]
126
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
   776
    ].
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
   777
    ^ newSock
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
   778
"
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
   779
same as:
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
   780
    ^ (self new) for:hostname port:(self portOfService:aPort).
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
   781
"
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
   782
    "
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
   783
      Socket newTCPclientToHost:'slsv6bt' port:'nntp'
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
   784
      Socket newTCPclientToHost:'localhost' port:'nntp' withTimeout:1000
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
   785
    "
604
b302a21afece Remove redundant code.
Stefan Vogel <sv@exept.de>
parents: 589
diff changeset
   786
b302a21afece Remove redundant code.
Stefan Vogel <sv@exept.de>
parents: 589
diff changeset
   787
    "Modified: / 16.1.1998 / 09:47:06 / stefan"
126
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
   788
!
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
   789
506
11ef93d12870 support anonymous (OS_specified) ports. (for FTP-protocol)
Claus Gittinger <cg@exept.de>
parents: 486
diff changeset
   790
newTCPserverAtAnonymousPort
11ef93d12870 support anonymous (OS_specified) ports. (for FTP-protocol)
Claus Gittinger <cg@exept.de>
parents: 486
diff changeset
   791
    "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
   792
     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
   793
811
72d9ac1a7f95 comments
Claus Gittinger <cg@exept.de>
parents: 809
diff changeset
   794
    ^ self newTCPserverAtPort:0
506
11ef93d12870 support anonymous (OS_specified) ports. (for FTP-protocol)
Claus Gittinger <cg@exept.de>
parents: 486
diff changeset
   795
11ef93d12870 support anonymous (OS_specified) ports. (for FTP-protocol)
Claus Gittinger <cg@exept.de>
parents: 486
diff changeset
   796
!
11ef93d12870 support anonymous (OS_specified) ports. (for FTP-protocol)
Claus Gittinger <cg@exept.de>
parents: 486
diff changeset
   797
126
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
   798
newTCPserverAtPort:aService
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
   799
    "create a new TCP server socket providing service."
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
   800
1911
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
   801
    ^ self newTCP:aService
126
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
   802
!
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
   803
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
   804
newUDP
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
   805
    "create a UDP socket - no binding or other setup is done,
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
   806
     neither connect nor connect-wait is done."
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
   807
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
   808
    ^ self new domain:#inet type:#datagram
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
   809
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
   810
    "Socket newUDP"
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
   811
!
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
   812
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
   813
newUDP:aServiceOrNil
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
   814
    "create a UDP socket for a service -
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
   815
     neither connect nor connect-wait is done."
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
    |newSock|
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
   818
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
   819
    newSock := self newUDP.
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
   820
    (newSock notNil and:[aServiceOrNil notNil]) ifTrue:[
1911
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
   821
        [
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
   822
            newSock bindTo:(self portOfService:aServiceOrNil) address:nil.
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
   823
        ] ifCurtailed:[
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
   824
            newSock close.
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
   825
        ]
126
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
   826
    ].
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
   827
    ^ newSock
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
   828
1911
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
   829
    "
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
   830
        Socket newUDP:nil.
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
   831
        Socket newUDP:'rwho'.
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
   832
    "
126
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
   833
!
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
newUDPserverAtPort:aService
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
   836
    "create a new UDP server socket providing service."
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
    ^ self newUDP:aService
126
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
   839
!
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
   840
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
   841
newUNIX
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
   842
    "create a UNIX domain socket - no binding or other setup is done,
811
72d9ac1a7f95 comments
Claus Gittinger <cg@exept.de>
parents: 809
diff changeset
   843
     neither connect nor connect-wait is done.
72d9ac1a7f95 comments
Claus Gittinger <cg@exept.de>
parents: 809
diff changeset
   844
     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
   845
     return nil."
126
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
   846
1485
d8578cf3504b gcc3.3.1 insn-scheduler bug workaround
Claus Gittinger <cg@exept.de>
parents: 1474
diff changeset
   847
    ^ self new domain:#unix type:#stream
126
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
   848
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
   849
    "
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
   850
     Socket newUNIX
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
   851
    "
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
   852
!
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
   853
1485
d8578cf3504b gcc3.3.1 insn-scheduler bug workaround
Claus Gittinger <cg@exept.de>
parents: 1474
diff changeset
   854
newUNIXclientTo:pathName
126
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
   855
    "create a new UNIX client socket connecting to a pathname.
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
   856
     Return a socket instance if ok, nil on failure.
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
   857
     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
   858
     not the whole smalltalk).
811
72d9ac1a7f95 comments
Claus Gittinger <cg@exept.de>
parents: 809
diff changeset
   859
     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
   860
     return nil.
126
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
   861
     See also: #newUNIXclientTo:withTimeout:"
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
   862
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
   863
    ^ self newUNIXclientTo:pathName withTimeout:nil
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
   864
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
   865
!
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
   866
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
   867
newUNIXclientTo:pathName withTimeout:millis
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
   868
    "create a new UNIX client socket connecting to a pathname.
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
   869
     Return a socket instance if ok, nil on failure.
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
   870
     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
   871
     and return nil.
72d9ac1a7f95 comments
Claus Gittinger <cg@exept.de>
parents: 809
diff changeset
   872
     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
   873
     return nil."
126
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
   874
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
   875
    |newSock|
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
   876
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
   877
    newSock := self newUNIX.
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
   878
    newSock notNil ifTrue:[
1485
d8578cf3504b gcc3.3.1 insn-scheduler bug workaround
Claus Gittinger <cg@exept.de>
parents: 1474
diff changeset
   879
	(newSock connectTo:'localhost' port:pathName withTimeout:millis) ifFalse:[
d8578cf3504b gcc3.3.1 insn-scheduler bug workaround
Claus Gittinger <cg@exept.de>
parents: 1474
diff changeset
   880
	    newSock close.
d8578cf3504b gcc3.3.1 insn-scheduler bug workaround
Claus Gittinger <cg@exept.de>
parents: 1474
diff changeset
   881
	    ^ nil
d8578cf3504b gcc3.3.1 insn-scheduler bug workaround
Claus Gittinger <cg@exept.de>
parents: 1474
diff changeset
   882
	]
126
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
   883
    ].
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
   884
    ^ newSock
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
   885
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
   886
    "
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
   887
     |s|
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
   888
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
   889
     s := Socket newUNIXclientTo:'/tmp/foo'
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
   890
    "
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
   891
!
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
   892
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
   893
newUNIXserverAt:pathName
811
72d9ac1a7f95 comments
Claus Gittinger <cg@exept.de>
parents: 809
diff changeset
   894
    "create a new UNIX server socket providing service at a pathname.
72d9ac1a7f95 comments
Claus Gittinger <cg@exept.de>
parents: 809
diff changeset
   895
     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
   896
     return nil."
126
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
   897
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
   898
    |newSock|
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
   899
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
   900
    newSock := self newUNIX.
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
   901
    newSock notNil ifTrue:[
1911
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
   902
        [
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
   903
            newSock bindTo:pathName address:nil.
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
   904
        ] ifCurtailed:[
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
   905
            newSock close.
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
   906
        ]
126
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
   907
    ].
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
   908
    ^ newSock
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
   909
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
   910
    "
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
   911
     |s s2|
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
   912
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
   913
     s := Socket newUNIXserverAt:'/tmp/foo'.
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
   914
     s listenFor:5.
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
   915
     s2 := s accept.
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
   916
    "
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
   917
! !
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
   918
1462
5602fce52b42 squeak stuff
Claus Gittinger <cg@exept.de>
parents: 1413
diff changeset
   919
!Socket class methodsFor:'Compatibility-ST80'!
5602fce52b42 squeak stuff
Claus Gittinger <cg@exept.de>
parents: 1413
diff changeset
   920
5602fce52b42 squeak stuff
Claus Gittinger <cg@exept.de>
parents: 1413
diff changeset
   921
family:domainSymbol type:typeSymbol
5602fce52b42 squeak stuff
Claus Gittinger <cg@exept.de>
parents: 1413
diff changeset
   922
    "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
   923
     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
   924
     Type must be #stream, #datagram or #raw."
1462
5602fce52b42 squeak stuff
Claus Gittinger <cg@exept.de>
parents: 1413
diff changeset
   925
5602fce52b42 squeak stuff
Claus Gittinger <cg@exept.de>
parents: 1413
diff changeset
   926
    ^ self domain:domainSymbol type:typeSymbol
5602fce52b42 squeak stuff
Claus Gittinger <cg@exept.de>
parents: 1413
diff changeset
   927
5602fce52b42 squeak stuff
Claus Gittinger <cg@exept.de>
parents: 1413
diff changeset
   928
    "
5602fce52b42 squeak stuff
Claus Gittinger <cg@exept.de>
parents: 1413
diff changeset
   929
     Socket family:#inet type:#stream
5602fce52b42 squeak stuff
Claus Gittinger <cg@exept.de>
parents: 1413
diff changeset
   930
     Socket family:#inet type:#datagram
5602fce52b42 squeak stuff
Claus Gittinger <cg@exept.de>
parents: 1413
diff changeset
   931
     Socket family:#unix type:#stream
5602fce52b42 squeak stuff
Claus Gittinger <cg@exept.de>
parents: 1413
diff changeset
   932
    "
5602fce52b42 squeak stuff
Claus Gittinger <cg@exept.de>
parents: 1413
diff changeset
   933
!
5602fce52b42 squeak stuff
Claus Gittinger <cg@exept.de>
parents: 1413
diff changeset
   934
5602fce52b42 squeak stuff
Claus Gittinger <cg@exept.de>
parents: 1413
diff changeset
   935
getHostname
5602fce52b42 squeak stuff
Claus Gittinger <cg@exept.de>
parents: 1413
diff changeset
   936
    "return the computers hostname string"
5602fce52b42 squeak stuff
Claus Gittinger <cg@exept.de>
parents: 1413
diff changeset
   937
5602fce52b42 squeak stuff
Claus Gittinger <cg@exept.de>
parents: 1413
diff changeset
   938
    ^ OperatingSystem getHostName
5602fce52b42 squeak stuff
Claus Gittinger <cg@exept.de>
parents: 1413
diff changeset
   939
5602fce52b42 squeak stuff
Claus Gittinger <cg@exept.de>
parents: 1413
diff changeset
   940
    "Created: / 27.2.1998 / 02:32:17 / cg"
5602fce52b42 squeak stuff
Claus Gittinger <cg@exept.de>
parents: 1413
diff changeset
   941
!
5602fce52b42 squeak stuff
Claus Gittinger <cg@exept.de>
parents: 1413
diff changeset
   942
5602fce52b42 squeak stuff
Claus Gittinger <cg@exept.de>
parents: 1413
diff changeset
   943
sockStream
5602fce52b42 squeak stuff
Claus Gittinger <cg@exept.de>
parents: 1413
diff changeset
   944
    "return the type code for stream sockets"
5602fce52b42 squeak stuff
Claus Gittinger <cg@exept.de>
parents: 1413
diff changeset
   945
5602fce52b42 squeak stuff
Claus Gittinger <cg@exept.de>
parents: 1413
diff changeset
   946
    ^ #stream
5602fce52b42 squeak stuff
Claus Gittinger <cg@exept.de>
parents: 1413
diff changeset
   947
! !
5602fce52b42 squeak stuff
Claus Gittinger <cg@exept.de>
parents: 1413
diff changeset
   948
1600
f3acd5382fa1 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1584
diff changeset
   949
!Socket class methodsFor:'Compatibility-Squeak'!
f3acd5382fa1 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1584
diff changeset
   950
f3acd5382fa1 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1584
diff changeset
   951
initializeNetwork
f3acd5382fa1 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1584
diff changeset
   952
    "/ intentionally left blank here
f3acd5382fa1 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1584
diff changeset
   953
!
f3acd5382fa1 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1584
diff changeset
   954
f3acd5382fa1 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1584
diff changeset
   955
wildcardPort
f3acd5382fa1 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1584
diff changeset
   956
    ^ nil
f3acd5382fa1 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1584
diff changeset
   957
! !
f3acd5382fa1 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1584
diff changeset
   958
1462
5602fce52b42 squeak stuff
Claus Gittinger <cg@exept.de>
parents: 1413
diff changeset
   959
!Socket class methodsFor:'Compatibility-VW'!
5602fce52b42 squeak stuff
Claus Gittinger <cg@exept.de>
parents: 1413
diff changeset
   960
1485
d8578cf3504b gcc3.3.1 insn-scheduler bug workaround
Claus Gittinger <cg@exept.de>
parents: 1474
diff changeset
   961
AF_INET
1462
5602fce52b42 squeak stuff
Claus Gittinger <cg@exept.de>
parents: 1413
diff changeset
   962
    ^ #AF_INET
5602fce52b42 squeak stuff
Claus Gittinger <cg@exept.de>
parents: 1413
diff changeset
   963
!
5602fce52b42 squeak stuff
Claus Gittinger <cg@exept.de>
parents: 1413
diff changeset
   964
5602fce52b42 squeak stuff
Claus Gittinger <cg@exept.de>
parents: 1413
diff changeset
   965
SOCK_STREAM
5602fce52b42 squeak stuff
Claus Gittinger <cg@exept.de>
parents: 1413
diff changeset
   966
    ^ #SOCK_STREAM
5602fce52b42 squeak stuff
Claus Gittinger <cg@exept.de>
parents: 1413
diff changeset
   967
! !
5602fce52b42 squeak stuff
Claus Gittinger <cg@exept.de>
parents: 1413
diff changeset
   968
5602fce52b42 squeak stuff
Claus Gittinger <cg@exept.de>
parents: 1413
diff changeset
   969
!Socket class methodsFor:'Signal constants'!
5602fce52b42 squeak stuff
Claus Gittinger <cg@exept.de>
parents: 1413
diff changeset
   970
5602fce52b42 squeak stuff
Claus Gittinger <cg@exept.de>
parents: 1413
diff changeset
   971
brokenConnectionSignal
5602fce52b42 squeak stuff
Claus Gittinger <cg@exept.de>
parents: 1413
diff changeset
   972
    "return the signal used to tell broken connections.
5602fce52b42 squeak stuff
Claus Gittinger <cg@exept.de>
parents: 1413
diff changeset
   973
     Since in unix, this is the same as the broken pipe signal,
5602fce52b42 squeak stuff
Claus Gittinger <cg@exept.de>
parents: 1413
diff changeset
   974
     return that one.
5602fce52b42 squeak stuff
Claus Gittinger <cg@exept.de>
parents: 1413
diff changeset
   975
     (for other Operatingsystems, this may change ..)"
5602fce52b42 squeak stuff
Claus Gittinger <cg@exept.de>
parents: 1413
diff changeset
   976
5602fce52b42 squeak stuff
Claus Gittinger <cg@exept.de>
parents: 1413
diff changeset
   977
    ^ PipeStream brokenPipeSignal
5602fce52b42 squeak stuff
Claus Gittinger <cg@exept.de>
parents: 1413
diff changeset
   978
!
5602fce52b42 squeak stuff
Claus Gittinger <cg@exept.de>
parents: 1413
diff changeset
   979
5602fce52b42 squeak stuff
Claus Gittinger <cg@exept.de>
parents: 1413
diff changeset
   980
invalidArgumentsSignal
5602fce52b42 squeak stuff
Claus Gittinger <cg@exept.de>
parents: 1413
diff changeset
   981
    "dummy for compatibility"
5602fce52b42 squeak stuff
Claus Gittinger <cg@exept.de>
parents: 1413
diff changeset
   982
5602fce52b42 squeak stuff
Claus Gittinger <cg@exept.de>
parents: 1413
diff changeset
   983
    ^ self errorSignal
5602fce52b42 squeak stuff
Claus Gittinger <cg@exept.de>
parents: 1413
diff changeset
   984
! !
5602fce52b42 squeak stuff
Claus Gittinger <cg@exept.de>
parents: 1413
diff changeset
   985
5602fce52b42 squeak stuff
Claus Gittinger <cg@exept.de>
parents: 1413
diff changeset
   986
!Socket class methodsFor:'debugging'!
5602fce52b42 squeak stuff
Claus Gittinger <cg@exept.de>
parents: 1413
diff changeset
   987
5602fce52b42 squeak stuff
Claus Gittinger <cg@exept.de>
parents: 1413
diff changeset
   988
debug:aBoolean
5602fce52b42 squeak stuff
Claus Gittinger <cg@exept.de>
parents: 1413
diff changeset
   989
    "turn on/off internal debugprints.
5602fce52b42 squeak stuff
Claus Gittinger <cg@exept.de>
parents: 1413
diff changeset
   990
     This method is for ST/X debugging only and
5602fce52b42 squeak stuff
Claus Gittinger <cg@exept.de>
parents: 1413
diff changeset
   991
     may  be removed in later versions"
5602fce52b42 squeak stuff
Claus Gittinger <cg@exept.de>
parents: 1413
diff changeset
   992
5602fce52b42 squeak stuff
Claus Gittinger <cg@exept.de>
parents: 1413
diff changeset
   993
%{  /* NOCONTEXT */
5602fce52b42 squeak stuff
Claus Gittinger <cg@exept.de>
parents: 1413
diff changeset
   994
5602fce52b42 squeak stuff
Claus Gittinger <cg@exept.de>
parents: 1413
diff changeset
   995
    __debugging__ = (aBoolean == true);
5602fce52b42 squeak stuff
Claus Gittinger <cg@exept.de>
parents: 1413
diff changeset
   996
%}
5602fce52b42 squeak stuff
Claus Gittinger <cg@exept.de>
parents: 1413
diff changeset
   997
    "
5602fce52b42 squeak stuff
Claus Gittinger <cg@exept.de>
parents: 1413
diff changeset
   998
     Socket debug:true
5602fce52b42 squeak stuff
Claus Gittinger <cg@exept.de>
parents: 1413
diff changeset
   999
     Socket debug:false
5602fce52b42 squeak stuff
Claus Gittinger <cg@exept.de>
parents: 1413
diff changeset
  1000
    "
5602fce52b42 squeak stuff
Claus Gittinger <cg@exept.de>
parents: 1413
diff changeset
  1001
! !
5602fce52b42 squeak stuff
Claus Gittinger <cg@exept.de>
parents: 1413
diff changeset
  1002
1911
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
  1003
!Socket class methodsFor:'obsolete'!
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
  1004
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
  1005
connectTo:service on:host
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
  1006
    <resource: #obsolete>
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
  1007
    "standard & easy client setup:
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
  1008
        create new client tcp socket, bind and connect;
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
  1009
        return the socket.
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
  1010
     The thread blocks (interruptable), until the connection is established."
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
  1011
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
  1012
    ^ self newTCPclientToHost:host port:(self portOfService:service).
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
  1013
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
  1014
    "
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
  1015
     Socket connectTo:9995 on:'clam'
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
  1016
     Socket connectTo:4711 on:'exept'
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
  1017
     Socket connectTo:'finger' on:'clam'
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
  1018
     Socket connectTo:'ftp' on:'exept'
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
  1019
     Socket connectTo:'nntp' on:(OperatingSystem getEnvironment:'NNTPSERVER')
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
  1020
    "
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
  1021
!
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
  1022
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
  1023
networkLongOrderIsMSB
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
  1024
    "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
  1025
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
  1026
    <resource: #obsolete>
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
  1027
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
  1028
    ^ true
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
  1029
!
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
  1030
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
  1031
networkShortOrderIsMSB
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
  1032
    "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
  1033
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
  1034
    <resource: #obsolete>
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
  1035
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
  1036
    ^ true
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
  1037
!
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
  1038
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
  1039
provide:aService
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
  1040
    "standard & easy server setup:
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
  1041
     create a new TCP server socket providing a service."
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
  1042
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
  1043
    <resource:#obsolete>
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
  1044
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
  1045
    |newSock|
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
  1046
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
  1047
    self obsoleteMethodWarning:'use #newTCPserverAtPort: / #listen'.
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
  1048
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
  1049
    newSock := self newTCPserverAtPort:(self portOfService:aService).
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
  1050
    newSock notNil ifTrue:[
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
  1051
	newSock listenFor:5.
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
  1052
    ].
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
  1053
    ^ newSock
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
  1054
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
  1055
    "
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
  1056
     Socket provide:9995
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
  1057
     (Socket provide:9996) accept
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
  1058
     Socket provide:'nntp'
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
  1059
    "
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
  1060
! !
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
  1061
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
  1062
!Socket class methodsFor:'obsolete host queries'!
525
5891518d17a3 appletalk support - untested
Claus Gittinger <cg@exept.de>
parents: 524
diff changeset
  1063
5891518d17a3 appletalk support - untested
Claus Gittinger <cg@exept.de>
parents: 524
diff changeset
  1064
appletalkAddressOfHost:aHostName
1911
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
  1065
    <resource: #obsolete>
525
5891518d17a3 appletalk support - untested
Claus Gittinger <cg@exept.de>
parents: 524
diff changeset
  1066
    "return the APPLETALK address for a hostname as a byteArray,
819
4cc15700d123 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 817
diff changeset
  1067
     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
  1068
     followed by the node byte.
525
5891518d17a3 appletalk support - untested
Claus Gittinger <cg@exept.de>
parents: 524
diff changeset
  1069
     If the host is unknown, return nil.
812
c8101ea70e6c *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 811
diff changeset
  1070
     This is the reverse operation to #hostWithAppletalkAddress:.
c8101ea70e6c *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 811
diff changeset
  1071
     WARNING: untested code - I have no appletalk to test this."
525
5891518d17a3 appletalk support - untested
Claus Gittinger <cg@exept.de>
parents: 524
diff changeset
  1072
1485
d8578cf3504b gcc3.3.1 insn-scheduler bug workaround
Claus Gittinger <cg@exept.de>
parents: 1474
diff changeset
  1073
    NameLookupError
d8578cf3504b gcc3.3.1 insn-scheduler bug workaround
Claus Gittinger <cg@exept.de>
parents: 1474
diff changeset
  1074
	handle:[:ex |
1343
cc3bed115c0a definitions cleanup with stxOSDefs.h
penk
parents: 1342
diff changeset
  1075
	    ^ nil
cc3bed115c0a definitions cleanup with stxOSDefs.h
penk
parents: 1342
diff changeset
  1076
	]
cc3bed115c0a definitions cleanup with stxOSDefs.h
penk
parents: 1342
diff changeset
  1077
	do:[
cc3bed115c0a definitions cleanup with stxOSDefs.h
penk
parents: 1342
diff changeset
  1078
	    ^ (AppletalkSocketAddress hostName:aHostName) address
cc3bed115c0a definitions cleanup with stxOSDefs.h
penk
parents: 1342
diff changeset
  1079
	]
525
5891518d17a3 appletalk support - untested
Claus Gittinger <cg@exept.de>
parents: 524
diff changeset
  1080
!
5891518d17a3 appletalk support - untested
Claus Gittinger <cg@exept.de>
parents: 524
diff changeset
  1081
1278
7251c65b8d38 use nameLookup from SocketAddress for all addr-families
Claus Gittinger <cg@exept.de>
parents: 1274
diff changeset
  1082
hostWithAppletalkAddress:addrByteArray
1911
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
  1083
    <resource: #obsolete>
525
5891518d17a3 appletalk support - untested
Claus Gittinger <cg@exept.de>
parents: 524
diff changeset
  1084
    "return the hostname for an APPLETALK address.
5891518d17a3 appletalk support - untested
Claus Gittinger <cg@exept.de>
parents: 524
diff changeset
  1085
     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
  1086
     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
  1087
     The last byte is the node number.
5891518d17a3 appletalk support - untested
Claus Gittinger <cg@exept.de>
parents: 524
diff changeset
  1088
     Nil is returned for an unknown host or if its not an appletalk host.
812
c8101ea70e6c *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 811
diff changeset
  1089
     This is is the reverse operation to #appletalkAddressOfHost:.
c8101ea70e6c *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 811
diff changeset
  1090
     WARNING: untested code - I have no appletalk to test this."
525
5891518d17a3 appletalk support - untested
Claus Gittinger <cg@exept.de>
parents: 524
diff changeset
  1091
1485
d8578cf3504b gcc3.3.1 insn-scheduler bug workaround
Claus Gittinger <cg@exept.de>
parents: 1474
diff changeset
  1092
    NameLookupError
d8578cf3504b gcc3.3.1 insn-scheduler bug workaround
Claus Gittinger <cg@exept.de>
parents: 1474
diff changeset
  1093
	handle:[:ex |
1343
cc3bed115c0a definitions cleanup with stxOSDefs.h
penk
parents: 1342
diff changeset
  1094
	    ^ nil
cc3bed115c0a definitions cleanup with stxOSDefs.h
penk
parents: 1342
diff changeset
  1095
	]
cc3bed115c0a definitions cleanup with stxOSDefs.h
penk
parents: 1342
diff changeset
  1096
	do:[
cc3bed115c0a definitions cleanup with stxOSDefs.h
penk
parents: 1342
diff changeset
  1097
	    ^ (AppletalkSocketAddress hostAddress:addrByteArray) hostName
cc3bed115c0a definitions cleanup with stxOSDefs.h
penk
parents: 1342
diff changeset
  1098
	]
1278
7251c65b8d38 use nameLookup from SocketAddress for all addr-families
Claus Gittinger <cg@exept.de>
parents: 1274
diff changeset
  1099
525
5891518d17a3 appletalk support - untested
Claus Gittinger <cg@exept.de>
parents: 524
diff changeset
  1100
    "
1278
7251c65b8d38 use nameLookup from SocketAddress for all addr-families
Claus Gittinger <cg@exept.de>
parents: 1274
diff changeset
  1101
     Socket appletalkAddressOfHost:'yourAppleHere'
1485
d8578cf3504b gcc3.3.1 insn-scheduler bug workaround
Claus Gittinger <cg@exept.de>
parents: 1474
diff changeset
  1102
     Socket hostWithAppletalkAddress:#[1 2 3]
525
5891518d17a3 appletalk support - untested
Claus Gittinger <cg@exept.de>
parents: 524
diff changeset
  1103
     "
126
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
  1104
!
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
  1105
1278
7251c65b8d38 use nameLookup from SocketAddress for all addr-families
Claus Gittinger <cg@exept.de>
parents: 1274
diff changeset
  1106
hostWithIpAddress:addrByteArray
1911
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
  1107
    <resource: #obsolete>
126
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
  1108
    "return the hostname for an IP (internet-) address.
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
  1109
     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
  1110
     the network bytes come first (no matter what the local byteorder is).
525
5891518d17a3 appletalk support - untested
Claus Gittinger <cg@exept.de>
parents: 524
diff changeset
  1111
     Nil is returned for an unknown host or if its not an internet host.
126
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
  1112
     This is the reverse operation to #ipAddressOfHost:."
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
  1113
1485
d8578cf3504b gcc3.3.1 insn-scheduler bug workaround
Claus Gittinger <cg@exept.de>
parents: 1474
diff changeset
  1114
    NameLookupError
d8578cf3504b gcc3.3.1 insn-scheduler bug workaround
Claus Gittinger <cg@exept.de>
parents: 1474
diff changeset
  1115
	handle:[:ex |
1343
cc3bed115c0a definitions cleanup with stxOSDefs.h
penk
parents: 1342
diff changeset
  1116
	    ^ nil
cc3bed115c0a definitions cleanup with stxOSDefs.h
penk
parents: 1342
diff changeset
  1117
	]
cc3bed115c0a definitions cleanup with stxOSDefs.h
penk
parents: 1342
diff changeset
  1118
	do:[
cc3bed115c0a definitions cleanup with stxOSDefs.h
penk
parents: 1342
diff changeset
  1119
	    ^ (IPSocketAddress hostAddress:addrByteArray) hostName
cc3bed115c0a definitions cleanup with stxOSDefs.h
penk
parents: 1342
diff changeset
  1120
	]
126
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
  1121
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
  1122
    "
1485
d8578cf3504b gcc3.3.1 insn-scheduler bug workaround
Claus Gittinger <cg@exept.de>
parents: 1474
diff changeset
  1123
     Socket ipAddressOfHost:'clam'
d8578cf3504b gcc3.3.1 insn-scheduler bug workaround
Claus Gittinger <cg@exept.de>
parents: 1474
diff changeset
  1124
     Socket hostWithIpAddress:(Socket ipAddressOfHost:'clam')
d8578cf3504b gcc3.3.1 insn-scheduler bug workaround
Claus Gittinger <cg@exept.de>
parents: 1474
diff changeset
  1125
     Socket ipAddressOfHost:'porty'
1278
7251c65b8d38 use nameLookup from SocketAddress for all addr-families
Claus Gittinger <cg@exept.de>
parents: 1274
diff changeset
  1126
     Socket hostWithIpAddress:(Socket ipAddressOfHost:'porty')
1485
d8578cf3504b gcc3.3.1 insn-scheduler bug workaround
Claus Gittinger <cg@exept.de>
parents: 1474
diff changeset
  1127
     Socket hostWithIpAddress:#[1 2 3 4]
d8578cf3504b gcc3.3.1 insn-scheduler bug workaround
Claus Gittinger <cg@exept.de>
parents: 1474
diff changeset
  1128
     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
  1129
     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
  1130
     Socket hostWithIpAddress:(Socket ipAddressOfHost:'www.altavista.com')
126
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
  1131
     "
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
  1132
!
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
  1133
1278
7251c65b8d38 use nameLookup from SocketAddress for all addr-families
Claus Gittinger <cg@exept.de>
parents: 1274
diff changeset
  1134
hostWithIpV6Address:addrByteArray
1911
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
  1135
    <resource: #obsolete>
820
b6860c3660c8 Fix address sizes when calling gethostbyaddr
Stefan Vogel <sv@exept.de>
parents: 819
diff changeset
  1136
    "return the hostname for an IPv6 (internet-) address.
b6860c3660c8 Fix address sizes when calling gethostbyaddr
Stefan Vogel <sv@exept.de>
parents: 819
diff changeset
  1137
     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
  1138
     the network bytes come first (no matter what the local byteorder is).
b6860c3660c8 Fix address sizes when calling gethostbyaddr
Stefan Vogel <sv@exept.de>
parents: 819
diff changeset
  1139
     Nil is returned for an unknown host or if its not an internet host.
b6860c3660c8 Fix address sizes when calling gethostbyaddr
Stefan Vogel <sv@exept.de>
parents: 819
diff changeset
  1140
     This is the reverse operation to #ipV6AddressOfHost:."
b6860c3660c8 Fix address sizes when calling gethostbyaddr
Stefan Vogel <sv@exept.de>
parents: 819
diff changeset
  1141
1485
d8578cf3504b gcc3.3.1 insn-scheduler bug workaround
Claus Gittinger <cg@exept.de>
parents: 1474
diff changeset
  1142
    NameLookupError
d8578cf3504b gcc3.3.1 insn-scheduler bug workaround
Claus Gittinger <cg@exept.de>
parents: 1474
diff changeset
  1143
	handle:[:ex |
1343
cc3bed115c0a definitions cleanup with stxOSDefs.h
penk
parents: 1342
diff changeset
  1144
	    ^ nil
cc3bed115c0a definitions cleanup with stxOSDefs.h
penk
parents: 1342
diff changeset
  1145
	]
cc3bed115c0a definitions cleanup with stxOSDefs.h
penk
parents: 1342
diff changeset
  1146
	do:[
cc3bed115c0a definitions cleanup with stxOSDefs.h
penk
parents: 1342
diff changeset
  1147
	    ^ (IPv6SocketAddress hostAddress:addrByteArray) hostName
cc3bed115c0a definitions cleanup with stxOSDefs.h
penk
parents: 1342
diff changeset
  1148
	]
820
b6860c3660c8 Fix address sizes when calling gethostbyaddr
Stefan Vogel <sv@exept.de>
parents: 819
diff changeset
  1149
b6860c3660c8 Fix address sizes when calling gethostbyaddr
Stefan Vogel <sv@exept.de>
parents: 819
diff changeset
  1150
    "
1485
d8578cf3504b gcc3.3.1 insn-scheduler bug workaround
Claus Gittinger <cg@exept.de>
parents: 1474
diff changeset
  1151
     Socket ipV6AddressOfHost:'clam'
d8578cf3504b gcc3.3.1 insn-scheduler bug workaround
Claus Gittinger <cg@exept.de>
parents: 1474
diff changeset
  1152
     Socket hostWithIpV6Address:(Socket ipAddressOfHost:'clam')
d8578cf3504b gcc3.3.1 insn-scheduler bug workaround
Claus Gittinger <cg@exept.de>
parents: 1474
diff changeset
  1153
     Socket ipV6AddressOfHost:'porty'
d8578cf3504b gcc3.3.1 insn-scheduler bug workaround
Claus Gittinger <cg@exept.de>
parents: 1474
diff changeset
  1154
     Socket hostWithIpV6Address:(Socket ipAddressOfHost:'porty')
d8578cf3504b gcc3.3.1 insn-scheduler bug workaround
Claus Gittinger <cg@exept.de>
parents: 1474
diff changeset
  1155
     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
  1156
     Socket ipV6AddressOfHost:'www.exept.de'
820
b6860c3660c8 Fix address sizes when calling gethostbyaddr
Stefan Vogel <sv@exept.de>
parents: 819
diff changeset
  1157
     "
b6860c3660c8 Fix address sizes when calling gethostbyaddr
Stefan Vogel <sv@exept.de>
parents: 819
diff changeset
  1158
!
b6860c3660c8 Fix address sizes when calling gethostbyaddr
Stefan Vogel <sv@exept.de>
parents: 819
diff changeset
  1159
6
claus
parents: 4
diff changeset
  1160
ipAddressOfHost:aHostName
1911
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
  1161
    <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
  1162
    "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
  1163
     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
  1164
     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
  1165
     This is the reverse operation to #hostWithIpAddress:."
6
claus
parents: 4
diff changeset
  1166
1485
d8578cf3504b gcc3.3.1 insn-scheduler bug workaround
Claus Gittinger <cg@exept.de>
parents: 1474
diff changeset
  1167
    NameLookupError
d8578cf3504b gcc3.3.1 insn-scheduler bug workaround
Claus Gittinger <cg@exept.de>
parents: 1474
diff changeset
  1168
	handle:[:ex |
1343
cc3bed115c0a definitions cleanup with stxOSDefs.h
penk
parents: 1342
diff changeset
  1169
	    ^ nil
cc3bed115c0a definitions cleanup with stxOSDefs.h
penk
parents: 1342
diff changeset
  1170
	]
cc3bed115c0a definitions cleanup with stxOSDefs.h
penk
parents: 1342
diff changeset
  1171
	do:[
cc3bed115c0a definitions cleanup with stxOSDefs.h
penk
parents: 1342
diff changeset
  1172
	    ^ (IPSocketAddress hostName:aHostName) address
cc3bed115c0a definitions cleanup with stxOSDefs.h
penk
parents: 1342
diff changeset
  1173
	]
21
33eb5ffad09d *** empty log message ***
claus
parents: 8
diff changeset
  1174
71
claus
parents: 63
diff changeset
  1175
    "
1485
d8578cf3504b gcc3.3.1 insn-scheduler bug workaround
Claus Gittinger <cg@exept.de>
parents: 1474
diff changeset
  1176
     Socket ipAddressOfHost:'localhost'
d8578cf3504b gcc3.3.1 insn-scheduler bug workaround
Claus Gittinger <cg@exept.de>
parents: 1474
diff changeset
  1177
     Socket ipAddressOfHost:'exept'
d8578cf3504b gcc3.3.1 insn-scheduler bug workaround
Claus Gittinger <cg@exept.de>
parents: 1474
diff changeset
  1178
     Socket ipAddressOfHost:'1.2.3.4'
1274
f257a1b16b4d use naemLookup from SocketAddress for ipv6
Claus Gittinger <cg@exept.de>
parents: 1263
diff changeset
  1179
     Socket ipAddressOfHost:'193.15.16.17'
1485
d8578cf3504b gcc3.3.1 insn-scheduler bug workaround
Claus Gittinger <cg@exept.de>
parents: 1474
diff changeset
  1180
     Socket ipAddressOfHost:'josef'
d8578cf3504b gcc3.3.1 insn-scheduler bug workaround
Claus Gittinger <cg@exept.de>
parents: 1474
diff changeset
  1181
     Socket ipAddressOfHost:'styx.com'
d8578cf3504b gcc3.3.1 insn-scheduler bug workaround
Claus Gittinger <cg@exept.de>
parents: 1474
diff changeset
  1182
     Socket hostWithIpAddress:(Socket ipAddressOfHost:'localhost')
d8578cf3504b gcc3.3.1 insn-scheduler bug workaround
Claus Gittinger <cg@exept.de>
parents: 1474
diff changeset
  1183
     Socket ipAddressOfHost:(Socket hostWithIpAddress:'127.0.0.1')
71
claus
parents: 63
diff changeset
  1184
    "
819
4cc15700d123 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 817
diff changeset
  1185
!
4cc15700d123 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 817
diff changeset
  1186
4cc15700d123 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 817
diff changeset
  1187
ipV6AddressOfHost:aHostName
1911
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
  1188
    <resource: #obsolete>
819
4cc15700d123 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 817
diff changeset
  1189
    "return the IPv6 (internet-) number for a hostname as a byteArray,
4cc15700d123 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 817
diff changeset
  1190
     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
  1191
     If the host is unknown, return nil.
4cc15700d123 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 817
diff changeset
  1192
     This is the reverse operation to #hostWithIpV6Address:."
4cc15700d123 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 817
diff changeset
  1193
1485
d8578cf3504b gcc3.3.1 insn-scheduler bug workaround
Claus Gittinger <cg@exept.de>
parents: 1474
diff changeset
  1194
    NameLookupError
d8578cf3504b gcc3.3.1 insn-scheduler bug workaround
Claus Gittinger <cg@exept.de>
parents: 1474
diff changeset
  1195
	handle:[:ex |
1343
cc3bed115c0a definitions cleanup with stxOSDefs.h
penk
parents: 1342
diff changeset
  1196
	    ^ nil
cc3bed115c0a definitions cleanup with stxOSDefs.h
penk
parents: 1342
diff changeset
  1197
	]
cc3bed115c0a definitions cleanup with stxOSDefs.h
penk
parents: 1342
diff changeset
  1198
	do:[
cc3bed115c0a definitions cleanup with stxOSDefs.h
penk
parents: 1342
diff changeset
  1199
	    ^ (IPv6SocketAddress hostName:aHostName) address
cc3bed115c0a definitions cleanup with stxOSDefs.h
penk
parents: 1342
diff changeset
  1200
	]
819
4cc15700d123 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 817
diff changeset
  1201
4cc15700d123 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 817
diff changeset
  1202
    "
1485
d8578cf3504b gcc3.3.1 insn-scheduler bug workaround
Claus Gittinger <cg@exept.de>
parents: 1474
diff changeset
  1203
     Socket ipV6AddressOfHost:'localhost'
d8578cf3504b gcc3.3.1 insn-scheduler bug workaround
Claus Gittinger <cg@exept.de>
parents: 1474
diff changeset
  1204
     Socket ipV6AddressOfHost:'exept'
d8578cf3504b gcc3.3.1 insn-scheduler bug workaround
Claus Gittinger <cg@exept.de>
parents: 1474
diff changeset
  1205
     Socket ipV6AddressOfHost:'exept.exept.de'
d8578cf3504b gcc3.3.1 insn-scheduler bug workaround
Claus Gittinger <cg@exept.de>
parents: 1474
diff changeset
  1206
     Socket ipV6AddressOfHost:'www.google.de'
d8578cf3504b gcc3.3.1 insn-scheduler bug workaround
Claus Gittinger <cg@exept.de>
parents: 1474
diff changeset
  1207
     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
  1208
     Socket ipV6AddressOfHost:'josef'
d8578cf3504b gcc3.3.1 insn-scheduler bug workaround
Claus Gittinger <cg@exept.de>
parents: 1474
diff changeset
  1209
     Socket ipV6AddressOfHost:'styx.com'
d8578cf3504b gcc3.3.1 insn-scheduler bug workaround
Claus Gittinger <cg@exept.de>
parents: 1474
diff changeset
  1210
     Socket hostWithIpV6Address:(Socket ipV6AddressOfHost:'localhost')
d8578cf3504b gcc3.3.1 insn-scheduler bug workaround
Claus Gittinger <cg@exept.de>
parents: 1474
diff changeset
  1211
     Socket ipV6AddressOfHost:(Socket hostV6WithIpAddress:'127.0.0.1')
819
4cc15700d123 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 817
diff changeset
  1212
    "
531
ca4c73813531 category changes
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
  1213
! !
ca4c73813531 category changes
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
  1214
ca4c73813531 category changes
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
  1215
!Socket class methodsFor:'queries'!
ca4c73813531 category changes
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
  1216
ca4c73813531 category changes
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
  1217
domainOfProtocol:aProtocol
ca4c73813531 category changes
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
  1218
    "given a protocols name (i.e. tcp, udp etc) return the domain.
ca4c73813531 category changes
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
  1219
     This method needs more ... - or is there a way to get this from the system ?"
ca4c73813531 category changes
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
  1220
ca4c73813531 category changes
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
  1221
    "
ca4c73813531 category changes
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
  1222
     tcp/ip stuff
ca4c73813531 category changes
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
  1223
    "
ca4c73813531 category changes
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
  1224
    (aProtocol = 'tcp') ifTrue:[^ #inet].
ca4c73813531 category changes
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
  1225
    (aProtocol = 'udp') ifTrue:[^ #inet].
ca4c73813531 category changes
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
  1226
    (aProtocol = 'ip')  ifTrue:[^ #inet].
ca4c73813531 category changes
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
  1227
    "
ca4c73813531 category changes
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
  1228
     unix domain
ca4c73813531 category changes
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
  1229
    "
ca4c73813531 category changes
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
  1230
    (aProtocol = 'ud')  ifTrue:[^ #unix].
ca4c73813531 category changes
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
  1231
ca4c73813531 category changes
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
  1232
    "
ca4c73813531 category changes
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
  1233
     add x25 stuff (if any) here ...
ca4c73813531 category changes
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
  1234
    "
ca4c73813531 category changes
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
  1235
    "
ca4c73813531 category changes
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
  1236
     add appletalk stuff (if any) here ...
ca4c73813531 category changes
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
  1237
    "
ca4c73813531 category changes
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
  1238
    "
ca4c73813531 category changes
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
  1239
     add other stuff (if any) here ...
ca4c73813531 category changes
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
  1240
    "
ca4c73813531 category changes
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
  1241
    ^ nil
ca4c73813531 category changes
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
  1242
ca4c73813531 category changes
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
  1243
    "
ca4c73813531 category changes
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
  1244
     Socket domainOfProtocol:'tcp'
ca4c73813531 category changes
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
  1245
     Socket domainOfProtocol:'ucp'
ca4c73813531 category changes
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
  1246
     Socket domainOfProtocol:(Socket protocolOfService:'nntp')
ca4c73813531 category changes
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
  1247
     Socket domainOfProtocol:(Socket protocolOfService:'echo')
ca4c73813531 category changes
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
  1248
    "
6
claus
parents: 4
diff changeset
  1249
!
claus
parents: 4
diff changeset
  1250
1260
9a8fb2391174 instance creation of peer refactored
Claus Gittinger <cg@exept.de>
parents: 1235
diff changeset
  1251
peerFromDomain:domain name:peerName port:port
9a8fb2391174 instance creation of peer refactored
Claus Gittinger <cg@exept.de>
parents: 1235
diff changeset
  1252
    |addrClass|
9a8fb2391174 instance creation of peer refactored
Claus Gittinger <cg@exept.de>
parents: 1235
diff changeset
  1253
9a8fb2391174 instance creation of peer refactored
Claus Gittinger <cg@exept.de>
parents: 1235
diff changeset
  1254
    addrClass := self socketAddressClassForDomain:domain.
1263
23161346a162 no longer callBack into sockets getHostName/getAddress code.
Claus Gittinger <cg@exept.de>
parents: 1260
diff changeset
  1255
    ^ 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
  1256
!
7e5f2f6b177d getHostByAddr - call is now done lazy, when the socket is asked for the peer
Claus Gittinger <cg@exept.de>
parents: 1186
diff changeset
  1257
7e5f2f6b177d getHostByAddr - call is now done lazy, when the socket is asked for the peer
Claus Gittinger <cg@exept.de>
parents: 1186
diff changeset
  1258
peerNameFromDomain:domain peer:peer
1260
9a8fb2391174 instance creation of peer refactored
Claus Gittinger <cg@exept.de>
parents: 1235
diff changeset
  1259
    |addrClass|
9a8fb2391174 instance creation of peer refactored
Claus Gittinger <cg@exept.de>
parents: 1235
diff changeset
  1260
9a8fb2391174 instance creation of peer refactored
Claus Gittinger <cg@exept.de>
parents: 1235
diff changeset
  1261
    addrClass := self socketAddressClassForDomain:domain.
9a8fb2391174 instance creation of peer refactored
Claus Gittinger <cg@exept.de>
parents: 1235
diff changeset
  1262
    ^ 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
  1263
!
7e5f2f6b177d getHostByAddr - call is now done lazy, when the socket is asked for the peer
Claus Gittinger <cg@exept.de>
parents: 1186
diff changeset
  1264
0
1cf8d1747859 Initial revision
claus
parents:
diff changeset
  1265
portOfService:aNameOrNumber
819
4cc15700d123 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 817
diff changeset
  1266
    "returns the port-number for a given IP-service
0
1cf8d1747859 Initial revision
claus
parents:
diff changeset
  1267
     or nil if no such service exists;
1cf8d1747859 Initial revision
claus
parents:
diff changeset
  1268
     - used to convert service names to portNumbers"
1cf8d1747859 Initial revision
claus
parents:
diff changeset
  1269
91
Claus Gittinger <cg@exept.de>
parents: 85
diff changeset
  1270
    ^ self portOfService:aNameOrNumber protocol:nil
Claus Gittinger <cg@exept.de>
parents: 85
diff changeset
  1271
28
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1272
    "
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1273
     Socket portOfService:'finger'
1485
d8578cf3504b gcc3.3.1 insn-scheduler bug workaround
Claus Gittinger <cg@exept.de>
parents: 1474
diff changeset
  1274
     Socket portOfService:'nntp'
d8578cf3504b gcc3.3.1 insn-scheduler bug workaround
Claus Gittinger <cg@exept.de>
parents: 1474
diff changeset
  1275
     Socket portOfService:'echo'
d8578cf3504b gcc3.3.1 insn-scheduler bug workaround
Claus Gittinger <cg@exept.de>
parents: 1474
diff changeset
  1276
     Socket portOfService:'snmp'
28
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1277
    "
0
1cf8d1747859 Initial revision
claus
parents:
diff changeset
  1278
!
1cf8d1747859 Initial revision
claus
parents:
diff changeset
  1279
91
Claus Gittinger <cg@exept.de>
parents: 85
diff changeset
  1280
portOfService:aNameOrNumber protocol:aProtocol
819
4cc15700d123 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 817
diff changeset
  1281
    "returns the port-number for a given IP-service
91
Claus Gittinger <cg@exept.de>
parents: 85
diff changeset
  1282
     or nil if no such service exists;
Claus Gittinger <cg@exept.de>
parents: 85
diff changeset
  1283
     - used to convert service names to portNumbers"
Claus Gittinger <cg@exept.de>
parents: 85
diff changeset
  1284
1499
1ff98f9bc58f Unlimitedstack for some methods which call getXXXByName().
Stefan Vogel <sv@exept.de>
parents: 1486
diff changeset
  1285
%{ /* UNLIMITEDSTACK */
418
317e55c6c281 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 403
diff changeset
  1286
#ifndef NO_SOCKET
91
Claus Gittinger <cg@exept.de>
parents: 85
diff changeset
  1287
    struct servent *servent = NULL;
Claus Gittinger <cg@exept.de>
parents: 85
diff changeset
  1288
    char *protocol;
Claus Gittinger <cg@exept.de>
parents: 85
diff changeset
  1289
    int tryBoth = 0;
524
8287da54eccf more empty code for other domains;
Claus Gittinger <cg@exept.de>
parents: 513
diff changeset
  1290
    short portNo;
91
Claus Gittinger <cg@exept.de>
parents: 85
diff changeset
  1291
604
b302a21afece Remove redundant code.
Stefan Vogel <sv@exept.de>
parents: 589
diff changeset
  1292
    if (__isSmallInteger(aNameOrNumber)) {
1503
4d97e4191d04 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1499
diff changeset
  1293
	RETURN ( aNameOrNumber );
92
Claus Gittinger <cg@exept.de>
parents: 91
diff changeset
  1294
    }
Claus Gittinger <cg@exept.de>
parents: 91
diff changeset
  1295
604
b302a21afece Remove redundant code.
Stefan Vogel <sv@exept.de>
parents: 589
diff changeset
  1296
    if (__isString(aProtocol)) {
1503
4d97e4191d04 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1499
diff changeset
  1297
	protocol = (char *)__stringVal(aProtocol);
604
b302a21afece Remove redundant code.
Stefan Vogel <sv@exept.de>
parents: 589
diff changeset
  1298
    } else {
1503
4d97e4191d04 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1499
diff changeset
  1299
	protocol = "tcp";
4d97e4191d04 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1499
diff changeset
  1300
	tryBoth = 1;
91
Claus Gittinger <cg@exept.de>
parents: 85
diff changeset
  1301
    }
524
8287da54eccf more empty code for other domains;
Claus Gittinger <cg@exept.de>
parents: 513
diff changeset
  1302
8287da54eccf more empty code for other domains;
Claus Gittinger <cg@exept.de>
parents: 513
diff changeset
  1303
    if (__isString(aNameOrNumber) || __isSymbol(aNameOrNumber)) {
1503
4d97e4191d04 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1499
diff changeset
  1304
	servent = getservbyname((char *) __stringVal(aNameOrNumber), protocol);
4d97e4191d04 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1499
diff changeset
  1305
	if (servent != NULL) {
4d97e4191d04 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1499
diff changeset
  1306
	    RETURN ( __MKSMALLINT(ntohs(servent->s_port)) );
4d97e4191d04 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1499
diff changeset
  1307
	}
4d97e4191d04 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1499
diff changeset
  1308
	if (tryBoth) {
4d97e4191d04 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1499
diff changeset
  1309
	    servent = getservbyname((char *) __stringVal(aNameOrNumber), "udp");
4d97e4191d04 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1499
diff changeset
  1310
	    if (servent != NULL) {
4d97e4191d04 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1499
diff changeset
  1311
		RETURN ( __MKSMALLINT(ntohs(servent->s_port)) );
4d97e4191d04 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1499
diff changeset
  1312
	    }
4d97e4191d04 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1499
diff changeset
  1313
	}
4d97e4191d04 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1499
diff changeset
  1314
	RETURN ( nil );
91
Claus Gittinger <cg@exept.de>
parents: 85
diff changeset
  1315
    }
418
317e55c6c281 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 403
diff changeset
  1316
#endif
91
Claus Gittinger <cg@exept.de>
parents: 85
diff changeset
  1317
    RETURN ( nil );
Claus Gittinger <cg@exept.de>
parents: 85
diff changeset
  1318
%}
Claus Gittinger <cg@exept.de>
parents: 85
diff changeset
  1319
    "
Claus Gittinger <cg@exept.de>
parents: 85
diff changeset
  1320
     Socket portOfService:'echo' protocol:'udp'
Claus Gittinger <cg@exept.de>
parents: 85
diff changeset
  1321
     Socket portOfService:'echo' protocol:'tcp'
Claus Gittinger <cg@exept.de>
parents: 85
diff changeset
  1322
    "
Claus Gittinger <cg@exept.de>
parents: 85
diff changeset
  1323
!
Claus Gittinger <cg@exept.de>
parents: 85
diff changeset
  1324
0
1cf8d1747859 Initial revision
claus
parents:
diff changeset
  1325
protocolOfService:aNameOrNumber
819
4cc15700d123 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 817
diff changeset
  1326
    "returns the protocol (as string) for a given IP-service
28
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1327
     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
  1328
92005eec5c9d fixed moving-object-when-interrupted-with-scavenge bugs;
Claus Gittinger <cg@exept.de>
parents: 1503
diff changeset
  1329
%{  /* UNLIMITEDSTACK(noWIN32) */
418
317e55c6c281 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 403
diff changeset
  1330
#ifndef NO_SOCKET
0
1cf8d1747859 Initial revision
claus
parents:
diff changeset
  1331
    struct servent *servent = NULL;
524
8287da54eccf more empty code for other domains;
Claus Gittinger <cg@exept.de>
parents: 513
diff changeset
  1332
    short portNo;
0
1cf8d1747859 Initial revision
claus
parents:
diff changeset
  1333
58
bd6753bf0401 *** empty log message ***
claus
parents: 51
diff changeset
  1334
    if (__isSmallInteger(aNameOrNumber)) {
1503
4d97e4191d04 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1499
diff changeset
  1335
	portNo = __intVal(aNameOrNumber);
4d97e4191d04 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1499
diff changeset
  1336
	servent = getservbyport(htons(portNo), "tcp") ;
4d97e4191d04 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1499
diff changeset
  1337
	if (servent == NULL) {
4d97e4191d04 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1499
diff changeset
  1338
	    servent = getservbyport(htons(portNo), "udp") ;
4d97e4191d04 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1499
diff changeset
  1339
	    if (servent == NULL) {
4d97e4191d04 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1499
diff changeset
  1340
		RETURN ( nil );
4d97e4191d04 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1499
diff changeset
  1341
	    }
4d97e4191d04 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1499
diff changeset
  1342
	}
0
1cf8d1747859 Initial revision
claus
parents:
diff changeset
  1343
    } else {
1503
4d97e4191d04 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1499
diff changeset
  1344
	if (__isString(aNameOrNumber)) {
4d97e4191d04 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1499
diff changeset
  1345
	    servent = getservbyname((char *) __stringVal(aNameOrNumber), "tcp");
4d97e4191d04 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1499
diff changeset
  1346
	    if (servent == NULL) {
4d97e4191d04 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1499
diff changeset
  1347
		servent = getservbyname((char *) __stringVal(aNameOrNumber), "udp");
4d97e4191d04 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1499
diff changeset
  1348
		if (servent == NULL) {
4d97e4191d04 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1499
diff changeset
  1349
		    RETURN ( nil );
4d97e4191d04 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1499
diff changeset
  1350
		}
4d97e4191d04 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1499
diff changeset
  1351
	    }
4d97e4191d04 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1499
diff changeset
  1352
	}
0
1cf8d1747859 Initial revision
claus
parents:
diff changeset
  1353
    }
1cf8d1747859 Initial revision
claus
parents:
diff changeset
  1354
    if (servent) {
1503
4d97e4191d04 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1499
diff changeset
  1355
	RETURN ( __MKSTRING(servent->s_proto) );
0
1cf8d1747859 Initial revision
claus
parents:
diff changeset
  1356
    }
1504
92005eec5c9d fixed moving-object-when-interrupted-with-scavenge bugs;
Claus Gittinger <cg@exept.de>
parents: 1503
diff changeset
  1357
#endif /* !NO_SOCKET */
0
1cf8d1747859 Initial revision
claus
parents:
diff changeset
  1358
    RETURN ( nil );
1cf8d1747859 Initial revision
claus
parents:
diff changeset
  1359
%}
28
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1360
    "
1485
d8578cf3504b gcc3.3.1 insn-scheduler bug workaround
Claus Gittinger <cg@exept.de>
parents: 1474
diff changeset
  1361
     Socket protocolOfService:'finger'
d8578cf3504b gcc3.3.1 insn-scheduler bug workaround
Claus Gittinger <cg@exept.de>
parents: 1474
diff changeset
  1362
     Socket protocolOfService:'nntp'
28
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1363
     Socket protocolOfService:'xxx'
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1364
     Socket protocolOfService:79
1485
d8578cf3504b gcc3.3.1 insn-scheduler bug workaround
Claus Gittinger <cg@exept.de>
parents: 1474
diff changeset
  1365
     Socket protocolOfService:'snmp'
28
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1366
    "
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1367
!
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1368
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
  1369
socketAddressClassForDomain:domain
1230
2cfb8c270cb5 more functionality moved to SocketAccessor
Claus Gittinger <cg@exept.de>
parents: 1224
diff changeset
  1370
    ^ SocketAddress knownClassFromCode:domain
2cfb8c270cb5 more functionality moved to SocketAccessor
Claus Gittinger <cg@exept.de>
parents: 1224
diff changeset
  1371
2cfb8c270cb5 more functionality moved to SocketAccessor
Claus Gittinger <cg@exept.de>
parents: 1224
diff changeset
  1372
    "
2cfb8c270cb5 more functionality moved to SocketAccessor
Claus Gittinger <cg@exept.de>
parents: 1224
diff changeset
  1373
     self socketAddressClassForDomain:#inet
1260
9a8fb2391174 instance creation of peer refactored
Claus Gittinger <cg@exept.de>
parents: 1235
diff changeset
  1374
     self socketAddressClassForDomain:#unix
1230
2cfb8c270cb5 more functionality moved to SocketAccessor
Claus Gittinger <cg@exept.de>
parents: 1224
diff changeset
  1375
    "
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
  1376
!
7e5f2f6b177d getHostByAddr - call is now done lazy, when the socket is asked for the peer
Claus Gittinger <cg@exept.de>
parents: 1186
diff changeset
  1377
532
f997c3873602 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 531
diff changeset
  1378
supportedProtocolFamilies
f997c3873602 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 531
diff changeset
  1379
    "return a collection of supported protocol families.
f997c3873602 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 531
diff changeset
  1380
     This list specifies what the Socket class supports -
f997c3873602 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 531
diff changeset
  1381
     socket creation may still fail, if your system was built
f997c3873602 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 531
diff changeset
  1382
     without it."
f997c3873602 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 531
diff changeset
  1383
1280
b973855bfe74 moved all socket constant queries from SocketHandle
Claus Gittinger <cg@exept.de>
parents: 1278
diff changeset
  1384
    ^ OperatingSystem supportedProtocolFamilies
532
f997c3873602 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 531
diff changeset
  1385
f997c3873602 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 531
diff changeset
  1386
    "
f997c3873602 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 531
diff changeset
  1387
     Socket supportedProtocolFamilies
f997c3873602 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 531
diff changeset
  1388
    "
559
61012867ebed cleanup if #connect is interrupted
Claus Gittinger <cg@exept.de>
parents: 551
diff changeset
  1389
!
61012867ebed cleanup if #connect is interrupted
Claus Gittinger <cg@exept.de>
parents: 551
diff changeset
  1390
61012867ebed cleanup if #connect is interrupted
Claus Gittinger <cg@exept.de>
parents: 551
diff changeset
  1391
typeOfProtocol:aProtocol
61012867ebed cleanup if #connect is interrupted
Claus Gittinger <cg@exept.de>
parents: 551
diff changeset
  1392
    "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
  1393
     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
  1394
61012867ebed cleanup if #connect is interrupted
Claus Gittinger <cg@exept.de>
parents: 551
diff changeset
  1395
    (aProtocol = 'tcp') ifTrue:[^ #stream].
61012867ebed cleanup if #connect is interrupted
Claus Gittinger <cg@exept.de>
parents: 551
diff changeset
  1396
    (aProtocol = 'udp') ifTrue:[^ #datagram].
61012867ebed cleanup if #connect is interrupted
Claus Gittinger <cg@exept.de>
parents: 551
diff changeset
  1397
    (aProtocol = 'ip')  ifTrue:[^ #raw].
61012867ebed cleanup if #connect is interrupted
Claus Gittinger <cg@exept.de>
parents: 551
diff changeset
  1398
    "
61012867ebed cleanup if #connect is interrupted
Claus Gittinger <cg@exept.de>
parents: 551
diff changeset
  1399
     unix domain
61012867ebed cleanup if #connect is interrupted
Claus Gittinger <cg@exept.de>
parents: 551
diff changeset
  1400
    "
61012867ebed cleanup if #connect is interrupted
Claus Gittinger <cg@exept.de>
parents: 551
diff changeset
  1401
    (aProtocol = 'ud')  ifTrue:[^ #stream].
61012867ebed cleanup if #connect is interrupted
Claus Gittinger <cg@exept.de>
parents: 551
diff changeset
  1402
    "
61012867ebed cleanup if #connect is interrupted
Claus Gittinger <cg@exept.de>
parents: 551
diff changeset
  1403
     add x25 stuff (if any) here ...
61012867ebed cleanup if #connect is interrupted
Claus Gittinger <cg@exept.de>
parents: 551
diff changeset
  1404
    "
61012867ebed cleanup if #connect is interrupted
Claus Gittinger <cg@exept.de>
parents: 551
diff changeset
  1405
    "
61012867ebed cleanup if #connect is interrupted
Claus Gittinger <cg@exept.de>
parents: 551
diff changeset
  1406
     add appletalk stuff (if any) here ...
61012867ebed cleanup if #connect is interrupted
Claus Gittinger <cg@exept.de>
parents: 551
diff changeset
  1407
    "
61012867ebed cleanup if #connect is interrupted
Claus Gittinger <cg@exept.de>
parents: 551
diff changeset
  1408
    "
61012867ebed cleanup if #connect is interrupted
Claus Gittinger <cg@exept.de>
parents: 551
diff changeset
  1409
     add other stuff (if any) here ...
61012867ebed cleanup if #connect is interrupted
Claus Gittinger <cg@exept.de>
parents: 551
diff changeset
  1410
    "
61012867ebed cleanup if #connect is interrupted
Claus Gittinger <cg@exept.de>
parents: 551
diff changeset
  1411
    ^ nil
61012867ebed cleanup if #connect is interrupted
Claus Gittinger <cg@exept.de>
parents: 551
diff changeset
  1412
61012867ebed cleanup if #connect is interrupted
Claus Gittinger <cg@exept.de>
parents: 551
diff changeset
  1413
    "
61012867ebed cleanup if #connect is interrupted
Claus Gittinger <cg@exept.de>
parents: 551
diff changeset
  1414
     Socket typeOfProtocol:'tcp'
61012867ebed cleanup if #connect is interrupted
Claus Gittinger <cg@exept.de>
parents: 551
diff changeset
  1415
     Socket typeOfProtocol:'ucp'
61012867ebed cleanup if #connect is interrupted
Claus Gittinger <cg@exept.de>
parents: 551
diff changeset
  1416
     Socket typeOfProtocol:(Socket protocolOfService:'nntp')
61012867ebed cleanup if #connect is interrupted
Claus Gittinger <cg@exept.de>
parents: 551
diff changeset
  1417
     Socket typeOfProtocol:(Socket protocolOfService:'echo')
61012867ebed cleanup if #connect is interrupted
Claus Gittinger <cg@exept.de>
parents: 551
diff changeset
  1418
    "
28
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1419
! !
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1420
1202
c52279df60d8 method category rename
Claus Gittinger <cg@exept.de>
parents: 1187
diff changeset
  1421
!Socket methodsFor:'Compatibility-Dolphin'!
1110
0876a3d30fd2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1035
diff changeset
  1422
0876a3d30fd2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1035
diff changeset
  1423
setReceiveTimeout: milliseconds
0876a3d30fd2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1035
diff changeset
  1424
    self receiveTimeout:(milliseconds / 1000)
0876a3d30fd2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1035
diff changeset
  1425
!
0876a3d30fd2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1035
diff changeset
  1426
0876a3d30fd2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1035
diff changeset
  1427
setSendTimeout: milliseconds
0876a3d30fd2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1035
diff changeset
  1428
    self sendTimeout:(milliseconds / 1000)
0876a3d30fd2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1035
diff changeset
  1429
! !
0876a3d30fd2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1035
diff changeset
  1430
1202
c52279df60d8 method category rename
Claus Gittinger <cg@exept.de>
parents: 1187
diff changeset
  1431
!Socket methodsFor:'Compatibility-ST80'!
28
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1432
887
2b2dc6b59b5a more VW compatibility
Claus Gittinger <cg@exept.de>
parents: 876
diff changeset
  1433
acceptNonBlock
2b2dc6b59b5a more VW compatibility
Claus Gittinger <cg@exept.de>
parents: 876
diff changeset
  1434
    ^ self accept
2b2dc6b59b5a more VW compatibility
Claus Gittinger <cg@exept.de>
parents: 876
diff changeset
  1435
!
2b2dc6b59b5a more VW compatibility
Claus Gittinger <cg@exept.de>
parents: 876
diff changeset
  1436
870
452fc695de34 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 869
diff changeset
  1437
connectTo:aSocketAddress
452fc695de34 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 869
diff changeset
  1438
    ^ self connectTo:aSocketAddress hostAddress port:aSocketAddress port
452fc695de34 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 869
diff changeset
  1439
!
452fc695de34 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 869
diff changeset
  1440
126
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
  1441
errorReporter
781
4d61e7588ff3 added #waitForNewConnectionOrDataOnAny:timeout:
Claus Gittinger <cg@exept.de>
parents: 776
diff changeset
  1442
    "ST-80 mimicry."
4d61e7588ff3 added #waitForNewConnectionOrDataOnAny:timeout:
Claus Gittinger <cg@exept.de>
parents: 776
diff changeset
  1443
1535
f6aa0fc8c3cc getSocketAddress
Claus Gittinger <cg@exept.de>
parents: 1533
diff changeset
  1444
    ^ self class
28
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1445
!
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1446
1485
d8578cf3504b gcc3.3.1 insn-scheduler bug workaround
Claus Gittinger <cg@exept.de>
parents: 1474
diff changeset
  1447
ioConnection
887
2b2dc6b59b5a more VW compatibility
Claus Gittinger <cg@exept.de>
parents: 876
diff changeset
  1448
    ^ self
2b2dc6b59b5a more VW compatibility
Claus Gittinger <cg@exept.de>
parents: 876
diff changeset
  1449
!
2b2dc6b59b5a more VW compatibility
Claus Gittinger <cg@exept.de>
parents: 876
diff changeset
  1450
126
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
  1451
notReadySignal
781
4d61e7588ff3 added #waitForNewConnectionOrDataOnAny:timeout:
Claus Gittinger <cg@exept.de>
parents: 776
diff changeset
  1452
    "ST-80 mimicry.
4d61e7588ff3 added #waitForNewConnectionOrDataOnAny:timeout:
Claus Gittinger <cg@exept.de>
parents: 776
diff changeset
  1453
     for now - this is not yet raised"
71
claus
parents: 63
diff changeset
  1454
126
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
  1455
    ^ Signal new
486
ed4e215e83ef ST-80 mimicry
Claus Gittinger <cg@exept.de>
parents: 470
diff changeset
  1456
!
ed4e215e83ef ST-80 mimicry
Claus Gittinger <cg@exept.de>
parents: 470
diff changeset
  1457
576
13acab81fad0 more ST80 compatibility
ca
parents: 572
diff changeset
  1458
readAppendStream
781
4d61e7588ff3 added #waitForNewConnectionOrDataOnAny:timeout:
Claus Gittinger <cg@exept.de>
parents: 776
diff changeset
  1459
    "ST-80 mimicry.
4d61e7588ff3 added #waitForNewConnectionOrDataOnAny:timeout:
Claus Gittinger <cg@exept.de>
parents: 776
diff changeset
  1460
     In ST-80, socket is not a stream, but referes to one.
4d61e7588ff3 added #waitForNewConnectionOrDataOnAny:timeout:
Claus Gittinger <cg@exept.de>
parents: 776
diff changeset
  1461
     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
  1462
     the actual stream.
781
4d61e7588ff3 added #waitForNewConnectionOrDataOnAny:timeout:
Claus Gittinger <cg@exept.de>
parents: 776
diff changeset
  1463
     In ST/X, sockets inherit from stream, so
4d61e7588ff3 added #waitForNewConnectionOrDataOnAny:timeout:
Claus Gittinger <cg@exept.de>
parents: 776
diff changeset
  1464
     this method returns the receiver, for transparency"
4d61e7588ff3 added #waitForNewConnectionOrDataOnAny:timeout:
Claus Gittinger <cg@exept.de>
parents: 776
diff changeset
  1465
576
13acab81fad0 more ST80 compatibility
ca
parents: 572
diff changeset
  1466
    ^ self
13acab81fad0 more ST80 compatibility
ca
parents: 572
diff changeset
  1467
!
13acab81fad0 more ST80 compatibility
ca
parents: 572
diff changeset
  1468
486
ed4e215e83ef ST-80 mimicry
Claus Gittinger <cg@exept.de>
parents: 470
diff changeset
  1469
readStream
ed4e215e83ef ST-80 mimicry
Claus Gittinger <cg@exept.de>
parents: 470
diff changeset
  1470
    "ST-80 mimicry.
ed4e215e83ef ST-80 mimicry
Claus Gittinger <cg@exept.de>
parents: 470
diff changeset
  1471
     In ST-80, socket is not a stream, but referes to one.
ed4e215e83ef ST-80 mimicry
Claus Gittinger <cg@exept.de>
parents: 470
diff changeset
  1472
     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
  1473
     the actual stream.
781
4d61e7588ff3 added #waitForNewConnectionOrDataOnAny:timeout:
Claus Gittinger <cg@exept.de>
parents: 776
diff changeset
  1474
     In ST/X, sockets inherit from stream, so
4d61e7588ff3 added #waitForNewConnectionOrDataOnAny:timeout:
Claus Gittinger <cg@exept.de>
parents: 776
diff changeset
  1475
     this method returns the receiver, for transparency"
486
ed4e215e83ef ST-80 mimicry
Claus Gittinger <cg@exept.de>
parents: 470
diff changeset
  1476
ed4e215e83ef ST-80 mimicry
Claus Gittinger <cg@exept.de>
parents: 470
diff changeset
  1477
    ^ self
ed4e215e83ef ST-80 mimicry
Claus Gittinger <cg@exept.de>
parents: 470
diff changeset
  1478
ed4e215e83ef ST-80 mimicry
Claus Gittinger <cg@exept.de>
parents: 470
diff changeset
  1479
    "Created: 24.1.1997 / 23:52:57 / cg"
ed4e215e83ef ST-80 mimicry
Claus Gittinger <cg@exept.de>
parents: 470
diff changeset
  1480
!
ed4e215e83ef ST-80 mimicry
Claus Gittinger <cg@exept.de>
parents: 470
diff changeset
  1481
ed4e215e83ef ST-80 mimicry
Claus Gittinger <cg@exept.de>
parents: 470
diff changeset
  1482
writeStream
ed4e215e83ef ST-80 mimicry
Claus Gittinger <cg@exept.de>
parents: 470
diff changeset
  1483
    "ST-80 mimicry.
ed4e215e83ef ST-80 mimicry
Claus Gittinger <cg@exept.de>
parents: 470
diff changeset
  1484
     In ST-80, socket is not a stream, but referes to one.
ed4e215e83ef ST-80 mimicry
Claus Gittinger <cg@exept.de>
parents: 470
diff changeset
  1485
     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
  1486
     the actual stream.
781
4d61e7588ff3 added #waitForNewConnectionOrDataOnAny:timeout:
Claus Gittinger <cg@exept.de>
parents: 776
diff changeset
  1487
     In ST/X, sockets inherit from stream, so
4d61e7588ff3 added #waitForNewConnectionOrDataOnAny:timeout:
Claus Gittinger <cg@exept.de>
parents: 776
diff changeset
  1488
     this method returns the receiver, for transparency"
486
ed4e215e83ef ST-80 mimicry
Claus Gittinger <cg@exept.de>
parents: 470
diff changeset
  1489
ed4e215e83ef ST-80 mimicry
Claus Gittinger <cg@exept.de>
parents: 470
diff changeset
  1490
    ^ self
ed4e215e83ef ST-80 mimicry
Claus Gittinger <cg@exept.de>
parents: 470
diff changeset
  1491
ed4e215e83ef ST-80 mimicry
Claus Gittinger <cg@exept.de>
parents: 470
diff changeset
  1492
    "Created: 24.1.1997 / 10:34:35 / cg"
ed4e215e83ef ST-80 mimicry
Claus Gittinger <cg@exept.de>
parents: 470
diff changeset
  1493
    "Modified: 24.1.1997 / 23:52:52 / cg"
71
claus
parents: 63
diff changeset
  1494
! !
claus
parents: 63
diff changeset
  1495
1202
c52279df60d8 method category rename
Claus Gittinger <cg@exept.de>
parents: 1187
diff changeset
  1496
!Socket methodsFor:'Compatibility-Squeak'!
771
74abb04ef57c checkin from browser
Claus Gittinger <cg@exept.de>
parents: 752
diff changeset
  1497
1462
5602fce52b42 squeak stuff
Claus Gittinger <cg@exept.de>
parents: 1413
diff changeset
  1498
address
5602fce52b42 squeak stuff
Claus Gittinger <cg@exept.de>
parents: 1413
diff changeset
  1499
    ^ self getSocketAddress
5602fce52b42 squeak stuff
Claus Gittinger <cg@exept.de>
parents: 1413
diff changeset
  1500
!
5602fce52b42 squeak stuff
Claus Gittinger <cg@exept.de>
parents: 1413
diff changeset
  1501
5602fce52b42 squeak stuff
Claus Gittinger <cg@exept.de>
parents: 1413
diff changeset
  1502
dataAvailable
5602fce52b42 squeak stuff
Claus Gittinger <cg@exept.de>
parents: 1413
diff changeset
  1503
    ^ self canReadWithoutBlocking
5602fce52b42 squeak stuff
Claus Gittinger <cg@exept.de>
parents: 1413
diff changeset
  1504
!
5602fce52b42 squeak stuff
Claus Gittinger <cg@exept.de>
parents: 1413
diff changeset
  1505
1886
e0d23764c809 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1885
diff changeset
  1506
destroy
e0d23764c809 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1885
diff changeset
  1507
    self close
e0d23764c809 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1885
diff changeset
  1508
e0d23764c809 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1885
diff changeset
  1509
    "Created: / 04-06-2007 / 21:29:03 / cg"
e0d23764c809 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1885
diff changeset
  1510
!
e0d23764c809 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1885
diff changeset
  1511
1462
5602fce52b42 squeak stuff
Claus Gittinger <cg@exept.de>
parents: 1413
diff changeset
  1512
listenOn:aPortNr
1882
6f818f33c85a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1863
diff changeset
  1513
    self listenOn:aPortNr backlogSize:5
6f818f33c85a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1863
diff changeset
  1514
6f818f33c85a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1863
diff changeset
  1515
    "Modified: / 31-05-2007 / 17:59:53 / cg"
6f818f33c85a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1863
diff changeset
  1516
!
6f818f33c85a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1863
diff changeset
  1517
6f818f33c85a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1863
diff changeset
  1518
listenOn:aPortNr backlogSize:aNumber
1462
5602fce52b42 squeak stuff
Claus Gittinger <cg@exept.de>
parents: 1413
diff changeset
  1519
    self bindTo:aPortNr address:nil.
1882
6f818f33c85a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1863
diff changeset
  1520
    self listenWithBacklog:aNumber
6f818f33c85a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1863
diff changeset
  1521
6f818f33c85a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1863
diff changeset
  1522
    "Created: / 31-05-2007 / 17:59:47 / cg"
1462
5602fce52b42 squeak stuff
Claus Gittinger <cg@exept.de>
parents: 1413
diff changeset
  1523
!
5602fce52b42 squeak stuff
Claus Gittinger <cg@exept.de>
parents: 1413
diff changeset
  1524
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  1525
peerName
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  1526
    "return my peer (i.e. ipAddr + port);
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  1527
     May return nil if not yet setup completely."
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  1528
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  1529
    ^ self getPeer
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  1530
!
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  1531
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  1532
primSocketLocalPort:aSocket
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  1533
    ^ port
1600
f3acd5382fa1 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1584
diff changeset
  1534
!
f3acd5382fa1 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1584
diff changeset
  1535
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  1536
sendData: aStringOrByteArray
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  1537
	"Send all of the data in the given array, even if it requires multiple calls to send it all.
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  1538
	 Return the number of bytes sent."
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  1539
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  1540
	"An experimental version use on slow lines: Longer timeout and smaller writes to try to avoid spurious timeouts."
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  1541
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  1542
	|remaining nWritten|
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  1543
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  1544
Transcript show:'>> '; showCR:aStringOrByteArray.
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  1545
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  1546
	remaining := aStringOrByteArray size.
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  1547
	[remaining > 0] whileTrue:[
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  1548
	    nWritten := self nextPutBytes:remaining from:aStringOrByteArray startingAt:1.
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  1549
	    remaining := remaining - nWritten.
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  1550
	].
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  1551
	^ aStringOrByteArray size.
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  1552
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  1553
"/        | bytesSent bytesToSend count |
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  1554
"/        bytesToSend := aStringOrByteArray size.
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  1555
"/        bytesSent := 0.
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  1556
"/        [bytesSent < bytesToSend] whileTrue: [
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  1557
"/                (self waitForSendDoneFor: 60)
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  1558
"/                        ifFalse: [ConnectionTimedOut signal: 'send data timeout; data not sent'].
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  1559
"/                count := self primSocket: socketHandle
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  1560
"/                        sendData: aStringOrByteArray
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  1561
"/                        startIndex: bytesSent + 1
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  1562
"/                        count: (bytesToSend - bytesSent min: 5000).
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  1563
"/                bytesSent := bytesSent + count].
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  1564
"/
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  1565
"/        ^ bytesSent
1600
f3acd5382fa1 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1584
diff changeset
  1566
!
f3acd5382fa1 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1584
diff changeset
  1567
1462
5602fce52b42 squeak stuff
Claus Gittinger <cg@exept.de>
parents: 1413
diff changeset
  1568
setOption: optionName value: optionValue
5602fce52b42 squeak stuff
Claus Gittinger <cg@exept.de>
parents: 1413
diff changeset
  1569
    optionName = 'TCP_NODELAY' ifTrue:[
1887
f26d9b04244d changed #setOption:value:
Claus Gittinger <cg@exept.de>
parents: 1886
diff changeset
  1570
        ^ self setTCPNoDelay:optionValue
1884
ee0d640a25a7 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1882
diff changeset
  1571
    ].
1887
f26d9b04244d changed #setOption:value:
Claus Gittinger <cg@exept.de>
parents: 1886
diff changeset
  1572
    ^ self setSocketOption:optionName argument:optionValue argument:nil
f26d9b04244d changed #setOption:value:
Claus Gittinger <cg@exept.de>
parents: 1886
diff changeset
  1573
f26d9b04244d changed #setOption:value:
Claus Gittinger <cg@exept.de>
parents: 1886
diff changeset
  1574
    "Modified: / 04-06-2007 / 21:23:19 / cg"
1600
f3acd5382fa1 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1584
diff changeset
  1575
!
f3acd5382fa1 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1584
diff changeset
  1576
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  1577
socketHandle
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  1578
    ^ self
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  1579
!
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  1580
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  1581
waitForConnectionUntil:aMillisecondClockValue
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  1582
    self shouldImplement.
1886
e0d23764c809 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1885
diff changeset
  1583
!
e0d23764c809 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1885
diff changeset
  1584
e0d23764c809 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1885
diff changeset
  1585
waitForData
e0d23764c809 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1885
diff changeset
  1586
    self readWait
e0d23764c809 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1885
diff changeset
  1587
e0d23764c809 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1885
diff changeset
  1588
    "Created: / 04-06-2007 / 21:28:40 / cg"
771
74abb04ef57c checkin from browser
Claus Gittinger <cg@exept.de>
parents: 752
diff changeset
  1589
! !
74abb04ef57c checkin from browser
Claus Gittinger <cg@exept.de>
parents: 752
diff changeset
  1590
1576
a2ffb22c5f5e New: #shutDownInput #shutDownOutput
Stefan Vogel <sv@exept.de>
parents: 1568
diff changeset
  1591
!Socket methodsFor:'closing'!
a2ffb22c5f5e New: #shutDownInput #shutDownOutput
Stefan Vogel <sv@exept.de>
parents: 1568
diff changeset
  1592
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  1593
shutDown
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  1594
    "shutDown and close the socket"
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  1595
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  1596
    self shutdown:2.
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  1597
    self close
1576
a2ffb22c5f5e New: #shutDownInput #shutDownOutput
Stefan Vogel <sv@exept.de>
parents: 1568
diff changeset
  1598
!
a2ffb22c5f5e New: #shutDownInput #shutDownOutput
Stefan Vogel <sv@exept.de>
parents: 1568
diff changeset
  1599
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  1600
shutDownInput
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  1601
    "shutDown the input side of the socket.
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  1602
     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
  1603
     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
  1604
     (e.g. setting the TCP-Windowsize to 0)"
a2ffb22c5f5e New: #shutDownInput #shutDownOutput
Stefan Vogel <sv@exept.de>
parents: 1568
diff changeset
  1605
a2ffb22c5f5e New: #shutDownInput #shutDownOutput
Stefan Vogel <sv@exept.de>
parents: 1568
diff changeset
  1606
    self shutdown:0.
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  1607
!
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  1608
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  1609
shutDownOutput
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  1610
    "shutDown the output side of the socket.
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  1611
     Any write to the socket will signal end-of-file from now on.
1884
ee0d640a25a7 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1882
diff changeset
  1612
     The other side will get a end-of-file condition,
ee0d640a25a7 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1882
diff changeset
  1613
     after the last buffered data has been read"
1343
cc3bed115c0a definitions cleanup with stxOSDefs.h
penk
parents: 1342
diff changeset
  1614
1884
ee0d640a25a7 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1882
diff changeset
  1615
    self shutdown:1.
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  1616
! !
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  1617
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  1618
!Socket methodsFor:'datagram transmission'!
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  1619
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  1620
receiveBuffer:aDataBuffer start:startIndex for:nBytes
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  1621
    "receive data
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  1622
     Return the number of bytes received, or a negative number on error.
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  1623
     On error, the unix error code is left in the lastErrorNumber
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  1624
     instance variable.
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  1625
     The thread blocks until data arrives - you may want to wait before
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  1626
     receiving, using #readWait or #readWaitWithTimeout:."
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  1627
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  1628
    |nReceived|
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  1629
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  1630
%{
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  1631
#ifndef NO_SOCKET
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  1632
    OBJ fp = __INST(filePointer);
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  1633
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  1634
    if (fp != nil) {
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  1635
	SOCKET sock;
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  1636
	int objSize, offs;
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  1637
	int n;
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  1638
	char *extPtr;
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  1639
	unsigned char *buffer;
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  1640
	unsigned char *allocatedBuffer;
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  1641
	int flags = 0;
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  1642
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  1643
	sock = SOCKET_FROM_FILE_OBJECT(fp);
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  1644
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  1645
	if (! setupBufferParameters(aDataBuffer, startIndex, &extPtr, &offs, &objSize)) goto bad;
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  1646
	if (__isSmallInteger(nBytes)) {
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  1647
	    if (__intVal(nBytes) < objSize) {
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  1648
		objSize = __intVal(nBytes);
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  1649
	    }
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  1650
	}
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  1651
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  1652
# ifdef DO_WRAP_CALLS
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  1653
	if (extPtr) {
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  1654
	    buffer = extPtr + offs;
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  1655
	} else {
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  1656
	    allocatedBuffer = buffer = (char *)malloc(objSize);
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  1657
	}
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  1658
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  1659
	do {
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  1660
	    __threadErrno = 0;
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  1661
	    n = STX_WSA_CALL4("recv", recv, sock, buffer, objSize, flags);
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  1662
	} while ((n < 0) && (__threadErrno == EINTR));
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  1663
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  1664
	if (allocatedBuffer) {
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  1665
	    if (n > 0) {
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  1666
		bcopy(allocatedBuffer, (char *)__InstPtr(aDataBuffer) + offs, n);
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  1667
	    }
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  1668
	    free(allocatedBuffer);
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  1669
	}
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  1670
# else
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  1671
	__BEGIN_INTERRUPTABLE__
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  1672
	do {
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  1673
	    if (extPtr) {
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  1674
		n = recv(sock, extPtr + offs, objSize, flags);
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  1675
	    } else {
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  1676
		n = recv(sock, (char *)__InstPtr(aDataBuffer) + offs, objSize, flags);
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  1677
	    }
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  1678
	} while ((n < 0) && (errno == EINTR));
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  1679
	__END_INTERRUPTABLE__
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  1680
# endif
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  1681
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  1682
	if (n < 0) {
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  1683
	    __INST(lastErrorNumber) = __MKSMALLINT(errno);
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  1684
	}
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  1685
	nReceived = __MKSMALLINT(n);
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  1686
    }
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  1687
#endif
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  1688
bad: ;
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  1689
%}.
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  1690
    nReceived notNil ifTrue:[
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  1691
	nReceived < 0 ifTrue:[
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  1692
	    'Socket [warning]: ' infoPrint.
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  1693
	    (OperatingSystem errorTextForNumber:lastErrorNumber) infoPrintCR.
1343
cc3bed115c0a definitions cleanup with stxOSDefs.h
penk
parents: 1342
diff changeset
  1694
	].
cc3bed115c0a definitions cleanup with stxOSDefs.h
penk
parents: 1342
diff changeset
  1695
	^ nReceived
915
3dc0e3cd838a added interface to send() and recv()
Claus Gittinger <cg@exept.de>
parents: 898
diff changeset
  1696
    ].
3dc0e3cd838a added interface to send() and recv()
Claus Gittinger <cg@exept.de>
parents: 898
diff changeset
  1697
    "
1282
7e4ffdfd19f6 remove historic leftover
Claus Gittinger <cg@exept.de>
parents: 1280
diff changeset
  1698
     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
  1699
    "
3dc0e3cd838a added interface to send() and recv()
Claus Gittinger <cg@exept.de>
parents: 898
diff changeset
  1700
    self primitiveFailed
3dc0e3cd838a added interface to send() and recv()
Claus Gittinger <cg@exept.de>
parents: 898
diff changeset
  1701
!
3dc0e3cd838a added interface to send() and recv()
Claus Gittinger <cg@exept.de>
parents: 898
diff changeset
  1702
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  1703
receiveFrom:anAddressBuffer buffer:aDataBuffer
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  1704
    "receive datagramm data - put address of originating host into
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  1705
     anAddressBuffer, data into aBuffer.
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  1706
     Both must be ByteArray-like. The addressBuffer must
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  1707
     provide space for a valid address for my domain (i.e. for inet, a 4-byte byteArray).
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  1708
     Return the number of bytes received, or a negative number on error.
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  1709
     On error, the unix error code is left in the lastErrorNumber
126
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
  1710
     instance variable."
28
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  1711
126
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
  1712
    ^ self receiveFrom:anAddressBuffer buffer:aDataBuffer start:1 for:(aDataBuffer size)
99
7d016cc30052 fixed & moved pingWalk from SNMPSession to here;
Claus Gittinger <cg@exept.de>
parents: 98
diff changeset
  1713
!
7d016cc30052 fixed & moved pingWalk from SNMPSession to here;
Claus Gittinger <cg@exept.de>
parents: 98
diff changeset
  1714
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  1715
receiveFrom:anAddressBuffer buffer:aDataBuffer start:startIndex for:nBytes
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  1716
    "receive datagramm data
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  1717
     - put address of originating host into anAddressBuffer, data into aBuffer.
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  1718
     For backward compatibility, the addressBuffer may be a non-SocketAddress;
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  1719
     then, it must be a byteArray with appropriate size for the addressBytes.
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  1720
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  1721
     Return the number of bytes received, or a negative number on error.
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  1722
     On error, the unix error code is left in the lastErrorNumber
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  1723
     instance variable.
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  1724
     The thread blocks until data arrives - you may want to wait before
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  1725
     receiving, using #readWait or #readWaitWithTimeout:."
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  1726
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  1727
    |domainClass addr addrLen nReceived|
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  1728
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  1729
    domainClass := self class socketAddressClassForDomain:domain.
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  1730
    domainClass isNil ifTrue:[
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  1731
	^ self error:'invalid (unsupported) domain'.
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  1732
    ].
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  1733
    (anAddressBuffer isKindOf:SocketAddress) ifTrue:[
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  1734
	anAddressBuffer class == domainClass ifFalse:[
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  1735
	    ^ self error:'addressBuffer class mismatch (domain)'.
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  1736
	].
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  1737
	addr := anAddressBuffer.
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  1738
    ] ifFalse:[
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  1739
	anAddressBuffer notNil ifTrue:[
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  1740
	    addr := domainClass new.
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  1741
	].
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  1742
    ].
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  1743
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  1744
%{
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  1745
#ifndef NO_SOCKET
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  1746
    OBJ fp = __INST(filePointer);
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  1747
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  1748
    if (fp != nil) {
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  1749
	SOCKET sock;
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  1750
	int objSize;
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  1751
	union sockaddr_u sa;
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  1752
	unsigned int alen = 0;
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  1753
	int n, offs;
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  1754
	int flags = 0;
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  1755
	char *extPtr;
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  1756
	unsigned char *allocatedBuffer = NULL;
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  1757
	unsigned char *buffer = NULL;
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  1758
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  1759
	sock = SOCKET_FROM_FILE_OBJECT(fp);
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  1760
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  1761
	if (! setupBufferParameters(aDataBuffer, startIndex, &extPtr, &offs, &objSize)) goto bad;
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  1762
	if (__isSmallInteger(nBytes)) {
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  1763
	    if (__intVal(nBytes) < objSize) {
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  1764
		objSize = __intVal(nBytes);
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  1765
	    }
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  1766
	}
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  1767
# ifdef DO_WRAP_CALLS
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  1768
	if (extPtr) {
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  1769
	    buffer = extPtr + offs;
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  1770
	} else {
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  1771
	    allocatedBuffer = buffer = (char *)malloc(objSize);
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  1772
	}
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  1773
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  1774
	do {
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  1775
	    __threadErrno = 0;
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  1776
	    alen = sizeof(sa);
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  1777
	    n = STX_WSA_CALL6("recvfrom", recvfrom, sock, buffer, objSize, flags, (struct sockaddr *)&sa, &alen);
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  1778
	} while ((n < 0) && (__threadErrno == EINTR));
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  1779
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  1780
	if (allocatedBuffer) {
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  1781
	    if (n > 0) {
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  1782
		bcopy(allocatedBuffer, (char *)__InstPtr(aDataBuffer) + offs, n);
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  1783
	    }
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  1784
	    free(allocatedBuffer);
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  1785
	}
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  1786
# else
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  1787
	__BEGIN_INTERRUPTABLE__
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  1788
	do {
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  1789
	    alen = sizeof(sa);
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  1790
	    if (extPtr) {
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  1791
		n = recvfrom(sock, extPtr + offs, objSize, flags, (struct sockaddr *) &sa, &alen);
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  1792
	    } else {
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  1793
		n = recvfrom(sock, (char *)__InstPtr(aDataBuffer) + offs, objSize, flags, (struct sockaddr *) &sa, &alen);
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  1794
	    }
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  1795
	} while ((n < 0) && (errno == EINTR));
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  1796
	__END_INTERRUPTABLE__
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  1797
# endif
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  1798
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  1799
	if (n >= 0) {
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  1800
	    if (__isNonNilObject(addr)) {
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  1801
		char *addrPtr;
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  1802
		OBJ oClass;
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  1803
		int nInstVars, nInstBytes, objSize;
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  1804
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  1805
		oClass = __qClass(addr);
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  1806
		if (! __isBytes(addr) )
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  1807
		    goto bad;
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  1808
		nInstVars = __intVal(__ClassInstPtr(oClass)->c_ninstvars);
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  1809
		nInstBytes = OHDR_SIZE + (nInstVars * sizeof(OBJ));
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  1810
		objSize = __qSize(addr) - nInstBytes;
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  1811
		addrPtr = (char *)__InstPtr(addr) + nInstBytes;
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  1812
		if (objSize < alen)
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  1813
		    goto bad;
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  1814
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  1815
		/*
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  1816
		 * extract the datagrams address
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  1817
		 */
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  1818
		bcopy((char *)&sa, addrPtr, alen);
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  1819
		addrLen = __MKSMALLINT(alen);
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  1820
	    }
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  1821
	}
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  1822
	if (n < 0) {
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  1823
	    __INST(lastErrorNumber) = __MKSMALLINT(errno);
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  1824
	}
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  1825
	nReceived = __MKSMALLINT(n);
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  1826
    }
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  1827
#endif
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  1828
bad: ;
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  1829
%}.
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  1830
    nReceived notNil ifTrue:[
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  1831
	nReceived < 0 ifTrue:[
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  1832
	    'Socket [warning]: ' infoPrint.
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  1833
	    (OperatingSystem errorTextForNumber:lastErrorNumber) infoPrintCR.
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  1834
	].
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  1835
	addrLen notNil ifTrue:[
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  1836
	    (addr == anAddressBuffer) ifFalse:[
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  1837
		self obsoleteFeatureWarning:'please use a socketAddress argument'.
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  1838
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  1839
		" can be a ByteArray for backward compatibility "
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  1840
		anAddressBuffer replaceFrom:1 to:addrLen with:(addr hostAddress).
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  1841
	    ].
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  1842
	].
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  1843
	^ nReceived
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  1844
    ].
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  1845
    "
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  1846
     arrive here if you try to receive into an invalid buffer
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  1847
     (i.e. not ByteArray-like),
1485
d8578cf3504b gcc3.3.1 insn-scheduler bug workaround
Claus Gittinger <cg@exept.de>
parents: 1474
diff changeset
  1848
     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
  1849
     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
  1850
    "
126
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
  1851
    self primitiveFailed
116
7789fb1c9fa2 more UD socket fixes (at least client side seems to work now)
Claus Gittinger <cg@exept.de>
parents: 115
diff changeset
  1852
!
7789fb1c9fa2 more UD socket fixes (at least client side seems to work now)
Claus Gittinger <cg@exept.de>
parents: 115
diff changeset
  1853
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  1854
sendBuffer:aDataBuffer start:startIndex for:nBytes flags:flags
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  1855
    "send data.
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  1856
     Both must be ByteArray-like. The bytes in the addressBuffer must
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  1857
     be a valid address for my domain (i.e. for inet, a 4-byte byteArray).
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  1858
     Return the number of bytes transmitted, or a negative number on error.
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  1859
     On error, the unix error code is left in the lastErrorNumber
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  1860
     instance variable."
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  1861
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  1862
    |nReceived portNo|
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  1863
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  1864
%{
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  1865
#ifndef NO_SOCKET
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  1866
    OBJ fp = __INST(filePointer);
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  1867
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  1868
    if ((fp != nil)
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  1869
     && __isSmallInteger(startIndex)
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  1870
     && __isSmallInteger(nBytes)) {
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  1871
	SOCKET sock;
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  1872
	int objSize;
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  1873
	int n;
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  1874
	char *extPtr;
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  1875
	int _flags = 0;
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  1876
	int offs;
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  1877
	unsigned long norder;
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  1878
	unsigned char *buffer;
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  1879
	unsigned char *allocatedBuffer;
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  1880
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  1881
	_flags = __longIntVal(flags);
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  1882
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  1883
	sock = SOCKET_FROM_FILE_OBJECT(fp);
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  1884
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  1885
	if (! setupBufferParameters(aDataBuffer, startIndex, &extPtr, &offs, &objSize)) goto bad;
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  1886
	if (__isSmallInteger(nBytes)) {
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  1887
	    if (__intVal(nBytes) < objSize) {
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  1888
		objSize = __intVal(nBytes);
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  1889
	    }
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  1890
	}
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  1891
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  1892
# ifdef DGRAM_DEBUG
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  1893
	console_printf("sending %d bytes ...\n", nBytes);
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  1894
# endif
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  1895
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  1896
#ifdef DO_WRAP_CALLS
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  1897
	if (extPtr) {
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  1898
	    buffer = extPtr + offs;
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  1899
	} else {
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  1900
	    allocatedBuffer = buffer = (char *)malloc(objSize);
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  1901
	    bcopy((char *)__InstPtr(aDataBuffer) + offs, allocatedBuffer, objSize);
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  1902
	}
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  1903
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  1904
	do {
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  1905
	    __threadErrno = 0;
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  1906
	    n = STX_WSA_CALL4("send", send, sock, buffer, objSize, _flags);
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  1907
	} while ((n < 0) && (__threadErrno == EINTR));
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  1908
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  1909
	if (allocatedBuffer) {
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  1910
	    free(allocatedBuffer);
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  1911
	}
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  1912
#else
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  1913
	__BEGIN_INTERRUPTABLE__
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  1914
	do {
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  1915
	    if (extPtr) {
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  1916
		n = send(sock, extPtr + offs, objSize, _flags);
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  1917
	    } else {
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  1918
		n = send(sock, (char *)__InstPtr(aDataBuffer) + offs, objSize, _flags);
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  1919
	    }
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  1920
	} while ((n < 0) && (errno == EINTR));
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  1921
	__END_INTERRUPTABLE__
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  1922
#endif
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  1923
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  1924
	if (n < 0) {
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  1925
	    __INST(lastErrorNumber) = __MKSMALLINT(errno);
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  1926
	}
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  1927
	RETURN (__MKSMALLINT(n));
915
3dc0e3cd838a added interface to send() and recv()
Claus Gittinger <cg@exept.de>
parents: 898
diff changeset
  1928
    }
3dc0e3cd838a added interface to send() and recv()
Claus Gittinger <cg@exept.de>
parents: 898
diff changeset
  1929
#endif
3dc0e3cd838a added interface to send() and recv()
Claus Gittinger <cg@exept.de>
parents: 898
diff changeset
  1930
bad: ;
3dc0e3cd838a added interface to send() and recv()
Claus Gittinger <cg@exept.de>
parents: 898
diff changeset
  1931
%}.
3dc0e3cd838a added interface to send() and recv()
Claus Gittinger <cg@exept.de>
parents: 898
diff changeset
  1932
    "
1485
d8578cf3504b gcc3.3.1 insn-scheduler bug workaround
Claus Gittinger <cg@exept.de>
parents: 1474
diff changeset
  1933
     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
  1934
    "
3dc0e3cd838a added interface to send() and recv()
Claus Gittinger <cg@exept.de>
parents: 898
diff changeset
  1935
    self primitiveFailed
3dc0e3cd838a added interface to send() and recv()
Claus Gittinger <cg@exept.de>
parents: 898
diff changeset
  1936
!
3dc0e3cd838a added interface to send() and recv()
Claus Gittinger <cg@exept.de>
parents: 898
diff changeset
  1937
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  1938
sendTo:anAddressBuffer buffer:buffer
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  1939
    "send datagramm data - fetch address of destination host from
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  1940
     anAddressBuffer, data from aDataBuffer.
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  1941
     Both must be ByteArray-like. The bytes in the addressBuffer must
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  1942
     be a valid address for my domain (i.e. for inet, a 4-byte byteArray).
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  1943
     Return the number of bytes transmitted, or a negative number on error.
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  1944
     On error, the unix error code is left in the lastErrorNumber
126
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
  1945
     instance variable.
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
  1946
     Flags is currently ignored; it is there for ST-80 compatibility."
116
7789fb1c9fa2 more UD socket fixes (at least client side seems to work now)
Claus Gittinger <cg@exept.de>
parents: 115
diff changeset
  1947
1485
d8578cf3504b gcc3.3.1 insn-scheduler bug workaround
Claus Gittinger <cg@exept.de>
parents: 1474
diff changeset
  1948
    ^ self sendTo:anAddressBuffer buffer:buffer start:1 for:buffer size flags:0
116
7789fb1c9fa2 more UD socket fixes (at least client side seems to work now)
Claus Gittinger <cg@exept.de>
parents: 115
diff changeset
  1949
!
7789fb1c9fa2 more UD socket fixes (at least client side seems to work now)
Claus Gittinger <cg@exept.de>
parents: 115
diff changeset
  1950
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  1951
sendTo:anAddressBuffer buffer:buffer start:startIndex for:count
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  1952
    "send datagramm data - fetch address of destination host from
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  1953
     anAddressBuffer, data from aDataBuffer.
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  1954
     Both must be ByteArray-like. The bytes in the addressBuffer must
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  1955
     be a valid address for my domain (i.e. for inet, a 4-byte byteArray).
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  1956
     Return the number of bytes transmitted, or a negative number on error.
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  1957
     On error, the unix error code is left in the lastErrorNumber
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  1958
     instance variable.
817
eda0065cbd47 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 814
diff changeset
  1959
     Flags is currently ignored; it is there for ST-80 compatibility."
eda0065cbd47 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 814
diff changeset
  1960
1485
d8578cf3504b gcc3.3.1 insn-scheduler bug workaround
Claus Gittinger <cg@exept.de>
parents: 1474
diff changeset
  1961
    ^ self sendTo:anAddressBuffer buffer:buffer start:startIndex for:count flags:0
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  1962
!
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  1963
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  1964
sendTo:anAddressBuffer buffer:aDataBuffer start:startIndex for:nBytes flags:flags
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  1965
    "send datagramm data - fetch address of destination host from
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  1966
     anAddressBuffer, data from aDataBuffer starting at startIndex,
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  1967
     sending count bytes.
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  1968
     Both must be ByteArray-like. The bytes in the addressBuffer must
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  1969
     be a valid address for my domain (i.e. for inet, a 4-byte byteArray).
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  1970
     Return the number of bytes transmitted, or a negative number on error.
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  1971
     On error, the unix error code is left in the lastErrorNumber
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  1972
     instance variable."
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  1973
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  1974
    |domainClass addr|
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  1975
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  1976
    domainClass := self class socketAddressClassForDomain:domain.
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  1977
    domainClass isNil ifTrue:[
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  1978
	^ self error:'invalid (unsupported) domain'.
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  1979
    ].
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  1980
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  1981
    (anAddressBuffer isKindOf:SocketAddress) ifTrue:[
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  1982
	addr := anAddressBuffer.
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  1983
    ] ifFalse:[
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  1984
	anAddressBuffer isByteArray ifFalse:[
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  1985
	    ^ self error:'bad socketAddress argument'
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  1986
	].
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  1987
	addr := domainClass hostAddress:anAddressBuffer.
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  1988
    ].
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  1989
%{
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  1990
#ifndef NO_SOCKET
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  1991
    OBJ fp = __INST(filePointer);
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  1992
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  1993
    if ((fp != nil)
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  1994
     && __isSmallInteger(startIndex)
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  1995
     && __isSmallInteger(nBytes)) {
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  1996
	SOCKET sock;
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  1997
	int objSize;
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  1998
	struct sockaddr *sockaddr_ptr;
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  1999
	union sockaddr_u sa;
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2000
	int alen = 0;
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2001
	int sockAddrOffs, sockaddr_size;
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2002
	int n;
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2003
	char *extPtr;
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2004
	int _flags = 0;
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2005
	int offs;
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2006
	unsigned long norder;
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2007
	unsigned char *buffer;
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2008
	unsigned char *allocatedBuffer;
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2009
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2010
	_flags = __longIntVal(flags);
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2011
	sock = SOCKET_FROM_FILE_OBJECT(fp);
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2012
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2013
	if (! __isBytes(addr)) {
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2014
	    sockaddr_size = 0;
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2015
	    sockaddr_ptr = (struct sockaddr *)0;
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2016
	} else {
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2017
	    int nIndex;
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2018
	    OBJ cls;
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2019
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2020
	    sockAddrOffs = 0;
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2021
	    if ((cls = __qClass(addr)) != @global(ByteArray))
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2022
		sockAddrOffs += __OBJS2BYTES__(__intVal(__ClassInstPtr(cls)->c_ninstvars));
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2023
	    nIndex = __qSize(addr) - OHDR_SIZE;
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2024
	    sockaddr_size = nIndex - sockAddrOffs;
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2025
	    if (sockaddr_size > sizeof(sa)) {
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2026
		console_fprintf(stderr, "Socket [warning]: bad socketAddr\n");
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2027
		goto bad;
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2028
	    }
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2029
	    bcopy((__byteArrayVal(addr) + sockAddrOffs), &sa, sockaddr_size);
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2030
	    sockaddr_ptr = (struct sockaddr *)(&sa);
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2031
	}
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2032
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2033
	if (! setupBufferParameters(aDataBuffer, startIndex, &extPtr, &offs, &objSize)) goto bad;
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2034
	if (__isSmallInteger(nBytes)) {
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2035
	    if (__intVal(nBytes) < objSize) {
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2036
		objSize = __intVal(nBytes);
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2037
	    }
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2038
	}
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2039
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2040
#ifdef DO_WRAP_CALLS
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2041
	if (extPtr) {
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2042
	    buffer = extPtr + offs;
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2043
	} else {
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2044
	    allocatedBuffer = buffer = (char *)malloc(objSize);
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2045
	    bcopy((char *)__InstPtr(aDataBuffer) + offs, allocatedBuffer, objSize);
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2046
	}
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2047
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2048
	do {
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2049
	    __threadErrno = 0;
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2050
	    n = STX_WSA_CALL6("sendto", sendto, sock, buffer, objSize, _flags, sockaddr_ptr, sockaddr_size);
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2051
	} while ((n < 0) && (__threadErrno == EINTR));
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2052
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2053
	if (allocatedBuffer) {
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2054
	    free(allocatedBuffer);
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2055
	}
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2056
#else
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2057
	__BEGIN_INTERRUPTABLE__
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2058
	do {
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2059
	    if (extPtr) {
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2060
		n = sendto(sock, extPtr + offs, objSize, _flags, sockaddr_ptr, sockaddr_size);
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2061
	    } else {
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2062
		n = sendto(sock, (char *)__InstPtr(aDataBuffer) + offs, objSize, _flags, sockaddr_ptr, sockaddr_size);
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2063
	    }
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2064
	} while ((n < 0) && (errno == EINTR));
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2065
	__END_INTERRUPTABLE__
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2066
#endif
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2067
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2068
	if (n < 0) {
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2069
	    __INST(lastErrorNumber) = __MKSMALLINT(errno);
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2070
	}
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2071
	RETURN (__MKSMALLINT(n));
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2072
    }
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2073
#endif
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2074
bad: ;
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2075
%}.
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2076
    "
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2077
     arrive here if you try to send from an invalid buffer
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2078
     (i.e. not ByteArray-like),
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2079
     or if the addressBuffer is nonNil AND not a ByteArray/String
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2080
     or if the addressBuffer is nonNil AND too small.
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2081
    "
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2082
    self primitiveFailed
0
1cf8d1747859 Initial revision
claus
parents:
diff changeset
  2083
! !
1cf8d1747859 Initial revision
claus
parents:
diff changeset
  2084
1cf8d1747859 Initial revision
claus
parents:
diff changeset
  2085
!Socket methodsFor:'low level'!
1cf8d1747859 Initial revision
claus
parents:
diff changeset
  2086
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2087
bindAnonymously
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2088
    "bind to any address. A free port will be allocated.
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2089
     Our own socket address will be determined after conection set up.
1505
Stefan Vogel <sv@exept.de>
parents: 1504
diff changeset
  2090
     This is the default after the socket has been created"
Stefan Vogel <sv@exept.de>
parents: 1504
diff changeset
  2091
507
91fb3dfd91a5 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 506
diff changeset
  2092
    ^ self
1529
911273d090c1 Re-unified Win32 and Unix code into single Socket.st.
Claus Gittinger <cg@exept.de>
parents: 1505
diff changeset
  2093
	bindTo:nil
911273d090c1 Re-unified Win32 and Unix code into single Socket.st.
Claus Gittinger <cg@exept.de>
parents: 1505
diff changeset
  2094
	address:nil
911273d090c1 Re-unified Win32 and Unix code into single Socket.st.
Claus Gittinger <cg@exept.de>
parents: 1505
diff changeset
  2095
	reuseAddress:false
509
eb5a2d5bab0b *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 508
diff changeset
  2096
!
eb5a2d5bab0b *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 508
diff changeset
  2097
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2098
bindAnonymouslyToAddress:addressString
1505
Stefan Vogel <sv@exept.de>
parents: 1504
diff changeset
  2099
    "bind to address addressString.
Stefan Vogel <sv@exept.de>
parents: 1504
diff changeset
  2100
     A free port will be allocated"
Stefan Vogel <sv@exept.de>
parents: 1504
diff changeset
  2101
509
eb5a2d5bab0b *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 508
diff changeset
  2102
    ^ self
1529
911273d090c1 Re-unified Win32 and Unix code into single Socket.st.
Claus Gittinger <cg@exept.de>
parents: 1505
diff changeset
  2103
	bindTo:nil
911273d090c1 Re-unified Win32 and Unix code into single Socket.st.
Claus Gittinger <cg@exept.de>
parents: 1505
diff changeset
  2104
	address:addressString
911273d090c1 Re-unified Win32 and Unix code into single Socket.st.
Claus Gittinger <cg@exept.de>
parents: 1505
diff changeset
  2105
	reuseAddress:false
507
91fb3dfd91a5 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 506
diff changeset
  2106
!
91fb3dfd91a5 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 506
diff changeset
  2107
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2108
bindTo:aSocketAddress
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2109
    "ST80 compatible bind, expecting a socketAddress argument.
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2110
     The socketAddress object (an instance of SocketAddress)
425
eb8198e9f1b0 comment
Claus Gittinger <cg@exept.de>
parents: 421
diff changeset
  2111
     is supposed to respond to #portOrName and #address requests."
71
claus
parents: 63
diff changeset
  2112
claus
parents: 63
diff changeset
  2113
    ^ self bindTo:(aSocketAddress portOrName)
claus
parents: 63
diff changeset
  2114
	   address:(aSocketAddress address)
425
eb8198e9f1b0 comment
Claus Gittinger <cg@exept.de>
parents: 421
diff changeset
  2115
	   reuseAddress:true
71
claus
parents: 63
diff changeset
  2116
!
claus
parents: 63
diff changeset
  2117
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2118
bindTo:portNrOrNameString address:addressString
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2119
    "low level bind - returns true if ok, false otherwise.
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2120
     Currently only non-address binding is supported;
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2121
     i.e. the address must always be nil.
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2122
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2123
     The interpretation of portNrOrName depends on the domain:
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2124
	inet domain uses (4byte) byteArray like internet numbers,
116
7789fb1c9fa2 more UD socket fixes (at least client side seems to work now)
Claus Gittinger <cg@exept.de>
parents: 115
diff changeset
  2125
	unix domain uses pathname strings,
7789fb1c9fa2 more UD socket fixes (at least client side seems to work now)
Claus Gittinger <cg@exept.de>
parents: 115
diff changeset
  2126
	others use whatever will come up in the future
7789fb1c9fa2 more UD socket fixes (at least client side seems to work now)
Claus Gittinger <cg@exept.de>
parents: 115
diff changeset
  2127
     "
7789fb1c9fa2 more UD socket fixes (at least client side seems to work now)
Claus Gittinger <cg@exept.de>
parents: 115
diff changeset
  2128
1485
d8578cf3504b gcc3.3.1 insn-scheduler bug workaround
Claus Gittinger <cg@exept.de>
parents: 1474
diff changeset
  2129
    ^ self
d8578cf3504b gcc3.3.1 insn-scheduler bug workaround
Claus Gittinger <cg@exept.de>
parents: 1474
diff changeset
  2130
	bindTo:portNrOrNameString
d8578cf3504b gcc3.3.1 insn-scheduler bug workaround
Claus Gittinger <cg@exept.de>
parents: 1474
diff changeset
  2131
	address:addressString
425
eb8198e9f1b0 comment
Claus Gittinger <cg@exept.de>
parents: 421
diff changeset
  2132
	reuseAddress:true
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2133
!
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2134
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2135
bindTo:portNrOrNameOrNil address:hostOrPathNameOrSocketAddrOrNil reuseAddress:reuse
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2136
    "low level bind - returns true if ok, false otherwise.
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2137
     Currently only non-address binding is supported;
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2138
     i.e. address must always be nil.
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2139
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2140
     The interpretation of portNrOrName depends on the domain:
1911
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
  2141
        inet domain uses (4byte) byteArray like internet numbers,
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
  2142
        unix domain uses pathname strings,
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
  2143
        others use whatever will come up in the future
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2144
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2145
     The reuse boolean argument controls if the SO_REUSEADDR socket option
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2146
     is to be set (to avoid the 'bind: address in use' error).
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2147
    "
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2148
1911
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
  2149
    |ok addr addrName domainClass error|
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2150
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2151
    filePointer isNil ifTrue:[
1911
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
  2152
        ^ self errorNotOpen
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2153
    ].
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2154
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2155
    domainClass := self class socketAddressClassForDomain:domain.
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2156
    domainClass isNil ifTrue:[
1911
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
  2157
        ^ self error:'invalid (unsupported) domain'.
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2158
    ].
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2159
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2160
    hostOrPathNameOrSocketAddrOrNil isNil ifTrue:[
1911
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
  2161
        addr := domainClass anyHost.
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2162
    ] ifFalse:[
1911
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
  2163
        (hostOrPathNameOrSocketAddrOrNil isKindOf:SocketAddress) ifTrue:[
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
  2164
            addr := hostOrPathNameOrSocketAddrOrNil.
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
  2165
        ] ifFalse:[
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
  2166
            "backward compatibility: support for byteArray and string arg"
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
  2167
            hostOrPathNameOrSocketAddrOrNil isString ifTrue:[
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
  2168
                addr := domainClass hostName:hostOrPathNameOrSocketAddrOrNil.
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
  2169
                addrName := hostOrPathNameOrSocketAddrOrNil.
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
  2170
            ] ifFalse:[
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
  2171
                hostOrPathNameOrSocketAddrOrNil isByteArray ifFalse:[
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
  2172
                    ^ self error:'bad host (socketAddress) argument'
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
  2173
                ].
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
  2174
                addr := domainClass hostAddress:hostOrPathNameOrSocketAddrOrNil.
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
  2175
            ].
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
  2176
        ].
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2177
    ].
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2178
    portNrOrNameOrNil notNil ifTrue:[
1911
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
  2179
        addr port:portNrOrNameOrNil.
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2180
    ].
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2181
    (portNrOrNameOrNil isNil or:[portNrOrNameOrNil == 0]) ifTrue:[
1911
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
  2182
        addr := addr copy.
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2183
    ].
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2184
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2185
%{  /* STACK: 100000 */
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2186
#ifndef NO_SOCKET
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2187
    OBJ fp = __INST(filePointer);
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2188
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2189
    if (! __isBytes(addr)) {
1911
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
  2190
        error=__mkSmallInteger(-1);
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
  2191
        addr = nil;
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
  2192
        goto getOutOfHere;
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2193
    }
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2194
    if (fp != nil) {
1911
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
  2195
        SOCKET sock;
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
  2196
        union sockaddr_u sa;
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
  2197
        int sockaddr_size;
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
  2198
        int ret;
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
  2199
        int sockAddrOffs;
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
  2200
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
  2201
        {
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
  2202
            int nIndex;
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
  2203
            OBJ cls;
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
  2204
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
  2205
            sockAddrOffs = 0;
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
  2206
            if ((cls = __qClass(addr)) != @global(ByteArray))
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
  2207
                sockAddrOffs += __OBJS2BYTES__(__intVal(__ClassInstPtr(cls)->c_ninstvars));
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
  2208
            nIndex = __qSize(addr) - OHDR_SIZE;
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
  2209
            sockaddr_size = nIndex - sockAddrOffs;
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
  2210
            if (sockaddr_size > sizeof(sa)) {
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
  2211
                error=__mkSmallInteger(-2);
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
  2212
                goto getOutOfHere;
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
  2213
            }
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
  2214
            memcpy(&sa, __byteArrayVal(addr) + sockAddrOffs, sockaddr_size);
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
  2215
        }
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
  2216
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
  2217
        sock = SOCKET_FROM_FILE_OBJECT(fp);
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2218
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2219
# ifdef SO_REUSEADDR
1911
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
  2220
        if (reuse == true) {
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
  2221
            int on = 1;
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
  2222
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
  2223
            if (setsockopt(sock, SOL_SOCKET, SO_REUSEADDR, (char *) &on, sizeof (on)) < 0) {
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
  2224
                DBGPRINTF(("SOCKET: setsockopt - SO_REUSEADDR failed\n"));
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
  2225
            }
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
  2226
        }
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2227
# endif /* SO_REUSEADDR */
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2228
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2229
# ifdef BIND_BLOCKS
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2230
#  ifdef DO_WRAP_CALLS
1911
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
  2231
        do {
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
  2232
            __threadErrno = 0;
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
  2233
            ret = STX_WSA_CALL3("bind", bind, sock, &sa, sockaddr_size);
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
  2234
        } while ((ret < 0) && (__threadErrno == EINTR));
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2235
#  else
1911
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
  2236
        __BEGIN_INTERRUPTABLE__
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
  2237
        do {
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
  2238
            ret = bind(sock, (struct sockaddr *)&sa, sockaddr_size);
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
  2239
        } while ((ret < 0) && (errno == EINTR));
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
  2240
        __END_INTERRUPTABLE__
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2241
#  endif
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2242
# else
1911
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
  2243
        ret = bind(sock, (struct sockaddr *)&sa, sockaddr_size);
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2244
# endif
1911
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
  2245
        if (ret < 0) {
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
  2246
            DBGPRINTF(("SOCKET: bind failed errno=%d\n", errno));
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
  2247
            error = __INST(lastErrorNumber) = __MKSMALLINT(errno);
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
  2248
            goto getOutOfHere;
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
  2249
        } else {
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
  2250
            ok = true;
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
  2251
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
  2252
            if (! __isSmallInteger(portNrOrNameOrNil)
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
  2253
                || (portNrOrNameOrNil == __MKSMALLINT(0))) {
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
  2254
                unsigned int alen = sockaddr_size;
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
  2255
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
  2256
                /*
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
  2257
                 * anonymous port - get the actual portNr
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
  2258
                 */
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
  2259
                if (getsockname(sock, (struct sockaddr *)&sa, &alen) < 0) {
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2260
# ifdef WIN32
1911
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
  2261
                    errno = WSAGetLastError();
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2262
# endif
1911
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
  2263
                    console_fprintf(stderr, "SOCKET: cannot get socketname: %d\n", errno);
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
  2264
                }
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
  2265
                memcpy(__byteArrayVal(addr) + sockAddrOffs, &sa, alen);
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
  2266
            }
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
  2267
        }
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2268
    }
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2269
#endif /* NO_SOCKET */
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2270
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2271
getOutOfHere: ;
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2272
%}.
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2273
    ok ~~ true ifTrue:[
1911
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
  2274
        "maybe someone catches the error and binds to some other port..."
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
  2275
        OpenError raiseRequestWith:self errorString:('cannot bind socket to port: <1p> address: <2p> (error=<3p>)' 
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
  2276
                                                        expandMacrosWith:portNrOrNameOrNil 
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
  2277
                                                        with:hostOrPathNameOrSocketAddrOrNil
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
  2278
                                                        with:error).
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
  2279
        ^ true.
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2280
    ].
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2281
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2282
    peer := addr.
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2283
    port := addr port.
1282
7e4ffdfd19f6 remove historic leftover
Claus Gittinger <cg@exept.de>
parents: 1280
diff changeset
  2284
    peerName := addrName.
7e4ffdfd19f6 remove historic leftover
Claus Gittinger <cg@exept.de>
parents: 1280
diff changeset
  2285
28
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  2286
    ^ true
0
1cf8d1747859 Initial revision
claus
parents:
diff changeset
  2287
28
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  2288
    "
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  2289
     (Socket domain:#inet type:#stream)
1911
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
  2290
         bindTo:21
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
  2291
         address:nil
28
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  2292
    "
1474
1ad407692b0b Protect #closeFile.
Stefan Vogel <sv@exept.de>
parents: 1462
diff changeset
  2293
! !
1ad407692b0b Protect #closeFile.
Stefan Vogel <sv@exept.de>
parents: 1462
diff changeset
  2294
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2295
!Socket protectedMethodsFor:'low level'!
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2296
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2297
closeFile
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2298
    "low level close"
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2299
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2300
%{  /* NOCONTEXT */
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2301
#ifndef NO_SOCKET
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2302
    OBJ t;
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2303
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2304
    t = __INST(filePointer);
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2305
    if (t != nil) {
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2306
	FILE *fp;
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2307
	SOCKET sock;
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2308
	int fd;
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2309
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2310
	__INST(filePointer) = nil;
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2311
	fp = __FILEVal(t);
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2312
	fd = fileno(fp);
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2313
	sock = SOCKET_FROM_FD(fd);
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2314
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2315
# ifdef xxDO_WRAP_CALLS
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2316
	{ int ret;
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2317
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2318
	  do {
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2319
	    __threadErrno = 0;
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2320
	    ret = STX_C_CALL1("fclose", fclose, fp);
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2321
	  } while ((ret < 0) && (__threadErrno == EINTR));
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2322
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2323
#  ifdef WIN32
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2324
	  do {
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2325
	    __threadErrno = 0;
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2326
	    ret = STX_WSA_CALL1("closesocket", closesocket, sock);
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2327
	  } while ((ret < 0) && (__threadErrno == EINTR));
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2328
	  closesocket(sock);
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2329
#  endif
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2330
	}
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2331
# else /* !DO_WRAP_CALLS */
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2332
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2333
	DBGFPRINTF((stderr, "SOCKET: fflush %x (%d %d)\n", fp, fileno(fp), sock));
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2334
	fflush(fp);
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2335
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2336
#  if defined(CLOSESOCKET_BEFORE_FCLOSE)
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2337
	DBGFPRINTF((stderr, "SOCKET: closesocket (%d)\n", sock));
1558
a563aac90660 No need to ask Socket>>#networkXXXOrderIsMSB, because the return value is
Stefan Vogel <sv@exept.de>
parents: 1542
diff changeset
  2338
	closesocket(sock);
a563aac90660 No need to ask Socket>>#networkXXXOrderIsMSB, because the return value is
Stefan Vogel <sv@exept.de>
parents: 1542
diff changeset
  2339
#  endif
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2340
	if ((@global(FileOpenTrace) == true) || __debugging__) {
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2341
	    console_fprintf(stderr, "SOCKET: fclose %x (%d %d)\n", fp, fileno(fp), sock);
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2342
	}
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2343
	fclose(fp);
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2344
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2345
#  if defined(CLOSESOCKET_AFTER_FCLOSE)
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2346
	DBGFPRINTF((stderr, "SOCKET: closesocket (%d)\n", sock));
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2347
	closesocket(sock);
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2348
#  endif
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2349
# endif /* !DO_WRAP_CALLS */
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2350
    }
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2351
#endif /* NO_SOCKET */
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2352
%}
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2353
! !
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2354
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2355
!Socket methodsFor:'low level'!
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2356
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2357
getSocketError
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2358
    "get the SO_ERROR form the socket, which indicates the
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2359
     result of an asynchronous operation"
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2360
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2361
%{
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2362
#ifndef NO_SOCKET
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2363
    OBJ fp;
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2364
    int err;
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2365
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2366
    fp = __INST(filePointer);
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2367
    if (fp == nil) {
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2368
	err = EBADF;
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2369
    } else {
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2370
	unsigned int sz;
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2371
	SOCKET sock;
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2372
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2373
	sock = SOCKET_FROM_FILE_OBJECT(fp);
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2374
	sz = sizeof(err);
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2375
	if (getsockopt(sock, SOL_SOCKET, SO_ERROR, &err, &sz) < 0) {
1558
a563aac90660 No need to ask Socket>>#networkXXXOrderIsMSB, because the return value is
Stefan Vogel <sv@exept.de>
parents: 1542
diff changeset
  2376
# ifdef WIN32
1568
3bca500e0c7a send and receiveTimeout fixed
Claus Gittinger <cg@exept.de>
parents: 1561
diff changeset
  2377
	    errno = WSAGetLastError();
1558
a563aac90660 No need to ask Socket>>#networkXXXOrderIsMSB, because the return value is
Stefan Vogel <sv@exept.de>
parents: 1542
diff changeset
  2378
# endif
1568
3bca500e0c7a send and receiveTimeout fixed
Claus Gittinger <cg@exept.de>
parents: 1561
diff changeset
  2379
	    err = errno;
3bca500e0c7a send and receiveTimeout fixed
Claus Gittinger <cg@exept.de>
parents: 1561
diff changeset
  2380
	}
1558
a563aac90660 No need to ask Socket>>#networkXXXOrderIsMSB, because the return value is
Stefan Vogel <sv@exept.de>
parents: 1542
diff changeset
  2381
    }
a563aac90660 No need to ask Socket>>#networkXXXOrderIsMSB, because the return value is
Stefan Vogel <sv@exept.de>
parents: 1542
diff changeset
  2382
a563aac90660 No need to ask Socket>>#networkXXXOrderIsMSB, because the return value is
Stefan Vogel <sv@exept.de>
parents: 1542
diff changeset
  2383
    RETURN(__MKSMALLINT(err));
a563aac90660 No need to ask Socket>>#networkXXXOrderIsMSB, because the return value is
Stefan Vogel <sv@exept.de>
parents: 1542
diff changeset
  2384
#endif
a563aac90660 No need to ask Socket>>#networkXXXOrderIsMSB, because the return value is
Stefan Vogel <sv@exept.de>
parents: 1542
diff changeset
  2385
%}
a563aac90660 No need to ask Socket>>#networkXXXOrderIsMSB, because the return value is
Stefan Vogel <sv@exept.de>
parents: 1542
diff changeset
  2386
!
a563aac90660 No need to ask Socket>>#networkXXXOrderIsMSB, because the return value is
Stefan Vogel <sv@exept.de>
parents: 1542
diff changeset
  2387
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2388
listenFor:aNumber
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2389
    "same as listenWithBacklog: - for ST-80 compatibility"
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2390
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2391
    ^ self listenWithBacklog:aNumber
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2392
!
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2393
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2394
listenWithBacklog:aNumber
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2395
    "start listening; return true if ok, false on error"
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2396
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2397
    filePointer isNil ifTrue:[
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2398
	^ self errorNotOpen
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2399
    ].
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2400
%{
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2401
#ifndef NO_SOCKET
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2402
    OBJ fp = __INST(filePointer);
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2403
    SOCKET sock;
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2404
    int ret;
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2405
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2406
    if (! __isSmallInteger(aNumber)) {
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2407
	DBGPRINTF(("SOCKET: invalid arg\n"));
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2408
	RETURN (false);
1558
a563aac90660 No need to ask Socket>>#networkXXXOrderIsMSB, because the return value is
Stefan Vogel <sv@exept.de>
parents: 1542
diff changeset
  2409
    }
a563aac90660 No need to ask Socket>>#networkXXXOrderIsMSB, because the return value is
Stefan Vogel <sv@exept.de>
parents: 1542
diff changeset
  2410
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2411
    sock = SOCKET_FROM_FILE_OBJECT(fp);
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2412
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2413
#ifdef LISTEN_BLOCKS
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2414
# ifdef DO_WRAP_CALLS
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2415
    do {
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2416
	__threadErrno = 0;
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2417
	ret = STX_WSA_CALL2("listen", listen, sock, __intVal(aNumber));
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2418
    } while ((ret < 0) && (__threadErrno == EINTR));
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2419
# else
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2420
    __BEGIN_INTERRUPTABLE__
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2421
    do {
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2422
	ret = listen(sock, __intVal(aNumber));
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2423
    } while ((ret < 0) && (errno == EINTR));
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2424
    __END_INTERRUPTABLE__
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2425
# endif
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2426
#else
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2427
    ret = listen(sock, __intVal(aNumber));
1884
ee0d640a25a7 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1882
diff changeset
  2428
#endif
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2429
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2430
    if (ret < 0) {
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2431
	DBGPRINTF(("SOCKET: listen call failed errno=%d\n", errno));
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2432
	__INST(lastErrorNumber) = __MKSMALLINT(errno);
1558
a563aac90660 No need to ask Socket>>#networkXXXOrderIsMSB, because the return value is
Stefan Vogel <sv@exept.de>
parents: 1542
diff changeset
  2433
	RETURN (false);
a563aac90660 No need to ask Socket>>#networkXXXOrderIsMSB, because the return value is
Stefan Vogel <sv@exept.de>
parents: 1542
diff changeset
  2434
    }
a563aac90660 No need to ask Socket>>#networkXXXOrderIsMSB, because the return value is
Stefan Vogel <sv@exept.de>
parents: 1542
diff changeset
  2435
#else
a563aac90660 No need to ask Socket>>#networkXXXOrderIsMSB, because the return value is
Stefan Vogel <sv@exept.de>
parents: 1542
diff changeset
  2436
    RETURN (false);
a563aac90660 No need to ask Socket>>#networkXXXOrderIsMSB, because the return value is
Stefan Vogel <sv@exept.de>
parents: 1542
diff changeset
  2437
#endif
a563aac90660 No need to ask Socket>>#networkXXXOrderIsMSB, because the return value is
Stefan Vogel <sv@exept.de>
parents: 1542
diff changeset
  2438
%}.
a563aac90660 No need to ask Socket>>#networkXXXOrderIsMSB, because the return value is
Stefan Vogel <sv@exept.de>
parents: 1542
diff changeset
  2439
    listening := true.
a563aac90660 No need to ask Socket>>#networkXXXOrderIsMSB, because the return value is
Stefan Vogel <sv@exept.de>
parents: 1542
diff changeset
  2440
    ^ true
a563aac90660 No need to ask Socket>>#networkXXXOrderIsMSB, because the return value is
Stefan Vogel <sv@exept.de>
parents: 1542
diff changeset
  2441
! !
a563aac90660 No need to ask Socket>>#networkXXXOrderIsMSB, because the return value is
Stefan Vogel <sv@exept.de>
parents: 1542
diff changeset
  2442
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2443
!Socket protectedMethodsFor:'low level'!
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2444
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2445
setSocketOption:option argument:arg1 argument:arg2
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2446
    |ok|
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2447
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2448
%{  /* STACK: 32000 */
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2449
    OBJ fp = __INST(filePointer);
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2450
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2451
    if (fp != nil) {
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2452
	SOCKET sock;
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2453
	int opt = -1;
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2454
	int level = -1;
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2455
	int usize = -1;
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2456
	int ret;
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2457
	union u {
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2458
	    BOOL        u_bool;
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2459
	    int         u_int;
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2460
	    struct linger u_linger;
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2461
	} u;
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2462
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2463
	sock = SOCKET_FROM_FILE_OBJECT(fp);
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2464
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2465
# ifdef SO_BROADCAST
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2466
	if (option == @symbol(SO_BROADCAST)) {
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2467
	    /* Enables transmission and receipt of broadcast messages on the socket. */
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2468
	    opt = SO_BROADCAST;
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2469
	    level = SOL_SOCKET;
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2470
	    usize = sizeof(u.u_bool);
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2471
	    if (arg1 == true) u.u_bool = TRUE;
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2472
	    else if (arg1 == false) u.u_bool = FALSE;
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2473
	    else goto argError;
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2474
	}
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2475
# endif /* SO_BROADCAST */
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2476
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2477
# ifdef SO_CONDITIONAL
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2478
#  if 0
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2479
	if (option == @symbol(SO_CONDITIONAL)) {
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2480
	    /* Enables sockets to delay the acknowledgment of a connection until after the WSAAccept condition function is called. */
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2481
	    opt = SO_CONDITIONAL;
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2482
	    level = SOL_SOCKET;
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2483
	    usize = sizeof(u.u_bool);
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2484
	    if (arg1 == true) u.u_bool = TRUE;
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2485
	    else if (arg1 == false) u.u_bool = FALSE;
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2486
	    else goto argError;
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2487
	}
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2488
#  endif
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2489
# endif /* SO_CONDITIONAL */
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2490
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2491
# ifdef SO_DEBUG
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2492
	if (option == @symbol(SO_DEBUG)) {
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2493
	    /* Records debugging information. */
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2494
	    opt = SO_DEBUG;
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2495
	    level = SOL_SOCKET;
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2496
	    usize = sizeof(u.u_bool);
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2497
	    if (arg1 == true) u.u_bool = TRUE;
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2498
	    else if (arg1 == false) u.u_bool = FALSE;
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2499
	    else goto argError;
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2500
	}
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2501
# endif /* SO_DEBUG */
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2502
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2503
# ifdef SO_DONTLINGER
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2504
	    if (option == @symbol(SO_DONTLINGER)) {
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2505
		/* Does not block close waiting for unsent data to be sent.
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2506
		   Setting this option is equivalent to setting SO_LINGER with l_onoff set to zero. */
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2507
		opt = SO_DONTLINGER;
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2508
		level = SOL_SOCKET;
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2509
		usize = sizeof(u.u_bool);
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2510
		if (arg1 == true) u.u_bool = TRUE;
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2511
		else if (arg1 == false) u.u_bool = FALSE;
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2512
		else goto argError;
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2513
	    }
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2514
# endif /* SO_DONTLINGER */
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2515
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2516
# ifdef SO_DONTROUTE
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2517
	if (option == @symbol(SO_DONTROUTE)) {
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2518
	    /* Does not route: sends directly to interface.
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2519
	       Succeeds but is ignored on AF_INET sockets;
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2520
	       fails on AF_INET6 sockets with WSAENOPROTOOPT.
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2521
	       Not supported on ATM sockets (results in an error). */
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2522
	    opt = SO_DONTROUTE;
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2523
	    level = SOL_SOCKET;
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2524
	    usize = sizeof(u.u_bool);
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2525
	    if (arg1 == true) u.u_bool = TRUE;
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2526
	    else if (arg1 == false) u.u_bool = FALSE;
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2527
	    else goto argError;
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2528
	}
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2529
# endif /* SO_DONTROUTE */
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2530
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2531
# ifdef SO_KEEPALIVE
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2532
	if (option == @symbol(SO_KEEPALIVE)) {
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2533
	    /* Sends keep-alives. Not supported on ATM sockets (results in an error). */
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2534
	    opt = SO_KEEPALIVE;
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2535
	    level = SOL_SOCKET;
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2536
	    usize = sizeof(u.u_bool);
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2537
	    if (arg1 == true) u.u_bool = TRUE;
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2538
	    else if (arg1 == false) u.u_bool = FALSE;
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2539
	    else goto argError;
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2540
	}
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2541
# endif /* SO_KEEPALIVE */
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2542
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2543
# ifdef SO_LINGER
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2544
	if (option == @symbol(SO_LINGER)) {
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2545
	    /* Lingers on close if unsent data is present. */
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2546
	    opt = SO_LINGER;
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2547
	    level = SOL_SOCKET;
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2548
	    usize = sizeof(u.u_linger);
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2549
	    if (arg1 == true) u.u_linger.l_onoff = TRUE;
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2550
	    else if (arg1 == false) u.u_linger.l_onoff = FALSE;
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2551
	    else goto argError;
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2552
	    if (arg2 == nil) u.u_linger.l_linger = 0;
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2553
	    else if (__isSmallInteger(arg2))u.u_linger.l_linger = __intVal(arg2);
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2554
	    else goto argError;
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2555
	    DBGPRINTF(("SOCKET: SO_LINGER %d %d\n", u.u_linger.l_onoff, u.u_linger.l_linger));
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2556
	}
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2557
# endif /* SO_LINGER */
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2558
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2559
# ifdef SO_OOBINLINE
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2560
	if (option == @symbol(SO_OOBINLINE)) {
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2561
	    /* Receives OOB data in the normal data stream. */
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2562
	    opt = SO_OOBINLINE;
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2563
	    level = SOL_SOCKET;
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2564
	    usize = sizeof(u.u_bool);
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2565
	    if (arg1 == true) u.u_bool = TRUE;
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2566
	    else if (arg1 == false) u.u_bool = FALSE;
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2567
	    else goto argError;
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2568
	}
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2569
# endif /* SO_OOBINLINE */
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2570
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2571
# ifdef SO_RCVBUF
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2572
	if (option == @symbol(SO_RCVBUF)) {
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2573
	    /* Specifies the total per-socket buffer space reserved for receives.
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2574
	       This is unrelated to SO_MAX_MSG_SIZE or the size of a TCP window. */
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2575
	    opt = SO_RCVBUF;
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2576
	    level = SOL_SOCKET;
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2577
	    usize = sizeof(u.u_int);
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2578
	    if (__isSmallInteger(arg1))u.u_int = __intVal(arg1);
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2579
	    else goto argError;
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2580
	}
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2581
# endif /* SO_RCVBUF */
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2582
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2583
# ifdef SO_SNDBUF
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2584
	if (option == @symbol(SO_SNDBUF)) {
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2585
	    /* Specifies the total per-socket buffer space reserved for sends.
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2586
	       This is unrelated to SO_MAX_MSG_SIZE or the size of a TCP window. */
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2587
	    opt = SO_SNDBUF;
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2588
	    level = SOL_SOCKET;
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2589
	    usize = sizeof(u.u_int);
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2590
	    if (__isSmallInteger(arg1))u.u_int = __intVal(arg1);
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2591
	    else goto argError;
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2592
	}
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2593
# endif /* SO_SNDBUF */
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2594
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2595
# ifdef SO_REUSEADDR
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2596
	if (option == @symbol(SO_REUSEADDR)) {
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2597
	    /* Allows the socket to be bound to an address that is already in use.  */
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2598
	    opt = SO_REUSEADDR;
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2599
	    level = SOL_SOCKET;
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2600
	    usize = sizeof(u.u_bool);
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2601
	    if (arg1 == true) u.u_bool = TRUE;
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2602
	    else if (arg1 == false) u.u_bool = FALSE;
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2603
	    else goto argError;
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2604
	}
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2605
# endif /* SO_OOBINLINE */
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2606
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2607
# ifdef SO_EXCLUSIVEADDRUSE
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2608
	if (option == @symbol(SO_EXCLUSIVEADDRUSE)) {
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2609
	    /* Enables a socket to be bound for exclusive access.
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2610
	       Does not require administrative privilege.  */
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2611
	    opt = SO_EXCLUSIVEADDRUSE;
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2612
	    level = SOL_SOCKET;
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2613
	    usize = sizeof(u.u_bool);
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2614
	    if (arg1 == true) u.u_bool = TRUE;
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2615
	    else if (arg1 == false) u.u_bool = FALSE;
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2616
	    else goto argError;
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2617
	}
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2618
# endif /* SO_OOBINLINE */
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2619
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2620
	if (usize == -1) goto argError;
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2621
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2622
	ok = ( setsockopt( sock, level, opt, &u, usize) >= 0) ? true : false;
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2623
    }
1529
911273d090c1 Re-unified Win32 and Unix code into single Socket.st.
Claus Gittinger <cg@exept.de>
parents: 1505
diff changeset
  2624
argError: ;
911273d090c1 Re-unified Win32 and Unix code into single Socket.st.
Claus Gittinger <cg@exept.de>
parents: 1505
diff changeset
  2625
911273d090c1 Re-unified Win32 and Unix code into single Socket.st.
Claus Gittinger <cg@exept.de>
parents: 1505
diff changeset
  2626
%}.
911273d090c1 Re-unified Win32 and Unix code into single Socket.st.
Claus Gittinger <cg@exept.de>
parents: 1505
diff changeset
  2627
    ok isNil ifTrue:[
911273d090c1 Re-unified Win32 and Unix code into single Socket.st.
Claus Gittinger <cg@exept.de>
parents: 1505
diff changeset
  2628
	self primitiveFailed
911273d090c1 Re-unified Win32 and Unix code into single Socket.st.
Claus Gittinger <cg@exept.de>
parents: 1505
diff changeset
  2629
    ].
911273d090c1 Re-unified Win32 and Unix code into single Socket.st.
Claus Gittinger <cg@exept.de>
parents: 1505
diff changeset
  2630
    ok ifFalse:[
911273d090c1 Re-unified Win32 and Unix code into single Socket.st.
Claus Gittinger <cg@exept.de>
parents: 1505
diff changeset
  2631
	'setsocketoption failed' infoPrintCR.
911273d090c1 Re-unified Win32 and Unix code into single Socket.st.
Claus Gittinger <cg@exept.de>
parents: 1505
diff changeset
  2632
    ].
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2633
! !
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2634
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2635
!Socket methodsFor:'low level'!
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2636
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2637
shutdown: howNum
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2638
    "shutDown the socket - inform it that no more I/O will be performed.
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2639
	 0 - read side   (no further reads)
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2640
	 1 - write side  (no further writes)
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2641
	 2 - both        (no further I/O at all)
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2642
     shutDown:2
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2643
	discards any pending data
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2644
	(as opposed to close, which might wait until data is delivered as set by LINGER)"
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2645
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2646
%{
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2647
#ifndef NO_SOCKET
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2648
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2649
    OBJ fp;
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2650
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2651
    fp = __INST(filePointer);
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2652
    if ((fp != nil) && __isSmallInteger(howNum)) {
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2653
	SOCKET sock;
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2654
	int ret;
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2655
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2656
	sock = SOCKET_FROM_FILE_OBJECT(fp);
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2657
# ifdef DO_WRAP_CALLS
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2658
	do {
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2659
	    __threadErrno = 0;
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2660
	    DBGFPRINTF((stderr, "SOCKET: shutDown...\n"));
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2661
	    ret = STX_WSA_CALL2("shutdown", shutdown, sock, __intVal(howNum));
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2662
	    DBGFPRINTF((stderr, "SOCKET: shutDown -> %d (%d)\n", ret, __threadErrno));
1529
911273d090c1 Re-unified Win32 and Unix code into single Socket.st.
Claus Gittinger <cg@exept.de>
parents: 1505
diff changeset
  2663
	} while ((ret < 0) && (__threadErrno == EINTR));
911273d090c1 Re-unified Win32 and Unix code into single Socket.st.
Claus Gittinger <cg@exept.de>
parents: 1505
diff changeset
  2664
# else
1343
cc3bed115c0a definitions cleanup with stxOSDefs.h
penk
parents: 1342
diff changeset
  2665
	__BEGIN_INTERRUPTABLE__
1529
911273d090c1 Re-unified Win32 and Unix code into single Socket.st.
Claus Gittinger <cg@exept.de>
parents: 1505
diff changeset
  2666
	shutdown(sock, __intVal(howNum));
1343
cc3bed115c0a definitions cleanup with stxOSDefs.h
penk
parents: 1342
diff changeset
  2667
	__END_INTERRUPTABLE__
1529
911273d090c1 Re-unified Win32 and Unix code into single Socket.st.
Claus Gittinger <cg@exept.de>
parents: 1505
diff changeset
  2668
# endif
781
4d61e7588ff3 added #waitForNewConnectionOrDataOnAny:timeout:
Claus Gittinger <cg@exept.de>
parents: 776
diff changeset
  2669
    }
4d61e7588ff3 added #waitForNewConnectionOrDataOnAny:timeout:
Claus Gittinger <cg@exept.de>
parents: 776
diff changeset
  2670
#endif
1339
cc973a42aa54 shutdown: added
Claus Gittinger <cg@exept.de>
parents: 1338
diff changeset
  2671
%}.
781
4d61e7588ff3 added #waitForNewConnectionOrDataOnAny:timeout:
Claus Gittinger <cg@exept.de>
parents: 776
diff changeset
  2672
! !
4d61e7588ff3 added #waitForNewConnectionOrDataOnAny:timeout:
Claus Gittinger <cg@exept.de>
parents: 776
diff changeset
  2673
4d61e7588ff3 added #waitForNewConnectionOrDataOnAny:timeout:
Claus Gittinger <cg@exept.de>
parents: 776
diff changeset
  2674
!Socket methodsFor:'low level-accepting'!
4d61e7588ff3 added #waitForNewConnectionOrDataOnAny:timeout:
Claus Gittinger <cg@exept.de>
parents: 776
diff changeset
  2675
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2676
accept
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2677
    "create a new TCP socket from accepting on the receiver.
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2678
     This method will suspend the current process if no connection is waiting.
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2679
     For ST-80 compatibility"
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2680
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2681
    |newSock|
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2682
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2683
    newSock := self class new.
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2684
    (newSock acceptOn:self) ifFalse:[^ nil].
781
4d61e7588ff3 added #waitForNewConnectionOrDataOnAny:timeout:
Claus Gittinger <cg@exept.de>
parents: 776
diff changeset
  2685
    ^ newSock
4d61e7588ff3 added #waitForNewConnectionOrDataOnAny:timeout:
Claus Gittinger <cg@exept.de>
parents: 776
diff changeset
  2686
4d61e7588ff3 added #waitForNewConnectionOrDataOnAny:timeout:
Claus Gittinger <cg@exept.de>
parents: 776
diff changeset
  2687
    "
4d61e7588ff3 added #waitForNewConnectionOrDataOnAny:timeout:
Claus Gittinger <cg@exept.de>
parents: 776
diff changeset
  2688
     |sock newSock|
4d61e7588ff3 added #waitForNewConnectionOrDataOnAny:timeout:
Claus Gittinger <cg@exept.de>
parents: 776
diff changeset
  2689
4d61e7588ff3 added #waitForNewConnectionOrDataOnAny:timeout:
Claus Gittinger <cg@exept.de>
parents: 776
diff changeset
  2690
     sock := Socket provide:8004.
4d61e7588ff3 added #waitForNewConnectionOrDataOnAny:timeout:
Claus Gittinger <cg@exept.de>
parents: 776
diff changeset
  2691
     sock listenFor:5.
4d61e7588ff3 added #waitForNewConnectionOrDataOnAny:timeout:
Claus Gittinger <cg@exept.de>
parents: 776
diff changeset
  2692
     newSock := sock accept.
4d61e7588ff3 added #waitForNewConnectionOrDataOnAny:timeout:
Claus Gittinger <cg@exept.de>
parents: 776
diff changeset
  2693
    "
4d61e7588ff3 added #waitForNewConnectionOrDataOnAny:timeout:
Claus Gittinger <cg@exept.de>
parents: 776
diff changeset
  2694
!
4d61e7588ff3 added #waitForNewConnectionOrDataOnAny:timeout:
Claus Gittinger <cg@exept.de>
parents: 776
diff changeset
  2695
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2696
acceptOn:aSocket
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2697
    "accept a connection on a server port (created with:'Socket>>onIPPort:')
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2698
     usage is: (Socket basicNew acceptOn:(Socket onIPPort:9999)).
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2699
     This method will suspend the current process if no connection is waiting.
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2700
     Return the true if ok; false if not."
781
4d61e7588ff3 added #waitForNewConnectionOrDataOnAny:timeout:
Claus Gittinger <cg@exept.de>
parents: 776
diff changeset
  2701
896
2ca43149a20e Ask for possible error after async connect.
Stefan Vogel <sv@exept.de>
parents: 888
diff changeset
  2702
    aSocket readWait.
1529
911273d090c1 Re-unified Win32 and Unix code into single Socket.st.
Claus Gittinger <cg@exept.de>
parents: 1505
diff changeset
  2703
    ^ self primAcceptOn:aSocket blocking:false.
781
4d61e7588ff3 added #waitForNewConnectionOrDataOnAny:timeout:
Claus Gittinger <cg@exept.de>
parents: 776
diff changeset
  2704
4d61e7588ff3 added #waitForNewConnectionOrDataOnAny:timeout:
Claus Gittinger <cg@exept.de>
parents: 776
diff changeset
  2705
    "Modified: / 11.3.1996 / 14:21:31 / stefan"
4d61e7588ff3 added #waitForNewConnectionOrDataOnAny:timeout:
Claus Gittinger <cg@exept.de>
parents: 776
diff changeset
  2706
    "Modified: / 1.8.1998 / 23:39:10 / cg"
4d61e7588ff3 added #waitForNewConnectionOrDataOnAny:timeout:
Claus Gittinger <cg@exept.de>
parents: 776
diff changeset
  2707
!
4d61e7588ff3 added #waitForNewConnectionOrDataOnAny:timeout:
Claus Gittinger <cg@exept.de>
parents: 776
diff changeset
  2708
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2709
blockingAccept
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2710
    "create a new TCP socket from accepting on the receiver.
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2711
     This method will suspend the current process if no connection is waiting.
1529
911273d090c1 Re-unified Win32 and Unix code into single Socket.st.
Claus Gittinger <cg@exept.de>
parents: 1505
diff changeset
  2712
     For ST-80 compatibility"
911273d090c1 Re-unified Win32 and Unix code into single Socket.st.
Claus Gittinger <cg@exept.de>
parents: 1505
diff changeset
  2713
911273d090c1 Re-unified Win32 and Unix code into single Socket.st.
Claus Gittinger <cg@exept.de>
parents: 1505
diff changeset
  2714
    |newSock|
911273d090c1 Re-unified Win32 and Unix code into single Socket.st.
Claus Gittinger <cg@exept.de>
parents: 1505
diff changeset
  2715
911273d090c1 Re-unified Win32 and Unix code into single Socket.st.
Claus Gittinger <cg@exept.de>
parents: 1505
diff changeset
  2716
    newSock := self class new.
911273d090c1 Re-unified Win32 and Unix code into single Socket.st.
Claus Gittinger <cg@exept.de>
parents: 1505
diff changeset
  2717
    (newSock blockingAcceptOn:self) ifFalse:[^ nil].
911273d090c1 Re-unified Win32 and Unix code into single Socket.st.
Claus Gittinger <cg@exept.de>
parents: 1505
diff changeset
  2718
    ^ newSock
911273d090c1 Re-unified Win32 and Unix code into single Socket.st.
Claus Gittinger <cg@exept.de>
parents: 1505
diff changeset
  2719
!
911273d090c1 Re-unified Win32 and Unix code into single Socket.st.
Claus Gittinger <cg@exept.de>
parents: 1505
diff changeset
  2720
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2721
blockingAcceptOn:aSocket
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2722
    "accept a connection on a server port (created with:'Socket>>onIPPort:')
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2723
     usage is: (Socket basicNew acceptOn:(Socket onIPPort:9999)).
1529
911273d090c1 Re-unified Win32 and Unix code into single Socket.st.
Claus Gittinger <cg@exept.de>
parents: 1505
diff changeset
  2724
     This method will suspend the current process if no connection is waiting.
911273d090c1 Re-unified Win32 and Unix code into single Socket.st.
Claus Gittinger <cg@exept.de>
parents: 1505
diff changeset
  2725
     Return the true if ok; false if not."
911273d090c1 Re-unified Win32 and Unix code into single Socket.st.
Claus Gittinger <cg@exept.de>
parents: 1505
diff changeset
  2726
911273d090c1 Re-unified Win32 and Unix code into single Socket.st.
Claus Gittinger <cg@exept.de>
parents: 1505
diff changeset
  2727
    ^ self primAcceptOn:aSocket blocking:true.
911273d090c1 Re-unified Win32 and Unix code into single Socket.st.
Claus Gittinger <cg@exept.de>
parents: 1505
diff changeset
  2728
!
911273d090c1 Re-unified Win32 and Unix code into single Socket.st.
Claus Gittinger <cg@exept.de>
parents: 1505
diff changeset
  2729
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2730
pollingWaitForNewConnectionOrDataOnAny:otherConnections timeout:timeoutSeconds
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2731
    <resource: #obsolete>
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2732
    "stupid MSDOS does not support select on sockets (sigh).
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2733
     Must poll here."
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2734
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2735
    |millis newConnection|
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2736
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2737
    millis := timeoutSeconds * 1000.
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2738
    [millis > 0] whileTrue:[
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2739
	otherConnections size > 0 ifTrue:[
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2740
	    otherConnections do:[:aConnection |
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2741
		aConnection canReadWithoutBlocking ifTrue:[
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2742
		    ^ aConnection
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2743
		]
1558
a563aac90660 No need to ask Socket>>#networkXXXOrderIsMSB, because the return value is
Stefan Vogel <sv@exept.de>
parents: 1542
diff changeset
  2744
	    ].
a563aac90660 No need to ask Socket>>#networkXXXOrderIsMSB, because the return value is
Stefan Vogel <sv@exept.de>
parents: 1542
diff changeset
  2745
	].
a563aac90660 No need to ask Socket>>#networkXXXOrderIsMSB, because the return value is
Stefan Vogel <sv@exept.de>
parents: 1542
diff changeset
  2746
	newConnection := self blockingAccept.
a563aac90660 No need to ask Socket>>#networkXXXOrderIsMSB, because the return value is
Stefan Vogel <sv@exept.de>
parents: 1542
diff changeset
  2747
	newConnection notNil ifTrue:[^ newConnection].
a563aac90660 No need to ask Socket>>#networkXXXOrderIsMSB, because the return value is
Stefan Vogel <sv@exept.de>
parents: 1542
diff changeset
  2748
	Delay waitForMilliseconds:20.
a563aac90660 No need to ask Socket>>#networkXXXOrderIsMSB, because the return value is
Stefan Vogel <sv@exept.de>
parents: 1542
diff changeset
  2749
	millis := millis - 20.
a563aac90660 No need to ask Socket>>#networkXXXOrderIsMSB, because the return value is
Stefan Vogel <sv@exept.de>
parents: 1542
diff changeset
  2750
    ].
a563aac90660 No need to ask Socket>>#networkXXXOrderIsMSB, because the return value is
Stefan Vogel <sv@exept.de>
parents: 1542
diff changeset
  2751
    ^ nil.
a563aac90660 No need to ask Socket>>#networkXXXOrderIsMSB, because the return value is
Stefan Vogel <sv@exept.de>
parents: 1542
diff changeset
  2752
!
a563aac90660 No need to ask Socket>>#networkXXXOrderIsMSB, because the return value is
Stefan Vogel <sv@exept.de>
parents: 1542
diff changeset
  2753
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2754
pollingWaitForNewConnectionWithTimeout:timeoutSeconds
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2755
    <resource: #obsolete>
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2756
    "stupid MSDOS does not support select on sockets (sigh).
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2757
     Must poll here."
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2758
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2759
    |millis newConnection|
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2760
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2761
    timeoutSeconds notNil ifTrue:[
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2762
	millis := timeoutSeconds * 1000.
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2763
    ].
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2764
    [millis isNil or:[millis > 0]] whileTrue:[
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2765
	newConnection := self blockingAccept.
1558
a563aac90660 No need to ask Socket>>#networkXXXOrderIsMSB, because the return value is
Stefan Vogel <sv@exept.de>
parents: 1542
diff changeset
  2766
	newConnection notNil ifTrue:[^ newConnection].
a563aac90660 No need to ask Socket>>#networkXXXOrderIsMSB, because the return value is
Stefan Vogel <sv@exept.de>
parents: 1542
diff changeset
  2767
	Delay waitForMilliseconds:20.
a563aac90660 No need to ask Socket>>#networkXXXOrderIsMSB, because the return value is
Stefan Vogel <sv@exept.de>
parents: 1542
diff changeset
  2768
	millis notNil ifTrue:[
a563aac90660 No need to ask Socket>>#networkXXXOrderIsMSB, because the return value is
Stefan Vogel <sv@exept.de>
parents: 1542
diff changeset
  2769
	    millis := millis - 20.
a563aac90660 No need to ask Socket>>#networkXXXOrderIsMSB, because the return value is
Stefan Vogel <sv@exept.de>
parents: 1542
diff changeset
  2770
	]
a563aac90660 No need to ask Socket>>#networkXXXOrderIsMSB, because the return value is
Stefan Vogel <sv@exept.de>
parents: 1542
diff changeset
  2771
    ].
a563aac90660 No need to ask Socket>>#networkXXXOrderIsMSB, because the return value is
Stefan Vogel <sv@exept.de>
parents: 1542
diff changeset
  2772
    ^ nil.
a563aac90660 No need to ask Socket>>#networkXXXOrderIsMSB, because the return value is
Stefan Vogel <sv@exept.de>
parents: 1542
diff changeset
  2773
!
a563aac90660 No need to ask Socket>>#networkXXXOrderIsMSB, because the return value is
Stefan Vogel <sv@exept.de>
parents: 1542
diff changeset
  2774
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2775
primAcceptOn:aSocket blocking:blocking
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2776
    "accept a connection on a server port (created with:'Socket>>onIPPort:')
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2777
     usage is: (Socket basicNew acceptOn:(Socket onIPPort:9999)).
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2778
     Return the true if ok; false if not."
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2779
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2780
    |serverSocketFd addr addrLen domainClass|
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2781
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2782
    filePointer notNil ifTrue:[
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2783
	^ self errorAlreadyOpen
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2784
    ].
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2785
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2786
    domain := aSocket domain.
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2787
    socketType := aSocket type.
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2788
    serverSocketFd := aSocket fileDescriptor.
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2789
    serverSocketFd isNil ifTrue:[
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2790
	^ self error:'invalid server socket'
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2791
    ].
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2792
    (serverSocketFd isMemberOf:SmallInteger) ifFalse:[
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2793
	^ self error:'invalid server socket'
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2794
    ].
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2795
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2796
    domainClass := self class socketAddressClassForDomain:domain.
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2797
    domainClass isNil ifTrue:[
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2798
	^ self error:'invalid (unsupported) domain'.
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2799
    ].
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2800
    addrLen := domainClass socketAddressSize.
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2801
    addr := domainClass new.
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2802
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2803
%{  /* STACK: 100000 */
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2804
#ifndef NO_SOCKET
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2805
    FILE *fp;
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2806
    int flags;
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2807
    SOCKET sock, newSock;
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2808
    union sockaddr_u sa;
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2809
    unsigned int alen, alen0;
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2810
    struct hostent *he ;
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2811
    char dotted[20] ;
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2812
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2813
    if (!__isSmallInteger(addrLen)) {
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2814
	DBGPRINTF(("SOCKET: bad addrLen\n"));
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2815
	RETURN (false);
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2816
    }
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2817
    alen0 = __intVal(addrLen);
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2818
    sock = SOCKET_FROM_FD(__intVal(serverSocketFd));
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2819
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2820
    if (blocking == false) {
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2821
# if defined(O_NONBLOCK) && defined(SET_NDELAY)
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2822
	flags = fcntl(sock, F_GETFL);
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2823
	fcntl(sock, F_SETFL, flags | O_NONBLOCK);
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2824
# endif
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2825
    }
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2826
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2827
# ifdef DO_WRAP_CALLS
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2828
    do {
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2829
	__threadErrno = 0;
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2830
	alen = alen0;
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2831
	newSock = STX_WSA_CALL3("accept", accept, sock, &sa, &alen);
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2832
    } while ((newSock < 0) && (__threadErrno == EINTR));
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2833
# else
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2834
    __BEGIN_INTERRUPTABLE__
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2835
    do {
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2836
	alen = alen0;
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2837
	newSock = accept(sock, (struct sockaddr *) &sa, &alen);
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2838
    } while ((newSock < 0) && (errno == EINTR));
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2839
    __END_INTERRUPTABLE__
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2840
# endif
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2841
    DBGFPRINTF((stderr, "SOCKET: accept newSock=%d\n", newSock));
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2842
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2843
    if (blocking == false) {
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2844
# if defined(O_NDELAY) && defined(SET_NDELAY)
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2845
	fcntl(sock, F_SETFL, flags);
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2846
# endif
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2847
    }
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2848
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2849
    if (newSock < 0) {
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2850
	DBGPRINTF(("SOCKET: accept call failed errno=%d\n", errno));
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2851
	__INST(lastErrorNumber) = __MKSMALLINT(errno);
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2852
	RETURN (false);
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2853
    }
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2854
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2855
    if (__isNonNilObject(addr)) {
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2856
	OBJ oClass;
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2857
	int nInstVars, nInstBytes, objSize;
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2858
	char *cp;
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2859
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2860
	oClass = __qClass(addr);
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2861
	if (! __isBytes(addr) ) {
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2862
	    DBGPRINTF(("SOCKET: bad addr\n"));
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2863
	    closesocket(newSock);
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2864
	    RETURN (false);
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2865
	}
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2866
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2867
	nInstVars = __intVal(__ClassInstPtr(oClass)->c_ninstvars);
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2868
	nInstBytes = OHDR_SIZE + (nInstVars * sizeof(OBJ));
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2869
	objSize = __qSize(addr) - nInstBytes;
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2870
	cp = (char *)__InstPtr(addr) + nInstBytes;
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2871
	if (objSize < alen) {
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2872
	    DBGPRINTF(("SOCKET: bad addr\n"));
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2873
	    closesocket(newSock);
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2874
	    RETURN (false);
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2875
	}
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2876
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2877
	/*
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2878
	 * extract the partners address
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2879
	 */
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2880
	bcopy((char *)&sa, cp, alen);
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2881
	addrLen = __MKSMALLINT(alen);
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2882
    }
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2883
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2884
    /*
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2885
     * make it a FILE *
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2886
     */
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2887
# ifdef WIN32
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2888
    {
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2889
	int _fd = _open_osfhandle(newSock, 0);
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2890
	fp = fdopen(_fd, "r+");
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2891
	DBGPRINTF(("SOCKET: sock=%d fd=%d fp=%x\n",newSock,_fd, fp));
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2892
    }
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2893
# else
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2894
    fp = fdopen(newSock, "r+");
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2895
# endif
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2896
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2897
    if (! fp) {
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2898
	DBGPRINTF(("SOCKET: fdopen call failed\n"));
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2899
	__INST(lastErrorNumber) = __MKSMALLINT(errno);
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2900
#  ifdef DO_WRAP_CALLS
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2901
	{
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2902
	  int ret;
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2903
	  do {
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2904
	      __threadErrno = 0;
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2905
	      ret = STX_WSA_CALL1("closesocket", closesocket, newSock);
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2906
	  } while ((ret < 0) && (__threadErrno == EINTR));
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2907
	}
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2908
#  else
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2909
	closesocket(newSock);
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2910
#  endif
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2911
	DBGFPRINTF((stderr, "SOCKET: close (fdopen failed) (%d)\n", newSock));
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2912
	RETURN (false);
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2913
    }
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2914
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2915
    if ((@global(FileOpenTrace) == true) || __debugging__) {
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2916
# ifdef WIN32
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2917
	{
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2918
	    HANDLE h;
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2919
	    int _fd = fileno(fp);
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2920
	    h = (HANDLE)_get_osfhandle(_fd);
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2921
	    console_fprintf(stderr, "fdopen [Socket] -> %x (fd: %d) (H: %x)\n", fp, _fd, h);
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2922
	}
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2923
# else
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2924
	console_fprintf(stderr, "fdopen [Socket] -> %x (fd: %d)\n", fp, newSock);
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2925
# endif
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2926
    }
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2927
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2928
# ifdef BUGGY_STDIO_LIB
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2929
    setbuf(fp, NULL);
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2930
    __INST(buffered) = false;
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2931
# endif
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2932
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2933
# if 0
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2934
    // The original code was:
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2935
    __INST(filePointer) = __MKOBJ((INT)fp); __STORESELF(filePointer);
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2936
    // but for that, gcc generates wrong code, which loads self (volatile) into
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2937
    // a register (bp), then calls __MKOBJ, then stores indirect bp.
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2938
    // That is wrong if a scavenge occurs in MKOBJ, as bp is now still pointing to the old
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2939
    // object.
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2940
# endif
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2941
    {
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2942
	OBJ t;
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2943
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2944
	t = __MKOBJ(fp);
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2945
	__INST(filePointer) = t;
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2946
	__STORE(self, t);
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2947
    }
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2948
#endif /* not NO_SOCKET */
208
c3eca2cc16dc accept: do not wait for input on non-connected socket.
Stefan Vogel <sv@exept.de>
parents: 207
diff changeset
  2949
%}.
c3eca2cc16dc accept: do not wait for input on non-connected socket.
Stefan Vogel <sv@exept.de>
parents: 207
diff changeset
  2950
    mode := #readwrite.
c3eca2cc16dc accept: do not wait for input on non-connected socket.
Stefan Vogel <sv@exept.de>
parents: 207
diff changeset
  2951
    Lobby register:self.
c3eca2cc16dc accept: do not wait for input on non-connected socket.
Stefan Vogel <sv@exept.de>
parents: 207
diff changeset
  2952
    binary := false.
c3eca2cc16dc accept: do not wait for input on non-connected socket.
Stefan Vogel <sv@exept.de>
parents: 207
diff changeset
  2953
    port := aSocket port.
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
  2954
1282
7e4ffdfd19f6 remove historic leftover
Claus Gittinger <cg@exept.de>
parents: 1280
diff changeset
  2955
    addr notNil ifTrue:[
1568
3bca500e0c7a send and receiveTimeout fixed
Claus Gittinger <cg@exept.de>
parents: 1561
diff changeset
  2956
	peer := addr.
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
  2957
    ].
7e5f2f6b177d getHostByAddr - call is now done lazy, when the socket is asked for the peer
Claus Gittinger <cg@exept.de>
parents: 1186
diff changeset
  2958
208
c3eca2cc16dc accept: do not wait for input on non-connected socket.
Stefan Vogel <sv@exept.de>
parents: 207
diff changeset
  2959
    ^ true
c3eca2cc16dc accept: do not wait for input on non-connected socket.
Stefan Vogel <sv@exept.de>
parents: 207
diff changeset
  2960
!
c3eca2cc16dc accept: do not wait for input on non-connected socket.
Stefan Vogel <sv@exept.de>
parents: 207
diff changeset
  2961
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2962
waitForNewConnectionOrDataOnAny:otherConnections timeout:timeoutSeconds
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2963
    "suspend the current process, until either a new connection comes
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2964
     in at the receiver, or data arrives on any of the otherConnections.
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2965
     For a new connection, an accept is performed and the new socket is returned.
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2966
     For an old connection, that socket is returned.
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2967
     In any case, the caller gets a socket to operate on as return value,
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2968
     or nil, if a timeout occured.
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2969
     This method implements the inner wait-primitive of a multi-connection
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2970
     server application."
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2971
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2972
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2973
    |wasBlocked sema|
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2974
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2975
    "first, a quick check if data is already available"
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2976
    self canReadWithoutBlocking ifTrue:[
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2977
	^ self accept.
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2978
    ].
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2979
    otherConnections do:[:aConnection |
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2980
	aConnection canReadWithoutBlocking ifTrue:[
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2981
	    ^ aConnection
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2982
	]
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2983
    ].
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2984
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2985
    [
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2986
	"check again - prevent incoming interrupts from disturbing our setup"
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2987
	wasBlocked := OperatingSystem blockInterrupts.
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2988
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2989
	self canReadWithoutBlocking ifTrue:[
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2990
	    ^ self accept.
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2991
	].
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2992
	otherConnections do:[:aConnection |
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2993
	    aConnection canReadWithoutBlocking ifTrue:[
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2994
		^ aConnection
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2995
	    ]
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2996
	].
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2997
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2998
	"nope - must wait"
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  2999
	sema := Semaphore new name:'multiReadWait'.
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3000
	otherConnections do:[:aConnection |
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3001
	    Processor signal:sema onInput:(aConnection fileDescriptor).
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3002
	].
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3003
	Processor signal:sema onInput:(self fileDescriptor).
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3004
	timeoutSeconds notNil ifTrue:[
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3005
	    Processor signal:sema afterSeconds:timeoutSeconds
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3006
	].
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3007
	Processor activeProcess state:#ioWait.
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3008
	sema wait.
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3009
    ] ensure:[
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3010
	sema notNil ifTrue:[Processor disableSemaphore:sema].
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3011
	wasBlocked ifFalse:[OperatingSystem unblockInterrupts].
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3012
    ].
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3013
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3014
    "see who it was ..."
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3015
    self canReadWithoutBlocking ifTrue:[
1861
b7ee00950a85 debug print
Claus Gittinger <cg@exept.de>
parents: 1860
diff changeset
  3016
	^ self accept.
781
4d61e7588ff3 added #waitForNewConnectionOrDataOnAny:timeout:
Claus Gittinger <cg@exept.de>
parents: 776
diff changeset
  3017
    ].
4d61e7588ff3 added #waitForNewConnectionOrDataOnAny:timeout:
Claus Gittinger <cg@exept.de>
parents: 776
diff changeset
  3018
    otherConnections do:[:aConnection |
1861
b7ee00950a85 debug print
Claus Gittinger <cg@exept.de>
parents: 1860
diff changeset
  3019
	aConnection canReadWithoutBlocking ifTrue:[
b7ee00950a85 debug print
Claus Gittinger <cg@exept.de>
parents: 1860
diff changeset
  3020
	    ^ aConnection
b7ee00950a85 debug print
Claus Gittinger <cg@exept.de>
parents: 1860
diff changeset
  3021
	]
781
4d61e7588ff3 added #waitForNewConnectionOrDataOnAny:timeout:
Claus Gittinger <cg@exept.de>
parents: 776
diff changeset
  3022
    ].
4d61e7588ff3 added #waitForNewConnectionOrDataOnAny:timeout:
Claus Gittinger <cg@exept.de>
parents: 776
diff changeset
  3023
1859
00d7af30bfad Select on seockets works in Win32. Polling is no longer required.
Stefan Vogel <sv@exept.de>
parents: 1848
diff changeset
  3024
    "none - a timeout"
781
4d61e7588ff3 added #waitForNewConnectionOrDataOnAny:timeout:
Claus Gittinger <cg@exept.de>
parents: 776
diff changeset
  3025
    ^ nil
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3026
!
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3027
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3028
waitForNewConnectionWithTimeout:timeoutSeconds
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3029
    "suspend the current process, until a new connection comes
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3030
     in at the receiver or a timeout occurs.
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3031
     For a new connection, an accept is performed and the new socket is returned.
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3032
     Returns nil, if a timeout occured.
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3033
     This method implements the inner wait-primitive of a single-connection
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3034
     server application."
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3035
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3036
    (self readWaitWithTimeout:timeoutSeconds) ifTrue:[
1884
ee0d640a25a7 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1882
diff changeset
  3037
	"a timeout occurred - no connection within timeout"
ee0d640a25a7 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1882
diff changeset
  3038
	^ nil
ee0d640a25a7 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1882
diff changeset
  3039
    ].
ee0d640a25a7 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1882
diff changeset
  3040
    ^ self accept.
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3041
! !
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3042
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3043
!Socket methodsFor:'low level-connecting'!
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3044
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3045
connectTo:hostOrPathName port:portNrOrName
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3046
    "low level connect; connect to port, portNrOrNameOrNil on host, hostName.
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3047
     For backward compatibility, host may be also a string or a byteArray,
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3048
     but it is recommended to pass socketAddress instances.
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3049
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3050
     Return true if ok, false otherwise.
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3051
     The current process will block (but not the whole Smalltalk) until the connection is established.
116
7789fb1c9fa2 more UD socket fixes (at least client side seems to work now)
Claus Gittinger <cg@exept.de>
parents: 115
diff changeset
  3052
     See also: #connectTo:port:withTimeout: for a somewhat nicer interface."
28
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  3053
896
2ca43149a20e Ask for possible error after async connect.
Stefan Vogel <sv@exept.de>
parents: 888
diff changeset
  3054
    ^ self connectTo:hostOrPathName port:portNrOrName withTimeout:nil
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3055
!
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3056
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3057
connectTo:hostOrPathNameOrSocketAddr port:portNrOrNameOrNil withTimeout:timeout
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3058
    "low level connect; connect to port, portNrOrNameOrNil on host, hostName.
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3059
     For backward compatibility, host may be also a string or a byteArray,
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3060
     but it is recommended to pass socketAddress instances.
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3061
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3062
     Return true if ok, false otherwise.
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3063
     The current process will block (but not the whole Smalltalk) until the connection is established,
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3064
     or timeout millliseconds have passed."
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3065
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3066
    |isAsync err domainClass addr addrName|
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3067
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3068
    filePointer isNil ifTrue:[
1911
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
  3069
        ^ self errorNotOpen
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3070
    ].
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3071
1911
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
  3072
    (hostOrPathNameOrSocketAddr isKindOf:SocketAddress) ifTrue:[
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
  3073
        addr := hostOrPathNameOrSocketAddr.
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
  3074
        portNrOrNameOrNil notNil ifTrue:[
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
  3075
            addr port:portNrOrNameOrNil.
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
  3076
        ].
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3077
    ] ifFalse:[
1911
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
  3078
        "backward compatibility: support for byteArray and string arg"
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
  3079
        domainClass := self class socketAddressClassForDomain:domain.
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
  3080
        domainClass isNil ifTrue:[
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
  3081
            ^ self error:'invalid (unsupported) domain'.
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
  3082
        ].
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
  3083
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
  3084
        hostOrPathNameOrSocketAddr isString ifTrue:[
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
  3085
            addr := domainClass hostName:hostOrPathNameOrSocketAddr port:portNrOrNameOrNil.
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
  3086
            addrName := hostOrPathNameOrSocketAddr.
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
  3087
        ] ifFalse:[
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
  3088
            hostOrPathNameOrSocketAddr isByteCollection ifFalse:[
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
  3089
                ^ self error:'bad host (socketAddress) argument'
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
  3090
            ].
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
  3091
            addr := domainClass hostAddress:hostOrPathNameOrSocketAddr port:portNrOrNameOrNil.
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
  3092
        ].
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3093
    ].
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3094
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3095
%{  /* STACK: 100000 */
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3096
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3097
#ifndef NO_SOCKET
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3098
    OBJ fp = __INST(filePointer);
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3099
    union sockaddr_u sa;
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3100
    SOCKET sock;
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3101
    int a;
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3102
    int ret, oldFlags;
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3103
    int on = 1;
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3104
    int sockaddr_size;
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3105
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3106
    if (!__isNonNilObject(addr) || !__isBytes(addr)) {
1911
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
  3107
        DBGPRINTF(("SOCKET: invalid addrBytes\n"));
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
  3108
        RETURN (false);
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3109
    }
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3110
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3111
    {
1911
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
  3112
        int sockAddrOffs, nIndex;
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
  3113
        OBJ cls;
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
  3114
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
  3115
        sockAddrOffs = 0;
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
  3116
        if ((cls = __qClass(addr)) != @global(ByteArray))
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
  3117
            sockAddrOffs += __OBJS2BYTES__(__intVal(__ClassInstPtr(cls)->c_ninstvars));
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
  3118
        nIndex = __qSize(addr) - OHDR_SIZE;
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
  3119
        sockaddr_size = nIndex - sockAddrOffs;
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
  3120
        if (sockaddr_size > sizeof(sa)) {
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
  3121
            console_fprintf(stderr, "Socket: bad socketAddr\n");
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
  3122
            RETURN (false);
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
  3123
        }
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
  3124
        bcopy((__byteArrayVal(addr) + sockAddrOffs), &sa, sockaddr_size);
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3125
    }
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3126
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3127
    sock = SOCKET_FROM_FILE_OBJECT(fp);
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3128
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3129
# if defined(O_NONBLOCK)
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3130
#  if !defined(WIN32)
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3131
    /*
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3132
     * set to non-blocking and wait later
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3133
     */
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3134
    oldFlags = fcntl(sock, F_GETFL, 0);
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3135
    /* on SUNOS4.x, would use fcntl(osfd, F_SETFL, flags | FNDELAY); */
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3136
    fcntl(sock, F_SETFL, oldFlags | O_NONBLOCK);
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3137
#  endif
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3138
# endif
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3139
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3140
    /*
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3141
     * connect
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3142
     */
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3143
# ifdef DO_WRAP_CALLS
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3144
    do {
1911
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
  3145
        DBGFPRINTF((stderr, "SOCKET: connect...\n"));
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
  3146
        __threadErrno = 0;
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
  3147
        ret = STX_WSA_NOINT_CALL3("connect", connect, sock, &sa, sockaddr_size);
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
  3148
        DBGFPRINTF((stderr, "SOCKET: connect(%d) -> %d (%d)\n", sock, ret, __threadErrno));
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3149
    } while ((ret < 0) && (__threadErrno == EINTR));
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3150
# else
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3151
    __BEGIN_INTERRUPTABLE__
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3152
    do {
1911
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
  3153
        ret = connect(sock, (struct sockaddr *)&sa, sockaddr_size);
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3154
    } while ((ret < 0)
1911
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
  3155
             && ((errno == EINTR)
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3156
# ifdef EAGAIN
1911
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
  3157
                 || (errno == EAGAIN)
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3158
# endif
1911
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
  3159
                ));
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3160
    __END_INTERRUPTABLE__
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3161
#endif
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3162
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3163
    if (ret < 0) {
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3164
# if defined(EINPROGRESS) || defined(EALREADY)
1911
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
  3165
        if (0
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3166
#  ifdef EINPROGRESS
1911
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
  3167
            || (errno == EINPROGRESS)
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3168
#  endif
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3169
#  ifdef EALREADY
1911
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
  3170
            || (errno == EALREADY)
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3171
#  endif
1911
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
  3172
        ) {
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
  3173
            /*
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
  3174
             * This was a nonblocking operation that will take some time.
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
  3175
             * Do a select on read to get informed when the operation is ready.
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
  3176
             */
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
  3177
            DBGFPRINTF((stderr, "SOCKET: isAsync is true\n"));
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
  3178
            isAsync = true;
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
  3179
        } else
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3180
# endif /* EINPROGRESS or EALREADY */
1911
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
  3181
        {
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
  3182
            DBGFPRINTF((stderr, "SOCKET: connect failed ret=%d errno=%d __threadErrno=%d\n",
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
  3183
                        ret, errno, __threadErrno ));
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3184
# ifdef DUMP_ADDRESS
1911
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
  3185
            {
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
  3186
                char *cp = (char *)(&sa);
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
  3187
                int i;
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
  3188
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
  3189
                console_printf("address data:\n");
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
  3190
                for (i=0; i<sockaddr_size; i++) {
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
  3191
                    console_printf(" %02x\n", *cp++);
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
  3192
                }
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
  3193
            }
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3194
# endif
1911
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
  3195
            __INST(lastErrorNumber) = __MKSMALLINT(errno);
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
  3196
            RETURN (false);
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
  3197
        }
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3198
    }
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3199
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3200
# if defined(O_NONBLOCK)
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3201
#  if !defined(WIN32)
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3202
    fcntl(sock, F_SETFL, oldFlags);
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3203
#  endif
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3204
# endif
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3205
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3206
# else /* NO_SOCKET */
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3207
    RETURN (false);
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3208
# endif /* NO_SOCKET */
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3209
%}.
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3210
    isAsync == true ifTrue:[
1911
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
  3211
        (self writeWaitWithTimeoutMs:timeout) ifTrue:[
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
  3212
            "/ a timeout occured
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
  3213
            "/ should cancel the connect?
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
  3214
            ^ false.
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
  3215
        ].
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
  3216
        err := self getSocketError.
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
  3217
        err ~~ 0 ifTrue:[
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
  3218
            lastErrorNumber := err.
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
  3219
            ^ false.
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
  3220
        ].
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3221
    ].
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3222
    port := portNrOrNameOrNil.
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3223
    peer := addr.
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3224
    peerName := addrName.
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3225
    ^ true
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3226
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3227
    "
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3228
       |sock|
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3229
       sock := Socket newTCP.
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3230
       sock connectTo:'localhost' port:21 withTimeout:1000.
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3231
       sock
896
2ca43149a20e Ask for possible error after async connect.
Stefan Vogel <sv@exept.de>
parents: 888
diff changeset
  3232
2ca43149a20e Ask for possible error after async connect.
Stefan Vogel <sv@exept.de>
parents: 888
diff changeset
  3233
       |sock|
2ca43149a20e Ask for possible error after async connect.
Stefan Vogel <sv@exept.de>
parents: 888
diff changeset
  3234
       sock := Socket newTCP.
2ca43149a20e Ask for possible error after async connect.
Stefan Vogel <sv@exept.de>
parents: 888
diff changeset
  3235
       sock connectTo:'localhost' port:9876 withTimeout:2000.
2ca43149a20e Ask for possible error after async connect.
Stefan Vogel <sv@exept.de>
parents: 888
diff changeset
  3236
       sock
2ca43149a20e Ask for possible error after async connect.
Stefan Vogel <sv@exept.de>
parents: 888
diff changeset
  3237
    "
25
996051271ce9 *** empty log message ***
claus
parents: 21
diff changeset
  3238
! !
996051271ce9 *** empty log message ***
claus
parents: 21
diff changeset
  3239
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3240
!Socket methodsFor:'printing & storing'!
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3241
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3242
printOn:aStream
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3243
    aStream nextPutAll:self className; nextPutAll:'(protocol='.
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3244
    protocol printOn:aStream.
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3245
    aStream nextPutAll:' port='.
1462
5602fce52b42 squeak stuff
Claus Gittinger <cg@exept.de>
parents: 1413
diff changeset
  3246
    port printOn:aStream.
5602fce52b42 squeak stuff
Claus Gittinger <cg@exept.de>
parents: 1413
diff changeset
  3247
    aStream nextPutAll:' peer='.
5602fce52b42 squeak stuff
Claus Gittinger <cg@exept.de>
parents: 1413
diff changeset
  3248
    peer printOn:aStream.
1842
88c04d1e9e6b changed #printOn:
Stefan Vogel <sv@exept.de>
parents: 1839
diff changeset
  3249
    aStream nextPut:$).
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3250
! !
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3251
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3252
!Socket methodsFor:'queries'!
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3253
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3254
domain
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3255
    "return the sockets addressing domain (i.e. #inet, #unix, #x25, #appletalk)"
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3256
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3257
    ^ domain
126
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
  3258
!
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
  3259
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3260
getFullSocketAddress
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3261
    "implemented for swazoo project (primitive code cant be loaded as extension)
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3262
     Answer my own address (I am bound to this address).
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3263
     Note that this address may change after a connect or accept."
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3264
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3265
    |error domainClass addr addrLen|
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3266
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3267
    filePointer isNil ifTrue:[
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3268
	^ self errorNotOpen
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3269
    ].
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3270
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3271
    domainClass := self class socketAddressClassForDomain:domain.
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3272
    domainClass isNil ifTrue:[
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3273
	^ self error:'invalid (unsupported) domain'.
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3274
    ].
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3275
    addrLen := domainClass socketAddressSize.
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3276
    addr := domainClass new.
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3277
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3278
%{
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3279
#ifndef NO_SOCKET
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3280
    OBJ fp = __INST(filePointer);
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3281
    SOCKET sock;
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3282
    int ret;
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3283
    union sockaddr_u sa;
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3284
    unsigned int alen, alen0;
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3285
    char *addrP;
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3286
    int addrObjSize, nAddrInstBytes;
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3287
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3288
    if (!__isSmallInteger(addrLen)) {
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3289
	DBGPRINTF(("SOCKET: bad addrLen\n"));
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3290
	error = @symbol(badArgument);
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3291
	goto err;
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3292
    }
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3293
    alen = alen0 = __intVal(addrLen);
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3294
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3295
    if (!__isNonNilObject(addr) || !__isBytes(addr)) {
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3296
	DBGPRINTF(("SOCKET: bad addr\n"));
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3297
	error = @symbol(badArgument);
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3298
	goto err;
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3299
    }
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3300
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3301
    {
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3302
	OBJ addrClass;
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3303
	int nAddrInstVars;
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3304
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3305
	addrClass = __qClass(addr);
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3306
	nAddrInstVars = __intVal(__ClassInstPtr(addrClass)->c_ninstvars);
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3307
	nAddrInstBytes = OHDR_SIZE + (nAddrInstVars * sizeof(OBJ));
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3308
	addrObjSize = __qSize(addr) - nAddrInstBytes;
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3309
	if (addrObjSize < alen0) {
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3310
	    DBGPRINTF(("SOCKET: bad addr/alen\n"));
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3311
	    error = @symbol(badArgument);
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3312
	    goto err;
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3313
	}
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3314
    }
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3315
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3316
    sock = SOCKET_FROM_FILE_OBJECT(fp);
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3317
# ifdef WIN32
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3318
    __threadErrno = 0;
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3319
# endif
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3320
    ret = getsockname(sock, (struct sockaddr *)&sa, &alen);
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3321
    if (ret < 0) {
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3322
# ifdef WIN32
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3323
	errno = WSAGetLastError();
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3324
# endif
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3325
	DBGPRINTF(("SOCKET: getsocketname failed ret=%d errno=%d\n", ret, errno));
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3326
	error = __MKSMALLINT(errno);
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3327
	goto err;
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3328
    }
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3329
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3330
    if (addrObjSize < alen) {
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3331
	DBGPRINTF(("SOCKET: bad addr\n"));
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3332
	error = @symbol(badArgument);
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3333
	goto err;
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3334
    }
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3335
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3336
    addrP = (char *)__InstPtr(addr) + nAddrInstBytes;
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3337
    bcopy((char *)&sa, addrP, alen);
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3338
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3339
    addrLen = __MKSMALLINT(alen);
1535
f6aa0fc8c3cc getSocketAddress
Claus Gittinger <cg@exept.de>
parents: 1533
diff changeset
  3340
f6aa0fc8c3cc getSocketAddress
Claus Gittinger <cg@exept.de>
parents: 1533
diff changeset
  3341
err:;
f6aa0fc8c3cc getSocketAddress
Claus Gittinger <cg@exept.de>
parents: 1533
diff changeset
  3342
#else /* NO_SOCKET */
f6aa0fc8c3cc getSocketAddress
Claus Gittinger <cg@exept.de>
parents: 1533
diff changeset
  3343
    error = @symbol(notImplemented);
f6aa0fc8c3cc getSocketAddress
Claus Gittinger <cg@exept.de>
parents: 1533
diff changeset
  3344
#endif /* NO_SOCKET */
f6aa0fc8c3cc getSocketAddress
Claus Gittinger <cg@exept.de>
parents: 1533
diff changeset
  3345
%}.
f6aa0fc8c3cc getSocketAddress
Claus Gittinger <cg@exept.de>
parents: 1533
diff changeset
  3346
    error notNil ifTrue:[
1568
3bca500e0c7a send and receiveTimeout fixed
Claus Gittinger <cg@exept.de>
parents: 1561
diff changeset
  3347
	^ self errorReporter reportOn:error
1535
f6aa0fc8c3cc getSocketAddress
Claus Gittinger <cg@exept.de>
parents: 1533
diff changeset
  3348
    ].
f6aa0fc8c3cc getSocketAddress
Claus Gittinger <cg@exept.de>
parents: 1533
diff changeset
  3349
    ^ addr
f6aa0fc8c3cc getSocketAddress
Claus Gittinger <cg@exept.de>
parents: 1533
diff changeset
  3350
!
f6aa0fc8c3cc getSocketAddress
Claus Gittinger <cg@exept.de>
parents: 1533
diff changeset
  3351
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3352
getName
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3353
    "return the name; here, we return the ports name"
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3354
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3355
    ^ port printString
126
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
  3356
!
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
  3357
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3358
getPeer
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3359
    "ST-80 compatibility: return an IPSocketAddress instance representing
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3360
     my hostname/port combination.
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3361
     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
  3362
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
  3363
    peer isNil ifTrue:[
1343
cc3bed115c0a definitions cleanup with stxOSDefs.h
penk
parents: 1342
diff changeset
  3364
	peer := self class peerFromDomain:domain name:peerName port:port.
819
4cc15700d123 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 817
diff changeset
  3365
    ].
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
  3366
    ^ peer
102
5dc264007513 added getPeer for ST-80 compatibility
Claus Gittinger <cg@exept.de>
parents: 99
diff changeset
  3367
!
5dc264007513 added getPeer for ST-80 compatibility
Claus Gittinger <cg@exept.de>
parents: 99
diff changeset
  3368
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3369
getPeerName
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3370
    "return the peer name; thats the hostname (or dotted name) of the
25
996051271ce9 *** empty log message ***
claus
parents: 21
diff changeset
  3371
     partners host after an accept."
996051271ce9 *** empty log message ***
claus
parents: 21
diff changeset
  3372
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
  3373
    peerName isNil ifTrue:[
1343
cc3bed115c0a definitions cleanup with stxOSDefs.h
penk
parents: 1342
diff changeset
  3374
	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
  3375
    ].
25
996051271ce9 *** empty log message ***
claus
parents: 21
diff changeset
  3376
    ^ peerName
28
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  3377
!
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  3378
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3379
getSocketAddress
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3380
    "implemented for swazoo project primitive code cant load as extension
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3381
     answer my own address (I am bound to this address).
1146
71a9df78ba9e bad spelling
Stefan Vogel <sv@exept.de>
parents: 1136
diff changeset
  3382
     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
  3383
1535
f6aa0fc8c3cc getSocketAddress
Claus Gittinger <cg@exept.de>
parents: 1533
diff changeset
  3384
    ^ self getFullSocketAddress hostAddress
f6aa0fc8c3cc getSocketAddress
Claus Gittinger <cg@exept.de>
parents: 1533
diff changeset
  3385
    "/ ^ self getFullSocketAddress copyFrom:5 to:8
1029
5906977e62f0 implement getSocketName for swazoo as primitive cant load as extension
penk
parents: 1010
diff changeset
  3386
!
5906977e62f0 implement getSocketName for swazoo as primitive cant load as extension
penk
parents: 1010
diff changeset
  3387
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3388
getSocketAdress
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3389
    "BAD SPELLING, of #getSocketAddress, kept for compatibility with swazoo"
1505
Stefan Vogel <sv@exept.de>
parents: 1504
diff changeset
  3390
Stefan Vogel <sv@exept.de>
parents: 1504
diff changeset
  3391
    <resource: #obsolete>
1146
71a9df78ba9e bad spelling
Stefan Vogel <sv@exept.de>
parents: 1136
diff changeset
  3392
71a9df78ba9e bad spelling
Stefan Vogel <sv@exept.de>
parents: 1136
diff changeset
  3393
    ^ self getSocketAddress
71a9df78ba9e bad spelling
Stefan Vogel <sv@exept.de>
parents: 1136
diff changeset
  3394
!
71a9df78ba9e bad spelling
Stefan Vogel <sv@exept.de>
parents: 1136
diff changeset
  3395
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3396
isActive
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3397
    "return true, if the receiver has a connection"
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3398
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3399
    ^ filePointer notNil
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3400
!
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3401
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3402
isConnected
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3403
    "return true, if the receiver has a connection"
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3404
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3405
    ^ self isActive
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3406
      and:[port notNil
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3407
      and:[peerName notNil or:[peer notNil]]]
1110
0876a3d30fd2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1035
diff changeset
  3408
!
0876a3d30fd2 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1035
diff changeset
  3409
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3410
old_getFullSocketAddress
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3411
    "implemented for swazoo project primitive code cant load as extension
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3412
     answer my own address (I am bound to this address).
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3413
     Note that this address may change after connect or accept."
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3414
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3415
    |socketAddress error|
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3416
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3417
    filePointer isNil ifTrue:[
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3418
	^ self errorNotOpen
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3419
    ].
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3420
    socketAddress := ByteArray new:16.
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3421
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3422
%{
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3423
#ifndef NO_SOCKET
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3424
    OBJ fp = __INST(filePointer);
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3425
    SOCKET sock;
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3426
    unsigned int sockaddr_size;
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3427
    int ret;
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3428
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3429
    if (!__isNonNilObject(socketAddress) ||
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3430
	(__intVal(__ClassInstPtr(__qClass(socketAddress))->c_flags) & ARRAYMASK) != BYTEARRAY) {
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3431
	error = @symbol(badArgument1);
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3432
	goto err;
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3433
    }
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3434
    sockaddr_size = __byteArraySize(socketAddress);
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3435
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3436
    sock = SOCKET_FROM_FILE_OBJECT(fp);
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3437
    ret = getsockname(sock, (struct sockaddr *)__byteArrayVal(socketAddress), &sockaddr_size);
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3438
    if (ret < 0) {
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3439
# ifdef WIN32
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3440
	errno = WSAGetLastError();
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3441
# endif
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3442
	DBGPRINTF(("SOCKET: getsocketname failed errno=%d\n", errno));
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3443
	error = __MKSMALLINT(errno);
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3444
    }
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3445
err:;
1558
a563aac90660 No need to ask Socket>>#networkXXXOrderIsMSB, because the return value is
Stefan Vogel <sv@exept.de>
parents: 1542
diff changeset
  3446
#else /* NO_SOCKET */
a563aac90660 No need to ask Socket>>#networkXXXOrderIsMSB, because the return value is
Stefan Vogel <sv@exept.de>
parents: 1542
diff changeset
  3447
    error = @symbol(notImplemented);
a563aac90660 No need to ask Socket>>#networkXXXOrderIsMSB, because the return value is
Stefan Vogel <sv@exept.de>
parents: 1542
diff changeset
  3448
#endif /* NO_SOCKET */
a563aac90660 No need to ask Socket>>#networkXXXOrderIsMSB, because the return value is
Stefan Vogel <sv@exept.de>
parents: 1542
diff changeset
  3449
%}.
a563aac90660 No need to ask Socket>>#networkXXXOrderIsMSB, because the return value is
Stefan Vogel <sv@exept.de>
parents: 1542
diff changeset
  3450
    error notNil ifTrue:[
a563aac90660 No need to ask Socket>>#networkXXXOrderIsMSB, because the return value is
Stefan Vogel <sv@exept.de>
parents: 1542
diff changeset
  3451
	^ self errorReporter reportOn:error
a563aac90660 No need to ask Socket>>#networkXXXOrderIsMSB, because the return value is
Stefan Vogel <sv@exept.de>
parents: 1542
diff changeset
  3452
    ].
a563aac90660 No need to ask Socket>>#networkXXXOrderIsMSB, because the return value is
Stefan Vogel <sv@exept.de>
parents: 1542
diff changeset
  3453
    ^ socketAddress
a563aac90660 No need to ask Socket>>#networkXXXOrderIsMSB, because the return value is
Stefan Vogel <sv@exept.de>
parents: 1542
diff changeset
  3454
!
a563aac90660 No need to ask Socket>>#networkXXXOrderIsMSB, because the return value is
Stefan Vogel <sv@exept.de>
parents: 1542
diff changeset
  3455
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3456
port
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3457
    "return the port number (or name for unix-sockets) to which the socket is bound"
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3458
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3459
"/ sometimes maybe we do am lazy fetch of the port
1505
Stefan Vogel <sv@exept.de>
parents: 1504
diff changeset
  3460
"/    port == 0 ifTrue:[ |p|
Stefan Vogel <sv@exept.de>
parents: 1504
diff changeset
  3461
"/        p := self getPort.
Stefan Vogel <sv@exept.de>
parents: 1504
diff changeset
  3462
"/        p notNil ifTrue:[
Stefan Vogel <sv@exept.de>
parents: 1504
diff changeset
  3463
"/            port := p
Stefan Vogel <sv@exept.de>
parents: 1504
diff changeset
  3464
"/        ]
Stefan Vogel <sv@exept.de>
parents: 1504
diff changeset
  3465
"/    ].
71
claus
parents: 63
diff changeset
  3466
    ^ port
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3467
!
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3468
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3469
type
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3470
    "return the sockets connection type (i.e. #datagram, #stream etc)"
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3471
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3472
    ^ socketType
81
claus
parents: 79
diff changeset
  3473
! !
claus
parents: 79
diff changeset
  3474
126
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
  3475
!Socket methodsFor:'socket setup'!
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
  3476
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3477
domain:domainArg type:typeArg
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3478
    "set up socket with domain and type.
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3479
     This is a low level entry; no binding, listening or connect
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3480
     is done. Both arguments must be symbols from one of
126
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
  3481
     #inet,#unix, #appletalk, #x25 .. and #stream, #datagram, #raw resp."
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
  3482
649
1bc56594db85 fixed connect for sun/irix
Claus Gittinger <cg@exept.de>
parents: 648
diff changeset
  3483
    ^ self domain:domainArg type:typeArg protocol:0 reuseAddress:true
126
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
  3484
!
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
  3485
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3486
domain:domainArg type:typeArg protocol:protocolNumber
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3487
    "set up socket with domain, type and protocol number.
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3488
     This is a low level entry; no binding, listening or connect
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3489
     is done. Both arguments must be symbols from one of
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3490
     #inet,#unix, #appletalk, #x25 .. and #stream, #datagram, #raw resp."
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3491
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3492
    ^ self domain:domainArg type:typeArg protocol:protocolNumber reuseAddress:true
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3493
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3494
    "
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3495
     Socket new domain:#inet type:#stream
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3496
     Socket new domain:#unix type:#stream
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3497
    "
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3498
!
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3499
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3500
domain:domainArg type:typeArg protocol:protocolNumber reuseAddress:reuse
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3501
    "set up socket with domain, type and protocol number.
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3502
     This is a low level entry; no binding, listening or connect
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3503
     is done. Both arguments must be symbols from one of
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3504
     #inet,#unix, #appletalk, #x25 .. and #stream, #datagram, #raw resp.
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3505
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3506
     The reuse boolean argument controls if the SO_REUSEADDR socket option
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3507
     is to be set (to avoid the 'bind: address in use' error)."
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3508
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3509
    |domainName domainCode typeCode error|
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3510
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3511
    filePointer notNil ifTrue:[
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3512
	^ self errorAlreadyOpen
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3513
    ].
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3514
    domainName := SocketAddress domainCodeFromName:domainArg.
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3515
    domainCode := OperatingSystem domainCodeOf:domainName.
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3516
    typeCode := OperatingSystem socketTypeCodeOf:typeArg.
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3517
%{
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3518
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3519
#ifndef NO_SOCKET
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3520
    FILE *fp;
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3521
    int dom, typ, pf, proto = 0;
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3522
    int on = 1;
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3523
    SOCKET sock;
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3524
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3525
    if (! __isSmallInteger(domainCode)) {
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3526
	error = @symbol(badArgument1);
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3527
	goto out;
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3528
    }
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3529
    if (! __isSmallInteger(typeCode)) {
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3530
	error = @symbol(badArgument2);
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3531
	goto out;
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3532
    }
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3533
    if (protocolNumber != nil) {
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3534
	if (!__isSmallInteger(protocolNumber)) {
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3535
	    error = @symbol(badArgument3);
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3536
	    goto out;
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3537
	}
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3538
	proto = __intVal(protocolNumber);
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3539
    }
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3540
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3541
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3542
    /*
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3543
     * get address and protocol-family
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3544
     */
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3545
    dom = __intVal(domainCode);
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3546
    typ = __intVal(typeCode);
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3547
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3548
# ifdef SOCKET_BLOCKS
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3549
#  ifdef DO_WRAP_CALLS
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3550
    do {
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3551
	__threadErrno = 0;
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3552
	sock = STX_WSA_CALL3("socket", socket, dom, typ, proto);
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3553
    } while ((sock < 0) && (__threadErrno == EINTR));
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3554
#  else
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3555
    __BEGIN_INTERRUPTABLE__
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3556
    do {
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3557
	DBGPRINTF(("SOCKET: opening socket domain=%d type=%d proto=%d\n", dom, typ, proto));
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3558
	sock = socket(dom, typ, proto);
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3559
#   if defined(EPROTONOSUPPORT) /* for SGI */
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3560
	if ((proto != 0) && (sock < 0) && (errno == EPROTONOSUPPORT)) {
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3561
	    DBGPRINTF(("SOCKET: retry with UNSPEC protocol\n"));
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3562
	    proto = 0;
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3563
	    sock = socket(dom, typ, 0);
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3564
	}
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3565
#   endif
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3566
    } while ((sock < 0) && (errno == EINTR));
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3567
    __END_INTERRUPTABLE__
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3568
#  endif
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3569
# else
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3570
    sock = socket(dom, typ, proto);
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3571
#  if defined(EPROTONOSUPPORT) /* for SGI */
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3572
    if ((proto != 0) && (sock < 0) && (errno == EPROTONOSUPPORT)) {
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3573
	DBGPRINTF(("SOCKET: retry with UNSPEC protocol\n"));
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3574
	proto = 0;
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3575
	sock = socket(dom, typ, 0);
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3576
    }
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3577
#  endif
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3578
# endif
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3579
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3580
    DBGFPRINTF((stderr, "SOCKET: create newSock=%d\n", sock));
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3581
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3582
# ifdef WIN32
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3583
    if (sock == INVALID_SOCKET)
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3584
# else
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3585
    if (sock < 0)
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3586
# endif
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3587
    {
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3588
	DBGPRINTF(("SOCKET: socket(dom=%d typ=%d proto=%d) call failed errno=%d\n", dom, typ, proto, errno));
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3589
	__INST(lastErrorNumber) = __MKSMALLINT(errno);
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3590
    } else {
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3591
# ifdef SO_REUSEADDR
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3592
	if (reuse == true) {
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3593
	    DBGPRINTF(("SOCKET: setsockopt - SO_REUSEADDR\n"));
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3594
	    if (setsockopt(sock, SOL_SOCKET, SO_REUSEADDR, (char *) &on, sizeof (on)) < 0) {
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3595
		DBGPRINTF(("SOCKET: setsockopt - SO_REUSEADDR failed\n"));
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3596
	    }
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3597
	}
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3598
# endif /* SO_REUSEADDR */
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3599
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3600
# ifdef SET_LINGER_WHEN_CREATING_SOCKET
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3601
#  ifdef SO_LINGER
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3602
	{
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3603
	    struct linger l;
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3604
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3605
	    l.l_onoff = 1;
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3606
	    l.l_linger = 30;
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3607
	    setsockopt( sock, SOL_SOCKET, SO_LINGER, &l, sizeof(l));
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3608
	}
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3609
#  endif
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3610
# endif
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3611
# ifdef WIN32
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3612
	/*
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3613
	 * make it blocking
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3614
	 */
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3615
	{
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3616
	    int zero = 0;
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3617
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3618
	    ioctlsocket(sock, FIONBIO, &zero);
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3619
	}
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3620
# endif
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3621
	/*
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3622
	 * make it a FILE *
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3623
	 */
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3624
# ifdef WIN32
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3625
	{
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3626
	    int _fd = _open_osfhandle(sock, 0);
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3627
	    fp = fdopen(_fd, "r+");
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3628
	    DBGPRINTF(("SOCKET: sock=%d fd=%d fp=%x\n",sock,_fd, fp));
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3629
	}
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3630
# else
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3631
	fp = fdopen(sock, "r+");
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3632
# endif
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3633
	if (! fp) {
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3634
	    DBGPRINTF(("SOCKET: fdopen call failed\n"));
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3635
	    __INST(lastErrorNumber) = __MKSMALLINT(errno);
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3636
# ifdef DO_WRAP_CALLS
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3637
	    { int ret;
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3638
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3639
	      do {
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3640
		__threadErrno = 0;
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3641
		ret = STX_WSA_CALL1("closesocket", closesocket, sock);
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3642
	      } while ((ret < 0) && (__threadErrno == EINTR));
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3643
	    }
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3644
# else
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3645
	    __BEGIN_INTERRUPTABLE__
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3646
	    closesocket(sock);
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3647
	    DBGFPRINTF((stderr, "SOCKET: fdopen failed (%d)\n", sock));
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3648
	    __END_INTERRUPTABLE__
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3649
# endif
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3650
	} else {
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3651
	    if ((@global(FileOpenTrace) == true) || __debugging__) {
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3652
		console_fprintf(stderr, "fdopen [Socket] -> %x\n", fp);
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3653
	    }
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3654
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3655
# if 0
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3656
	    // The original code was:
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3657
	    __INST(filePointer) = __MKOBJ((INT)fp); __STORESELF(filePointer);
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3658
	    // but for that, gcc generates wrong code, which loads self (volatile) into
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3659
	    // a register (bp), then calls __MKOBJ, then stores indirect bp.
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3660
	    // That is wrong if a scavenge occurs in MKOBJ, as bp is now still pointing to the old
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3661
	    // object.
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3662
# endif
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3663
	    {
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3664
		OBJ t;
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3665
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3666
		t = __MKOBJ(fp);
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3667
		__INST(filePointer) = t;
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3668
		__STORE(self, t);
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3669
	    }
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3670
	}
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3671
    }
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3672
#endif
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3673
out:;
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3674
%}.
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3675
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3676
    "all ok?"
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3677
    filePointer notNil ifTrue:[
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3678
	domain := domainArg.
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3679
	socketType := typeArg.
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3680
	Lobby register:self.
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3681
    ] ifFalse:[
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3682
	error notNil ifTrue:[
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3683
	    ^ self primitiveFailed:error.
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3684
	].
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3685
	^ self openError
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3686
    ].
126
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
  3687
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
  3688
    "
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
  3689
     Socket new domain:#inet type:#stream
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
  3690
     Socket new domain:#unix type:#stream
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
  3691
    "
28
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  3692
! !
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  3693
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  3694
!Socket methodsFor:'specials'!
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  3695
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3696
receiveBufferSize
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3697
    "get the send buffer size - for special applications only.
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3698
     Not all operatingSystems offer this functionality
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3699
     (returns nil, if unsupported)"
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3700
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3701
    filePointer isNil ifTrue:[
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3702
	^ self errorNotOpen
1335
0fafb78d7a80 sockopt utilities added
Claus Gittinger <cg@exept.de>
parents: 1316
diff changeset
  3703
    ].
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3704
%{
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3705
#if defined(SO_RCVBUF) && defined(SOL_SOCKET)
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3706
    {
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3707
	OBJ fp = __INST(filePointer);
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3708
	SOCKET sock;
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3709
	int opt;
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3710
	unsigned int size;
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3711
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3712
	sock = SOCKET_FROM_FILE_OBJECT(fp);
1568
3bca500e0c7a send and receiveTimeout fixed
Claus Gittinger <cg@exept.de>
parents: 1561
diff changeset
  3713
	if (getsockopt(sock, SOL_SOCKET, SO_RCVBUF, (char *)&opt, &size) >= 0) {
3bca500e0c7a send and receiveTimeout fixed
Claus Gittinger <cg@exept.de>
parents: 1561
diff changeset
  3714
	    RETURN( __MKSMALLINT(opt) );
3bca500e0c7a send and receiveTimeout fixed
Claus Gittinger <cg@exept.de>
parents: 1561
diff changeset
  3715
	}
1335
0fafb78d7a80 sockopt utilities added
Claus Gittinger <cg@exept.de>
parents: 1316
diff changeset
  3716
    }
0fafb78d7a80 sockopt utilities added
Claus Gittinger <cg@exept.de>
parents: 1316
diff changeset
  3717
#endif
0fafb78d7a80 sockopt utilities added
Claus Gittinger <cg@exept.de>
parents: 1316
diff changeset
  3718
%}.
0fafb78d7a80 sockopt utilities added
Claus Gittinger <cg@exept.de>
parents: 1316
diff changeset
  3719
    ^ nil
0fafb78d7a80 sockopt utilities added
Claus Gittinger <cg@exept.de>
parents: 1316
diff changeset
  3720
!
0fafb78d7a80 sockopt utilities added
Claus Gittinger <cg@exept.de>
parents: 1316
diff changeset
  3721
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3722
receiveBufferSize:size
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3723
    "set the receive buffer size - for special applications only.
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3724
     Not all operatingSystems offer this functionality
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3725
     (returns false, if unsupported)"
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3726
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3727
    filePointer isNil ifTrue:[
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3728
	^ self errorNotOpen
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3729
    ].
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3730
%{
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3731
#if defined(SO_RCVBUF) && defined(SOL_SOCKET)
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3732
    if (__isSmallInteger(size)) {
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3733
	OBJ fp = __INST(filePointer);
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3734
	SOCKET sock;
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3735
	int opt;
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3736
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3737
	sock = SOCKET_FROM_FILE_OBJECT(fp);
1343
cc3bed115c0a definitions cleanup with stxOSDefs.h
penk
parents: 1342
diff changeset
  3738
	opt = __intVal(size);
1529
911273d090c1 Re-unified Win32 and Unix code into single Socket.st.
Claus Gittinger <cg@exept.de>
parents: 1505
diff changeset
  3739
	if (setsockopt(sock, SOL_SOCKET, SO_RCVBUF, (char *)&opt, sizeof(int)) >= 0 ) {
911273d090c1 Re-unified Win32 and Unix code into single Socket.st.
Claus Gittinger <cg@exept.de>
parents: 1505
diff changeset
  3740
	    RETURN(true);
911273d090c1 Re-unified Win32 and Unix code into single Socket.st.
Claus Gittinger <cg@exept.de>
parents: 1505
diff changeset
  3741
	}
1335
0fafb78d7a80 sockopt utilities added
Claus Gittinger <cg@exept.de>
parents: 1316
diff changeset
  3742
    }
0fafb78d7a80 sockopt utilities added
Claus Gittinger <cg@exept.de>
parents: 1316
diff changeset
  3743
#endif
0fafb78d7a80 sockopt utilities added
Claus Gittinger <cg@exept.de>
parents: 1316
diff changeset
  3744
%}.
0fafb78d7a80 sockopt utilities added
Claus Gittinger <cg@exept.de>
parents: 1316
diff changeset
  3745
    ^ false
0fafb78d7a80 sockopt utilities added
Claus Gittinger <cg@exept.de>
parents: 1316
diff changeset
  3746
!
0fafb78d7a80 sockopt utilities added
Claus Gittinger <cg@exept.de>
parents: 1316
diff changeset
  3747
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3748
receiveTimeout
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3749
    "get the receive timeout in millis - for special applications only.
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3750
     Not all operatingSystems offer this functionality
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3751
     (returns nil, if unsupported)"
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3752
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3753
    |millis|
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3754
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3755
    filePointer isNil ifTrue:[
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3756
	^ self errorNotOpen
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3757
    ].
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3758
%{
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3759
#if defined(SO_RCVTIMEO) && defined(SOL_SOCKET)
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3760
    {
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3761
	OBJ fp = __INST(filePointer);
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3762
	int sock;
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3763
	int len;
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3764
	int __millis;
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3765
	struct timeval tv = {0, 0};
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3766
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3767
	sock = fileno(__FILEVal(fp));
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3768
	len = sizeof(struct timeval);
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3769
	if (getsockopt(sock, SOL_SOCKET, SO_RCVTIMEO, (void *)&tv, &len) == 0) {
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3770
	    __millis = (tv.tv_sec * 1000) + (tv.tv_usec / 1000);
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3771
	    millis = __mkSmallInteger(__millis);
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3772
# if 0
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3773
	    console_fprintf(stderr, "getsockopt -> s:%d us:%d -> millis:%d\n", tv.tv_sec, tv.tv_usec, __millis);
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3774
# endif
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3775
	} else {
1839
c10cd58ec334 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1781
diff changeset
  3776
	    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
  3777
	}
3bca500e0c7a send and receiveTimeout fixed
Claus Gittinger <cg@exept.de>
parents: 1561
diff changeset
  3778
    }
3bca500e0c7a send and receiveTimeout fixed
Claus Gittinger <cg@exept.de>
parents: 1561
diff changeset
  3779
#endif
3bca500e0c7a send and receiveTimeout fixed
Claus Gittinger <cg@exept.de>
parents: 1561
diff changeset
  3780
%}.
3bca500e0c7a send and receiveTimeout fixed
Claus Gittinger <cg@exept.de>
parents: 1561
diff changeset
  3781
    millis notNil ifTrue:[^ millis / 1000 ].
3bca500e0c7a send and receiveTimeout fixed
Claus Gittinger <cg@exept.de>
parents: 1561
diff changeset
  3782
    ^ nil
3bca500e0c7a send and receiveTimeout fixed
Claus Gittinger <cg@exept.de>
parents: 1561
diff changeset
  3783
!
3bca500e0c7a send and receiveTimeout fixed
Claus Gittinger <cg@exept.de>
parents: 1561
diff changeset
  3784
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3785
receiveTimeout:seconds
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3786
    "set the receive timeout - for special applications only.
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3787
     Not all operatingSystems offer this functionality
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3788
     (returns false, if unsupported)"
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3789
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3790
    |millis|
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3791
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3792
    filePointer isNil ifTrue:[
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3793
	^ self errorNotOpen
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3794
    ].
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3795
    millis := (seconds * 1000) rounded.
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3796
%{
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3797
#if defined(SO_RCVTIMEO) && defined(SOL_SOCKET)
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3798
    if (__isSmallInteger(millis)) {
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3799
	OBJ fp = __INST(filePointer);
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3800
	int sock;
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3801
	int __millis = __intVal(millis);
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3802
	struct timeval tv = {0, 0};
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3803
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3804
	sock = fileno(__FILEVal(fp));
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3805
	tv.tv_sec = __millis / 1000;
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3806
	tv.tv_usec = (__millis % 1000) * 1000;
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3807
# if 0
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3808
	console_fprintf(stderr, "setsockopt -> millis:%d -> s:%d us:%d \n", __millis, tv.tv_sec, tv.tv_usec);
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3809
# endif
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3810
	if (setsockopt(sock, SOL_SOCKET, SO_RCVTIMEO, (void *)&tv, sizeof(struct timeval)) == 0) {
1529
911273d090c1 Re-unified Win32 and Unix code into single Socket.st.
Claus Gittinger <cg@exept.de>
parents: 1505
diff changeset
  3811
	    RETURN(true);
911273d090c1 Re-unified Win32 and Unix code into single Socket.st.
Claus Gittinger <cg@exept.de>
parents: 1505
diff changeset
  3812
	}
1839
c10cd58ec334 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1781
diff changeset
  3813
	console_fprintf(stderr, "Socket [warning]: setsockopt %d failed; errno=%d\n", sock, errno);
28
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  3814
    }
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  3815
#endif
71
claus
parents: 63
diff changeset
  3816
%}.
28
350f8e9493a4 *** empty log message ***
claus
parents: 25
diff changeset
  3817
    ^ false
81
claus
parents: 79
diff changeset
  3818
!
claus
parents: 79
diff changeset
  3819
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3820
sendBufferSize
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3821
    "get the send buffer size - for special applications only.
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3822
     Not all operatingSystems offer this functionality
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3823
     (returns nil, if unsupported)"
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3824
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3825
    filePointer isNil ifTrue:[
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3826
	^ self errorNotOpen
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3827
    ].
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3828
%{
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3829
#if defined(SO_SNDBUF) && defined(SOL_SOCKET)
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3830
    {
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3831
	OBJ fp = __INST(filePointer);
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3832
	SOCKET sock;
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3833
	int opt;
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3834
	unsigned int size;
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3835
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3836
	sock = SOCKET_FROM_FILE_OBJECT(fp);
1568
3bca500e0c7a send and receiveTimeout fixed
Claus Gittinger <cg@exept.de>
parents: 1561
diff changeset
  3837
	if (getsockopt(sock, SOL_SOCKET, SO_SNDBUF, (char *)&opt, &size) >= 0) {
3bca500e0c7a send and receiveTimeout fixed
Claus Gittinger <cg@exept.de>
parents: 1561
diff changeset
  3838
	    RETURN( __MKSMALLINT(opt) );
3bca500e0c7a send and receiveTimeout fixed
Claus Gittinger <cg@exept.de>
parents: 1561
diff changeset
  3839
	}
1335
0fafb78d7a80 sockopt utilities added
Claus Gittinger <cg@exept.de>
parents: 1316
diff changeset
  3840
    }
0fafb78d7a80 sockopt utilities added
Claus Gittinger <cg@exept.de>
parents: 1316
diff changeset
  3841
#endif
0fafb78d7a80 sockopt utilities added
Claus Gittinger <cg@exept.de>
parents: 1316
diff changeset
  3842
%}.
0fafb78d7a80 sockopt utilities added
Claus Gittinger <cg@exept.de>
parents: 1316
diff changeset
  3843
    ^ nil
0fafb78d7a80 sockopt utilities added
Claus Gittinger <cg@exept.de>
parents: 1316
diff changeset
  3844
!
0fafb78d7a80 sockopt utilities added
Claus Gittinger <cg@exept.de>
parents: 1316
diff changeset
  3845
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3846
sendBufferSize:size
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3847
    "set the send buffer size - for special applications only.
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3848
     Not all operatingSystems offer this functionality
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3849
     (returns false, if unsupported)"
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3850
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3851
    filePointer isNil ifTrue:[
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3852
	^ self errorNotOpen
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3853
    ].
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3854
%{
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3855
#if defined(SO_SNDBUF) && defined(SOL_SOCKET)
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3856
    if (__isSmallInteger(size)) {
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3857
	OBJ fp = __INST(filePointer);
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3858
	SOCKET sock;
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3859
	int opt;
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3860
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3861
	sock = SOCKET_FROM_FILE_OBJECT(fp);
1343
cc3bed115c0a definitions cleanup with stxOSDefs.h
penk
parents: 1342
diff changeset
  3862
	opt = __intVal(size);
1529
911273d090c1 Re-unified Win32 and Unix code into single Socket.st.
Claus Gittinger <cg@exept.de>
parents: 1505
diff changeset
  3863
	if (setsockopt(sock, SOL_SOCKET, SO_SNDBUF, (char *)&opt, sizeof(int)) >= 0) {
911273d090c1 Re-unified Win32 and Unix code into single Socket.st.
Claus Gittinger <cg@exept.de>
parents: 1505
diff changeset
  3864
	    RETURN(true);
911273d090c1 Re-unified Win32 and Unix code into single Socket.st.
Claus Gittinger <cg@exept.de>
parents: 1505
diff changeset
  3865
	}
1335
0fafb78d7a80 sockopt utilities added
Claus Gittinger <cg@exept.de>
parents: 1316
diff changeset
  3866
    }
0fafb78d7a80 sockopt utilities added
Claus Gittinger <cg@exept.de>
parents: 1316
diff changeset
  3867
#endif
0fafb78d7a80 sockopt utilities added
Claus Gittinger <cg@exept.de>
parents: 1316
diff changeset
  3868
%}.
0fafb78d7a80 sockopt utilities added
Claus Gittinger <cg@exept.de>
parents: 1316
diff changeset
  3869
    ^ false
0fafb78d7a80 sockopt utilities added
Claus Gittinger <cg@exept.de>
parents: 1316
diff changeset
  3870
!
0fafb78d7a80 sockopt utilities added
Claus Gittinger <cg@exept.de>
parents: 1316
diff changeset
  3871
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3872
sendTimeout
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3873
    "get the send timeout in millis - for special applications only.
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3874
     Not all operatingSystems offer this functionality
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3875
     (returns nil, if unsupported)"
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3876
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3877
    |millis|
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3878
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3879
    filePointer isNil ifTrue:[
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3880
	^ self errorNotOpen
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3881
    ].
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3882
%{
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3883
#if defined(SO_SNDTIMEO) && defined(SOL_SOCKET)
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3884
    {
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3885
	OBJ fp = __INST(filePointer);
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3886
	int sock;
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3887
	int len;
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3888
	int __millis;
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3889
	struct timeval tv = {0, 0};
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3890
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3891
	sock = fileno(__FILEVal(fp));
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3892
	len = sizeof(struct timeval);
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3893
	if (getsockopt(sock, SOL_SOCKET, SO_SNDTIMEO, (void *)&tv, &len) == 0) {
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3894
	    __millis = (tv.tv_sec * 1000) + (tv.tv_usec / 1000);
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3895
	    millis = __mkSmallInteger(__millis);
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3896
# if 0
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3897
	    console_fprintf(stderr, "getsockopt -> s:%d us:%d -> millis:%d\n", tv.tv_sec, tv.tv_usec, __millis);
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3898
# endif
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3899
	} else {
1839
c10cd58ec334 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1781
diff changeset
  3900
	    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
  3901
	}
3bca500e0c7a send and receiveTimeout fixed
Claus Gittinger <cg@exept.de>
parents: 1561
diff changeset
  3902
    }
3bca500e0c7a send and receiveTimeout fixed
Claus Gittinger <cg@exept.de>
parents: 1561
diff changeset
  3903
#endif
3bca500e0c7a send and receiveTimeout fixed
Claus Gittinger <cg@exept.de>
parents: 1561
diff changeset
  3904
%}.
3bca500e0c7a send and receiveTimeout fixed
Claus Gittinger <cg@exept.de>
parents: 1561
diff changeset
  3905
    millis notNil ifTrue:[^ millis / 1000 ].
3bca500e0c7a send and receiveTimeout fixed
Claus Gittinger <cg@exept.de>
parents: 1561
diff changeset
  3906
    ^ nil
3bca500e0c7a send and receiveTimeout fixed
Claus Gittinger <cg@exept.de>
parents: 1561
diff changeset
  3907
!
3bca500e0c7a send and receiveTimeout fixed
Claus Gittinger <cg@exept.de>
parents: 1561
diff changeset
  3908
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3909
sendTimeout:seconds
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3910
    "set the send timeout - for special applications only.
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3911
     Not all operatingSystems offer this functionality
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3912
     (returns false, if unsupported)"
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3913
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3914
    |millis|
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3915
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3916
    filePointer isNil ifTrue:[
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3917
	^ self errorNotOpen
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3918
    ].
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3919
    millis := (seconds * 1000) rounded.
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3920
%{
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3921
#if defined(SO_SNDTIMEO) && defined(SOL_SOCKET)
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3922
    if (__isSmallInteger(millis)) {
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3923
	OBJ fp = __INST(filePointer);
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3924
	int sock;
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3925
	int __millis = __intVal(millis);
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3926
	struct timeval tv = {0, 0};
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3927
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3928
	sock = fileno(__FILEVal(fp));
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3929
	tv.tv_sec = __millis / 1000;
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3930
	tv.tv_usec = (__millis % 1000) * 1000;
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3931
# if 0
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3932
	console_fprintf(stderr, "setsockopt -> millis:%d -> s:%d us:%d \n", __millis, tv.tv_sec, tv.tv_usec);
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3933
# endif
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3934
	if (setsockopt(sock, SOL_SOCKET, SO_SNDTIMEO, (void *)&tv, sizeof(struct timeval)) == 0) {
1529
911273d090c1 Re-unified Win32 and Unix code into single Socket.st.
Claus Gittinger <cg@exept.de>
parents: 1505
diff changeset
  3935
	    RETURN(true);
911273d090c1 Re-unified Win32 and Unix code into single Socket.st.
Claus Gittinger <cg@exept.de>
parents: 1505
diff changeset
  3936
	}
1839
c10cd58ec334 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1781
diff changeset
  3937
	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
  3938
    }
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
  3939
#endif
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
  3940
%}.
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
  3941
    ^ false
1568
3bca500e0c7a send and receiveTimeout fixed
Claus Gittinger <cg@exept.de>
parents: 1561
diff changeset
  3942
1340
eb9b1f1340e5 setTCP_NODELAY
Claus Gittinger <cg@exept.de>
parents: 1339
diff changeset
  3943
!
eb9b1f1340e5 setTCP_NODELAY
Claus Gittinger <cg@exept.de>
parents: 1339
diff changeset
  3944
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3945
setTCPCork:aBoolean
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3946
    "enable/disable TCP_CORK (do-not-send-partial-frames)
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3947
     For special applications only.
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3948
     Not all OperatingSystems offer this functionality
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3949
     (returns false, if unsupported)"
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3950
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3951
    filePointer isNil ifTrue:[
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3952
	^ self errorNotOpen
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3953
    ].
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3954
%{
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3955
#if defined(IPPROTO_TCP) && defined(TCP_CORK)
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3956
    int onOff = (aBoolean == true);
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3957
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3958
    if ((aBoolean == true) || (aBoolean == false)) {
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3959
	OBJ fp = __INST(filePointer);
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3960
	SOCKET sock;
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3961
	int onOff = (aBoolean == true);
1343
cc3bed115c0a definitions cleanup with stxOSDefs.h
penk
parents: 1342
diff changeset
  3962
1529
911273d090c1 Re-unified Win32 and Unix code into single Socket.st.
Claus Gittinger <cg@exept.de>
parents: 1505
diff changeset
  3963
	sock = SOCKET_FROM_FILE_OBJECT(fp);
911273d090c1 Re-unified Win32 and Unix code into single Socket.st.
Claus Gittinger <cg@exept.de>
parents: 1505
diff changeset
  3964
	if (setsockopt(sock, IPPROTO_TCP, TCP_CORK, (char *)&onOff, sizeof(int)) >= 0) {
911273d090c1 Re-unified Win32 and Unix code into single Socket.st.
Claus Gittinger <cg@exept.de>
parents: 1505
diff changeset
  3965
	    RETURN(true);
911273d090c1 Re-unified Win32 and Unix code into single Socket.st.
Claus Gittinger <cg@exept.de>
parents: 1505
diff changeset
  3966
	}
1342
7c9682a7183d setTCP_CORK
Claus Gittinger <cg@exept.de>
parents: 1341
diff changeset
  3967
    }
7c9682a7183d setTCP_CORK
Claus Gittinger <cg@exept.de>
parents: 1341
diff changeset
  3968
#endif
7c9682a7183d setTCP_CORK
Claus Gittinger <cg@exept.de>
parents: 1341
diff changeset
  3969
%}.
7c9682a7183d setTCP_CORK
Claus Gittinger <cg@exept.de>
parents: 1341
diff changeset
  3970
    ^ false
1885
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3971
!
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3972
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3973
setTCPNoDelay:aBoolean
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3974
    "enable/disable TCP_NODELAY (i.e. disable/enable the Nagle algorithm)
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3975
     For special applications only.
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3976
     Not all OperatingSystems offer this functionality
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3977
     (returns false, if unsupported)"
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3978
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3979
    filePointer isNil ifTrue:[
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3980
	^ self errorNotOpen
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3981
    ].
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3982
%{
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3983
#if defined(IPPROTO_TCP) && defined(TCP_NODELAY)
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3984
    int onOff = (aBoolean == true);
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3985
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3986
    if ((aBoolean == true) || (aBoolean == false)) {
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3987
	OBJ fp = __INST(filePointer);
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3988
	SOCKET sock;
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3989
	int onOff = (aBoolean == true);
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3990
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3991
	sock = SOCKET_FROM_FILE_OBJECT(fp);
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3992
	if (setsockopt(sock, IPPROTO_TCP, TCP_NODELAY, (char *)&onOff, sizeof(int)) >= 0) {
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3993
	    RETURN(true);
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3994
	}
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3995
    }
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3996
#endif
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3997
%}.
Claus Gittinger <cg@exept.de>
parents: 1884
diff changeset
  3998
    ^ false
126
fca9404da9d4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 119
diff changeset
  3999
! !
82
claus
parents: 81
diff changeset
  4000
464
600b101a7035 alen in accept
Claus Gittinger <cg@exept.de>
parents: 463
diff changeset
  4001
!Socket class methodsFor:'documentation'!
206
77166a6b3ee6 For ST80 style socket creation: register socket in Lobby.
Stefan Vogel <sv@exept.de>
parents: 203
diff changeset
  4002
77166a6b3ee6 For ST80 style socket creation: register socket in Lobby.
Stefan Vogel <sv@exept.de>
parents: 203
diff changeset
  4003
version
1911
cb6a52d6944a Mark obsolete methods.
Stefan Vogel <sv@exept.de>
parents: 1887
diff changeset
  4004
    ^ '$Header: /cvs/stx/stx/libbasic2/Socket.st,v 1.242 2007-11-08 14:04:43 stefan Exp $'
206
77166a6b3ee6 For ST80 style socket creation: register socket in Lobby.
Stefan Vogel <sv@exept.de>
parents: 203
diff changeset
  4005
! !