99CTCPClient::CTCPClient (LogFnCallback oLogger) :
1010 ASocket(oLogger),
1111 m_eStatus(DISCONNECTED),
12+ #ifdef WINDOWS
1213 m_ConnectSocket (INVALID_SOCKET),
1314 m_pResultAddrInfo(nullptr )
15+ #else
16+ m_pServer (nullptr )
17+ #endif
1418 // m_uRetryCount(0),
1519 // m_uRetryPeriod(0)
1620{
@@ -26,6 +30,7 @@ bool CTCPClient::Connect(const std::string& strServer, const std::string& strPor
2630 m_oLog (" [TCPClient][Warning] Opening a new connexion. The last one was automatically closed." );
2731 }
2832
33+ #ifdef WINDOWS
2934 ZeroMemory (&m_HintsAddrInfo, sizeof (m_HintsAddrInfo));
3035 /* AF_INET is used to specify the IPv4 address family. */
3136 m_HintsAddrInfo.ai_family = AF_INET;
@@ -50,9 +55,9 @@ bool CTCPClient::Connect(const std::string& strServer, const std::string& strPor
5055 }
5156
5257 // socket creation
53- m_ConnectSocket = socket (m_pResultAddrInfo->ai_family ,
54- m_pResultAddrInfo->ai_socktype ,
55- m_pResultAddrInfo->ai_protocol );
58+ m_ConnectSocket = socket (m_pResultAddrInfo->ai_family , // AF_INET
59+ m_pResultAddrInfo->ai_socktype , // SOCK_STREAM
60+ m_pResultAddrInfo->ai_protocol );// IPPROTO_TCP
5661
5762 if (m_ConnectSocket == INVALID_SOCKET)
5863 {
@@ -113,36 +118,118 @@ bool CTCPClient::Connect(const std::string& strServer, const std::string& strPor
113118 }
114119 m_oLog (StringFormat (" [TCPClient][Error] Unable to connect to server : %d" , WSAGetLastError ()));
115120
121+ #else
122+ // socket creation
123+ m_ConnectSocket = socket (AF_INET, SOCK_STREAM, 0 );
124+ if (m_ConnectSocket < 0 )
125+ {
126+ m_oLog (StringFormat (" [TCPClient][Error] opening socket: %s" , strerror (errno)));
127+ return false ;
128+ }
129+
130+ int iPort = atoi (strPort.c_str ());
131+ m_pServer = gethostbyname (strServer.c_str ());
132+ if (m_pServer == nullptr )
133+ {
134+ m_oLog (" [TCPClient][Error] no such host." );
135+ return false ;
136+ }
137+
138+ bzero (reinterpret_cast <char *>(&m_ServAddr), sizeof (m_ServAddr));
139+
140+ // copy address
141+ bcopy (reinterpret_cast <char *>(m_pServer->h_addr ), // src
142+ reinterpret_cast <char *>(&m_ServAddr.sin_addr .s_addr ), // dst
143+ m_pServer->h_length ); // len
144+
145+ m_ServAddr.sin_family = AF_INET;
146+ m_ServAddr.sin_port = htons (iPort);
147+
148+
149+ // connexion to the server
150+ int iResult = connect (m_ConnectSocket,
151+ reinterpret_cast <struct sockaddr *>(&m_ServAddr),
152+ sizeof (m_ServAddr));
153+ if (iResult >= 0 )
154+ {
155+ m_eStatus = CONNECTED;
156+ return true ;
157+ }
158+ m_oLog (StringFormat (" [TCPClient][Error] connecting : %s" , strerror (errno)));
159+ #endif
160+
116161 return false ;
117162}
118163
119- bool CTCPClient::SendData (const char * pData, size_t uSize) const
164+ bool CTCPClient::Send (const char * pData, size_t uSize) const
120165{
121166 if (m_eStatus != CONNECTED)
122167 {
123168 m_oLog (" [TCPClient][Error] send failed : not connected to a server." );
124169 return false ;
125170 }
126171
127- int iResult = send (m_ConnectSocket, pData, uSize, 0 );
172+ int iResult = 0 ;
173+ #ifdef WINDOWS
174+ iResult = send (m_ConnectSocket, pData, uSize, 0 );
128175 if (iResult == SOCKET_ERROR)
129176 {
130177 m_oLog (StringFormat (" [TCPClient][Error] send failed : %d" , WSAGetLastError ()));
131178 // Disconnect();
132179 return false ;
133180 }
181+ #else
182+ iResult = write (m_ConnectSocket, pData, uSize);
183+ if (iResult < 0 )
184+ {
185+ m_oLog (StringFormat (" [TCPClient][Error] writing to socket : %s" , strerror (errno)));
186+ return false ;
187+ }
188+ #endif
134189
135190 return true ;
136191}
137192
138- bool CTCPClient::SendData (const std::string& strData) const
193+ bool CTCPClient::Send (const std::string& strData) const
139194{
140- return SendData (strData.c_str (), strData.length ());
195+ return Send (strData.c_str (), strData.length ());
141196}
142197
143- bool CTCPClient::SendData (const std::vector<char >& Data) const
198+ bool CTCPClient::Send (const std::vector<char >& Data) const
144199{
145- return SendData (Data.data (), Data.size ());
200+ return Send (Data.data (), Data.size ());
201+ }
202+
203+ /* ret > 0 : bytes received
204+ * ret == 0 : connection closed
205+ * ret < 0 : recv failed
206+ */
207+ int CTCPClient::Receive (char * pData, size_t uSize) const
208+ {
209+ if (m_eStatus != CONNECTED)
210+ {
211+ m_oLog (" [TCPClient][Error] recv failed : not connected to a server." );
212+ return -1 ;
213+ }
214+
215+ int iBytesRcvd = 0 ;
216+
217+ #ifdef WINDOWS
218+ iBytesRcvd = recv (m_ConnectSocket, pData, uSize, 0 );
219+ if (iBytesRcvd < 0 )
220+ {
221+ m_oLog (StringFormat (" [TCPClient][Error] recv failed : %d" , WSAGetLastError ()));
222+ }
223+ #else
224+ // bzero(pData, uSize);
225+ iBytesRcvd = read (m_ConnectSocket, pData, uSize);
226+ if (iBytesRcvd < 0 )
227+ {
228+ m_oLog (StringFormat (" [TCPClient][Error] reading from socket : %s" , strerror (errno)));
229+ }
230+ #endif
231+
232+ return iBytesRcvd;
146233}
147234
148235bool CTCPClient::Disconnect ()
@@ -152,6 +239,7 @@ bool CTCPClient::Disconnect()
152239
153240 m_eStatus = DISCONNECTED;
154241
242+ #ifdef WINDOWS
155243 // shutdown the connection since no more data will be sent
156244 int iResult = shutdown (m_ConnectSocket, SD_SEND);
157245 if (iResult == SOCKET_ERROR)
@@ -161,13 +249,16 @@ bool CTCPClient::Disconnect()
161249 }
162250 closesocket (m_ConnectSocket);
163251
164- m_ConnectSocket = INVALID_SOCKET;
165-
166252 if (m_pResultAddrInfo != nullptr )
167253 {
168254 freeaddrinfo (m_pResultAddrInfo);
169255 m_pResultAddrInfo = nullptr ;
170256 }
257+ #else
258+ close (m_ConnectSocket);
259+ #endif
260+
261+ m_ConnectSocket = INVALID_SOCKET;
171262
172263 return true ;
173264}
0 commit comments