Я пытаюсь установить простую связь сокета UNIX со службой с помощью GO. Для тестирования я создал такой сокет:
$ nc -vlU /tmp/sock
Bound on /tmp/sock
Listening on /tmp/sock
А в GO я net.Dial
и пытаюсь что-то написать, потом читаю. Я вижу записанные данные в консоли nc
и знаю, что это работает. Но операция net.Conn.Read
кажется неблокирующей и немедленно вернется с нулевой длиной. Из всего, что я прочитал, и из примеров, которые я видел, эта операция должна блокироваться.
buf := make([]byte, 0, 4096)
ctl, err := net.Dial("unix", "/tmp/sock")
for {
ctl.Write([]byte("test write\n"))
n, err := ctl.Read(buf)
fmt.Printf("Len:%v, Data:%v, err:%v", n, buf, err)
}
Я вижу, что соединение установлено и данные записаны ...
Connection received on /tmp/sock
test write
test write
test write
test write
...
Но консоль GO зацикливается без блокировки, сообщая о нулевой длине и отсутствии ошибок.
Len:0, Data:[], err:<nil>
Len:0, Data:[], err:<nil>
Len:0, Data:[], err:<nil>
Len:0, Data:[], err:<nil>
...
И, конечно, если я что-нибудь наберу в консоли nc
, в выводе программы GO ничего интересного не произойдет.
Есть идеи, что я делаю не так?
err
результатRead
? - person Burak Serdar   schedule 20.01.2021nil
. Ошибки нет. Он просто возвращает нулевую длину и без ошибок в цикле. - person sherrellbc   schedule 20.01.2021nc
. Но пока он зацикливается, я продолжаю видеть записанные данные вnc
консоли (если я добавлюnet.Conn.Write
вызов в цикл). Так что соединение остается в силе. Я обновил сообщение, чтобы отразить это. - person sherrellbc   schedule 20.01.2021net.Conn.Read
возвращает ошибку. Но ошибки нет. Чтение не блокируется, и ошибка не возвращается. Я вижу записанные данные в консолиnc
, поэтому соединение действительно, потому что данные проходят. Я просто почему-то ничего не могу читать. - person sherrellbc   schedule 20.01.2021strace
показывает, что сокет открыт как неблокирующий, epoll используется для опроса и никогда не возникаетread
(вероятно, поскольку epoll никогда не возвращается). Таким образом,ctl.Read
, похоже, на самом деле не вызывает чтения, а просто заставляет текущие считываемые данные опрашивать сокет, чего нет. То же самое и с TCP, кстати - person Steffen Ullrich   schedule 20.01.2021