Advertisement
DimkaM

Net_api

Jul 11th, 2020
193
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.55 KB | None | 0 0
  1. Все макросы, используемые в этом документе, объявлены в файле sys_h.asm.
  2.  
  3. хост(host) - точка подключения
  4.  
  5. errno - номер ошибки
  6.  
  7. big-endian - представление числа в ОЗУ. Сначала старший байт, затем младший.
  8. К примеру 16 битное число 0x1234 располагается в памяти как DEFB 0x12,0x34
  9. little-endian - представление числа в ОЗУ. Это представление использует процессор z80.
  10. Сначала младший байт, затем старший. В этом документе, по умолчанию, все числа little-endian.
  11. К примеру 16 битное число 0x1234 располагается в памяти как DEFB 0x34,0x12
  12.  
  13. SOCKET - дескриптор сокета. Знаковое 8-битное число.
  14.  
  15. sockaddr_in - структура, размером 15 байт, со следующими полями:
  16. sin_family - семейство адресов, беззнаковое 8-битное число.
  17. в текущей реализации допускается только значение 2 (AF_INET).
  18. sin_port - номер порта, 16-битное беззнаковое big-endian число.
  19. sin_addr - IP-адрес. Массив из четырёх 8-битных беззнаковых чисел.
  20. к примеру IP-адрес 1.2.3.4 располагается в памяти как defb 1,2,3,4
  21. sin_zero - зарезервировано. массив из 8 байт.
  22.  
  23. ************************* Возможные номера ошибок (errno)*************************
  24. SHUT_RDWR EQU 2
  25. ERR_EAGAIN EQU 35 ;/* Try again */
  26. ERR_EWOULDBLOCK EQU ERR_EAGAIN ;/* Operation would block */
  27. ERR_INTR EQU 4
  28. ERR_NFILE EQU 23
  29. ERR_ALREADY EQU 37
  30. ERR_NOTSOCK EQU 38
  31. ERR_EMSGSIZE EQU 40 ;/* Message too long */
  32. ERR_PROTOTYPE EQU 41
  33. ERR_AFNOSUPPORT EQU 47
  34. ERR_HOSTUNREACH EQU 65
  35. ERR_ECONNABORTED EQU 53 /* Software caused connection abort */
  36. ERR_CONNRESET EQU 54
  37. ERR_NOTCONN EQU 57
  38.  
  39. ************************* Протоколы соединений *************************
  40. SOCK_STREAM EQU 0x01 ;tcp/ip
  41. SOCK_ICMP EQU 0x02 ;icmp
  42. SOCK_DGRAM EQU 0x03 ;udp/ip
  43.  
  44. AF_INET EQU 2
  45.  
  46. ***********************************************************
  47. ************************* Функции *************************
  48. ***********************************************************
  49. Все вызовы не блокирующие(за исключением OS_NETCONNECT), т.е.
  50. не ожидадают отправку\прием данных, либо подключения.
  51. При необходимости использования блокирующих функций - реализовывать самостоятельно внутри процесса.
  52.  
  53. *********************** OS_NETSOCKET **********************
  54. Создаёт сокет.
  55. Макрос вызова функции ядра. Возможна порча всех регистров.
  56. Все аргументы в регистрах:
  57. D - семейство адресов, беззнаковое 8-битное число, допускается только значение 2 (AF_INET).
  58. E - протокол соединения(0x01 tcp/ip, 0x02 icmp, 0x03 udp/ip)
  59. Возвращаемые значения в регистрах:
  60. L - SOCKET при положительном значении, при отрицательном значении - функция завершилась с ошибкой.
  61. А - errno при ошибке.
  62.  
  63. Возможные ошибки:
  64. ERR_AFNOSUPPORT - семейство адресов не поддерживается
  65. ERR_NFILE - нет свободных сокетов
  66. ERR_PROTOTYPE - протокол не поддерживается
  67.  
  68. Пример создания TCP/IP сокета:
  69. LD D,2
  70. LD E,SOCK_STREAM
  71. OS_NETSOCKET
  72. BIT 7,L
  73. JP NZ,ERR_EXIT ;обработка ошибки
  74. LD A,L
  75. LD (SOC),A ;сохраняем дескриптор сокета.
  76.  
  77. Примечания:
  78. При закрытии процесса, закрываются все сокеты созданные этим процессом.
  79. Сокеты защищены от использования другим процессом.
  80. Номер исходящего порта присваивается автоматически из диапазона 49152...65535
  81.  
  82. *********************** OS_NETSHUTDOWN **********************
  83. Закрытие сокета.
  84. Макрос вызова функции ядра. Возможна порча всех регистров.
  85. Все аргументы в регистрах:
  86. A - SOCKET
  87. E - Варианты закрытия, 0 - закрыть немедленно, 1 - закрыть только если буфер отправки пуст.
  88. Возвращаемые значения в регистрах:
  89. L - При отрицательном значении - функция завершилась с ошибкой.
  90. А - errno при ошибке.
  91.  
  92. Пример закрытия сокета с ожиданием опустошения буфера отправки:
  93. close_wait:
  94. LD A,(SOC)
  95. LD E,1
  96. OS_NETSHUTDOWN
  97. BIT 7,L
  98. RET Z ;сокет закрылся
  99. CP ERR_EAGAIN
  100. JP NZ,ERR_EXIT ;обработка ошибки не связанной с ожиданием отправки.
  101. OS_YIELD ;не обязательно. Если время не критично,
  102. ;то отдадим квант времени системе.
  103. JR close_wait ;ожидаем отправки данных
  104.  
  105. Возможные ошибки:
  106. ERR_NOTSOCK - не действительный дескриптор сокета
  107. ERR_EAGAIN - буфер отправки не пуст
  108.  
  109. Примечание: Керналь закрывает сокеты процесса при закрытии процесса.
  110. Но, ввиду ограниченного количества сокетов, рекомендуется закрывать сокет
  111. как только он становится не нужен.
  112.  
  113. *********************** OS_NETCONNECT **********************
  114. Подключить TCP/IP сокет к хосту.
  115. Макрос вызова функции ядра. Возможна порча всех регистров.
  116. Все аргументы в регистрах:
  117. A - SOCKET
  118. DE - указатель на структуру sockaddr_in содержащую IP адрес и порт хоста.
  119. Возвращаемые значения в регистрах:
  120. L - При отрицательном значении - функция завершилась с ошибкой.
  121. А - errno при ошибке.
  122. Возможные ошибки:
  123. ERR_NOTSOCK - не действительный дескриптор сокета
  124. ERR_ALREADY - сокет уже подключен
  125. ERR_HOSTUNREACH - хост не доступн, либо отверг подключение.
  126.  
  127. Пример подключения к хосту с IP адресом 1.2.3.4 на порт 80:
  128. LD A,(SOC)
  129. LD DE,(destination_host)
  130. OS_NETCONNECT
  131. BIT 7,L
  132. JP NZ,ERR_EXIT ;обработка ошибки
  133. ... ;подключились
  134.  
  135. destination_host
  136. DEFB AF_INET
  137. DEFB 0,80 ;порт назначения
  138. DEFB 1,2,3,4 ;IP адрес назначения
  139. DEFB 0,0,0,0,0,0,0,0 ;резерв
  140.  
  141. Примечание: Данная функция применима только к TCP/IP сокетам.
  142.  
  143. *********************** OS_BIND **********************
  144. Присвоение сокету конкретного номера исходящего порта.
  145. Макрос вызова функции ядра. Возможна порча всех регистров.
  146. Все аргументы в регистрах:
  147. A - SOCKET
  148. DE - указатель на структуру sockaddr_in содержащую номер исходящего порта.
  149. (остальные поля структуры не используются, но обязаны присутствовать)
  150. Возвращаемые значения в регистрах:
  151. L - При отрицательном значении - функция завершилась с ошибкой.
  152. А - errno при ошибке.
  153. Возможные ошибки:
  154. ERR_NOTSOCK - не действительный дескриптор сокета
  155.  
  156. Пример присвоения сокету исходяего порта 433:
  157. LD A,(SOC)
  158. LD DE,(destination_host)
  159. OS_BIND
  160. BIT 7,L
  161. JP NZ,ERR_EXIT ;обработка ошибки
  162. ... ;удачно, продолжаем работу
  163.  
  164. destination_host
  165. DEFB AF_INET
  166. DEFB high(433),low(433) ;исходящий порт
  167. DEFB 0,0,0,0 ;исходящий IP адрес (не используется в текущей реализации)
  168. DEFB 0,0,0,0,0,0,0,0 ;резерв
  169. Примечание: В режиме TCP/IP функция вызывается(если нужна) до вызовов OS_NETCONNECT или OS_LISTEN.
  170.  
  171. *********************** OS_LISTEN **********************
  172. Включить режим прослушивания исходящего порта(режим сервера) TCP/IP сокета.
  173. Макрос вызова функции ядра. Возможна порча всех регистров.
  174. Все аргументы в регистрах:
  175. A - SOCKET
  176. Возвращаемые значения в регистрах:
  177. L - При отрицательном значении - функция завершилась с ошибкой.
  178. А - errno при ошибке.
  179. Возможные ошибки:
  180. ERR_NOTSOCK - не действительный дескриптор сокета
  181. ERR_ALREADY - сокет уже подключен
  182.  
  183. Пример включения режима прослушивания:
  184. LD A,(SOC)
  185. OS_LISTEN
  186. BIT 7,L
  187. JP NZ,ERR_EXIT ;обработка ошибки
  188. ... ;удачно, продолжаем работу
  189.  
  190. Примечание: Данная функция применима только к TCP/IP сокетам.
  191. Как правило функция вызывается(если нужна) после вызова OS_BIND.
  192.  
  193. *********************** OS_ACCEPT **********************
  194. Принять входящее TCP/IP подключение.
  195. Макрос вызова функции ядра. Возможна порча всех регистров.
  196. Все аргументы в регистрах:
  197. A - SOCKET
  198. Возвращаемые значения в регистрах:
  199. L - SOCKET при положительном значении, при отрицательном значении - функция завершилась с ошибкой.
  200. А - errno при ошибке.
  201. Возможные ошибки:
  202. ERR_NOTSOCK - не действительный дескриптор сокета
  203. ERR_ECONNABORTED - общая ошибка сокета
  204. ERR_EAGAIN - входящих подключений пока нет
  205.  
  206. Пример принятия соединения с ожиданием подключения:
  207. WAIT_CLIENTS
  208. LD A,(SOC)
  209. OS_ACCEPT
  210. BIT 7,L
  211. JR Z,ESTABLISHED
  212. CP ERR_EAGAIN
  213. JP NZ,ERR_EXIT ;обработка ошибки
  214. OS_YIELD ;не обязательно. Если время реагирования на подключение не критично,
  215. ;то отдадим квант времени системе.
  216. JR WAIT_CLIENTS ;никто не подключился, ждём
  217. ESTABLISHED
  218. LD A,L ;удачно
  219. LD (SOC_CLIENT),A ;сохраняем дескриптор сокета.
  220. ... ;продолжаем работу
  221.  
  222. Примечания: Данная функция применима только к TCP/IP сокетам.
  223. Функция вызывается после вызова OS_LISTEN.
  224. Возвращает новый дескриптор сокета с принятым соединением. Сокет прослушки продолжает слушать.
  225. Если дальнейшая прослушка не требуется, то рекомендуется сразу закрывать слушающий сокет.
  226. При недостатке сокетов, возвращается дескриптор подключенного сокета прослушки,
  227. в этом случае нет дальнейшего прослушивания.
  228. Т.е. при закрытии слушающего сокета, необходимо проверить(путем сравнения дескрипторов)
  229. не является ли он сокетом с принятым соединением.
  230.  
  231. *********************** OS_WIZNETREAD **********************
  232. Прочитать входящие данные.
  233. Макрос вызова функции ядра. Возможна порча всех регистров.
  234.  
  235. При протоколе TCP/IP все аргументы в регистрах:
  236. A - SOCKET
  237. DE - указатель на буфер для принятия данных
  238. HL - размер буфера(в байтах)
  239. При протоколе отличном от TCP/IP все аргументы в регистрах:
  240. A - SOCKET
  241. DE - указатель на структуру sockaddr_in, в неё помещается(ядром) IP-адрес и порт хоста отправившего данные,
  242. при значенни указателя 0x0000 данные хоста не заполняются.
  243. IX - указатель на буфер для принятия данных
  244. HL - размер буфера(в байтах)
  245. Возвращаемые значения в регистрах:
  246. HL - при отрицательном значении функция завершилась с ошибкой,
  247. иначе возвращается действительный размер(в байтах) принятых данных,
  248. А - errno при ошибке.
  249. Возможные ошибки:
  250. ERR_NOTSOCK - не действительный дескриптор сокета
  251. ERR_EAGAIN - входящих данных пока нет
  252. ERR_NOTCONN - сокет с неустановленным\пропавшем соединением(при протоколе TCP/IP)
  253.  
  254. Пример принятия данных по протоколу TCP/IP с ожиданием данных:
  255. WAIT_DATA
  256. LD A,(SOC)
  257. LD DE,BUF
  258. LD HL,BUF_SIZE
  259. OS_WIZNETREAD
  260. BIT 7,H
  261. JR Z,RECEIVED ;ошибок нет
  262. CP ERR_EAGAIN
  263. JP NZ,ERR_EXIT ;обработка ошибки
  264. OS_YIELD ;не обязательно. Если время реагирования на пришедшие данные не критично,
  265. ;то отдадим квант времени системе.
  266. JR WAIT_DATA ;данных нет, ждём
  267. RECEIVED
  268. LD (DATA_SIZE),HL ;удачно. если требуется, то сохраняем количество принятых данных.
  269. ... ;продолжаем работу
  270.  
  271. BUF DEFS 1000
  272. BUF_SIZE EQU $-BUF
  273.  
  274. Примечания: При протоколе отличном от TCP/IP, необходимо единовременно прочитать весь пакет,
  275. иначе недовычитанные данные пакета игнорируются.
  276.  
  277. *********************** OS_WIZNETWRITE **********************
  278. Отправить пакет данных.
  279. Макрос вызова функции ядра. Возможна порча всех регистров.
  280.  
  281. При протоколе TCP/IP все аргументы в регистрах:
  282. A - SOCKET
  283. DE - указатель на буфер с данными
  284. HL - размер данных(в байтах), в текущей реализации максимум 8192 байта
  285. При протоколе отличном от TCP/IP все аргументы в регистрах:
  286. A - SOCKET
  287. DE - указатель на структуру sockaddr_in, в неё необходимо поместить IP-адрес и порт хоста получателя
  288. IX - указатель на буфер с данными
  289. HL - размер данных(в байтах), в текущей реализации максимум 8192 байта
  290. Возвращаемые значения в регистрах:
  291. HL - при отрицательном значении функция завершилась с ошибкой,
  292. иначе возвращается действительный размер(в байтах) отправленных данных,
  293. А - errno при ошибке.
  294. Возможные ошибки:
  295. ERR_NOTSOCK - не действительный дескриптор сокета
  296. ERR_NOTCONN - сокет с неустановленным\пропавшем соединением(при протоколе TCP/IP)
  297. ERR_EMSGSIZE - в буфере отправки нет места, либо пакет слишком большой
  298.  
  299. Пример отправки данных по протоколу TCP/IP с ожиданием данных:
  300. WAIT_DATA
  301. LD A,(SOC)
  302. LD DE,BUF
  303. LD HL,BUF_SIZE
  304. OS_WIZNETWRITE
  305. BIT 7,H
  306. JR Z,RECEIVED ;ошибок нет
  307. CP ERR_EMSGSIZE
  308. JP NZ,ERR_EXIT ;обработка ошибки
  309. OS_YIELD ;не обязательно. Если время не критично,
  310. ;то отдадим квант времени системе.
  311. JR WAIT_DATA ;буфер отправки переполнен, ждём освобождения
  312. RECEIVED
  313. LD (DATA_SIZE),HL ;удачно. если требуется, то сохраняем количество отправленных данных.
  314. ... ;продолжаем работу
  315.  
  316. BUF DEFB "Hello World!"
  317. BUF_SIZE EQU $-BUF
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement