1. C++ / Говнокод #5065

    +161

    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
    // If iMode!=0, non-blocking mode is enabled.
    	u_long iMode=1;
    	ioctlsocket(Socket,FIONBIO,&iMode);
    	
    	// Main loop
    	for(;;)
    	{
    		// Display message from server
    		char buffer[1000];
    		memset(buffer,0,999);
    		int inDataLength=recv(Socket,buffer,1000,0);
    		std::cout<<buffer;
    		
    		int nError=WSAGetLastError();
    		if(nError!=WSAEWOULDBLOCK&&nError!=0)
    		{
    			std::cout<<"Winsock error code: "<<nError<<"\r\n";
    			std::cout<<"Server disconnected!\r\n";
    			// Shutdown our socket
    			shutdown(Socket,SD_SEND);
    
    			// Close our socket entirely
    			closesocket(Socket);
    
    			break;
    		}
    		Sleep(1000);
    	}

    http://www.win32developer.com/tutorial/winsock/winsock_tutorial_3.shtm
    Вот как нада работать с сокетами... (строка 27).

    Запостил: fddpro, 26 Декабря 2010

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

    • Мне больше нравится 12 строка, при определённых условиях ;)
      Ответить
      • 12 строка - вывод указателя?
        Ответить
        • buffer может быть не null-terminated
          Ответить
        • Вывод строки. Только вот явный конец строки (\0) может быть очееень далеко за 1000 байт. В 10ой строке не понятно почему на байт меньше.
          P.S. пока писал коммент - опередили :)
          Ответить
    • так использовать for -- некошерно, тем более в хануку
      Ответить
      • while(1) кошернее?
        А вообще по-хорошему do... while с условием, а аппендикс переместить за цикл и break не нужен.
        Ответить
        • конечно, for (;;) -- три пустых оператора
          Ответить
          • По-моему, это дело вкуса for(;;) или while(1). Может кто-то смотрел во что они вырождаются в асме?
            Ответить
            • На разных компиляторах по разному. Обычно без разницы, что использовать.
              Ваш КО.

              Разве, что, в одном компиляторе while(1) у меня выдавало предупреждение, поэтому лучше while(true) (оно не выдавало), но это слишком длинно, поэтому лучше for (;;).
              Ответить
              • фу, экономить нажатия клавиш, сишники такие сишники
                Ответить
                • А вам больше нравится
                  while true do
                  begin
                  end;
                  взамен
                  for(;;){}
                  ?

                  Да я, написав это, успею после работы в Крайзис поиграть ещё...
                  Ответить
                  • ну, если религия не позволяет сделать шаблончик... :-)
                    Ответить
                    • Можно на него взглянуть, если тело цикла будет не пустое в паскале?
                      Ответить
                      • ОСТОРОЖНО куча XML!
                        <?xml version="1.0" encoding="utf-8" ?>
                        
                        <codetemplate	xmlns="http://schemas.borland.com/Delphi/2005/codetemplates"
                        				version="1.0.0">
                        	<template name="whileb" surround="true" invoke="manual">
                        		<point name="expr">
                        			<script language="Delphi">
                        				InvokeCodeCompletion;
                        			</script>
                        			<text>
                        				True
                        			</text>
                        			<hint>
                        				loop condition
                        			</hint>
                        		</point>
                        		<description>
                        			while statement
                        		</description>
                        		<author>
                        			Embarcadero
                        		</author>
                        		<code language="Delphi" context="methodbody" delimiter="|"><![CDATA[while |expr| do
                        begin
                        |selected||*||end|
                        end;
                        ]]>
                        		</code>
                        	</template>
                        </codetemplate>
                        		</code>

                        особо ленивые могут добавить обвеса до forобразного цикла
                        Ответить
                        • Был ещё древний редактор Multiedit, позволяющий втыкать циклы одним клавиатурным аккордом, но это к самому языку уже не относится.
                          Ответить
                          • я примерно о том же, щас никто уже не пишет в примитивных редакторах, так что экономить кейстроки -- не аргумент
                            Ответить
                            • Ну некоторые же пишут всё в одном файле, чтобы на кластерах сэкономить. Вдруг им нескольких байт не хватит, чтобы исходник влез в кластер? Поэтому {...} выгоднее begin...end.
                              Ответить
                        • Может я отстал от жизни, но как это применять?
                          Ответить
                  • repeat
                    ...
                    until false;
                    PROFIT
                    Ответить
            • Правильно так:

              #define EVER ;;


              а потом

              for (EVER) {
              ...
              Ответить
              • Ага. А потом:
                #define FOREVER for(EVER)

                И:
                FOREVER
                {
                   ...
                };
                )))
                Ответить
                • ага ... а потом дойдет до программирования на дефайнах:
                  #define PROGRAM int main( ) { ...; return 0; }
                  Ответить
    • > Вот как нада работать с сокетами... (строка 27).

      Сочувствую и понимаю вашу боль. У меня в одном модуле нечто подобное написано финнской коллегой. Сначала везде тыркают non-blocking mode - потому что пара крутых консультантов им сказала что это оч круто - а потом пишут нечто подобное потому что на самом деле в коде нужно MSG_WAITALL.

      ЗЫ мне тот memset() больше нравится.
      Ответить
    • Я вызываю кучи говн!
      Ответить

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