1. C# / Говнокод #1695

    +127.7

    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
    61. 61
    62. 62
    63. 63
    64. 64
    65. 65
    66. 66
    ...
    
    // Импорт функций для работы с MailSlot
    [DllImport("kernel32.dll")]
    static extern int CreateMailslot(
    	string name,
    	int maxMessageSize,
    	int readTimeout,
    	int securityAttributes);
    [DllImport("kernel32.dll")]
    static extern int GetMailslotInfo(
    	int hFile,			// mailslot handle
    	int maxMsgSize,		// maximum message size
    	int* lpcbMessage,	// size of next message
    	int* lpcMessage,	// number of messages
    	int timeout);		// read time-out
    [DllImport("kernel32.dll")]
    static extern int ReadFile(
    	int hFile,
    	void* lpBuffer,
    	int nNumberOfBytesToRead,
    	int* lpNumberOfBytesRead,
    	int overlapped);
    
    ...
    
    // Чтение входящего пакета
    private void readMessage(int cbMessage)
    {
    	int bytesReaden, fResult;
    	byte[] buf = new byte [102400];
    
    	fixed (byte* data = buf)
    	{
    		fResult = ReadFile(
    			handleServer,
    			data,
    			cbMessage,
    			&bytesReaden,
    			0);
    	}
    
    	if (fResult == 0)
    	{
    		textBox_chat.AppendText("--< Невозможно прочесть данные >--\n");
    		return;
    	}
    
    	string str = "";
    	MsgType type = (MsgType)'e';
    	if (buf.Length > 0)
    	{
    		type = (MsgType)buf[0];
    		for (int i = 0; i < bytesReaden; i++)
    			str += BitConverter.ToChar(buf,i*2);
    		//str = buf.ToString();
    		str = str.Remove(0, 1);
    	}
    
    	switch (type)
    	{
    		...
    	}		
    }
    
    ...

    Учебная задача: чат на MailSlot.
    Битва с шарпом за указатели, за массивы и т.д.

    Запостил: k06a, 26 Августа 2009

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

    • Почему "битва"? Вряд ли можно было лучше реализовать указатели в виртуально-машинном языке. В джаве, например, их нет вообще.
      Ответить
      • Вообще-то для этого есть маршалинг. А использовать unsafe код это моветон. int* заменяется на out int, память выделяется с помощью Marshal.
        Ответить
        • Это моя первая и надеюсь последняя прога на шарпе.
          Я думал, писать под виртуальную машину означает,
          что машина эта существует более чем под одну ось . . .
          Ответить
          • Печальный язык...
            Ответить
          • Этот язык не для вас, попробуйте что-нибудь полегче, типа пхп.
            P.S. Код действительно бред.
            Ответить
          • Ребята нахуй вы к kernel32.dll лезете из шарпа????
            он не для этого придуман :)))
            Ответить
            • Задача была в трех вариантах: чат на сокетах, пайпах и майлслотах. Само задание - извращенство. Другого способа добраться до майлслотов просто нет. Это уже пятая моя прога была)) Три на кутэ и одна мцв.
              Ответить
              • Как это нет другого способа, с плюсов отлично можно с ними работать:

                void Server::Create(AnsiString ServerName)
                {
                String str="\\\\.\\Mailslot\\"+ServerName;
                if ((server = CreateMailslot(str.c_str(), 0,MAILSLOT_WAIT_FOREVER, NULL)) == INVALID_HANDLE_VALUE)
                {error.SetError("Ошибка при создании ящика");return;}
                return;
                }
                Ответить
                • У меня были проблемы с тем, что большая часть функций просит указатель на область памяти, куда она сама скопирует данные. А в шарпе с этим явно траблы . . .
                  Ответить
                  • А IntPtr зачем придуман?.
                    Поищите, кажется на хабре был курс статей по правильному инвоку различных методов, приведение типов и прочему взаимодействию с системными библиотеками, и сайт pinvoke точка net вам в помощь
                    Ответить
    • Друзья, C# не виртуально машинный язык.
      Ответить
      • Именно виртуально-машинный.
        Ответить
      • Да. Это виртуальный язык... Его не существует... Он только в памяти моей... Сколько дней я провёл у психолога, что-бы его забыть...
        Ответить

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