removed loop accept and connect and added more debug info #4313

This commit is contained in:
XinyuHou 2015-01-29 15:40:30 +00:00
parent d15c99f41d
commit 767802f111
3 changed files with 41 additions and 27 deletions

View File

@ -59,6 +59,8 @@ SecureSocket::SecureSocket(
SecureSocket::~SecureSocket()
{
SSL_shutdown(m_ssl->m_ssl);
if (m_ssl->m_ssl != NULL) {
SSL_free(m_ssl->m_ssl);
m_ssl->m_ssl = NULL;
@ -72,6 +74,14 @@ SecureSocket::~SecureSocket()
delete[] m_error;
}
void
SecureSocket::close()
{
SSL_shutdown(m_ssl->m_ssl);
TCPSocket::close();
}
void
SecureSocket::secureConnect()
{
@ -210,14 +220,6 @@ SecureSocket::secureAccept(int socket)
int r = SSL_accept(m_ssl->m_ssl);
bool retry = checkResult(r);
//TODO: don't use this infinite loop
while (retry) {
ARCH->sleep(.5f);
SSL_set_fd(m_ssl->m_ssl, socket);
r = SSL_accept(m_ssl->m_ssl);
retry = checkResult(r);
}
m_secureReady = !retry;
return retry;
}
@ -234,17 +236,12 @@ SecureSocket::secureConnect(int socket)
int r = SSL_connect(m_ssl->m_ssl);
bool retry = checkResult(r);
//TODO: don't use this infinite loop
while (retry) {
ARCH->sleep(.5f);
r = SSL_connect(m_ssl->m_ssl);
retry = checkResult(r);
m_secureReady = !retry;
if (m_secureReady) {
showCertificate();
}
m_secureReady= true;
showCertificate();
m_secureReady = !retry;
return retry;
}
@ -276,6 +273,12 @@ SecureSocket::checkResult(int n)
switch (errorCode) {
case SSL_ERROR_NONE:
// the TLS/SSL I/O operation completed
break;
case SSL_ERROR_ZERO_RETURN:
// the TLS/SSL connection has been closed
LOG((CLOG_DEBUG2 "SSL_ERROR_ZERO_RETURN"));
break;
case SSL_ERROR_WANT_READ:
@ -299,15 +302,18 @@ SecureSocket::checkResult(int n)
break;
case SSL_ERROR_SYSCALL:
// some I/O error occurred
throwError("Secure socket syscall error");
break;
case SSL_ERROR_SSL:
throwError("Secure socket error");
// a failure in the SSL library occurred
LOG((CLOG_DEBUG2 "SSL_ERROR_SSL"));
throwError("Secure socket SSL error");
break;
default:
// possible cases:
// SSL_ERROR_WANT_X509_LOOKUP, SSL_ERROR_ZERO_RETURN
// SSL_ERROR_WANT_X509_LOOKUP
showError();
}
@ -326,7 +332,7 @@ void
SecureSocket::throwError(const char* reason)
{
if (getError()) {
throw XSecureSocket(synergy::string::sprintf(
throw XSocket(synergy::string::sprintf(
"%s: %s", reason, m_error));
}
}
@ -342,7 +348,7 @@ SecureSocket::getError()
errorUpdated = true;
}
else {
LOG((CLOG_DEBUG "can not detect any error in secure socket"));
LOG((CLOG_DEBUG2 "can not detect any error in secure socket"));
}
return errorUpdated;
@ -376,5 +382,6 @@ SecureSocket::serviceAccept(ISocketMultiplexerJob* job,
#elif SYSAPI_UNIX
retry = secureAccept(getSocket()->m_fd);
#endif
return retry ? job : newJob();
}

View File

@ -18,7 +18,7 @@
#pragma once
#include "net/TCPSocket.h"
#include "base/XBase.h"
#include "net/XSocket.h"
class IEventQueue;
class SocketMultiplexer;
@ -26,10 +26,6 @@ class ISocketMultiplexerJob;
struct Ssl;
//! Generic socket exception
XBASE_SUBCLASS(XSecureSocket, XBase);
//! Secure socket
/*!
A secure socket using SSL.
@ -42,8 +38,12 @@ public:
ArchSocket socket);
~SecureSocket();
// ISocket overrides
void close();
void secureConnect();
void secureAccept();
bool isReady() const { return m_secureReady; }
bool isSecureReady();
bool isSecure() { return true; }
UInt32 secureRead(void* buffer, UInt32 n);

View File

@ -137,7 +137,8 @@ void
ClientListener::handleClientConnecting(const Event&, void*)
{
// accept client connection
synergy::IStream* stream = m_listen->accept();
IDataSocket* socket = m_listen->accept();
synergy::IStream* stream = socket;
if (stream == NULL) {
return;
@ -157,6 +158,12 @@ ClientListener::handleClientConnecting(const Event&, void*)
assert(m_server != NULL);
if (m_useSecureNetwork) {
while(!socket->isReady()) {
ARCH->sleep(.5f);
}
}
// create proxy for unknown client
ClientProxyUnknown* client = new ClientProxyUnknown(stream, 30.0, m_server, m_events);
m_newClients.insert(client);