1,9 → 1,9 |
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; |
;; ;; |
;; Copyright (C) KolibriOS team 2010-2017. All rights reserved. ;; |
;; Copyright (C) KolibriOS team 2010-2015. All rights reserved. ;; |
;; Distributed under terms of the GNU General Public License ;; |
;; ;; |
;; tcpserv.asm - TCP server demo program for KolibriOS ;; |
;; tcpserv.asm - TCP demo program for KolibriOS ;; |
;; ;; |
;; Written by hidnplayr@kolibrios.org ;; |
;; ;; |
46,59 → 46,46 |
invoke con_start, 1 |
invoke con_init, 80, 25, 80, 25, title |
|
; Set event mask to socket events only |
mcall 40, EVM_STACK |
|
; Write message str1 to the console |
invoke con_write_asciiz, str1 |
|
; Allocate a TCP socket |
mcall socket, AF_INET4, SOCK_STREAM, 0 |
cmp eax, -1 |
je sock_err |
; Socket allocation succeeded, store it's number in socketnum |
mov [socketnum], eax |
|
; This might be needed in the future, |
; SO_REUSEADDR option is not implemented in kernel yet. |
; This socket option is not implemented in kernel yet. |
; mcall setsockopt, [socketnum], SOL_SOCKET, SO_REUSEADDR, &yes, |
; cmp eax, -1 |
; je opt_err |
|
; Bind the socket to port 23 (as defined in sockaddr1) |
mcall bind, [socketnum], sockaddr1, sockaddr1.length |
cmp eax, -1 |
je bind_err |
|
; Start listening for incoming connections, with a backlog of max 1 |
mcall listen, [socketnum], 1 |
mcall listen, [socketnum], 10 ; Backlog = 10 |
cmp eax, -1 |
je listen_err |
|
; Write message str2 to the console |
invoke con_write_asciiz, str2 |
|
; (Wait for and) accept incoming connection |
mcall accept, [socketnum], sockaddr1, sockaddr1.length |
cmp eax, -1 |
je acpt_err |
; We have a new incoming connection, store the new socket number in socketnum2 |
mov [socketnum2], eax |
|
; Send a message on the incoming connection |
mcall send, [socketnum2], hello, hello.length |
|
; Print the received data to the console, untill socket is closed by remote end |
.loop: |
mcall recv, [socketnum2], buffer, BUFFERSIZE, 0 |
mcall recv, [socketnum2], buffer, buffer.length, 0 |
cmp eax, -1 |
je .loop |
|
mov byte[buffer+eax], 0 ; Zero-terminate the data, so we can print it |
mov byte[buffer+eax], 0 |
invoke con_write_asciiz, buffer |
jmp .loop |
|
; Print error message |
acpt_err: |
invoke con_write_asciiz, str8 |
jmp done |
115,25 → 102,18 |
invoke con_write_asciiz, str6 |
jmp done |
|
|
done: |
; Wait for user input |
invoke con_getch2 |
; Close console |
invoke con_getch2 ; Wait for user input |
invoke con_exit, 1 |
exit: |
; Close listening socket, if it is open |
cmp [socketnum], 0 |
je @f |
mcall close, [socketnum] |
@@: |
|
; Close second socket, if it is open |
cmp [socketnum2], 0 |
je @f |
mcall close, [socketnum2] |
@@: |
; Close application |
mcall -1 |
|
|
153,7 → 133,7 |
.length = $ - hello |
|
sockaddr1: |
dw AF_INET4 ; IPv4 |
dw AF_INET4 |
.port dw 23 shl 8 ; port 23 - network byte order |
.ip dd 0 |
rb 10 |
180,6 → 160,7 |
socketnum dd 0 |
socketnum2 dd 0 |
buffer rb BUFFERSIZE |
.length = BUFFERSIZE |
|
align 4 |
rb 4096 ; stack |