Mercurial > ecos-v3_0-branch
annotate host/tools/Utils/common/eCosSocket.cpp @ 2729:74dbf4c3f2e1 after-copyright-change-20090129
Update all copyright banners to reflect FSF ownership; fix and improve licence text.
| author | jlarmour |
|---|---|
| date | Thu, 29 Jan 2009 17:47:46 +0000 |
| parents | 9034ec3868e5 |
| children |
| rev | line source |
|---|---|
|
2729
74dbf4c3f2e1
Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents:
540
diff
changeset
|
1 // ####ECOSHOSTGPLCOPYRIGHTBEGIN#### |
|
74dbf4c3f2e1
Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents:
540
diff
changeset
|
2 // ------------------------------------------- |
|
74dbf4c3f2e1
Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents:
540
diff
changeset
|
3 // This file is part of the eCos host tools. |
|
74dbf4c3f2e1
Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents:
540
diff
changeset
|
4 // Copyright (C) 1998, 1999, 2000 Free Software Foundation, Inc. |
|
82
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
5 // |
|
2729
74dbf4c3f2e1
Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents:
540
diff
changeset
|
6 // This program is free software; you can redistribute it and/or modify |
|
74dbf4c3f2e1
Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents:
540
diff
changeset
|
7 // it under the terms of the GNU General Public License as published by |
|
74dbf4c3f2e1
Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents:
540
diff
changeset
|
8 // the Free Software Foundation; either version 2 or (at your option) any |
|
74dbf4c3f2e1
Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents:
540
diff
changeset
|
9 // later version. |
|
82
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
10 // |
|
2729
74dbf4c3f2e1
Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents:
540
diff
changeset
|
11 // This program is distributed in the hope that it will be useful, but |
|
74dbf4c3f2e1
Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents:
540
diff
changeset
|
12 // WITHOUT ANY WARRANTY; without even the implied warranty of |
|
74dbf4c3f2e1
Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents:
540
diff
changeset
|
13 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
|
74dbf4c3f2e1
Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents:
540
diff
changeset
|
14 // General Public License for more details. |
|
82
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
15 // |
|
2729
74dbf4c3f2e1
Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents:
540
diff
changeset
|
16 // You should have received a copy of the GNU General Public License |
|
74dbf4c3f2e1
Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents:
540
diff
changeset
|
17 // along with this program; if not, write to the |
|
74dbf4c3f2e1
Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents:
540
diff
changeset
|
18 // Free Software Foundation, Inc., 51 Franklin Street, |
|
74dbf4c3f2e1
Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents:
540
diff
changeset
|
19 // Fifth Floor, Boston, MA 02110-1301, USA. |
|
74dbf4c3f2e1
Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents:
540
diff
changeset
|
20 // ------------------------------------------- |
|
74dbf4c3f2e1
Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents:
540
diff
changeset
|
21 // ####ECOSHOSTGPLCOPYRIGHTEND#### |
|
82
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
22 //================================================================= |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
23 // |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
24 // eCosSocket.cpp |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
25 // |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
26 // Socket test class |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
27 // |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
28 //================================================================= |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
29 //================================================================= |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
30 //#####DESCRIPTIONBEGIN#### |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
31 // |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
32 // Author(s): sdf |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
33 // Contributors: sdf |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
34 // Date: 1999-04-01 |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
35 // Description: This class abstracts tcp/ip sockets for use in the testing infrastructure |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
36 // Usage: |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
37 // |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
38 //####DESCRIPTIONEND#### |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
39 |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
40 #include "eCosStd.h" |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
41 #include "eCosSocket.h" |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
42 #include "eCosSerial.h" |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
43 #include "eCosThreadUtils.h" |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
44 #include "eCosTrace.h" |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
45 #include <map> |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
46 |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
47 enum {ERR_TIMEOUT=20000, ERR_READ_AFTER_CLOSE=20001}; |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
48 |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
49 // Blocking read on one or other of the data sources: |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
50 // Result: -1 - socket error occurred |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
51 // 1 - data read from socket |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
52 // -2 - serial error occurred |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
53 // 2 - data read from serial |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
54 |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
55 CeCosSocket::SSReadResult CeCosSocket::SSRead (CeCosSerial &serial,CeCosSocket &socket,void *pBuf,unsigned int nSize,unsigned int &nRead,bool *pbStop) |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
56 { |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
57 SSReadResult rc=SS_STOPPED; |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
58 bool bBlocking=serial.GetBlockingReads(); |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
59 bool bBlockingModified=false; |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
60 while(0==pbStop || !(*pbStop)){ |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
61 if(!socket.Peek(nRead)){ |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
62 rc=SS_SOCKET_ERROR; |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
63 break; |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
64 } else if(nRead){ |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
65 nRead=MIN(nRead,nSize); |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
66 rc=socket.recv(pBuf,nRead)?SS_SOCKET_READ:SS_SOCKET_ERROR; |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
67 break; |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
68 } else { |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
69 if(bBlocking){ |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
70 serial.SetBlockingReads(false); |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
71 bBlockingModified=true; |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
72 bBlocking=false; |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
73 } |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
74 if(serial.Read(pBuf,nSize,nRead)){ |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
75 if(nRead>0){ |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
76 rc=SS_SERIAL_READ; |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
77 break; |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
78 } |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
79 } else { |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
80 rc=SS_SERIAL_ERROR; |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
81 break; |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
82 } |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
83 } |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
84 CeCosThreadUtils::Sleep(10); |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
85 } |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
86 if(bBlockingModified){ |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
87 serial.SetBlockingReads(true); |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
88 } |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
89 return rc; |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
90 } |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
91 |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
92 // ctors and dtors |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
93 |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
94 CeCosSocket::CeCosSocket (): |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
95 m_nDefaultTimeout(10*1000), |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
96 m_nSock(-1), |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
97 m_nClient(0) |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
98 { |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
99 VTRACE(_T("Create socket instance %08x\n"),(unsigned int)this); |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
100 } |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
101 |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
102 CeCosSocket::CeCosSocket (int sock /*result of previous call of Listen*/, bool *pbStop): |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
103 m_nDefaultTimeout(10*1000), |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
104 m_nSock(-1), |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
105 m_nClient(0) |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
106 { |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
107 VTRACE(_T("Create socket instance %08x\n"),(unsigned int)this); |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
108 Accept(sock,pbStop); |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
109 } |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
110 |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
111 CeCosSocket::CeCosSocket (LPCTSTR pszHostPort,Duration dTimeout): |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
112 m_nDefaultTimeout(10*1000), |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
113 m_nSock(-1), |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
114 m_nClient(0) |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
115 { |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
116 VTRACE(_T("Create socket instance %08x\n"),(unsigned int)this); |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
117 Connect(pszHostPort,dTimeout); |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
118 } |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
119 |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
120 bool CeCosSocket::Accept(int sock /*result of previous call of Listen*/, bool *pbStop) |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
121 { |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
122 m_nSock=-1; |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
123 while(0==pbStop||!*pbStop){ |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
124 struct sockaddr cli_addr; |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
125 #ifndef _WIN32 |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
126 unsigned |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
127 #endif |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
128 int clilen=sizeof(struct sockaddr); |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
129 m_nSock=::accept(sock, (struct sockaddr *) &cli_addr, &clilen); |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
130 SaveError(); |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
131 if(-1==m_nSock){ |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
132 if(WOULDBLOCK==SocketError()){ |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
133 CeCosThreadUtils::Sleep(100); |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
134 continue; |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
135 } |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
136 } else { |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
137 memcpy(&m_nClient,cli_addr.sa_data+2,4); |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
138 TRACE(_T("Connection accepted from %s - socket %d\n"),(LPCTSTR )ClientName(m_nClient),m_nSock); |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
139 SetSocketOptions(); |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
140 break; |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
141 } |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
142 } |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
143 return -1!=m_nSock; |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
144 } |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
145 |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
146 int CeCosSocket::Listen(int nTcpPort) |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
147 { |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
148 // Create socket |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
149 int sock=::socket(AF_INET, SOCK_STREAM, 0); |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
150 if (sock == -1) { |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
151 ERROR(_T("Couldn't create socket\n")); |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
152 } else { |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
153 VTRACE(_T("Created socket %d listening on port %d\n"),sock,nTcpPort); |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
154 // Bind socket to address |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
155 struct sockaddr_in serv_addr; |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
156 memset(&serv_addr, 0, sizeof serv_addr); |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
157 |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
158 serv_addr.sin_family = AF_INET; |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
159 serv_addr.sin_port=htons((short)nTcpPort); |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
160 serv_addr.sin_addr.s_addr = INADDR_ANY; |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
161 |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
162 if (::bind(sock, (struct sockaddr *)&serv_addr, sizeof(serv_addr)) == -1) { |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
163 TRACE(_T("Couldn't bind socket on port %d\n"),nTcpPort); |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
164 CloseSocket(sock); |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
165 } else if (-1==::listen(sock, SOMAXCONN)){ |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
166 CloseSocket(sock); |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
167 TRACE(_T("socket error on listen - port %d\n"),nTcpPort); |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
168 } else { |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
169 #ifdef _WIN32 |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
170 int nTrue=1; |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
171 bool rc=(0==::ioctlsocket(sock, FIONBIO, (unsigned long *)&nTrue)); |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
172 #else //UNIX |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
173 int flags=::fcntl(sock,F_GETFL); |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
174 flags|=O_NONBLOCK; |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
175 bool rc=(0==::fcntl (sock, F_SETFL, flags)); |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
176 #endif |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
177 if(!rc){ |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
178 TRACE(_T("Failed to set socket options on socket %d\n"),sock); |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
179 } |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
180 } |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
181 } |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
182 return sock; |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
183 } |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
184 |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
185 bool CeCosSocket::Connect(LPCTSTR pszHostPort,Duration dTimeout) |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
186 { |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
187 dTimeout=TimeoutDuration(dTimeout); |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
188 struct sockaddr_in serv_addr; |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
189 |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
190 VTRACE(_T("Connect: %s timeout=%d\n"),pszHostPort,dTimeout); |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
191 |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
192 // Get the target host address |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
193 String strHost; |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
194 int nPort; |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
195 CeCosSocket::ParseHostPort(pszHostPort,strHost,nPort); |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
196 String strErr; |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
197 |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
198 char *ip=GetHostByName(strHost).GetCString(); |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
199 memset(&serv_addr, 0, sizeof serv_addr); |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
200 // Create socket |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
201 m_nSock = ::socket(AF_INET, SOCK_STREAM, 0); |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
202 if (-1 == m_nSock) { |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
203 TRACE(_T("Could not create socket [%s]\n"),pszHostPort); |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
204 } else { |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
205 #ifdef _WIN32 |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
206 SetSocketOptions(); |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
207 #endif |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
208 VTRACE(_T("Created socket %d connected to %s\n"),m_nSock,pszHostPort); |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
209 // Bind socket to address |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
210 serv_addr.sin_family = AF_INET; |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
211 serv_addr.sin_port=htons((short)nPort); |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
212 SaveError(); |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
213 serv_addr.sin_addr.s_addr = inet_addr(ip); |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
214 |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
215 // Connect to server |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
216 VTRACE(_T("Connect() : connecting to server\n")); |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
217 int cc=::connect(m_nSock, (struct sockaddr *) &serv_addr, sizeof(serv_addr)); |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
218 SaveError(); |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
219 String strMsg; |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
220 if(-1==cc){ |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
221 if( |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
222 #ifdef _WIN32 |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
223 WOULDBLOCK==SocketError() |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
224 #else // UNIX |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
225 EINPROGRESS==SocketError() |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
226 #endif |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
227 ){ |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
228 // Allow dTimeout milliseconds for connect to complete |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
229 fd_set set; |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
230 FD_ZERO(&set); |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
231 #ifdef _WIN32 |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
232 #pragma warning( push ) |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
233 #pragma warning( disable : 4127 ) // conditional expression is constant |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
234 #endif |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
235 FD_SET((unsigned)m_nSock, &set); |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
236 #ifdef _WIN32 |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
237 #pragma warning( pop ) |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
238 #endif |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
239 struct timeval tv; |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
240 tv.tv_sec = dTimeout/1000; |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
241 tv.tv_usec = 1000*(dTimeout % 1000); |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
242 switch(::select(m_nSock, NULL, &set , NULL, &tv)){ |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
243 case 0: |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
244 m_nErr=ERR_TIMEOUT; |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
245 strMsg.Format(_T("attempt timed out after %d seconds"),dTimeout/1000); |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
246 break; |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
247 case -1: |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
248 SaveError(); |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
249 strMsg=SocketErrString(); |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
250 break; |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
251 default: |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
252 cc=0; |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
253 } |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
254 } else { |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
255 strMsg=SocketErrString(); |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
256 } |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
257 } |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
258 |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
259 if(-1==cc){ |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
260 TRACE(_T("Could not connect to %s - %s\n"),pszHostPort,(LPCTSTR)strMsg); |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
261 CloseSocket(m_nSock); |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
262 } else { |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
263 #ifndef _WIN32 |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
264 SetSocketOptions(); |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
265 #endif |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
266 } |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
267 } |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
268 delete [] ip; |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
269 return -1!=m_nSock; |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
270 } |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
271 |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
272 bool CeCosSocket::sendrecv(bool bSend,const void *pData,unsigned int nLength, |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
273 LPCTSTR pszMsg,Duration dTimeout,CeCosSocket::StopFunc pFnStop,void *pParam) |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
274 { |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
275 |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
276 dTimeout=TimeoutDuration(dTimeout); |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
277 |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
278 LPCTSTR pszSR=(bSend?_T("sending"):_T("receiving")); |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
279 LPTSTR c=(LPTSTR )pData; |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
280 Time ft0=Now(); |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
281 int nTodo=nLength; |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
282 while((nTodo>0) && ((0==pFnStop) || (!pFnStop(pParam)))){ |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
283 int s=bSend?::send(m_nSock, (const char *)c, nTodo, 0): ::recv(m_nSock, (char *)c, nTodo, 0); |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
284 if(0==s && !bSend){ |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
285 m_nErr=ERR_READ_AFTER_CLOSE; |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
286 } else { |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
287 SaveError(); |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
288 } |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
289 if(-1==s && WOULDBLOCK==SocketError()){ |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
290 Duration d=Duration(Now()-ft0); |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
291 if(d>dTimeout){ |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
292 TRACE(_T("%d/%d mSec timeout on socket %d %s %s - processed %d/%d bytes\n") , |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
293 d,dTimeout,m_nSock,pszSR,pszMsg, |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
294 nLength-nTodo,nLength); |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
295 m_nErr=ERR_TIMEOUT; |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
296 break; |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
297 } |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
298 CeCosThreadUtils::Sleep(100); |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
299 } else if (s>0) { |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
300 c+=s; |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
301 nTodo-=s; |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
302 ft0=Now(); |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
303 } else { |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
304 TRACE(_T("Error on socket %d %s %s - %s\n") ,m_nSock, pszSR, pszMsg, (LPCTSTR )SocketErrString()); |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
305 break; |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
306 } |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
307 } |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
308 return 0==nTodo; |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
309 } |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
310 |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
311 // Graceful socket closedown |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
312 CeCosSocket::~CeCosSocket() |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
313 { |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
314 Close(); |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
315 VTRACE(_T("Delete socket instance %08x\n"),(unsigned int)this); |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
316 } |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
317 |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
318 bool CeCosSocket::CloseSocket(int &sock) |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
319 { |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
320 bool rc=false; |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
321 if(-1!=sock){ |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
322 VTRACE(_T("Closing socket %d\n"),sock); |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
323 try{ |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
324 shutdown(sock,0);// SD_BOTH |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
325 #ifdef _WIN32 |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
326 rc=(0==closesocket(sock)); |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
327 #else // UNIX |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
328 rc=(0==close(sock)); |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
329 #endif |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
330 } |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
331 catch(...) { |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
332 TRACE(_T("!!! Exception caught in CeCosSocket::CloseSocket!!!\n")); |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
333 } |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
334 sock=-1; |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
335 } |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
336 return rc; |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
337 } |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
338 |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
339 bool CeCosSocket::SetSocketOptions() |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
340 { |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
341 bool rc; |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
342 #ifdef _WIN32 |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
343 int nTrue=1; |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
344 rc=(0==::ioctlsocket(m_nSock, FIONBIO, (unsigned long *)&nTrue)); |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
345 SaveError(); |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
346 #else // UNIX |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
347 int flags=::fcntl(m_nSock,F_GETFL); |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
348 SaveError(); |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
349 flags|=O_NONBLOCK; |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
350 rc=(0==::fcntl (m_nSock, F_SETFL, flags)); |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
351 SaveError(); |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
352 #endif |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
353 int bLinger=0; |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
354 setsockopt(m_nSock,SOL_SOCKET,SO_LINGER,(const char *)&bLinger, sizeof(bLinger)); |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
355 if(!rc){ |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
356 TRACE(_T("Failed to set socket options socket %d - %s\n"),m_nSock,(LPCTSTR )SocketErrString()); |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
357 } |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
358 return rc; |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
359 } |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
360 |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
361 String CeCosSocket::SocketErrString(int nErr) |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
362 { |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
363 String str; |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
364 #ifdef _WIN32 |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
365 switch(nErr){ |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
366 case ERR_TIMEOUT: str=_T("Read operation timed out");break; |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
367 case ERR_READ_AFTER_CLOSE: str=_T("Read operation after socket closed");break; |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
368 |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
369 case WSAEACCES: str=_T("Permission denied");break; |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
370 case WSAEADDRINUSE: str=_T("Address already in use");break; |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
371 case WSAEADDRNOTAVAIL: str=_T("Cannot assign requested address");break; |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
372 case WSAEAFNOSUPPORT: str=_T("Address family not supported by protocol family");break; |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
373 case WSAEALREADY: str=_T("Operation already in progress");break; |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
374 case WSAECONNABORTED: str=_T("Software caused connection abort");break; |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
375 case WSAECONNREFUSED: str=_T("Connection refused");break; |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
376 case WSAECONNRESET: str=_T("Connection reset by peer");break; |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
377 case WSAEDESTADDRREQ: str=_T("Destination address required");break; |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
378 case WSAEFAULT: str=_T("Bad address");break; |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
379 case WSAEHOSTDOWN: str=_T("Host is down");break; |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
380 case WSAEHOSTUNREACH: str=_T("No route to host");break; |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
381 case WSAEINPROGRESS: str=_T("Operation now in progress");break; |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
382 case WSAEINTR: str=_T("Interrupted function call");break; |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
383 case WSAEINVAL: str=_T("Invalid argument");break; |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
384 case WSAEISCONN: str=_T("Socket is already connected");break; |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
385 case WSAEMFILE: str=_T("Too many open files");break; |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
386 case WSAEMSGSIZE: str=_T("Message too long");break; |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
387 case WSAENETDOWN: str=_T("Network is down");break; |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
388 case WSAENETRESET: str=_T("Network dropped connection on reset");break; |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
389 case WSAENETUNREACH: str=_T("Network is unreachable");break; |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
390 case WSAENOBUFS: str=_T("No buffer space available");break; |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
391 case WSAENOPROTOOPT: str=_T("Bad protocol option");break; |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
392 case WSAENOTCONN: str=_T("Socket is not connected");break; |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
393 case WSAENOTSOCK: str=_T("Socket operation on non-socket");break; |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
394 case WSAEOPNOTSUPP: str=_T("Operation not supported");break; |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
395 case WSAEPFNOSUPPORT: str=_T("Protocol family not supported");break; |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
396 case WSAEPROCLIM: str=_T("Too many processes");break; |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
397 case WSAEPROTONOSUPPORT: str=_T("Protocol not supported");break; |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
398 case WSAEPROTOTYPE: str=_T("Protocol wrong type for socket");break; |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
399 case WSAESHUTDOWN: str=_T("Cannot send after socket shutdown");break; |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
400 case WSAESOCKTNOSUPPORT: str=_T("Socket type not supported");break; |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
401 case WSAETIMEDOUT: str=_T("Connection timed out");break; |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
402 case WSATYPE_NOT_FOUND: str=_T("Class type not found");break; |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
403 case WSAEWOULDBLOCK: str=_T("Resource temporarily unavailable");break; |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
404 case WSAHOST_NOT_FOUND: str=_T("Host not found");break; |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
405 case WSA_INVALID_HANDLE: str=_T("Specified event object handle is invalid");break; |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
406 case WSA_INVALID_PARAMETER: str=_T("One or more parameters are invalid");break; |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
407 //case WSAINVALIDPROCTABLE: str=_T("Invalid procedure table from service provider");break; |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
408 //case WSAINVALIDPROVIDER: str=_T("Invalid service provider version number");break; |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
409 case WSA_IO_INCOMPLETE: str=_T("Overlapped I/O event object not in signaled state");break; |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
410 case WSA_IO_PENDING: str=_T("Overlapped operations will complete later");break; |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
411 case WSA_NOT_ENOUGH_MEMORY: str=_T("Insufficient memory available");break; |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
412 case WSANOTINITIALISED: str=_T("Successful case WSAStartup not yet:performed");break; |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
413 case WSANO_DATA: str=_T("Valid name, no data record of requested type");break; |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
414 case WSANO_RECOVERY: str=_T("This is a non-recoverable error");break; |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
415 //case WSAPROVIDERFAILEDINIT: str=_T("Unable to initialize a service provider");break; |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
416 case WSASYSCALLFAILURE: str=_T("System call failure");break; |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
417 case WSASYSNOTREADY: str=_T("Network subsystem is unavailable");break; |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
418 case WSATRY_AGAIN: str=_T("Non-authoritative host not found");break; |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
419 case WSAVERNOTSUPPORTED: str=_T("WINSOCK.DLL version out of range");break; |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
420 case WSAEDISCON: str=_T("Graceful shutdown in progress");break; |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
421 case WSA_OPERATION_ABORTED: str=_T("Overlapped operation aborted");break; |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
422 default: |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
423 str.Format(_T("Unknown error %d (0x%08x)"),nErr,nErr); |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
424 } |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
425 #else // UNIX |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
426 switch(nErr){ |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
427 case ERR_TIMEOUT: str=_T("Read operation timed out");break; |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
428 case ERR_READ_AFTER_CLOSE: str=_T("Read operation after socket closed");break; |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
429 default: |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
430 str=strerror(errno); |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
431 } |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
432 #endif |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
433 return str; |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
434 } |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
435 |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
436 bool CeCosSocket::sendInteger(int n,LPCTSTR pszMsg,Duration dTimeout) |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
437 { |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
438 // This has to support cross-architectural endianness |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
439 unsigned char c[sizeof(int)]; |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
440 for(unsigned int i=0;i<sizeof(int);i++){ |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
441 c[i]=(unsigned char)(n&0xff); |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
442 n>>=8; |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
443 } |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
444 return send (c, sizeof(int),pszMsg,dTimeout); |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
445 } |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
446 |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
447 bool CeCosSocket::recvInteger(int & n,LPCTSTR pszMsg,Duration dTimeout) |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
448 { |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
449 // This has to support cross-architectural endianness |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
450 unsigned char c[sizeof(int)]; |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
451 bool rc=recv (c, sizeof(int),pszMsg,dTimeout); |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
452 n=0; |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
453 if(rc){ |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
454 for(int i=sizeof(int)-1;i>=0;--i){ |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
455 n<<=8; |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
456 n|=c[i]; |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
457 } |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
458 } |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
459 return rc; |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
460 } |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
461 |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
462 // Socket communications for strings are always non-UNICODE: |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
463 bool CeCosSocket::recvString (String &str,LPCTSTR pszMsg,Duration dTimeout) |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
464 { |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
465 int nLength; |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
466 bool rc=false; |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
467 if(recvInteger(nLength,pszMsg,dTimeout)){ |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
468 if(0==nLength){ |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
469 rc=true; |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
470 } else { |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
471 Buffer b(1+nLength); |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
472 char *c=(char *)b.Data(); |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
473 if(c){ |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
474 rc=recv(c,nLength,pszMsg,dTimeout); |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
475 c[nLength]='\0'; |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
476 str=String::CStrToUnicodeStr(c); |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
477 } |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
478 } |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
479 } |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
480 return rc; |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
481 } |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
482 |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
483 // Socket communications for strings are always non-UNICODE: |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
484 bool CeCosSocket::sendString (const String &str,LPCTSTR pszMsg,Duration dTimeout) |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
485 { |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
486 char *psz=str.GetCString(); |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
487 int nLength=strlen(psz); |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
488 bool rc=sendInteger(nLength,pszMsg,dTimeout) && (0==nLength || send(psz,nLength,pszMsg,dTimeout)); |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
489 delete [] psz; |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
490 return rc; |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
491 } |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
492 |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
493 |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
494 // Give indication of bytes available to be read (but don't read them) |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
495 bool CeCosSocket::Peek (unsigned int &nAvail) |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
496 { |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
497 char buf[8192]; |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
498 int n=::recv(m_nSock, buf, sizeof buf, MSG_PEEK); |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
499 nAvail=0; |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
500 bool rc=false; |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
501 switch(n) { |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
502 case -1: |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
503 SaveError(); |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
504 if(WOULDBLOCK==SocketError()){ |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
505 rc=true; // nAvail stays==0 |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
506 } else { |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
507 ERROR(_T("Peek: err=%d %s\n"),SocketError(),(LPCTSTR)SocketErrString()); |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
508 } |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
509 break; |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
510 case 0: |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
511 m_nErr=ERR_READ_AFTER_CLOSE; |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
512 break; |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
513 default: |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
514 rc=true; |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
515 nAvail=n; |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
516 } |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
517 return rc; |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
518 } |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
519 |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
520 // Connect tcp/ip port and serial port together. |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
521 // Traffic is passed through pFunc, passed parameter pParam. |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
522 // The pFunc function: |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
523 // may reallocate pBuf (using malloc/realloc etc...) |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
524 // must leave pBuf allocated on exit |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
525 // should not close either serial or socket |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
526 // should leave writing to its caller |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
527 // should return false if it wishes to terminate the connection (after caller has written output) |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
528 bool CeCosSocket::ConnectSocketToSerial (CeCosSocket &socket,CeCosSerial &serial,FilterFunc *pSerialToSocketFilterFunc/*=0*/,void *pSerialParam/*=0*/,FilterFunc *pSocketToSerialFilterFunc/*=0*/,void *pSocketParam/*=0*/,bool *pbStop/*=0*/) |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
529 { |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
530 serial.ClearError(); |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
531 enum {BUFSIZE=8192}; |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
532 void *pBuf=malloc(BUFSIZE); |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
533 TRACE(_T("ConnectSocketToSerial: connected\n")); |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
534 bool rc=true; |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
535 try { |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
536 /* |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
537 { //hack |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
538 unsigned int nWritten;//hack |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
539 serial.Write(_T("+"),1,nWritten);//hack |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
540 }//hack |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
541 */ |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
542 while(rc && (0==pbStop || !(*pbStop))){ |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
543 unsigned int nRead=0; |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
544 switch(SSRead (serial,socket,pBuf,BUFSIZE,nRead,pbStop)){ |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
545 case SS_SERIAL_READ: |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
546 VTRACE(_T("Serial:%d\n"),nRead); |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
547 if(pSerialToSocketFilterFunc){ |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
548 rc=pSerialToSocketFilterFunc(pBuf,nRead,serial,socket,pSerialParam); |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
549 } |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
550 if(nRead && !socket.send(pBuf,nRead)){ |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
551 TRACE(_T("Failed to write to socket\n")); |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
552 rc=false; |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
553 } |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
554 break; |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
555 case SS_SOCKET_READ: |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
556 unsigned int nWritten; |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
557 VTRACE(_T("Socket:%d\n"),nRead); |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
558 if(pSocketToSerialFilterFunc){ |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
559 rc=pSocketToSerialFilterFunc(pBuf,nRead,serial,socket,pSocketParam); |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
560 } |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
561 { |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
562 LPTSTR c=(LPTSTR )pBuf; |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
563 int nToWrite=nRead; |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
564 while(nToWrite>0){ |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
565 if(!serial.Write(pBuf,nRead,nWritten)){ |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
566 TRACE(_T("Failed to write to serial\n")); |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
567 rc=false; |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
568 break; |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
569 } |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
570 nToWrite-=nWritten; |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
571 c+=nWritten; |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
572 } |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
573 } |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
574 break; |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
575 // Error conditions: |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
576 case SS_SERIAL_ERROR: |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
577 TRACE(_T("SSRead serial error - %s\n"),(LPCTSTR)serial.ErrString()); |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
578 rc=false; |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
579 break; |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
580 case SS_SOCKET_ERROR: |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
581 TRACE(_T("SSRead socket error - %s\n"),(LPCTSTR)socket.SocketErrString()); |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
582 rc=false; |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
583 break; |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
584 case SS_STOPPED: |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
585 TRACE(_T("SSRead stopped\n")); |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
586 rc=false; |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
587 break; |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
588 } |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
589 } |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
590 } |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
591 catch (...){ |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
592 ERROR(_T("!!! ConnectSocketToSerial exception caught!!!\n")); |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
593 free(pBuf); |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
594 throw; |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
595 } |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
596 free(pBuf); |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
597 return rc; |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
598 } |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
599 |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
600 // Connect two tcp/ip ports together. |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
601 // Traffic is passed through pFunc, passed parameter pParam. |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
602 // The pFunc function: |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
603 // may reallocate pBuf (using malloc/realloc etc...) |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
604 // must leave pBuf allocated on exit |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
605 // should not close either serial or socket |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
606 // should leave writing to its caller |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
607 // should return false if it wishes to terminate the connection (after caller has written output) |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
608 bool CeCosSocket::ConnectSocketToSocket (CeCosSocket &o,FilterFunc *pSocketToSocketFilterFunc1,FilterFunc *pSocketToSocketFilterFunc2,void *pParam,bool *pbStop) |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
609 { |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
610 enum {BUFSIZE=8192}; |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
611 void *pBuf=malloc(BUFSIZE); |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
612 TRACE(_T("ConnectSocketToSocket: connected\n")); |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
613 bool rc=true; |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
614 try { |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
615 while(rc && (0==pbStop || !(*pbStop))){ |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
616 fd_set set; |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
617 FD_ZERO(&set); |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
618 FD_SET((unsigned)m_nSock, &set); |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
619 FD_SET((unsigned)o.m_nSock, &set); |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
620 struct timeval tv; |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
621 tv.tv_sec = 1; |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
622 tv.tv_usec = 0; |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
623 switch(::select(m_nSock,&set,0,0,&tv)){ |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
624 case -1: |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
625 rc=false; |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
626 break; |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
627 case 1: |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
628 case 2: |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
629 { |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
630 unsigned int nAvail=0; |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
631 if(FD_ISSET((unsigned)m_nSock, &set) && Peek(nAvail) && recv(pBuf,nAvail)){ |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
632 //rc=pSocketToSocketFilterFunc1(pBuf,nAvail,socket,this,o); |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
633 o.send(pBuf,nAvail); |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
634 } |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
635 if(FD_ISSET((unsigned)o.m_nSock, &set) && o.Peek(nAvail) && o.recv(pBuf,nAvail)){ |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
636 //rc=pSocketToSocketFilterFunc2(pBuf,nAvail,socket,o,this); |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
637 send(pBuf,nAvail); |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
638 } |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
639 } |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
640 case 0: |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
641 break; |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
642 } |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
643 } |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
644 } |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
645 catch (...){ |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
646 TRACE(_T("!!! ConnectSocketToSocket exception caught!!!\n")); |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
647 rc=false; |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
648 } |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
649 free(pBuf); |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
650 return rc; |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
651 } |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
652 |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
653 bool CeCosSocket::ConnectSocketToSerial ( |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
654 int nListenSock,LPCTSTR pszPort, int nBaud, |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
655 FilterFunc *pSerialToSocketFilterFunc/*=0*/,void *pSerialParam/*=0*/,FilterFunc *pSocketToSerialFilterFunc/*=0*/,void *pSocketParam/*=0*/, |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
656 bool *pbStop) |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
657 { |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
658 bool rc=false; |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
659 try{ |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
660 TRACE(_T("ConnectSocketToSerial : socket %d <--> %s\n"),nListenSock,pszPort); |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
661 |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
662 CeCosSerial serial; |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
663 serial.SetBlockingReads(false); |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
664 // Open serial device. |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
665 if (!serial.Open(pszPort,nBaud)){ |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
666 ERROR(_T("Couldn't open port %s\n"),pszPort); |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
667 } else { |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
668 // Flush the serial buffer. |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
669 serial.Flush(); |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
670 |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
671 TRACE(_T("ConnectSocketToSerial: waiting for connection...\n")); |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
672 CeCosSocket socket; |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
673 if(!socket.Accept(nListenSock,pbStop)){ |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
674 ERROR(_T("ConnectSocketToSerial - couldn't accept\n")); |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
675 } else { |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
676 rc=ConnectSocketToSerial (socket,serial,pSerialToSocketFilterFunc,pSerialParam,pSocketToSerialFilterFunc,pSocketParam,pbStop); |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
677 } |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
678 } |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
679 TRACE(_T("ConnectSocketToSerial : done\n")); |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
680 } |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
681 catch(...){ |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
682 TRACE(_T("ConnectSocketToSerial !!!exception handled!!!\n")); |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
683 } |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
684 return rc; |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
685 } |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
686 |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
687 String CeCosSocket::ClientName(int nClient) |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
688 { |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
689 char ip[4]; |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
690 memcpy(ip,&nClient,4); |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
691 struct hostent *he=::gethostbyaddr((const char *)ip,4,AF_INET); |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
692 String str; |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
693 if(he){ |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
694 str=String::CStrToUnicodeStr(he->h_name); |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
695 } else { |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
696 str.Format(_T("%u.%u.%u.%u"),ip[0],ip[1],ip[2],ip[3]); |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
697 } |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
698 return str; |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
699 } |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
700 |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
701 String CeCosSocket::HostPort(LPCTSTR pszHost,int nPort) |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
702 { |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
703 String str; |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
704 str.Format(_T("%s:%d"),pszHost,nPort); |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
705 return str; |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
706 } |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
707 |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
708 // Split the string into host:port parts. Result tells us whether it was successful. |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
709 bool CeCosSocket::ParseHostPort (LPCTSTR pszHostPort, String &strHost, int &nPort) |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
710 { |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
711 int n=_stscanf(pszHostPort,_T("%[^:]:%d"),strHost.GetBuffer(_tcslen(pszHostPort)),&nPort); |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
712 strHost.ReleaseBuffer(); |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
713 return 2==n && nPort>0 && nPort<=0xffff; |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
714 } |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
715 |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
716 // Is the string in the form host:port? |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
717 bool CeCosSocket::IsLegalHostPort (LPCTSTR pszHostPort) |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
718 { |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
719 int nPort=0; |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
720 String strHost; |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
721 return ParseHostPort(pszHostPort,strHost,nPort); |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
722 } |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
723 |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
724 // Translate a timeout that may be one of the special values DEFAULTTIMEOUT or NOTIMEOUT to a value in milliseconds. |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
725 Duration CeCosSocket::TimeoutDuration(Duration dTimeout) |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
726 { |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
727 switch(dTimeout){ |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
728 case DEFAULTTIMEOUT: |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
729 dTimeout=m_nDefaultTimeout; |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
730 break; |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
731 case NOTIMEOUT: |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
732 dTimeout=0x7fffffff; |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
733 break; |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
734 default: |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
735 break; |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
736 } |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
737 return dTimeout; |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
738 } |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
739 |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
740 String CeCosSocket::SocketErrString() { |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
741 return SocketErrString(m_nErr); |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
742 } |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
743 |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
744 |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
745 bool CeCosSocket::SameHost(LPCTSTR host1, LPCTSTR host2) |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
746 { |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
747 return 0==_tcscmp(host1,host2) || (GetHostByName(host1)==GetHostByName(host2)); |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
748 } |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
749 |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
750 bool CeCosSocket::Init() |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
751 { |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
752 #ifdef _WIN32 |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
753 WSADATA wsaData; |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
754 WORD wVersionRequested = MAKEWORD( 2, 0 ); |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
755 WSAStartup( wVersionRequested, &wsaData ); |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
756 #endif |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
757 return true; |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
758 } |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
759 |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
760 void CeCosSocket::Term() |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
761 { |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
762 #ifdef _WIN32 |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
763 WSACleanup(); |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
764 #endif |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
765 } |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
766 |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
767 LPCTSTR CeCosSocket::MyHostName() |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
768 { |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
769 static String str; |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
770 if(str.empty()){ |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
771 char szMyname[256]; |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
772 if(0==gethostname(szMyname,sizeof szMyname)){ |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
773 str=String::CStrToUnicodeStr(szMyname); |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
774 } |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
775 } |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
776 return str; |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
777 } |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
778 |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
779 LPCTSTR CeCosSocket::MySimpleHostName() |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
780 { |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
781 static String str; |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
782 if(str.empty()){ |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
783 str=MyHostName(); |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
784 // Remove all after a '.' |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
785 LPCTSTR c=_tcschr(str,_TCHAR('.')); |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
786 if(c){ |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
787 str.resize(c-(LPCTSTR)str); |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
788 } |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
789 } |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
790 return str; |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
791 } |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
792 |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
793 const String CeCosSocket::GetHostByName(LPCTSTR pszHost) |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
794 { |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
795 typedef std::map<String,String> MapStringToString; |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
796 static MapStringToString hostmap; |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
797 MapStringToString::iterator it=hostmap.find(pszHost); |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
798 if(hostmap.end()==it){ |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
799 char *h=0; // avoid erroneous gcc warning message |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
800 h=String(pszHost).GetCString(); |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
801 char ip[16]; |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
802 struct hostent* host_dat; |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
803 if (0!=(host_dat=::gethostbyname(h))){ |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
804 char *c=inet_ntoa( *( (struct in_addr *)host_dat->h_addr_list[0] ) ); |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
805 if(c){ |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
806 strcpy(ip,c); |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
807 hostmap[pszHost]=String::CStrToUnicodeStr(ip); |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
808 } |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
809 } |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
810 delete [] h; |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
811 return String::CStrToUnicodeStr(ip); |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
812 } else { |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
813 return it->second; |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
814 } |
|
6736c52df507
Merge from eCos master repository on 2000-04-14-13:35:46-BST
jlarmour
parents:
diff
changeset
|
815 } |
