Я использую select (), чтобы выяснить, когда неблокирующее соединение либо подключается, либо подключается, либо не удается подключиться;использование TCP-сокетов в Linux.Мои фактические TCP-соединения подключаются и работают правильно, это просто для определения их статуса.
Странно то, что мой код всегда сначала дает мне то, что я считаю CONNECTIONFAILED .. после cout (любой cout) следующий вызов select () дает мне то, что я считаю CONNECTED .Независимо от того, подключается ли сокет, не имеет значения.
Я проверил, что я использую хорошо выглядящий сокет (в данном случае его int id равен 3, и, как я уже сказал, он отлично работает с реальнымсоединения проверены путем подключения к прослушивающей сети)
Мой код верхнего уровня
while(1)
{
state = networking.connectionStatus(socketId);
.. [cout would go here or not, as described above]
if(state == CONNECTED) { // connected! }
else .. // connecting, or connection failed code
}
Мой код выбора, работающий на этом неблокирующем сокете, который передается в connectionStatus
myStateType connectionStatus(int socket)
{
struct timeval tv;
tv.tv_sec = 0; tv.tv_usec = 0; // no timeout, immediately return from select()
fd_set ourFdSet;
FD_ZERO(&ourFdSet); // zero the set
FD_SET(socket, &ourFdSet); // put our socket in to this set
// Switch to figure out if we can write to our fd yet
switch(select(socket + 1, NULL, &ourFdSet, NULL, &tv))
{
case -1: // connection failed, actual error from select()
return CONNECTIONFAILED;
break;
case 0: // no fds ready to write, still connecting?? can someone verify this is true
return CONNECTING;
break;
case 1: // now we have 1 fd ready to write, but look closer..
// Examine our socket at the socket level for errors.. if < 0 then getsockopt fail
if(getsockopt(socket, SOL_SOCKET, SO_ERROR, &error, &len) < 0)
return CONNECTIONFAILED;
if(error == 0) return CONNECTED;
if(error == EINPROGRESS) return CONNECTING;
// otherwise, failure.. (a real error)
return CONNECTIONFAILED;
.. end of function ..
Так что же может происходить, когда здесь играет кут?И все ли на правильном пути?Все справочные страницы и источники в Интернете, похоже, согласны ..