Не могу написать сообщение с помощью sock_seqpacket onge goLinux

Ответить
Anonymous
 Не могу написать сообщение с помощью sock_seqpacket onge go

Сообщение Anonymous »

Я пытаюсь написать простой сервер 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
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Linux»