2024-05-14 00:06:38 -04:00
|
|
|
// =============================================================================
|
|
|
|
|
// Auth: Alex Celani
|
|
|
|
|
// File: test.go
|
2024-05-20 00:19:05 -04:00
|
|
|
// Revn: 05-19-2024 0.4
|
2024-05-14 00:06:38 -04:00
|
|
|
// Func: explore bounding on piecewise file transmission ( PWFT )
|
|
|
|
|
//
|
2024-05-20 00:19:05 -04:00
|
|
|
// TODO: implement
|
2024-05-14 00:06:38 -04:00
|
|
|
// =============================================================================
|
|
|
|
|
// CHANGE LOG
|
|
|
|
|
// -----------------------------------------------------------------------------
|
|
|
|
|
// 04-19-2024: bones
|
|
|
|
|
// level 0 PWFT
|
|
|
|
|
// level 1 PWFT
|
|
|
|
|
// level 2 PWFT
|
|
|
|
|
// 05-13-2024: comment level 1 and level 2 PWFT
|
|
|
|
|
// level 3 PWFT
|
2024-05-20 00:19:05 -04:00
|
|
|
// 05-18-2024: began level 4 changes
|
|
|
|
|
// 05-19-2024: got level 4 working
|
|
|
|
|
// commented
|
|
|
|
|
// wrote level 5
|
|
|
|
|
// commented
|
|
|
|
|
// wrote level 6!
|
|
|
|
|
// commented
|
2024-05-14 00:06:38 -04:00
|
|
|
//
|
|
|
|
|
// =============================================================================
|
|
|
|
|
|
|
|
|
|
package main
|
|
|
|
|
|
|
|
|
|
import (
|
2024-05-20 00:19:05 -04:00
|
|
|
"flag"
|
2024-05-14 00:06:38 -04:00
|
|
|
"fmt"
|
|
|
|
|
"math/rand"
|
2024-05-20 00:19:05 -04:00
|
|
|
"net" // ResovleTCPAddr, ListenTCP, listener.Accept
|
|
|
|
|
// conn.Read,Write
|
|
|
|
|
"os" // Exit
|
2024-05-14 00:06:38 -04:00
|
|
|
"strconv"
|
|
|
|
|
)
|
|
|
|
|
|
2024-05-20 00:19:05 -04:00
|
|
|
|
|
|
|
|
/*
|
2024-05-14 00:06:38 -04:00
|
|
|
func makedata() {
|
|
|
|
|
for c := 0; c < dsize; c++ {
|
|
|
|
|
datum[c] = rand.Intn( dsize )
|
|
|
|
|
}
|
|
|
|
|
}
|
2024-05-20 00:19:05 -04:00
|
|
|
*/
|
|
|
|
|
|
|
|
|
|
// special make function for strings
|
|
|
|
|
func makedatatx() {
|
|
|
|
|
// classic iteration of length dsize, toss in same-sized array
|
|
|
|
|
for c := 0; c < dsize; c++ {
|
|
|
|
|
// toss in same size array
|
|
|
|
|
// rand int picks letter, 0x61 -> lowercase ascii, cast byte
|
|
|
|
|
datumtx[c] = byte( rand.Intn( 26 ) + 0x61 )
|
|
|
|
|
}
|
|
|
|
|
// cast to string and print ( as slice )
|
|
|
|
|
fmt.Println( string( datumtx[:] ) )
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// handle errors catastrophically
|
|
|
|
|
func check( err error ) {
|
|
|
|
|
if err != nil { // error is not nil on error
|
|
|
|
|
// print error
|
|
|
|
|
fmt.Println( "Fatal: ", err.Error() )
|
|
|
|
|
os.Exit( 1 ) // bail
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2024-05-14 00:06:38 -04:00
|
|
|
|
|
|
|
|
// Levels of PWFT
|
|
|
|
|
// 0. print everything indescriminately
|
|
|
|
|
// 1. printing piecewise
|
|
|
|
|
// 2. printing piecewise with header
|
|
|
|
|
// 3. printing piecewise with variable size header
|
|
|
|
|
// 4. file tx piecewise
|
|
|
|
|
// 5. file tx piecewise with header
|
|
|
|
|
// 6. file tx piecewise with variable header
|
|
|
|
|
|
2024-05-20 00:19:05 -04:00
|
|
|
|
2024-05-14 00:06:38 -04:00
|
|
|
// level 0 PWFT
|
|
|
|
|
func level0( data []int) {
|
|
|
|
|
fmt.Println( data ) // level 0 sux
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// level 1 PWFT
|
|
|
|
|
func level1() {
|
|
|
|
|
tsize := 5 // print 5 chars at a time
|
|
|
|
|
txn := dsize / tsize // amount of prints needed
|
|
|
|
|
for c := 0; c < txn; c++ { // iterate that amount of times
|
|
|
|
|
// print ( using wrapper ) n-1 data points of size tsize
|
|
|
|
|
level0( datum[c*tsize:(c+1)*tsize] )
|
|
|
|
|
}
|
|
|
|
|
level0( datum[txn*tsize:] ) // print nth data point
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// level 2 PWFT
|
|
|
|
|
func level2() {
|
|
|
|
|
var bsize int = 10 // total transmission size
|
|
|
|
|
var header string = "Lr@x@" // static header
|
|
|
|
|
// calculate usable header size
|
|
|
|
|
var tsize int = bsize - len( header )
|
|
|
|
|
txn := dsize / tsize // amount of prints needed
|
|
|
|
|
for c := 0; c < txn; c++ { // iterate that amount of times
|
|
|
|
|
fmt.Print( header ) // print static header
|
|
|
|
|
// exact same print statement from level 1
|
|
|
|
|
level0( datum[c*tsize:(c+1)*tsize] )
|
|
|
|
|
}
|
|
|
|
|
fmt.Print( header ) // print nth static header
|
|
|
|
|
level0( datum[txn*tsize:] ) // print nth data point again
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// level 3 PWFT
|
|
|
|
|
func level3() {
|
|
|
|
|
var header string // declare header
|
|
|
|
|
var bsize int = 10 // total transmission size
|
|
|
|
|
var hhead, htail string = "Lr@", "@" // static pieces of header
|
|
|
|
|
txn := 1 // init transmission number
|
|
|
|
|
pos := 0 // init position tracker
|
|
|
|
|
|
|
|
|
|
for { // easier to do an infinite loop and break later
|
|
|
|
|
// combine both static parts of the header with the tx number
|
|
|
|
|
header = hhead + strconv.Itoa( txn ) + htail
|
|
|
|
|
hlen := len( header ) // keep track of total header length
|
|
|
|
|
fmt.Print( header ) // print header
|
|
|
|
|
|
|
|
|
|
// level0 print ( bsize - hlen ) units of data, starting at
|
|
|
|
|
// the noted position
|
|
|
|
|
level0( datum[ pos:(pos + bsize - hlen) ] )
|
|
|
|
|
// update position as last position printed
|
|
|
|
|
pos = pos + bsize - hlen
|
|
|
|
|
txn++ // update transmission number
|
|
|
|
|
|
|
|
|
|
// check to see if *updated* position goes out of bounds
|
|
|
|
|
if pos + bsize - hlen > dsize {
|
|
|
|
|
break // break if'n
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
// print nth header ( X denotes final transmission )
|
|
|
|
|
fmt.Print( hhead + "X" + htail )
|
|
|
|
|
level0( datum[pos:] ) // print from final position to end
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
2024-05-20 00:19:05 -04:00
|
|
|
// level 4 PWFT
|
|
|
|
|
func level4( conn net.Conn ) {
|
|
|
|
|
txn := dsize / tsize // amount of transmissions
|
|
|
|
|
|
|
|
|
|
// iterate for number of transmissions
|
|
|
|
|
for c := 0; c < txn; c++ {
|
|
|
|
|
// write that amount of times, very specific slice
|
|
|
|
|
_, err := conn.Write( datumtx[c*tsize:(c+1)*tsize] )
|
|
|
|
|
check( err ) // routine error check
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// write final of last chunk of data
|
|
|
|
|
_, err := conn.Write( datumtx[txn * tsize:] )
|
|
|
|
|
check( err ) // routine error check
|
|
|
|
|
_, err = conn.Write( []byte( "|" ) ) // write end char
|
|
|
|
|
check( err ) // routine error check
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// level 5 PWFT
|
|
|
|
|
func level5( conn net.Conn ) {
|
|
|
|
|
header := "la@x@" // static header
|
|
|
|
|
psize := tsize - len( header ) // calculate payload size
|
|
|
|
|
|
|
|
|
|
txn := dsize / psize // amount of transmissions
|
|
|
|
|
|
|
|
|
|
// iterate for number of transmissions
|
|
|
|
|
for c := 0; c < txn; c++ {
|
|
|
|
|
// concat header with payload, easier as string, cast to byte
|
|
|
|
|
packet := header + string( datumtx[c*psize:(c+1)*psize] )
|
|
|
|
|
// write that amount of times, very specific slice
|
|
|
|
|
_, err := conn.Write( []byte( packet ) )
|
|
|
|
|
check( err ) // routine error check
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// concat last payload
|
|
|
|
|
packet := header + string( datumtx[txn*psize:] )
|
|
|
|
|
// write final of last chunk of data
|
|
|
|
|
_, err := conn.Write( []byte( packet ) )
|
|
|
|
|
check( err ) // routine error check
|
|
|
|
|
_, err = conn.Write( []byte( "|" ) ) // write end char
|
|
|
|
|
check( err ) // routine error check
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// level 6 PWFT
|
|
|
|
|
func level6( conn net.Conn ) {
|
|
|
|
|
var header string // declare header
|
|
|
|
|
var hhead, htail string = "la@", "@" // static pieces of header
|
|
|
|
|
txn := 1 // init transmission number
|
|
|
|
|
pos := 0 // init position tracker
|
|
|
|
|
|
|
|
|
|
for { // easier to do an infinite loop and break later
|
|
|
|
|
// combine both static parts of the header with the tx number
|
|
|
|
|
header = hhead + strconv.Itoa( txn ) + htail
|
|
|
|
|
hlen := len( header ) // keep track of total header length
|
|
|
|
|
|
|
|
|
|
// craft packet
|
|
|
|
|
packet := header + string( datumtx[pos:( pos + tsize - hlen )] )
|
|
|
|
|
|
|
|
|
|
// cast packet to byte array and send
|
|
|
|
|
_, err := conn.Write( []byte( packet ) )
|
|
|
|
|
check( err ) // routine error check
|
|
|
|
|
|
|
|
|
|
// update position as last position printed
|
|
|
|
|
pos = pos + tsize - hlen
|
|
|
|
|
txn++ // update transmission number
|
|
|
|
|
|
|
|
|
|
// check to see if *updated* position goes out of bounds
|
|
|
|
|
if pos + tsize - hlen > dsize {
|
|
|
|
|
break // break if'n
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
// print nth header ( X denotes final transmission )
|
|
|
|
|
header = hhead + "X" + htail
|
|
|
|
|
packet := header + string( datumtx[pos:] )
|
|
|
|
|
// cast data to string, concat, cast to byte array, send
|
|
|
|
|
_, err := conn.Write( []byte( packet ) )
|
|
|
|
|
check( err ) // routine error check
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
2024-05-14 00:06:38 -04:00
|
|
|
|
|
|
|
|
// size variables
|
|
|
|
|
var dsize int = 104
|
|
|
|
|
// data global
|
|
|
|
|
var datum = make( []int, dsize )
|
2024-05-20 00:19:05 -04:00
|
|
|
var datumtx = make( []byte, dsize )
|
|
|
|
|
var tsize int
|
2024-05-14 00:06:38 -04:00
|
|
|
|
|
|
|
|
|
|
|
|
|
func main() {
|
|
|
|
|
|
2024-05-20 00:19:05 -04:00
|
|
|
flag.IntVar( &tsize, "s", 10, "tx size" )
|
|
|
|
|
flag.Parse()
|
|
|
|
|
|
|
|
|
|
makedatatx() // fill global with data
|
|
|
|
|
|
|
|
|
|
service := ":1300" // create service on ip and port
|
|
|
|
|
|
|
|
|
|
// resolve ip address and port
|
|
|
|
|
addr, err := net.ResolveTCPAddr( "tcp", service )
|
|
|
|
|
check( err ) // make sure ip resolves
|
|
|
|
|
|
|
|
|
|
// create listener object from ip:port
|
|
|
|
|
listener, err := net.ListenTCP( "tcp", addr )
|
|
|
|
|
|
2024-05-14 00:06:38 -04:00
|
|
|
// print global data to show that PWFT works as intended
|
2024-05-20 00:19:05 -04:00
|
|
|
//level0( datum )
|
|
|
|
|
|
|
|
|
|
//level3() // do the thing
|
2024-05-14 00:06:38 -04:00
|
|
|
|
2024-05-20 00:19:05 -04:00
|
|
|
for {
|
|
|
|
|
// wait, create connection when found
|
|
|
|
|
conn, err := listener.Accept()
|
|
|
|
|
check( err ) // make sure connection works
|
|
|
|
|
|
|
|
|
|
go level6( conn ) // handle connection
|
|
|
|
|
}
|
2024-05-14 00:06:38 -04:00
|
|
|
}
|
|
|
|
|
|