Является ли функция выбора внутренним вызовом tcp connect? - PullRequest
0 голосов
/ 17 января 2011

Код Sinnpet:

int CreateaTCPSocket()
{
    int iSockID =  ACE_OS::socket(......);
    ACE_OS::set_flags(iSockID,O_NONBLOCK);
    ACE_OS::bind();
    if (ACE_OS::connect(iSockID ,....) < 0)
    {
        if (ACE_OS::select(.....,timeout) <= 0)
        {
            return INVALID_HANDLE;
        }
    }
    return iSockID;
}

Мой вопрос: когда не удается установить соединение из-за неблокированной ошибки, и вызывается select и говорят, что select return success, тогда снова нам нужно вызвать connect или выбрать функцию internal do connect?

Ответы [ 2 ]

3 голосов
/ 17 января 2011

Как для блокирующих, так и для неблокирующих сокетов, вам нужно всего лишь один раз вызвать connect().

Когда сокет неблокирующий и connect() возвращает EINPROGRESS, нужно дождаться, пока сокет не станетготов к записи, используя select().Когда select() сообщает, что сокет готов к записи, connect() может быть успешным или неудачным.

Чтобы проверить, успешно ли неблокирующая connect(), вы можете позвонить getsockopt(..., SOL_SOCKET, SO_ERROR, ...), которая сообщаетноль ошибок при сбое или вызов getpeername(), который выполняется только на подключенном сокете.

0 голосов
/ 17 января 2011

почему выбор вызова после сбоя подключения? Чего вы хотите добиться с этим? select уведомляет вызывающего абонента о любых действиях с ресурсами, указанными в качестве аргумента. Эти действия могут быть

  • ошибка (пример: сокет tcp: peer отключен)
  • данные доступны (блокировка чтения может быть выполнена без блокирование)
  • запись возможна (после последней записи не удалось с заполненным буфером)

Полагаю, в описанном вами сценарии select всегда будет возвращать EBADF (в некоторых известных мне операционных системах), поскольку дескриптор еще не открыт или уже закрыт.

НТН

Mario

...