socketstream.bmx 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107
  1. Strict
  2. Rem
  3. bbdoc: Streams/Socket streams
  4. End Rem
  5. Module BRL.SocketStream
  6. ModuleInfo "Version: 1.05"
  7. ModuleInfo "Author: Mark Sibly"
  8. ModuleInfo "License: zlib/libpng"
  9. ModuleInfo "Copyright: Blitz Research Ltd"
  10. ModuleInfo "Modserver: BRL"
  11. ModuleInfo "History: 1.05 Release"
  12. ModuleInfo "History: CreateStream port handling fix documented"
  13. ModuleInfo "History: 1.04 Release"
  14. ModuleInfo "History: TSocketStream now just wraps a TSocket"
  15. Import BRL.Socket
  16. Import BRL.Stream
  17. Type TSocketStream Extends TStream
  18. Method Read( buf:Byte Ptr,count )
  19. Return _socket.Recv( buf,count )
  20. End Method
  21. Method Write( buf:Byte Ptr,count )
  22. Return _socket.Send( buf,count )
  23. End Method
  24. Method Eof()
  25. If Not _socket Return True
  26. If _socket.Connected() Return False
  27. Close
  28. Return True
  29. End Method
  30. Method Close()
  31. If Not _socket Return
  32. If _autoClose _socket.Close
  33. _socket=Null
  34. End Method
  35. Method Socket:TSocket()
  36. Return _socket
  37. End Method
  38. Function Create:TSocketStream( socket:TSocket,autoClose=True )
  39. Local t:TSocketStream=New TSocketStream
  40. t._socket=socket
  41. t._autoClose=autoClose
  42. Return t
  43. End Function
  44. Function CreateClient:TSocketStream( remoteHost$,remotePort )
  45. Local remoteIp=HostIp( remoteHost )
  46. If Not remoteIp Return
  47. Local socket:TSocket=TSocket.CreateTCP()
  48. If socket
  49. If socket.Connect( remoteIp,remotePort )
  50. Return Create( socket,True )
  51. EndIf
  52. socket.Close
  53. EndIf
  54. End Function
  55. Field _socket:TSocket,_autoClose
  56. End Type
  57. Type TSocketStreamFactory Extends TStreamFactory
  58. Method CreateStream:TSocketStream( url:Object,proto$,path$,readable,writeable )
  59. If proto$="tcp"
  60. Local i=path.Find( ":",0 ),server$,port
  61. If i>=0 Return TSocketStream.CreateClient( path[..i],Int(path[i+1..]) )
  62. Return TSocketStream.CreateClient( path,80 )
  63. EndIf
  64. End Method
  65. End Type
  66. New TSocketStreamFactory
  67. Rem
  68. bbdoc: Create a socket stream
  69. returns: A new socket stream
  70. about:
  71. A socket stream allows you to treat a socket as if it were a stream.
  72. If @autoClose is true, @socket will be automatically closed when the socket
  73. stream is closed. Otherwise, it is up to you to somehow close @socket at
  74. a later time.
  75. End Rem
  76. Function CreateSocketStream:TSocketStream( socket:TSocket,autoClose=True )
  77. Return TSocketStream.Create( socket,autoClose )
  78. End Function
  79. Rem
  80. bbdoc: Get underlying socket from a socket stream
  81. returns: The socket used to create the socket stream
  82. End Rem
  83. Function SocketStreamSocket:TSocket( stream:TSocketStream )
  84. Return stream.Socket()
  85. End Function