У меня есть функция подключения сокета, проблема в том, что если клиент запущен до сервера, соединение отображается как подключенное, но почему-то возвращается сбой. Я не уверен, где отказ и был бы очень признателен за любую помощь:Ошибка подключения Socket S ++
Функции:
bool IPV4Socket::Connect(std::string hostname
, unsigned short remotePort
, TimeoutValue *timeout)
{
AddrInfo getResults;
AddrInfo getaddrinfoHints;
int connReturn = 0;
SockAddr_In *addrData;
bool connectSuccess = false;
std::string service = std::to_string(remotePort);
getaddrinfoHints.ai_family = AddressFamily_inet;
getaddrinfoHints.ai_socktype = SockType_stream;
if (m_socketAdaptor->getaddrinfo(hostname
, service
, &getaddrinfoHints
, &getResults) != 0)
{
return false;
}
addrData = (SockAddr_In *)&(*getResults.ai_addr.begin());
connReturn = m_socketAdaptor->connect(m_socket
, (const Sockaddr *)addrData
, (int)getResults.ai_addrlen);
if (connReturn == SocketError)
{
int m_lastErrorCode = m_socketAdaptor->GetLastError();
// Connection error : FATAL
if ((m_lastErrorCode != SockErr_EWOULDBLOCK) &&
(m_lastErrorCode != SockErr_EALREADY))
{
connectSuccess = false;
}
else
{
SocketSet writeFDS;
SocketSet exceptFDS;
int selectReturn = 0;
// Clear all the socket FDS structures
SocketSet_ZERO(&writeFDS);
SocketSet_ZERO(&exceptFDS);
// Put the socket into the FDS structures
SocketSet_SET(m_socket, &writeFDS);
SocketSet_SET(m_socket, &exceptFDS);
selectReturn = m_socketAdaptor->select(-1
, NULL
, &writeFDS
, &exceptFDS
, timeout);
if (selectReturn == SocketError)
{
// Any errors are bad
connectSuccess = false;
}
else if (selectReturn > 0)
{
// Check for error (exception) first
if (m_socketAdaptor->SocketSet_ISSET(m_socket, &exceptFDS))
{
connectSuccess = false;
}
else if (m_socketAdaptor->SocketSet_ISSET(m_socket, &writeFDS))
{
// Select returned 'writable', we're connected!
connectSuccess = true;
m_isConnected = true;
}
}
}
}
else
{
connectSuccess = true;
m_isConnected = true;
}
return connectSuccess;
}
Я не уверен, если я пропускаю точку, или, если я слишком усложнил функцию.
Helllp :)
Примечания: * Кстати, m_socketAdaptor-> функции просто фантики. * Если вы запустите сервер, а затем клиент, он работает ...
Что показывает netstat, когда клиент работает до запуска сервера? –
@UmamaheshP с помощью 'netstat -a -p tcp 10' Получаю: TCP 127.0.0.1:51074 WINDEVSRV: 3490 SYN_SENT –
Это ожидаемое поведение. Отправка syn - это первый шаг ручного тряски TCP. Если сервер не прослушивает порт, соединение не будет выполнено. Клиент должен снова попробовать подключиться. –