# -*- coding: binary -*-
require 'rex/socket'
require 'rex/io/stream'

###
#
# This class provides methods for interacting with a TCP client connection.
#
###
module Rex::Socket::Tcp

	include Rex::Socket
	include Rex::IO::Stream

	##
	#
	# Factory
	#
	##

	#
	# Creates the client using the supplied hash.
	#
	def self.create(hash = {})
		hash['Proto'] = 'tcp'
		self.create_param(Rex::Socket::Parameters.from_hash(hash))
	end

	#
	# Wrapper around the base socket class' creation method that automatically
	# sets the parameter's protocol to TCP.
	#
	def self.create_param(param)
		param.proto = 'tcp'
		Rex::Socket.create_param(param)
	end

	##
	#
	# Stream mixin implementations
	#
	##

	#
	# Calls shutdown on the TCP connection.
	#
	def shutdown(how = ::Socket::SHUT_RDWR)
		begin
			return (super(how) == 0)
		rescue ::Exception
		end
	end

	#
	# Returns peer information (host + port) in host:port format.
	#
	def peerinfo
		if (pi = getpeername)
			return pi[1] + ':' + pi[2].to_s
		end
	end

	#
	# Returns local information (host + port) in host:port format.
	#
	def localinfo
		if (pi = getlocalname)
			return pi[1] + ':' + pi[2].to_s
		end
	end

	# returns socket type
	def type?
		return 'tcp'
	end

end
