1. Си / Говнокод #23272

    +1

    1. 01
    2. 02
    3. 03
    4. 04
    5. 05
    6. 06
    7. 07
    8. 08
    9. 09
    10. 10
    11. 11
    12. 12
    13. 13
    14. 14
    15. 15
    16. 16
    17. 17
    18. 18
    19. 19
    20. 20
    21. 21
    22. 22
    23. 23
    24. 24
    // GetBlockingMode возвращает: 1 - nonblocking | 0 - blocking | -1 - error | -2 - timeout reseted!
    
    int GetBlockingMode(int Sock)
    {
    	int iSize, iValOld, iValNew, retgso;
    	iSize = sizeof(iValOld);
    	retgso = getsockopt(Sock, SOL_SOCKET, SO_RCVTIMEO, (char *)&iValOld, &iSize); // Save current timeout value
    	if (retgso == SOCKET_ERROR) return (-1);
    	iValNew = 1;
    	retgso = setsockopt(Sock, SOL_SOCKET, SO_RCVTIMEO, (char *)&iValNew, iSize); // Set new timeout to 1 ms
    	if (retgso == SOCKET_ERROR) return (-1);
    	
    	// Ok! Try read 0 bytes.
    	char buf[1]; // 1 - why not :)
    	int retrcv = recv(Sock, buf, 0, MSG_OOB); // try read MSG_OOB
    	int werr = WSAGetLastError();
    	
    	retgso = setsockopt(Sock, SOL_SOCKET, SO_RCVTIMEO, (char *)&iValOld, iSize); // Set timeout to initial value
    	if (retgso == SOCKET_ERROR) return (-2);
    
    	if (werr == WSAENOTCONN) return (-1);
    	if (werr == WSAEWOULDBLOCK) return 1;
    	return 0;
    }

    Запостил: cykablyad, 17 Августа 2017

    Комментарии (11) RSS

    • # int iSize
      # iSize = sizeof(iValOld);
      Ответить
    • типа "угадай: это из какой операционки?" чтоли?
      Ответить
      • Скорее, для какой
        Мопед не мой
        Ответить
      • int werr = WSAGetLastError();


        А разве есть варианты?
        Ответить
        • Надо было ставить MSDOS
          Ответить
          • Чтобы этот код не запустился?
            Ответить
            • Что тебе мешает дополнить MSDOS WinAPI?
              Ответить
              • Пожалуй, только лень. Вообще отдельные функции WinAPI реализованы в расширителях DOS (Borland 32RTM, Pharlap DOS Extender, WDOSX, HX DOS Extender). В HX DOS Extender даже FAR запускается.

                Остаётся взять исходники Winsockets из WINE или из ReactOS и допилить...
                Ответить
    • > int Sock
      Отличная идея, надо тоже носки пронумеровать.
      Ответить
      • > носки пронумеровать
        Имхо, множество носков достаточно разбить на классы эквивалентности.
        Ответить
        • Зачем? Ведь левый носок всегда можно надеть на правую ногу. Вот ботинки придётся разбить на классы.
          Ответить

    Добавить комментарий