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

    +123

    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
    25. 25
    26. 26
    27. 27
    28. 28
    29. 29
    30. 30
    31. 31
    32. 32
    33. 33
    34. 34
    35. 35
    36. 36
    37. 37
    38. 38
    39. 39
    40. 40
    41. 41
    42. 42
    43. 43
    44. 44
    45. 45
    46. 46
    47. 47
    48. 48
    49. 49
    50. 50
    51. 51
    52. 52
    53. 53
    54. 54
    55. 55
    56. 56
    57. 57
    58. 58
    59. 59
    60. 60
    int closeestsockptr( SOCKET* pSocket )
    {
    	char chBuf[ 100 ];
    	fd_set rdevents, exevents;
    	struct timeval tv;
    	int iRetVal = 1;
    	int optlen;
    	SOCKET s = INVALID_SOCKET;
    	BOOL bLinger;
    	LINGER lng;
    	if( NULL == pSocket || INVALID_SOCKET == *pSocket )
    		return SOCKET_ERROR;
    	s = *pSocket;
    	optlen = sizeof( bLinger );
    	iRetVal = getsockopt( s, SOL_SOCKET, SO_DONTLINGER, ( char* )&bLinger, &optlen );
    	if( 0 == iRetVal && TRUE == bLinger ) //linger is off
    	{
    		lng.l_onoff = 1; //set linger on
    		lng.l_linger = 1; //set linger timeout to 1 second
    		iRetVal = setsockopt( s, SOL_SOCKET, SO_LINGER, ( char* )&lng, sizeof( lng ) );
    		if( 0 == iRetVal )
    		{
    			if( 0 == shutdown( s, SD_SEND ) )
    			{
    				tv.tv_sec = 3; //seconds
    				tv.tv_usec = 0; //microseconds
    				while( 1 )
    				{
    					FD_ZERO( &rdevents );
    					FD_ZERO( &exevents );
    					addsock2fd( &rdevents, NULL, &exevents, s ); //FD_SET( s, &rdevents ), FD_SET( s, &exevents );
    					iRetVal = select( 1, &rdevents, NULL, &exevents, &tv );
    					if( SOCKET_ERROR != iRetVal && 0 != iRetVal && FD_ISSET ( s, &rdevents ) && !FD_ISSET ( s, &exevents ) )
    					{
    						iRetVal = recv( s, chBuf, sizeof( chBuf ) / sizeof( *chBuf ), 0 );
    						if( iRetVal > 0 ) //Some data received
    							continue;
    						if( 0 == iRetVal ) //Receive FD_CLOSE
    							break;
    						else //SOCKET_ERROR returned
    							break;
    					}
    					else if( 0 == iRetVal ) //exceeded the timeout
    					{
    						WSASetLastError( WSAETIMEDOUT );
    						break;
    					}
    					else //SOCKET_ERROR returned
    						break;
    				}
    			}
    		}
    	}
    
    	if( NULL == pSocket || INVALID_SOCKET == *pSocket )
    		return SOCKET_ERROR;
    	iRetVal = closesocket( *pSocket );
    	*pSocket = INVALID_SOCKET;
    	return iRetVal;
    }

    Пуресишник наваял

    Запостил: sokol, 29 Августа 2012

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

    • Ну я вот здесь (как пуресишник) почти не вижу говн:
      1) В строках 55-56 бесполезная проверка, уже проделанная выше в строках 11-12, pSocket с тех пор измениться не должен.
      2) sizeof( chBuf ) / sizeof( *chBuf ) в строке 35. recv в третьем параметре принимает число байт, а не символов, поэтому следует использовать просто sizeof(chBuf).
      3) В строке 33 мутноватое условие, не соответствующее комментарию в 48й.
      4) Сомнительна необходимость WSASetLastError(WSAETIMEDOUT) в 45й строке.
      5) Стоило бы вернуть сокет в блокирующий режим перед вызовом closesocket или же отключить SO_LINGER:
      Enabling the SO_LINGER socket option with a nonzero time-out interval on a socket with its non-blocking mode enabled is not recommended. In this case, the call to the closesocket function will fail, and the WSAGetLastError function will return WSAEWOULDBLOCK if the close operation cannot be completed immediately. However the socket handle is still valid, and a disconnect is not initiated. Your program must call the closesocket function again to close the socket.

      Если же вы считаете, что сама логика закрыть выходной канал, дочитать все что придет, закрыть сокет не имеет права на жизнь - вы ошибаетесь:
      http://docstore.mik.ua/apache/manual/misc/fin_wait_2.html
      The solution in all cases is to send the response, close only the write half of the connection (what shutdown is supposed to do), and continue reading on the socket until it is either closed by the client (signifying it has finally read the response) or a timeout occurs.
      Ответить
      • >Ну я вот здесь (как пуресишник
        Мне кажется или большинство любителей разнообразных языков - работают сишниками++ или пуританскими сишниками? В этом есть какаято закономерность.
        Ответить
        • > В этом есть какаято закономерность.
          Есть. Те кто начал с уютненьких языков (вроде C#) за всю свою карьеру могут ни разу и не задуматься о том, что существуют и другие языки с другими концепциями. А начавший с Си невольно заинтересуется и другими языками...
          Ответить
          • >Те кто начал с уютненьких языков (вроде C#)
            Истинно. Они дальше вендоплатформы и VB никуда не смотрят.
            Ответить
            • Я живу активной жизнью, я изучаю каждый раз новый язык два раза в день. У меня нет времени, чтобы... продолжи сам
              Ответить
            • >Они дальше вендоплатформы и VB никуда не смотрят.
              Но есть же Mono
              Ответить
              • >Но есть же Mono
                A там есть Parallel LINQ?
                Ответить
                • Mono trunk as of June 22nd has that code on SVN, hopefully you can try it and help us by taking it out for a spin and filing bug reports.

                  Кстати не удержался - LINQ-рейтрейсинг.
                  http://tirania.org/blog/archive/2008/Jul-26-1.html
                  Ответить
      • >почти не вижу говн:
        1)2)3) ... N-1)N)
        Ответить
        • Позвать других?
          Ответить
        • Ну на такую огромную портянку концентрация слабовата, да и только одно из них можно назвать критическим...

          Ну и автор не привел свое мнение, что же именно он считает говнокодом. Было бы интересно его услышать.
          Ответить
    • Есть еще одна неприятная тенденция на ГК. Короткие петросянства в духе "обобнено бобами" народ с радостью комментирует и плюсует. А длинные портянки, в духе первого коммента в данном треде, никто не хочет ни плюсовать ни минусовать, ни опровергать, и видимо даже читать...
      Ответить
      • tl;dr

        Всегда Ваш, обобреный бобёр.
        Ответить
      • Если не всегда понятно, что пишут более опытные КГ'вцы, то обсуждать собственно нечего. По крайней мере, у меня так.
        Ответить
      • Обычно вы в таких тредах противостоите с @defecate-plusplus, а мы, запасшись попкорном читаем, гуглим, и пытаемся понять и намотать на ус. С каждой из перечисленных стадий (читаем, гуглим...) понимания остаётся всё меньше и меньше, но мы не сдаёмся. Когда я вырасту я тоже буду таким, как дядя @bormand с говнокодика.
        Ответить
      • Я выставляю оценку рандомом из множества [+, -, пох].
        Ответить
    • В общем и целом архитектуроособенности мышления.
      Ответить
    • Ох, сокеты... Х_Х Работать с ними правильно это еще та морока. К тому же требующая вдумчивого курения манулов...
      Ответить
      • Да, согласен. Работа с сокетами это целая наука.

        В свое время словил багофичу с алгоритмом Nagle. По глупости не буферизовывал пакет целиком, а отправлял первым write'ом длину, потом вторым write'ом контент, а затем ждал ответа. Как оно лагало... По реакции терминала казалось что он подключен через GPRS а не по локалке...

        Вот статейка про данную проблему, если кому интересно:
        http://www.stuartcheshire.org/papers/NagleDelayedAck/
        Ответить
    • @sokol, мы с нетерпением ждем ваших комментариев о том, какие именно говнокоды по-вашему таятся в этом тексте. Может быть я что-то упустил в своем комментарии выше.
      Ответить
      • sokol:
        - ко ко ко. Петусишник наваял. ко ко ко

        Govno:
        - Таки зря вы это запостили на говнокод. Я тоже govno не вижу. А я своих за версту чую. Даже комментарии есть. Названия некоторых переменных только смущают и функция длинновата, но не более.
        Ответить
      • Если совсем не к чему доебаться - помни правило:
        "Любой код, длиннее 50 строк - говно"
        Ответить
        • > "Любой код, длиннее 50 строк - говно"
          Особенно если это одна функция...
          Ответить
        • давайте уберем лишние \r\n и код станет красивым и однострочным
          Ответить
          • "Любой код, со строками длиннее 100 символов - говно"
            Ответить
            • В любой кодировке?
              Ответить
              • "Любой код, использующий юникод в идентификаторах - говно"

                P.S. И вообще "любой код - говно"
                Ответить
                • Нет кода - нет говна.
                  Ответить
                  • Нет кода без говна.
                    Ответить
                  • Так это ж очень старое правило:
                    Чем полезней код/язык, тем больше в нем говна.
                    Вывод: только СОВЕРШЕННО бесполезный код/язык не содержат говна.
                    Ответить
                    • Угу. Причем от говна нельзя избавиться. Максимум что можно сделать - инкапсулировать его куда-нибудь, чтобы не всплывало.
                      Ответить
                      • Макконнелл тоже об этом писал: если есть трэш-код, который просто невозможно написать нормально в силу несовершенства реального мира, инкапсулируй его в красивое апи.
                        Ответить
                        • Который просто пока что невозможно написать нормально...
                          Я не знаю, как именно сказал С. Макконелл, но имхо я не ошибся, поправив.
                          Это в "Совершенном коде"?
                          Ответить
                          • Да, в "Code Complete". К сожалению, я не помню дословно. Помню картинку с фигурами с неровными краями, обёрнутыми в прямоугольники... Там имелась в виду какая-то "некрасивая" часть системы, которую по каким-то причинам нет возможности исправить.
                            Ответить
                            • Пойду поем почитаю.
                              Предвижу поедающих меня олдфагов со словами "Ха-ха-ха ньюфажина, Макконелла не читал!"
                              Ответить
      • Вам и без меня уютненько

        cheers
        Ответить

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