Go to most recent revision | Details | Last modification | View Log | RSS feed
Rev | Author | Line No. | Line |
---|---|---|---|
1737 | clevermous | 1 | Что осуществлено |
2 | ================== |
||
3 | |||
4 | Следующие особенности присутствуют в коде TCP/IP стека: |
||
5 | |||
6 | |||
7 | Уровень IP. |
||
8 | ICMP. |
||
9 | Уровень TCP. |
||
10 | Уровень UDP. |
||
11 | Локальный возврат цикла. |
||
12 | Realtek 8029 интерфейсов сети стандарта Ethernet PCI. |
||
13 | Realtek 8139 интерфейсов сети стандарта Ethernet PCI. |
||
14 | Intel i8255x PCI интерфейс сети стандарта Ethernet. |
||
15 | Динамическая таблица протокола определения адресов. |
||
16 | Point-to-point протокол(PPP) |
||
17 | |||
18 | И следующие Интернет программы: |
||
19 | |||
20 | HTTP сервер |
||
21 | POP клиент |
||
22 | Telnet |
||
23 | DNS Name resolver |
||
24 | Mp3 сервер |
||
25 | TFTP клиент |
||
26 | IRC клиент |
||
27 | FTP клиент |
||
28 | PPP - звонилка |
||
29 | |||
30 | Есть ряд экспериментальных приложений для проигрывания потоковой музыки и |
||
31 | выполнения взаимодействия процессов через сокеты. Также есть простенький |
||
32 | браузер, позволяющий лазить по всемирной паутине(WWW). |
||
33 | |||
34 | |||
35 | Что не осуществлено |
||
36 | =================== |
||
37 | |||
38 | Уровень IP не обрабатывает опции заголовка. |
||
39 | Уровень IP не поддерживает маршрутизацию. |
||
40 | Фрагментация пакета не поддерживается. |
||
41 | |||
42 | |||
43 | Конфигурация PPP в Колибри |
||
44 | =========================== |
||
45 | |||
46 | Смотрите ppp.txt(или ppp_rus.txt с русским переводом) |
||
47 | |||
48 | |||
49 | Как сконфигурировать Колибри для локальной сети |
||
50 | ============================================== |
||
51 | |||
52 | Для начала у вас должна быть сетевая карта стандарта Ethernet или, если её нет, |
||
53 | встроенную в вашу системную плату. Если вы, не знаете, есть ли у вас сетевая |
||
54 | карта, то пробуйте сконфигурировать стек. Если она есть и поддерживается, то |
||
55 | сможете использовать её. |
||
56 | |||
57 | Установка таблицы протокола определения адресов |
||
58 | ----------------------------------------------- |
||
59 | |||
60 | Таблица протокола определения адресов в Колибри уже динамически создана и |
||
61 | сконфигурированна. Вы можете посмотреть, с какими компьютерами Колибри работает, |
||
62 | выполнив приложение ARPSTAT. |
||
63 | |||
64 | Подключение к локальной сети |
||
65 | --------------------------- |
||
66 | |||
67 | Загрузите Колибри, затем выберите STACKCFG(конфигурация стека) в меню NET(сеть). |
||
68 | |||
69 | Нажмите Кнопку 'Чтения', затем выберите 'Драйвер Пакета'. |
||
70 | Нажмите "Change"(выбор) рядом с адресом IP, и введите нужный IP, который вы |
||
71 | хотите использовать. Удостоверьтесь, что он находится в той же самой подсети, |
||
72 | что и сама локальная сеть, к которой вы подключены. Нажмите "Apply"(применить) |
||
73 | для подтверждения изменений. |
||
74 | Закройте программу. |
||
75 | |||
76 | Стек сконфигурирован и запущен. Вы можете проверить его работу, пропинговав |
||
77 | Колибри с удаленного компьютера. |
||
78 | |||
79 | Самый простой способ подключить два PC вместе - это использовать нулевое |
||
80 | модемное соединение. Это обычное соединение компьютеров посредством кабеля. Они |
||
81 | могут быть куплены вместе с памятью или просто сделаны. Подробности можно найти |
||
82 | в Интернете. Ищите на поисковиках, (например www.gogle.ru) введя в строку |
||
83 | поиска: 'организация соединения компьютеров с помощью кабеля' или подобные. |
||
84 | |||
85 | Как использовать TCP/IP без подключения к сети |
||
86 | ============================================= |
||
87 | |||
88 | Колибри поддерживает форму локального возврата цикла, а это значит, что |
||
89 | приложения на одном и том же самом PC могут общаться друг с другом через |
||
90 | сокеты, как если бы они находились на удалённых компьютерах. Чтобы соединяться |
||
91 | с приложением на локальной машине, определите локальный адрес IP как адрес |
||
92 | назначения. Вы даже не должны конфигурировать стек для сети стандарта Ethernet, |
||
93 | локальный возврат цикла будет работать без любых сетевых, аппаратных средств. |
||
94 | Хорошо подходит для проверки и отладки сетевых приложений. |
||
95 | |||
96 | Прикладной программный интерфейс |
||
97 | ================================ |
||
98 | |||
99 | Разработчик может обратиться к стеку через прерывание 0x40, функции 53. Файл |
||
100 | TFTPC.ASM - хороший пример того, как можно использовать программный интерфейс |
||
101 | (по крайней мере, для UDP), но как сетевая коммуникация, довольно сложен. Я дам |
||
102 | краткий обзор. |
||
103 | |||
104 | Сокеты |
||
105 | ======= |
||
106 | |||
107 | Приложения соединяются друг с другом и передают информацию между собой через |
||
108 | механизм, названный 'сокетом'. Сокеты - оконечные точки для коммуникации. Для |
||
109 | каждого нужного сетевого приложения должен быть открыт хотя бы один сокет. |
||
110 | |||
111 | Использование сокетов немного походит на использования файлов в ОС. Вы |
||
112 | открываете, читаете и пишете в них, затем закрываете. Единственная вещь, |
||
113 | которая делает жизнь немного более сложной - это то, что в отличие от работы с |
||
114 | файлами, у вас появится трудности с работой сокетов (например, не захочет |
||
115 | закрываться) |
||
116 | |||
117 | Познакомимся с терминологией прежде, чем мы пойдём дальше. |
||
118 | |||
119 | *Сокет Уникальный идентификатор, используемый приложением для |
||
120 | коммуникации. |
||
121 | |||
122 | *Локальный порт Число, которое идентифицирует нужное приложение на |
||
123 | локальном компьютере. Порты - способ, позволяющих множествам приложений |
||
124 | общаться с другими компьютерами, благодаря чему нет путаницы в передаваемых |
||
125 | данных (Техническое определение 'мультиплексные'). Число порта - 16 бит. |
||
126 | |||
127 | *Удалённый порт Число, которое идентифицирует приложение на удалённом |
||
128 | компьютере, к которому мы обращаемся. На удалённом компьютере - это 'локальный |
||
129 | порт'. Число порта - 16 бит. |
||
130 | |||
131 | *Адрес IP Это 32 битное число, которое идентифицирует удалённый PC, |
||
132 | с которым мы общаемся. |
||
133 | |||
134 | *Пассивный режим Это режим, в котором сокет открыт, а локальный PC ждёт |
||
135 | соединения. |
||
136 | |||
137 | *Активный режим Это режим, в котором сокет открыт, а локальный PC пытается |
||
138 | соединиться с удалённым PC. |
||
139 | |||
140 | Соединяясь с сокетом на удаленном PC, вы должны не только определить IP адрес, |
||
141 | но и полностью квалифицировать его, т.е. определить IP адрес и число порта. |
||
142 | Иначе стек на удалённом PC не будет знать, какому приложению предназначаются |
||
143 | посланные данные. Вот небольшой пример: |
||
144 | |||
145 | 192.168.1.10:80 ;Мы присоединяемся к компьютеру с IP адресом 192.168.1.10 к |
||
146 | 80 порту. |
||
147 | |||
148 | Числа порта являются важными. Некоторые 'известны' и обеспечивают доступ к |
||
149 | общим приложениям. Например, порт 80 используется серверами гипертекстового |
||
150 | транспортного протокола(HTTP). Таким путём я могу соединиться с вебсервером на |
||
151 | нужном компьютере без необходимости узнавать прослушиваемый приложением номер |
||
152 | порта. |
||
153 | |||
154 | Как вы знаете, есть два режима: Пассивный и Активный. Вебсервер открыл |
||
155 | пассивный сокет, поскольку он ждет входящих запросов на подключение. |
||
156 | Web-броузер открыл активный сокет, потому что он пытается соединиться с |
||
157 | указанным удалённым компьютером. |
||
158 | |||
159 | Доступ к программированию интерфейса |
||
160 | ==================================== |
||
161 | Разработчик обращается к функциям стека через прерывание 0x40, функции 53. К |
||
162 | некоторым функциям можно обратиться через функцию 52, но они главным образом |
||
163 | предназначены для конфигурации стека. |
||
164 | Вот функций, которые вы можете использовать: |
||
165 | |||
166 | Получаем локальный IP адрес |
||
167 | --------------------------- |
||
168 | eax = 52 |
||
169 | ebx = 1 |
||
170 | |||
171 | IP адрес возвратился в eax (в виде байтов, из которых состоит Интернет адрес) |
||
172 | |||
173 | Запись для расположения в стеке входной очереди |
||
174 | ----------------------------------------------- |
||
175 | eax = 52 |
||
176 | ebx = 6 |
||
177 | edx = число байтов для записи |
||
178 | esi = указатель на данные (в прикладном пространстве) |
||
179 | |||
180 | По возвращению, в eax содержится 0, если OK, или 0xFFFFFFFF, если ошибка. |
||
181 | Этот интерфейс - только для медленных сетевых драйверов (PPP, SLIP) |
||
182 | |||
183 | Чтение данных из сетевой очереди вывода |
||
184 | --------------------------------------- |
||
185 | eax = 52 |
||
186 | ebx = 8 |
||
187 | esi = указатель на данные (в прикладном пространстве) |
||
188 | |||
189 | По возвращению, eax считает число байтов переданным. |
||
190 | Этот интерфейс - только для медленных сетевых драйверов (PPP, SLIP) |
||
191 | |||
192 | Открываем UDP сокет |
||
193 | ------------------- |
||
194 | eax = 53 |
||
195 | ebx = 0 |
||
196 | ecx = локальный порт |
||
197 | edx = удаленный порт |
||
198 | esi = удаленный ip адрес (в виде байтов, из которых состоит Интернет адрес) |
||
199 | |||
200 | Номер сокета возвращён в eax. |
||
201 | Возвращаемое значение 0xFFFFFFFF означает, что сокеты не открылись. |
||
202 | |||
203 | Открываем TCP сокет |
||
204 | ------------------- |
||
205 | eax = 53 |
||
206 | ebx = 5 |
||
207 | ecx = локальный порт |
||
208 | edx = удаленный порт |
||
209 | esi = удаленный ip адрес (в виде байтов, из которых состоит Интернет адрес) |
||
210 | edi = режим: SOCKET_PASSIVE или SOCKET_ACTIVE (определён в stack.inc) |
||
211 | |||
212 | Номер сокета возвращается в eax. |
||
213 | Возвращаемое значение 0xFFFFFFFF означает, что сокеты не открылись. |
||
214 | |||
215 | Закрытие сокета (Только UDP) |
||
216 | ---------------------------- |
||
217 | eax = 53 |
||
218 | ebx = 1 |
||
219 | ecx = номер сокета |
||
220 | |||
221 | По возвращению, в eax содержится 0, если OK, или 0xFFFFFFFF, если ошибка. |
||
222 | |||
223 | Закрытие сокета (Только TCP) |
||
224 | ---------------------------- |
||
225 | eax = 53 |
||
226 | ebx = 8 |
||
227 | ecx = число сокета |
||
228 | |||
229 | По возвращению, в eax содержится 0, если OK, или 0xFFFFFFFF, если ошибка. |
||
230 | |||
231 | Опрос сокета |
||
232 | ------------- |
||
233 | eax = 53 |
||
234 | ebx = 2 |
||
235 | ecx = номер сокета |
||
236 | |||
237 | По возвращению, eax сохраняет число байтов в возвращённом буфере. |
||
238 | |||
239 | Чтение данных с сокета |
||
240 | ---------------------- |
||
241 | eax = 53 |
||
242 | ebx = 3 |
||
243 | ecx = число сокета |
||
244 | |||
245 | По возвращению, eax содержит число сохранённых байт, bl содержит байт данных. |
||
246 | |||
247 | Запись в сокет (Только UDP) |
||
248 | --------------------------- |
||
249 | eax = 53 |
||
250 | ebx = 4 |
||
251 | ecx = число сокета |
||
252 | edx = число байтов для записи |
||
253 | esi = указатель на данные (в прикладном пространстве) |
||
254 | |||
255 | По возвращению, в eax содержится 0, если OK, или 0xFFFFFFFF, если ошибка. |
||
256 | |||
257 | Возвращение состояния сокета (Только TCP) |
||
258 | ----------------------------------------- |
||
259 | eax = 53 |
||
260 | ebx = 6 |
||
261 | ecx = номер сокета |
||
262 | |||
263 | По возвращению, в eax содержится состояние TCP сокетов. |
||
264 | |||
265 | Эта функция может использоваться, чтобы определить, когда сокет фактически |
||
266 | соединился с другим сокетом. Вообще, данные не могут быть записаны в сокет, |
||
267 | пока подключение не установлено (TCB_ESTABLISHED). Состояния сокетов определены |
||
268 | в файле stack.inc, как TCB_ |
||
269 | |||
270 | Запись в сокет (Только TCP) |
||
271 | --------------------------- |
||
272 | eax = 53 |
||
273 | ebx = 7 |
||
274 | ecx = номер сокета |
||
275 | edx = число байт, нужных для записи |
||
276 | esi = указатель на данные (в прикладном пространстве) |
||
277 | |||
278 | По возвращению, в eax содержится 0, если OK, или 0xFFFFFFFF, если ошибка. |
||
279 | |||
280 | Проверка номера порта |
||
281 | --------------------- |
||
282 | eax = 53 |
||
283 | ebx = 9 |
||
284 | ecx = номер порта |
||
285 | |||
286 | Эта функция используется, чтобы определить, используется ли номер порта какими |
||
287 | - либо сокетами. Локальный номер порта обычно уникален. |
||
288 | |||
289 | По возвращению, eax = - 1 для номера порта, который используется, иначе |
||
290 | возвращается 0. |
||
291 | |||
292 | |||
293 | Открытие TCP сокета в Колибри |
||
294 | ============================= |
||
295 | |||
296 | Есть два способа открытия сокета - Пассивный или Активный. |
||
297 | |||
298 | При Пассивном подключении, приложение 'слушает' входящие запросы от удаленных |
||
299 | приложений. Обычно вы это делаете, осуществляя операцию клиент - сервер. Она |
||
300 | позволяет любому другому приложению соединяться с данным. Для этого нужно |
||
301 | определить 'известный' номер локального порта (80 для Веб-сервера), поставить |
||
302 | удаленный IP и удаленное номер порта равным 0(указывает, что любое удаленное |
||
303 | приложение может соединиться). |
||
304 | |||
305 | Как только сокет будет открыт, придётся ждать входящего подключения перед |
||
306 | выполнением чего - либо. Это может быть проверкой состояния разъема для |
||
307 | TCB_ESTABLISHED или ожиданием данных в получающемся буфере. |
||
308 | |||
309 | На Активном подключении вы соединяетесь с указанным удаленным портом. Удаленный |
||
310 | IP и удаленные параметры порта должны быть переведены в ненулевые значениями |
||
311 | (иначе, с чем соединятся?). Также, определите уникальный номер локального |
||
312 | порта, так чтобы удаленное приложение могло найти нужную программу и установить |
||
313 | с ней соединение. Ведь, могут быть несколько программ на вашей машине, |
||
314 | подключенные к одному и тому же удалённому компьютеру. |
||
315 | Ниже написано, как найти уникальный номер порта. |
||
316 | |||
317 | Как находить неиспользованный номер локального порта |
||
318 | ==================================================== |
||
319 | |||
320 | Создавая активное подключение с удаленным сокетом, у вас может появиться |
||
321 | желание выбрать уникальный номер локального порта. Обычно, номера локального |
||
322 | порта начинаются с 1000. Следующий код может использоваться, чтобы получить |
||
323 | неиспользованный номер порта до создания сокета. |
||
324 | |||
325 | mov ecx, 1000 ; Определяем локальный порт, начинаем с 1000 |
||
326 | |||
327 | getlp: |
||
328 | inc ecx |
||
329 | push ecx |
||
330 | mov eax, 53 |
||
331 | mov ebx, 9 |
||
332 | int 0x40 |
||
333 | pop ecx |
||
334 | cmp eax, 0 ; этот локальный порт используется? |
||
335 | jz getlp ; да - продолжаем перебирать |
||
336 | |||
337 | ; ecx содержит номер свободного локального порта |
||
338 | |||
339 | |||
340 | |||
341 | Запись данных в сокет |
||
342 | ===================== |
||
343 | |||
344 | Есть две функции, зависящие от того, был ли разъем открыт для протокола TCP или |
||
345 | UDP. параметры запроса - то же самое как бы то ни было. Когда сокет открывается |
||
346 | для TCP, используйте функцию состояния, чтобы опросить для подключения - данные |
||
347 | не могут быть переданы сокету, пока другой не соединился с этим. Состояние |
||
348 | сокета - TCB_ESTABLISHED. |
||
349 | |||
350 | Когда вы посылаете данные, происходит создание и отправка одного IP пакета. А |
||
351 | это значит, что пользовательское приложение отвечает за размер передаваемых |
||
352 | пакетов. Сохраняется менее чем 768 байтов размера пакета. Если вы пишете |
||
353 | оконченную программу (такую, как telnet), то можете захотеть отправлять пакет |
||
354 | за каждое (неэффективное) нажатие клавиши. Можно использовать таймер, чтобы |
||
355 | отправлять данные периодически (скажем, каждую секунду). |
||
356 | |||
357 | Чтение данных из сокета |
||
358 | ======================= |
||
359 | |||
360 | Есть одна функция для чтения данных из сокета, возвращающая данные в буфер. Эта |
||
361 | функция одновременно восстанавливает один байт. Вы можете использовать функцию |
||
362 | опроса, чтобы проверить получающийся буфер на данные. |
||
363 | |||
364 | Закрытие сокета |
||
365 | ================ |
||
366 | |||
367 | Просто вызовите соответствующую функцию (для TCP или UDP, соответственно). |
||
368 | Закрывая TCP сокет, не забудьте, что на другой конце соединения, сокет может |
||
369 | продолжить отправлять данные, так что он остаётся активным в течение нескольких |
||
370 | секунд после вашего запроса. |
||
371 | |||
372 | |||
373 | |||
374 | Если у вас есть вопросы или предложения по улучшению этого документа, то |
||
375 | пошлите мне письмо на mikeh@oceanfree.net. |
||
376 | Перевёл документ Hex. |
||
377 | Если есть вопросы или предложения по содержанию, то просьба написать мне на |
||
378 | mestack@yandex.ru или на наш форум: http://meos.sysbin.com |