В Win32 есть ли способ проверить, является ли сокет неблокирующим?

Утка, вводящая калек статическая проверка самого современного IDE, которая может указать на ошибки, как Вы вводите. Некоторые считают это преимуществом. Я хочу, чтобы IDE/компилятор сказал мне, что сделал глупый прием программиста как можно скорее.

Мой новый любимый аргумент против [1 111] утиный ввод прибывает из DTO проекта Grails:

class SimpleResults {
    def results
    def total
    def categories
}

, где results оказывается чем-то как Map<String, List<ComplexType>>, который может быть обнаружен только следующим след вызовов метода в различных классах, пока Вы не находите, где он был создан. Для оконечно любопытного, total сумма размеров List<ComplexType>, с и categories является размером Map

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

10
задан Daniel Stutzbach 30 March 2011 в 17:02
поделиться

1 ответ

Я соглашаюсь с принятым ответом, нет никакого официального способа определить блокирующее состояние сокета в Windows. В случае, если Вы получаете сокет от третьего лица (скажем, Вы - библиотека TLS, и Вы получаете сокет от верхнего уровня), Вы не можете решить, находится ли это в блокирующем состоянии или нет.

Несмотря на это у меня есть работа, неофициальное и ограниченное решение для проблемы, которая работает на меня в течение долгого времени.

я пытаюсь считать 0 байтов из сокета. В случае, если это - блокирующийся сокет, это возвратится 0, в случае, если это - неблокирование, это возвратится-1, и GetLastError равняется WSAEWOULDBLOCK.

int IsBlocking(SOCKET s)
{
    int r = 0;
    unsigned char b[1];
    r = recv(s, b, 0, 0);
    if (r == 0)
        return 1;
    else if (r == -1 && GetLastError() == WSAEWOULDBLOCK)
        return 0;
    return -1; /* In  case it is a connection socket (TCP) and it is not in connected state you will get here 10060 */
}

Протесты:

  • Работы с сокетами UDP
  • Работы с подключенными сокетами TCP
  • не работает с не связанными сокетами TCP
0
ответ дан 4 December 2019 в 00:20
поделиться
Другие вопросы по тегам:

Похожие вопросы: