source: SVN/cambria/redboot/host/tools/Utils/common/eCosSocket.h @ 1

Last change on this file since 1 was 1, checked in by Tim Harvey, 2 years ago

restored latest version of files from server backup

Signed-off-by: Tim Harvey <tharvey@…>

File size: 7.7 KB
Line 
1//####COPYRIGHTBEGIN####
2//                                                                         
3// ----------------------------------------------------------------------------
4// Copyright (C) 1998, 1999, 2000 Red Hat, Inc.
5//
6// This program is part of the eCos host tools.
7//
8// This program is free software; you can redistribute it and/or modify it
9// under the terms of the GNU General Public License as published by the Free
10// Software Foundation; either version 2 of the License, or (at your option)
11// any later version.
12//
13// This program is distributed in the hope that it will be useful, but WITHOUT
14// ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
15// FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
16// more details.
17//
18// You should have received a copy of the GNU General Public License along with
19// this program; if not, write to the Free Software Foundation, Inc.,
20// 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
21//
22// ----------------------------------------------------------------------------
23//                                                                         
24//####COPYRIGHTEND####
25//=================================================================
26//
27//        eCosSocket.h
28//
29//        Socket test class
30//
31//=================================================================
32//=================================================================
33//#####DESCRIPTIONBEGIN####
34//
35// Author(s):     sdf
36// Contributors:  sdf
37// Date:          1999-04-01
38// Description:   This class abstracts tcp/ip sockets for use in the testing infrastructure
39// Usage:
40//
41//####DESCRIPTIONEND####
42//=================================================================
43// This class is a host-independent interface to a TCP/IP socket
44// There are two flavours of socket - server and client.
45// Server sockets listen (accept) on a socket number.  Client sockets connect to a host:port.
46// The class can be used thus:
47//   Server:
48//      CeCosSocket sock; // no-argument ctor
49//      if(-1!=sock.Listen(6000)){
50//        ...     
51//      }
52//   Client:
53//      CeCosSocket sock;
54//      if(sock.Connect(_T("ginga"),5000)){
55//        ...     
56//      }
57// In each of the above cases the socket is closed automatically by the dtor.
58//
59// Alternatively, the ctor can be used directly:
60//   Server:
61//      CeCosSocket sock(6000));
62//      ...     
63//   Client:
64//      CeCosSocket sock(_T("ginga"),5000));
65//      ...     
66//
67//=================================================================
68#include "eCosStd.h"
69#include "Collections.h"
70
71#ifndef _SOCKETUTILS_H
72#define _SOCKETUTILS_H
73
74class CeCosSerial;
75
76class CeCosSocket {
77public: 
78        static const String GetHostByName(LPCTSTR pszHost);
79
80  // These functions must be called before any other operation is carried out:
81        static bool Init();
82        static void Term();
83
84  typedef bool (CALLBACK FilterFunc)(void *&,unsigned int &,CeCosSerial&,CeCosSocket &,void *);
85
86  // A function that causes an operation to stop - i.e. it when it returns true the operation is aborted.
87  typedef bool (CALLBACK StopFunc)(void *);
88 
89  enum {NOTIMEOUT=0x7fffffff-1,DEFAULTTIMEOUT=-2}; // No explicit timeout specified
90 
91  // Listen and this form of constructor used to act as server
92  static int Listen(int nTcpPort);
93  CeCosSocket (); // Caller promises to call Accept() or Connect() later
94 
95  // Accept-like ctor (act as server)
96  CeCosSocket (int sock /*result of previous call of Listen*/, bool *pbStop=0);
97  // Connect-like ctor (act as client)
98  CeCosSocket (LPCTSTR pszHostPort,Duration dTimeout=NOTIMEOUT);
99 
100  bool Accept(int sock /*result of previous call of Listen*/, bool *pbStop=0);
101  // This form of constructor used to act as client
102  bool Connect(LPCTSTR pszHostPort,Duration dTimeout=NOTIMEOUT);
103  ~CeCosSocket();
104 
105  int Client() const { return m_nClient; }
106  static String ClientName(int nClient);
107 
108  int Sock() const { return m_nSock; }
109 
110  // Set the default timeout for all operations
111  void SetTimeout (Duration dTimeout) { m_nDefaultTimeout=dTimeout; }
112 
113  // Use to test success after opening with the ctor:
114  bool Ok() { return -1!=m_nSock; }
115
116  // Close the given socket
117  bool Close () { return CloseSocket(m_nSock); }
118 
119  // Return last error on this socket
120  int SocketError() { return m_nErr; }
121
122  // Return last socket error, translated to a string
123  String SocketErrString();
124  static String SocketErrString(int nErr);
125
126  // Read and write functions
127
128  // Untyped: these versions allow the operation to be aborted either by timeout or by the "stop func" returning true.
129  bool send(const void *pData,unsigned int nLength,LPCTSTR pszMsg=_T(""),int dTimeout=DEFAULTTIMEOUT,StopFunc *pFunc=0,void *pParam=0){
130    return sendrecv(true,pData,nLength,pszMsg,dTimeout,pFunc,pParam);
131  }
132  bool recv(const void *pData,unsigned int nLength,LPCTSTR pszMsg=_T(""),int dTimeout=DEFAULTTIMEOUT,StopFunc *pFunc=0,void *pParam=0){
133    return sendrecv(false,pData,nLength,pszMsg,dTimeout,pFunc,pParam);
134  }
135
136  // Read/write an integer (this can be used between machines of different endianness)
137  bool recvInteger (int &n,LPCTSTR pszMsg=_T(""),Duration dTimeout=DEFAULTTIMEOUT);
138  bool sendInteger (int n,LPCTSTR pszMsg=_T(""),Duration dTimeout=DEFAULTTIMEOUT);
139
140  // Read/write a string
141  bool recvString  (String &str,LPCTSTR pszMsg=_T(""),Duration dTimeout=DEFAULTTIMEOUT);
142  bool sendString  (const String &str,LPCTSTR pszMsg=_T(""),Duration dTimeout=DEFAULTTIMEOUT);
143 
144  static bool CloseSocket (int &sock);
145  bool Peek (unsigned int &nAvail);
146
147  // Miscellaneous helper functions:
148
149  // Combine string and integer to the form host:port:
150  static String HostPort(LPCTSTR pszHost,int nPort);
151  // Decompose (opposite of the above):
152  static bool ParseHostPort (LPCTSTR pszHostPort, String &pszHost, int &nPort);
153  // Just check for legality:
154  static bool IsLegalHostPort (LPCTSTR pszHostPort);
155  // Are these two hosts really the same?
156  static bool SameHost (LPCTSTR host1,LPCTSTR host2);
157  // Set up a connection between a serial port and a socket.  Traffic is simply passed between them.
158  static bool ConnectSocketToSerial (int nListenSock,LPCTSTR pszPort, int nBaud,FilterFunc *pSerialToSocketFilterFunc=0,void *pSerialParam=0,FilterFunc *pSocketToSerialFilterFunc=0,void *pSocketParam=0,bool *pbStop=0);
159  static bool ConnectSocketToSerial (CeCosSocket &socket,CeCosSerial &serial,FilterFunc *pSerialToSocketFilterFunc=0,void *pSerialParam=0, FilterFunc *pSocketToSerialFilterFunc=0,void *pSocketParam=0,bool *pbStop=0);
160
161  static LPCTSTR MyHostName();
162  static LPCTSTR MySimpleHostName();
163
164  // Set up a connection between two sockets.  Traffic is simply passed between them.
165  bool ConnectSocketToSocket (CeCosSocket &o,FilterFunc *pSocketToSocketFilterFunc1,FilterFunc *pSocketToSocketFilterFunc2,void *pParam,bool *pbStop);
166 
167  enum   SSReadResult {SS_SOCKET_ERROR=-1,SS_SOCKET_READ=1,SS_SERIAL_ERROR=-2,SS_SERIAL_READ=2,SS_STOPPED=0};
168
169protected:
170
171  // Blocking read on one or other of the data sources:
172  // Result:  -1 - socket error occurred
173  //           1 - data read from socket
174  //          -2 - serial error occurred
175  //           2 - data read from serial
176
177  static SSReadResult SSRead (CeCosSerial &serial,CeCosSocket &socket,void *pBuf,unsigned int nSize,unsigned int &nRead,bool *pbStop);
178 
179  Duration m_nDefaultTimeout;
180  Duration TimeoutDuration (Duration dTimeout);
181  // Set appropriate socket options (most importantly, non-blocking mode)
182  bool SetSocketOptions ();
183  int m_nSock;
184  int m_nClient;
185  int m_nErr;
186  void SaveError() { 
187#ifdef _WIN32
188  m_nErr=WSAGetLastError();
189#else // UNIX
190  m_nErr=errno;
191#endif
192  }
193  bool sendrecv(bool bSend,const void *pData,unsigned int nLength,LPCTSTR pszMsg=_T(""),int dTimeout=DEFAULTTIMEOUT,StopFunc *pFunc=0,void *pParam=0);
194 
195};
196#endif
Note: See TracBrowser for help on using the repository browser.