Утка, вводящая калек статическая проверка самого современного 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) потерял много волос, разыскивающих этого.
Я соглашаюсь с принятым ответом, нет никакого официального способа определить блокирующее состояние сокета в 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 */
}
Протесты: