Socket Client over PowerShell

In this article let's use PowerShell to create a socket client and do a simple call to a webserver.

There are multiple ways to create sockets using PowerShell. For this article let's take use TcpClient object for it's simplicity.

Table of Contents

Set up the Client Socket

Let's start by creating the client object. TcpClient it's a very easy way to handle TCP connections as a client.

We're going to use the web server https://httpbin.org/ to connect our client.

# Creates the TCP Client
$client = New-Object System.Net.Sockets.TcpClient

# Connect to the server
$client.Connect("eu.httpbin.org", 80) 

Sending the Request

Since we're calling a Web Server HTTP 1.1. We must send the appropriate request as a HTTP 1.1 client.

# Data mimicking a web client
$payload = "GET /get HTTP/1.1
Host: eu.httpbin.org
Accept: */*

"

$bytesPayload = [System.Text.Encoding]::ASCII.GetBytes($payload) 
$stream.Write($bytesPayload, 0, $bytesPayload.Length)

Reading the Response

Once the request is sent we must immediately start reading the response.

# Receive data from the server
$bufferResponse = New-Object byte[] 4096 #enough to read our response 4mb
$bytesRead = $stream.Read($bufferResponse, 0, $bufferResponse.Length)
$response = [System.Text.Encoding]::ASCII.GetString($bytesRead, 0, $bytesRead)

# Output the Response
Write-Host $response

Finally! Close the connection

Don't forget to close the connection. 🚀

# Close the connection
$stream.Close()
$client.Close()

Complete Code

# Create a TCP client object
$client = New-Object System.Net.Sockets.TcpClient

# Connect to the server
$client.Connect("eu.httpbin.org", 80) 

# Get the network stream for reading and writing
$stream = $client.GetStream() 

# Send data to the server
$data = "GET /get HTTP/1.1
Host: eu.httpbin.org
Accept: */*

"

$bytes = [System.Text.Encoding]::ASCII.GetBytes($data) 
$stream.Write($bytes, 0, $bytes.Length)

# Receive data from the server
$buffer = New-Object byte[] 1024
$bytesRead = $stream.Read($buffer, 0, $buffer.Length)
$response = [System.Text.Encoding]::ASCII.GetString($buffer, 0, $bytesRead)

# Display the response
Write-Host $response

# Close the connection
$stream.Close()
$client.Close()

Love Discord?