Си диез / Говнокод #1695 Ссылка на оригинал

0

  1. 1
  2. 2
  3. 3
  4. 4
  5. 5
  6. 6
  7. 7
  8. 8
  9. 9
  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 k06a, (Updated )

Комментарии (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++, guest?!

    А не использовать ли нам bbcode?


    8