Я пытаюсь написать простой сервер 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
Не могу написать сообщение с помощью sock_seqpacket onge go ⇐ Linux
-
Anonymous
1746586995
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)
}
}
}
Подробнее здесь: [url]https://stackoverflow.com/questions/79609735/cant-write-message-with-sock-seqpacket-on-go[/url]
Ответить
1 сообщение
• Страница 1 из 1
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия