Thanks for the answer! (: In python it was straightforward to implement and it works like a charm. It sends small packets with delay between each other without even care if it is UDP or TCP:
[image: prooff.png] [image: proof2.png] The connection ( if UDP/ TCP ) is handled independently, the sending part ( the one I pasted ) is equal for both of them, its just an "if" in the code. The server ( which I control ) does riassembling by himself, so its fine. I know that providing a solution is not an easy task, I know it for sure. I'm just looking for a pro ( a saint ahaha ) with some patience that provides an example of code of how it should look like to work as I wish it does. I do not expect do make it work in first place, its almost impossible, but we all know, with some errors you get the solution before or after(: In this case I don't really know where to start and how to do it ( im a newbie in golang ), so I came here to ask help Il giorno martedì 29 giugno 2021 alle 14:22:32 UTC+2 Brian Candler ha scritto: > What sort of socket - TCP or UDP? TCP is an infinite stream, and there is > no reliable way to divide it into "chunks" (except possibly using the URG > pointer, which is very rarely used). There is no guarantee that waiting > 1.6 seconds between sends will actually send in separate segments being > sent, nor that the receiver will be able to determine that these were > separate segments - they may well be merged. > > To do it reliably, you'd want to add your own framing, e.g. send an 4-byte > length followed by that number of bytes. > > If you show a *complete* go program, together with a description of how it > isn't working to your satisfaction, then maybe someone can help you fix > it. If you want to make it behave the same as some given python program, > then maybe you should show the python program as well. > > On Tuesday, 29 June 2021 at 11:51:57 UTC+1 LetGo wrote: > >> I forgot this: >> // Manage connection for different behavior >> func handleConn(conn net.Conn, binPath string) { >> >> msg := "Status?\n" >> >> if binPath != "" { >> // Execute command and send Standard I/O net.Conn >> cmd := exec.Command(binPath) >> cmd.Stdin = conn >> cmd.Stdout = conn >> cmd.Stderr = conn >> cmd.Run() >> fmt.Println("Disconnected!?") >> time.Sleep(5 * time.Second) >> pippo, err2 := conn.Write([]byte(msg)) >> if err2 != nil { >> fmt.Println(pippo) >> } >> >> >> >> >> } else { >> // Copy Standard I/O in a net.Conn >> go io.Copy(os.Stderr, conn) >> go io.Copy(os.Stdout, conn) >> io.Copy(conn, os.Stdin) >> >> } >> } >> >> Il giorno martedì 29 giugno 2021 alle 12:27:00 UTC+2 LetGo ha scritto: >> >>> I have a proxy written in python with some logic that I would like to >>> implement in a golang tool of mine, but I don't really know how to do it. >>> It splits the data sent via socket (stdout) in small chunks, with a >>> delay between each other >>> >>> I have a variable which gets a random number from a list: >>> .... >>> listbytes = [87, 88, 89, 90] >>> .... >>> >>> I have also a function which splits in small chunk of bytes(n) the >>> data(lst): >>> >>> ............ >>> >>> def chunks(lst, n): >>> >>> "Yield successive chunks from lst, where n is a list of possible >>> sizes" >>> >>> i = 0 >>> >>> while i < len(lst): >>> >>> k = min(random.choice(n), len(lst) - i) >>> >>> yield lst[i:i + k] >>> >>> i += k >>> ............. >>> >>> Both things are executed this way: >>> ... >>> # get the data >>> data = s.recv(BUFFER_SIZE) >>> >>> if s == s_src: >>> d = LOCAL_DATA_HANDLER(data) >>> for chunk in chunks(d, listbytes): >>> #sleep 1.6 seconds before sending the next chunk of data >>> time.sleep(1.6) >>> #send the chunked data >>> s_dst.send(bytes(chunk) ) >>> ... >>> >>> >>> How do I implement *the same exact logic* illustrated here? >>> >>> func (nObj NetObject) RunClient(cmd string) { >>> // Try connection >>> >>> for { >>> conn, err := net.Dial(nObj.Type, nObj.Service) >>> fmt.Print("connect") >>> // msg := "status" >>> if err != nil { >>> fmt.Println("fail") >>> } >>> if err == nil { >>> fmt.Println("ok") >>> // defer conn.Close() >>> defer conn.Close() >>> log.Println("Connected to", conn.RemoteAddr()) >>> handleConn(conn, cmd) >>> >>> >>> //handleConn(conn, cmd) >>> fmt.Println("After handle") >>> } >>> fmt.Println("Before sleep") >>> time.Sleep(5 * time.Second) >>> } >>> >>> } >>> Can you help me please? >>> >> -- You received this message because you are subscribed to the Google Groups "golang-nuts" group. To unsubscribe from this group and stop receiving emails from it, send an email to golang-nuts+unsubscr...@googlegroups.com. To view this discussion on the web visit https://groups.google.com/d/msgid/golang-nuts/f82a73ad-164e-4af5-b183-9d4bf0b54911n%40googlegroups.com.