LINUX.ORG.RU

Ответ на: Тупишь от linuxfan

А как отправить ответ в питоне? :) В качестве адреса recvfrom возвращает None. Попытка просто кинуть в сокет данные возвращает «Transport endpoint is not connected».

true_admin ★★★★★
() автор топика

Мда, изучил примеры на сях, там recv_from возвращает адрес AF_UNIX(если верить strace :) ). Обидно, на этот раз питон меня подводит. А я так любил прототипчики на нём писать....

true_admin ★★★★★
() автор топика
Ответ на: комментарий от baverman

Мда, strace выявил проблемы, sa_family=AF_UNSPEC.

На всякий случай код сервера такой:

import socket,os

s = socket.socket(socket.AF_UNIX, socket.SOCK_DGRAM)
try:
    os.remove("/tmp/socketname")
except OSError:
    pass
s.bind("/tmp/socketname")
print(s.recvfrom(1000))

Или я какую-то фигню очевидную забыл или уже много лет присутствует баг. Буду думать.

Ну и код клиента:

import socket

s = socket.socket(socket.AF_UNIX, socket.SOCK_DGRAM)
s.connect("/tmp/socketname")
s.send('Hello, world')

data = s.recv(1024)
s.close()
print 'Received', repr(data)

true_admin ★★★★★
() автор топика
Ответ на: комментарий от true_admin

>Попытка просто кинуть в сокет данные возвращает «Transport endpoint is not connected».

Ты пытаешься писать в сокет, на котором делал listen, а не на полученном из accept сокете. Это вроде единственное объяснение.

(увидел твой код ниже) Так и есть. socket -> bind -> listen -> accept и только в сокет, полученный из accept можно писать.

linuxfan
()
Ответ на: комментарий от baverman

йопрст, хочешь сказать что клиент должен адрес тоже sendto юзать? Фак, не понимаю как это сделать на питоне...

true_admin ★★★★★
() автор топика
Ответ на: комментарий от true_admin

Как-то так:

import socket 
 
server = socket.socket(socket.AF_UNIX, socket.SOCK_DGRAM)

s = socket.socket(socket.AF_UNIX, socket.SOCK_DGRAM) 
s.bind('/tmp/client_socket')

s.sendto('Hello, world', '/tmp/socketname') 
baverman ★★★
()
Ответ на: комментарий от baverman

Любопытно. Это создаёт ещё один сокет. Впрочем, логично, для connection-less протоколов с обоих концов должен быть выполнен bind(). Спасибо за подсказку.

true_admin ★★★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.