1,6 → 1,6 |
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; |
;; ;; |
;; Copyright (C) KolibriOS team 2010-2015. All rights reserved. ;; |
;; Copyright (C) KolibriOS team 2010-2013. All rights reserved. ;; |
;; Distributed under terms of the GNU General Public License ;; |
;; ;; |
;; tcpserv.asm - TCP demo program for KolibriOS ;; |
43,22 → 43,29 |
jnz exit |
|
; initialize console |
invoke con_start, 1 |
invoke con_init, 80, 25, 80, 25, title |
push 1 |
call [con_start] |
push title |
push 25 |
push 80 |
push 25 |
push 80 |
call [con_init] |
|
mcall 40, EVM_STACK |
mcall 40, 1 shl 7 ; we only want network events |
|
invoke con_write_asciiz, str1 |
push str1 |
call [con_write_asciiz] |
|
mcall socket, AF_INET4, SOCK_STREAM, 0 |
cmp eax, -1 |
je sock_err |
|
mov [socketnum], eax |
|
; This socket option is not implemented in kernel yet. |
; mcall setsockopt, [socketnum], SOL_SOCKET, SO_REUSEADDR, &yes, |
; cmp eax, -1 |
; je opt_err |
;; mcall setsockopt, [socketnum], SOL_SOCKET, SO_REUSEADDR, &yes, |
;; cmp eax, -1 |
;; je opt_err |
|
mcall bind, [socketnum], sockaddr1, sockaddr1.length |
cmp eax, -1 |
68,13 → 75,19 |
cmp eax, -1 |
je listen_err |
|
invoke con_write_asciiz, str2 |
push str2 |
call [con_write_asciiz] |
|
mcall 10 |
|
mcall accept, [socketnum], sockaddr1, sockaddr1.length |
cmp eax, -1 |
je acpt_err |
|
mov [socketnum2], eax |
|
;; mcall close, [socketnum] |
|
mcall send, [socketnum2], hello, hello.length |
|
.loop: |
83,50 → 96,50 |
je .loop |
|
mov byte[buffer+eax], 0 |
invoke con_write_asciiz, buffer |
|
push buffer |
call [con_write_asciiz] |
|
jmp .loop |
|
acpt_err: |
invoke con_write_asciiz, str8 |
push str8 |
call [con_write_asciiz] |
jmp done |
|
listen_err: |
invoke con_write_asciiz, str3 |
push str3 |
call [con_write_asciiz] |
jmp done |
|
bind_err: |
invoke con_write_asciiz, str4 |
push str4 |
call [con_write_asciiz] |
jmp done |
|
sock_err: |
invoke con_write_asciiz, str6 |
push str6 |
call [con_write_asciiz] |
jmp done |
|
done: |
invoke con_getch2 ; Wait for user input |
invoke con_exit, 1 |
call [con_getch2] |
push 1 |
call [con_exit] |
exit: |
cmp [socketnum], 0 |
je @f |
mcall close, [socketnum] |
@@: |
cmp [socketnum2], 0 |
je @f |
mcall close, [socketnum2] |
@@: |
mcall -1 |
|
|
|
; data |
title db 'TCP stream server demo',0 |
title db 'TCP stream server - test',0 |
str1 db 'Opening socket',10, 0 |
str2 db 'Listening for incoming connections...',10,0 |
str3 db 'Listen error',10,10,0 |
str4 db 'Bind error',10,10,0 |
str5 db 'Setsockopt error',10,10,0 |
str5 db 'Setsockopt error.',10,10,0 |
str6 db 'Could not open socket',10,10,0 |
str7 db 'Got data',10,10,0 |
str7 db 'Got data!',10,10,0 |
str8 db 'Error accepting connection',10,10,0 |
|
hello db 'Hello world!',0 |
134,7 → 147,7 |
|
sockaddr1: |
dw AF_INET4 |
.port dw 23 shl 8 ; port 23 - network byte order |
.port dw 0x1700 ; 23 |
.ip dd 0 |
rb 10 |
.length = $ - sockaddr1 |
157,8 → 170,8 |
con_set_cursor_pos, 'con_set_cursor_pos' |
i_end: |
|
socketnum dd 0 |
socketnum2 dd 0 |
socketnum dd ? |
socketnum2 dd ? |
buffer rb BUFFERSIZE |
.length = BUFFERSIZE |
|