Я пытаюсь написать простой сервер Unix domain socket sock_seqpacket ("unixpacket" in go) с Go. Неверный аргумент < /code>.
С другой стороны, чтение данных из клиента работает правильно. < /p>
Этот код, работающий на Arch Linux.package main
import (
"fmt"
"log"
"net"
"os"
"syscall"
)
func main() {
buf := make([]byte, 1024)
oobbuf := make([]byte, 1024)
os.Remove("/tmp/myunixdomain")
unixaddr := &net.UnixAddr{Name: "/tmp/myunixdomain", Net: "unixpacket"}
server_sock, err := net.ListenUnix("unixpacket", unixaddr)
if err != nil {
log.Fatal("server_sock", err)
}
log.Println(server_sock.Addr().Network(), server_sock.Addr().String())
defer server_sock.Close()
for {
conn, err := server_sock.AcceptUnix()
if err != nil {
log.Println("accept", err)
continue
}
defer conn.Close()
go func() {
write_buffer := make([]byte, 1024, 1024)
oob_buffer := make([]byte, 1024, 1024)
f, _ := conn.File()
fd := f.Fd()
sa, err := syscall.Getsockname(int(fd))
if err != nil {
log.Println("Getsockname", sa)
return
}
for {
os.Stdin.Read(write_buffer)
err := syscall.Sendmsg(int(fd), write_buffer, oob_buffer, sa, syscall.MSG_MORE) // the error happen at this line.
if err != nil {
log.Println("write", err)
return
}
}
}()
for {
n, oobn, flags, _, err := conn.ReadMsgUnix(buf, oobbuf)
if err != nil {
log.Println("read", err)
conn.Close()
break
}
fmt.Println(string(buf[:n]), string(oobbuf[:oobn]), flags)
}
}
}
< /code>
Клиентский код: < /p>
package main
import (
"log"
"net"
"os"
"syscall"
)
func main() {
for {
buffer := make([]byte, 1024, 1024)
conn, err := net.DialUnix("unixpacket", nil, &net.UnixAddr{Name: "/tmp/myunixdomain", Net: "unixpacket"})
if err != nil {
log.Println("connect", err)
continue
}
go func() {
readbuffer := make([]byte, 1024, 1024)
oobbuffer := make([]byte, 1024, 1024)
for {
_, oobn, flags, _, err := conn.ReadMsgUnix(readbuffer, oobbuffer)
if err != nil {
log.Println("read", err)
return
}
if (flags & syscall.MSG_EOR) != 0 {
log.Println("Msg look like end")
}
log.Println(string(readbuffer))
}
}()
for {
os.Stdin.Read(buffer)
_, _, err := conn.WriteMsgUnix(buffer, []byte{'d', 'u', 'm', 'm', 'y'}, &net.UnixAddr{Net: "unixpacket", Name: "/tmp/myunixdomain"})
if err != nil {
log.Println("write", err)
conn.Close()
break
}
buffer = make([]byte, 1024, 1024)
}
}
}
Подробнее здесь: https://stackoverflow.com/questions/796 ... cket-on-go