return;
}
- if (FD_ISSET(fd, &readfds)) {
- if (!m_Connected)
- m_Connected = true;
-
+ if (FD_ISSET(fd, &readfds))
HandleReadable();
- }
if (FD_ISSET(fd, &exceptfds))
HandleException();
FD_ZERO(&writefds);
- while (!WantsToWrite() && m_Connected) {
+ while (!WantsToWrite()) {
m_WriteCV.timed_wait(lock, boost::posix_time::seconds(1));
if (GetFD() == INVALID_SOCKET)
return;
}
- if (FD_ISSET(fd, &writefds)) {
- if (!m_Connected)
- m_Connected = true;
-
+ if (FD_ISSET(fd, &writefds))
HandleWritable();
- }
}
}
{
return m_Mutex;
}
+
+void Socket::SetConnected(bool connected)
+{
+ m_Connected = connected;
+}
+
+bool Socket::IsConnected(void) const
+{
+ return m_Connected;
+}
void SetFD(SOCKET fd);
SOCKET GetFD(void) const;
+ void SetConnected(bool connected);
+ bool IsConnected(void) const;
+
int GetError(void) const;
static int GetLastSocketError(void);
void HandleSocketError(const exception& ex);
rc = send(GetFD(), (const char *)data, count, 0);
if (rc <= 0) {
+ SetConnected(false);
+
HandleSocketError(SocketException("send() failed", GetError()));
return;
}
+ SetConnected(true);
+
m_SendQueue->Read(NULL, rc);
}
}
return;
if (rc <= 0) {
+ SetConnected(false);
+
HandleSocketError(SocketException("recv() failed", GetError()));
return;
}
+ SetConnected(true);
+
m_RecvQueue->Write(data, rc);
}
for (;;) {
char data[1024];
- int rc = SSL_read(m_SSL.get(), data, sizeof(data));
+ int rc;
+
+ if (IsConnected()) {
+ rc = SSL_read(m_SSL.get(), data, sizeof(data));
+ } else {
+ rc = SSL_do_handshake(m_SSL.get());
+ }
if (rc <= 0) {
switch (SSL_get_error(m_SSL.get(), rc)) {
}
}
- m_RecvQueue->Write(data, rc);
+ if (IsConnected())
+ m_RecvQueue->Write(data, rc);
+ else
+ SetConnected(true);
}
post_event:
size_t count;
for (;;) {
- count = m_SendQueue->GetAvailableBytes();
+ int rc;
- if (count == 0)
- break;
+ if (IsConnected()) {
+ count = m_SendQueue->GetAvailableBytes();
- if (count > sizeof(data))
- count = sizeof(data);
+ if (count == 0)
+ break;
- m_SendQueue->Peek(data, count);
+ if (count > sizeof(data))
+ count = sizeof(data);
- int rc = SSL_write(m_SSL.get(), (const char *)data, count);
+ m_SendQueue->Peek(data, count);
+
+ rc = SSL_write(m_SSL.get(), (const char *)data, count);
+ } else {
+ rc = SSL_do_handshake(m_SSL.get());
+ }
if (rc <= 0) {
switch (SSL_get_error(m_SSL.get(), rc)) {
}
}
- m_SendQueue->Read(NULL, rc);
+ if (IsConnected())
+ m_SendQueue->Read(NULL, rc);
+ else
+ SetConnected(true);
}
}