![]() |
[Статья] WinSockets _C# или велосипед голыми руками
[ WinSockets _C# или велосипед голыми руками ]
[интро] Собственно в этой статье нет ничего нового , особенного ... Я даже не могу толком сказать , для кого эта статья ориентирована ... в первую очередь для новичков в C# ... Предворительно , читатель уже разбирается в win сокетах , например знает C++ , в C# недавно... Вот , представим читающий знает C++ и изучая C# хочет работать с советыми максимально 'близко'... Но думаю начинающему изучать c# будет полезно ... [абоут] В статье мы будем использовать Winsock , не подключая System.net.sockets , а напрямую из ws2_32.dll и wsock32.dll , импортируя необходимые нам функции ... Я опишу , возможные ошибки и трудности с типами пременных, которые могут возникнуть... [go] ну ладно , теперь уже приступим : Как я уже говорил , мы будем импортировать функции из библиотек... пожалуй приступим: (инклудим dll-импорт) using System.Runtime.InteropServices; Для начала нам понадобится WSAStartup ... Подключив System.Net.Sockets мы вообще можем не думать о инициализации ... имея заголоваочный файл winsock2.h , в C++ эта функция задается вот так: WSADATA wdata; WSAStartup(MAKEWORD(2,2), &wdata); Здесь нам прилется самим обьявить и заполнить struct wsadata: MSDN даёт нам вод такой пример : Код:
typedef struct WSAData {Код:
public struct WSA_Data{(см про явные и неявные преобразования в C#) В итоге , уточнив типы данных, приходим вот такому , наиболее точному коду : Код:
[StructLayout(LayoutKind.Sequential)]Теперь , имея свой WSA_Data импортируем саму функуцию: Код:
[DllImport("ws2_32.dll")]public const short WORD_VERSION = 36; Функцию мы подготовили ... Используем вот так: Код:
WSA_Data wsaData = new WSA_Data();WSAGetLastError обьявдяется так же как и в C++ ... Код:
[DllImport("ws2_32.dll", CharSet = CharSet.Auto, SetLastError = true)]Код:
if (WSAStartup(WORD_VERSION, wsaData) != 0)Далее перейдем к функции socket(); msdn описание: SOCKET WSAAPI socket( __in int af, __in int type, __in int protocol ); В случае успеха функция возвращает дискриптор нового сокета ... в С++ тип int почти универсален для функций ,в C# для дескриптора мы будем использовать специальный тип IntPtr. IntPtr – это platform-specific тип, который используется для представления указателей или дескрипторов... Код:
[DllImport("wsock32.dll")]Код:
public const int AF_INET = 2;Код:
IntPtr s = socket(AF_INET, SOCK_STREAM, PPROTO_TCP);Обьявим структуру sockaddr Код:
public struct sockaddrКод:
[DllImport("wsock32.dll")]для заполнения структуры нам понадобятся еще функции htons(преобразовывающая данные для их правильности при использовании WinSock) и inet_addr(для преобразования строки с IP-адресом в формате десятичное с точкой в 32-разрядное двоичное число (с сетевым порядком байтов)). Код:
[DllImport("ws2_32.dll")]Теперь же создадим и заполним эту структуру , в итоге (обобщив) получим небольшую функцию: Код:
public static bool AdvBind(string ipAddress, int port,IntPtr socketHandle)<не буду повторяться продолжая писать уже однообразный код к каждой йункции , хотя при освоении языка мне этот процесс показался довольно интересным и увлекательным> Дальше вам поможет Msdn , Гугл и собственное стремление ... [bonus] небольшая подсказка: Код:
[DllImport("wsock32.dll")]Я хотел описать все функции и впринципе можно было добавить их подробное описание , но посмотрев , скока я написал вначале , я решил остановиться на основных функциях...возможно , когда будет время и желание... Еще можно задуматься об актуальности данной статьи . Помог изобрести велосипед , можете сказать ... но это тоже полезно ... [bonus] Полезные ссылки по C# Код:
http://www.intuit.ru/department/pl/csharp/ |
А почему не работать с сокетами средствами .net?
Какое преимущество это дает? |
ты че это нехакерский способ. вот, скажем, придумать способ писать asm-вставки в .net - это для античатовцев настоящих.
|
| Время: 02:23 |