net/server_select.lua

changeset 2128
72411e239221
parent 2106
0dc5eb9dbb62
child 2233
459c1d1cae95
equal deleted inserted replaced
2127:828e161cdfc7 2128:72411e239221
164 164
165 maxconnections = maxconnections or _maxclientsperserver 165 maxconnections = maxconnections or _maxclientsperserver
166 166
167 local connections = 0 167 local connections = 0
168 168
169 local dispatch, disconnect = listeners.incoming or listeners.listener, listeners.disconnect 169 local dispatch, disconnect = listeners.onincoming, listeners.ondisconnect
170 170
171 local err 171 local err
172 172
173 local ssl = false 173 local ssl = false
174 174
239 end 239 end
240 handler.close = function( ) 240 handler.close = function( )
241 for _, handler in pairs( _socketlist ) do 241 for _, handler in pairs( _socketlist ) do
242 if handler.serverport == serverport then 242 if handler.serverport == serverport then
243 handler.disconnect( handler, "server closed" ) 243 handler.disconnect( handler, "server closed" )
244 handler.close( true ) 244 handler:close( true )
245 end 245 end
246 end 246 end
247 socket:close( ) 247 socket:close( )
248 _sendlistlen = removesocket( _sendlist, socket, _sendlistlen ) 248 _sendlistlen = removesocket( _sendlist, socket, _sendlistlen )
249 _readlistlen = removesocket( _readlist, socket, _readlistlen ) 249 _readlistlen = removesocket( _readlist, socket, _readlistlen )
298 298
299 --// private closures of the object //-- 299 --// private closures of the object //--
300 300
301 local ssl 301 local ssl
302 302
303 local dispatch = listeners.incoming or listeners.listener 303 local dispatch = listeners.onincoming
304 local status = listeners.status 304 local status = listeners.status
305 local disconnect = listeners.disconnect 305 local disconnect = listeners.ondisconnect
306 306
307 local bufferqueue = { } -- buffer array 307 local bufferqueue = { } -- buffer array
308 local bufferqueuelen = 0 -- end of buffer array 308 local bufferqueuelen = 0 -- end of buffer array
309 309
310 local toclose 310 local toclose
329 return dispatch 329 return dispatch
330 end 330 end
331 handler.disconnect = function( ) 331 handler.disconnect = function( )
332 return disconnect 332 return disconnect
333 end 333 end
334 handler.setlistener = function( listeners ) 334 handler.setlistener = function( self, listeners )
335 dispatch = listeners.incoming 335 dispatch = listeners.onincoming
336 disconnect = listeners.disconnect 336 disconnect = listeners.ondisconnect
337 end 337 end
338 handler.getstats = function( ) 338 handler.getstats = function( )
339 return readtraffic, sendtraffic 339 return readtraffic, sendtraffic
340 end 340 end
341 handler.ssl = function( ) 341 handler.ssl = function( )
398 return serverport 398 return serverport
399 end 399 end
400 handler.clientport = function( ) 400 handler.clientport = function( )
401 return clientport 401 return clientport
402 end 402 end
403 local write = function( data ) 403 local write = function( self, data )
404 bufferlen = bufferlen + string_len( data ) 404 bufferlen = bufferlen + string_len( data )
405 if bufferlen > maxsendlen then 405 if bufferlen > maxsendlen then
406 _closelist[ handler ] = "send buffer exceeded" -- cannot close the client at the moment, have to wait to the end of the cycle 406 _closelist[ handler ] = "send buffer exceeded" -- cannot close the client at the moment, have to wait to the end of the cycle
407 handler.write = idfalse -- dont write anymore 407 handler.write = idfalse -- dont write anymore
408 return false 408 return false
415 _writetimes[ handler ] = _writetimes[ handler ] or _currenttime 415 _writetimes[ handler ] = _writetimes[ handler ] or _currenttime
416 end 416 end
417 return true 417 return true
418 end 418 end
419 handler.write = write 419 handler.write = write
420 handler.bufferqueue = function( ) 420 handler.bufferqueue = function( self )
421 return bufferqueue 421 return bufferqueue
422 end 422 end
423 handler.socket = function( ) 423 handler.socket = function( self )
424 return socket 424 return socket
425 end 425 end
426 handler.pattern = function( new ) 426 handler.pattern = function( self, new )
427 pattern = new or pattern 427 pattern = new or pattern
428 return pattern 428 return pattern
429 end 429 end
430 handler.setsend = function ( newsend ) 430 handler.setsend = function ( self, newsend )
431 send = newsend or send 431 send = newsend or send
432 return send 432 return send
433 end 433 end
434 handler.bufferlen = function( readlen, sendlen ) 434 handler.bufferlen = function( self, readlen, sendlen )
435 maxsendlen = sendlen or maxsendlen 435 maxsendlen = sendlen or maxsendlen
436 maxreadlen = readlen or maxreadlen 436 maxreadlen = readlen or maxreadlen
437 return maxreadlen, maxsendlen 437 return maxreadlen, maxsendlen
438 end 438 end
439 handler.lock = function( switch ) 439 handler.lock = function( self, switch )
440 if switch == true then 440 if switch == true then
441 handler.write = idfalse 441 handler.write = idfalse
442 local tmp = _sendlistlen 442 local tmp = _sendlistlen
443 _sendlistlen = removesocket( _sendlist, socket, _sendlistlen ) 443 _sendlistlen = removesocket( _sendlist, socket, _sendlistlen )
444 _writetimes[ handler ] = nil 444 _writetimes[ handler ] = nil
505 end 505 end
506 if succ then -- sending succesful 506 if succ then -- sending succesful
507 bufferqueuelen = 0 507 bufferqueuelen = 0
508 bufferlen = 0 508 bufferlen = 0
509 _sendlistlen = removesocket( _sendlist, socket, _sendlistlen ) -- delete socket from writelist 509 _sendlistlen = removesocket( _sendlist, socket, _sendlistlen ) -- delete socket from writelist
510 _ = needtls and handler.starttls(true) 510 _ = needtls and handler:starttls(true)
511 _writetimes[ handler ] = nil 511 _writetimes[ handler ] = nil
512 _ = toclose and handler.close( ) 512 _ = toclose and handler.close( )
513 return true 513 return true
514 elseif byte and ( err == "timeout" or err == "wantwrite" ) then -- want write 514 elseif byte and ( err == "timeout" or err == "wantwrite" ) then -- want write
515 buffer = string_sub( buffer, byte + 1, bufferlen ) -- new buffer 515 buffer = string_sub( buffer, byte + 1, bufferlen ) -- new buffer
527 end 527 end
528 end 528 end
529 529
530 -- Set the sslctx 530 -- Set the sslctx
531 local handshake; 531 local handshake;
532 function handler.set_sslctx(new_sslctx) 532 function handler.set_sslctx(self, new_sslctx)
533 ssl = true 533 ssl = true
534 sslctx = new_sslctx; 534 sslctx = new_sslctx;
535 local wrote 535 local wrote
536 local read 536 local read
537 handshake = coroutine_wrap( function( client ) -- create handshake coroutine 537 handshake = coroutine_wrap( function( client ) -- create handshake coroutine
562 --coroutine_yield( handler, nil, err ) -- handshake not finished 562 --coroutine_yield( handler, nil, err ) -- handshake not finished
563 coroutine_yield( ) 563 coroutine_yield( )
564 end 564 end
565 end 565 end
566 disconnect( handler, "ssl handshake failed" ) 566 disconnect( handler, "ssl handshake failed" )
567 _ = handler and handler.close( true ) -- forced disconnect 567 _ = handler and handler:close( true ) -- forced disconnect
568 return false -- handshake failed 568 return false -- handshake failed
569 end 569 end
570 ) 570 )
571 end 571 end
572 if sslctx then -- ssl? 572 if sslctx then -- ssl?
573 handler.set_sslctx(sslctx); 573 handler:set_sslctx(sslctx);
574 if startssl then -- ssl now? 574 if startssl then -- ssl now?
575 --out_put("server.lua: ", "starting ssl handshake") 575 --out_put("server.lua: ", "starting ssl handshake")
576 local err 576 local err
577 socket, err = ssl_wrap( socket, sslctx ) -- wrap socket 577 socket, err = ssl_wrap( socket, sslctx ) -- wrap socket
578 if err then 578 if err then
588 return nil, nil, "ssl handshake failed"; 588 return nil, nil, "ssl handshake failed";
589 end 589 end
590 else 590 else
591 -- We're not automatically doing SSL, so we're not secure (yet) 591 -- We're not automatically doing SSL, so we're not secure (yet)
592 ssl = false 592 ssl = false
593 handler.starttls = function( now ) 593 handler.starttls = function( self, now )
594 if not now then 594 if not now then
595 --out_put "server.lua: we need to do tls, but delaying until later" 595 --out_put "server.lua: we need to do tls, but delaying until later"
596 needtls = true 596 needtls = true
597 return 597 return
598 end 598 end
735 removeserver = function( port ) 735 removeserver = function( port )
736 local handler = _server[ port ] 736 local handler = _server[ port ]
737 if not handler then 737 if not handler then
738 return nil, "no server found on port '" .. tostring( port ) .. "'" 738 return nil, "no server found on port '" .. tostring( port ) .. "'"
739 end 739 end
740 handler.close( ) 740 handler:close( )
741 _server[ port ] = nil 741 _server[ port ] = nil
742 return true 742 return true
743 end 743 end
744 744
745 closeall = function( ) 745 closeall = function( )
746 for _, handler in pairs( _socketlist ) do 746 for _, handler in pairs( _socketlist ) do
747 handler.close( ) 747 handler:close( )
748 _socketlist[ _ ] = nil 748 _socketlist[ _ ] = nil
749 end 749 end
750 _readlistlen = 0 750 _readlistlen = 0
751 _sendlistlen = 0 751 _sendlistlen = 0
752 _timerlistlen = 0 752 _timerlistlen = 0
820 out_put "server.lua: found no handler and closed socket (readlist)" -- this can happen 820 out_put "server.lua: found no handler and closed socket (readlist)" -- this can happen
821 end 821 end
822 end 822 end
823 for handler, err in pairs( _closelist ) do 823 for handler, err in pairs( _closelist ) do
824 handler.disconnect( )( handler, err ) 824 handler.disconnect( )( handler, err )
825 handler.close( true ) -- forced disconnect 825 handler:close( true ) -- forced disconnect
826 end 826 end
827 clean( _closelist ) 827 clean( _closelist )
828 _currenttime = os_time( ) 828 _currenttime = os_time( )
829 if os_difftime( _currenttime - _timer ) >= 1 then 829 if os_difftime( _currenttime - _timer ) >= 1 then
830 for i = 1, _timerlistlen do 830 for i = 1, _timerlistlen do
878 _starttime = _currenttime 878 _starttime = _currenttime
879 for handler, timestamp in pairs( _writetimes ) do 879 for handler, timestamp in pairs( _writetimes ) do
880 if os_difftime( _currenttime - timestamp ) > _sendtimeout then 880 if os_difftime( _currenttime - timestamp ) > _sendtimeout then
881 --_writetimes[ handler ] = nil 881 --_writetimes[ handler ] = nil
882 handler.disconnect( )( handler, "send timeout" ) 882 handler.disconnect( )( handler, "send timeout" )
883 handler.close( true ) -- forced disconnect 883 handler:close( true ) -- forced disconnect
884 end 884 end
885 end 885 end
886 for handler, timestamp in pairs( _readtimes ) do 886 for handler, timestamp in pairs( _readtimes ) do
887 if os_difftime( _currenttime - timestamp ) > _readtimeout then 887 if os_difftime( _currenttime - timestamp ) > _readtimeout then
888 --_readtimes[ handler ] = nil 888 --_readtimes[ handler ] = nil
889 handler.disconnect( )( handler, "read timeout" ) 889 handler.disconnect( )( handler, "read timeout" )
890 handler.close( ) -- forced disconnect? 890 handler:close( ) -- forced disconnect?
891 end 891 end
892 end 892 end
893 end 893 end
894 end 894 end
895 ) 895 )

mercurial