You can make your own Type like:
Type TSocketStreamEx Extends TSocketStream
Field RecvTimeout : Int
Field SendTimeout : Int
Field MessageIP : Int
Field MessagePort : Short
Method SetTimeouts(Recv:Int, Send:Int)
Self.RecvTimeout = Recv
Self.SendTimeout = Send
End Method
Method Read:Int(Buffer:Byte Ptr, Count:Int)
Local Read:Int, Size:Int, Result:Int, TempPort:Int
If Self._socket._socket = -1 Then Return 0
Read = Self._socket._socket
If select_(1, Varptr(Read), 0, Null, 0, Null, Self.RecvTimeout) <> 1 Then Return 0
If ioctl_(Self._socket._socket, FIONREAD, Varptr(Size)) = SOCKET_ERROR_ Then return 0
if Size <= 0 Then Return 0
Result = recvfrom_(Self._socket._socket, Buffer, Count, 0, Self.MessageIP, TempPort)
If result = SOCKET_ERROR Or Result = 0 Then Return 0
Self.MessagePort = Short(TempPort)
Return Result
End Method
Method Write:Int(Buffer:Byte Ptr, Count:Int)
Local Write:Int, Size:Int, Result:Int
If Self._socket._socket = -1 Then Return 0
Write = Self._socket._socket
If select_(0, Null, 1, Varptr(Write), 0, Null, Self.SendTimeout) <> 1 Then Return 0
Result = sendto_(Self._socket._socket, Buffer, Count, 0, Self._socket._remoteIp, Self._socket._remotePort)
If result = SOCKET_ERROR Or Result = 0 Then Return 0
Return Result
End Method
Method MessageIP:Int()
Return Self.MessageIP
End Method
Method MessagePort:Short()
Return Self.MessagePort
End Method
Function Create:TSocketStreamEx( socket:TSocket,autoClose=True )
Local t:TSocketStreamEx=New TSocketStreamEx
t._socket=socket
t._autoClose=autoClose
Return t
End Function
End Type
Function CreateSocketStreamEx:TSocketStreamEx(socket:TSocket, autoClose=True)
Return TSocketStreamEx.Create(socket, autoClose)
End Function
Function SocketStreamSocket:TSocket(stream:TSocketStreamEx)
Return stream.Socket()
End Function (I haven't test it)
Firstly you create a UDP Socket than you use CreateSocketStreamEx and set the timeouts with SetTimeouts. Than you can use ReadLine, WriteLine and so on. I you want to know the sender you can use MessageIP and MessagePort methods.
(Oh oh oh, Mark could use superstrictmode in his own modules ) cu olli
|