package door import ( "fmt" "log" "strings" "sync/atomic" "syscall" ) func Writer(d *Door) { var handle syscall.Handle = syscall.Handle(d.Config.Comm_handle) // handle syscall.Handle, writerChannel *chan string log.Println("Writer") defer d.wg.Done() for { select { case <-d.closeChannel: close(d.writerChannel) log.Println("~Writer") return default: } select { case <-d.closeChannel: close(d.writerChannel) log.Println("~Writer") return case output, ok := <-d.writerChannel: if !ok { log.Println("closeChannel") if !d.Disconnect() { atomic.StoreInt32(&d.Disconnected, 1) } log.Println("~Writer") return } else { if strings.HasSuffix(output, RestorePos) { output += Color(d.LastColor...) } else { d.UpdateLastColor(output, &d.LastColor) } var l uint32 = uint32(len(output)) var buffer []byte = []byte(output) WSA_Buffer := syscall.WSABuf{Len: uint32(l), Buf: &buffer[0]} var UitnZero_1 uint32 = uint32(0) var DataWrite uint32 = uint32(0) var err error err = syscall.WSASend(handle, &WSA_Buffer, 1, &DataWrite, UitnZero_1, nil, nil) if err != nil { fmt.Printf("write: %d bytes, error: %#v\n", DataWrite, err) } if (err != nil) || (l != DataWrite) { log.Println("CloseChannel") if !d.Disconnect() { atomic.StoreInt32(&d.Disconnected, 1) close(d.writerChannel) } log.Println("~Writer") return } } } } /* for output := range *writerChannel { l := uint32(len(output)) buffer := []byte(output) WSA_Buffer := syscall.WSABuf{Len: uint32(l), Buf: &buffer[0]} UitnZero_1 := uint32(0) DataWrite := uint32(0) err := syscall.WSASend(handle, &WSA_Buffer, 1, &DataWrite, UitnZero_1, nil, nil) if err != nil { fmt.Printf("write: %d bytes, error: %#v\n", DataWrite, err) } if (err != nil) || (l != DataWrite) { close(*writerChannel) break } } */ }