Автоматизированное именование локальных датаграммных сокетов AF_UNIX?

В основном, когда вы сериализуете массивы или объекты, вы просто превращаете их в допустимый строковый формат, чтобы вы могли легко хранить их вне сценария php.

  1. Используйте сериализацию, чтобы сохранить состояние объект в базе данных (позволяет взять класс User в качестве примера). Затем unserialize данные для загрузки предыдущего состояния обратно в объект (методы не являются сериализаторами, вам нужно включить класс объектов, чтобы иметь возможность использовать его) персонализация пользователя

Примечание для объекта вы должны использовать методы магии __sleep и __wakeup. __sleep вызывается serialize (). Метод sleep вернет массив значений из объекта, который вы хотите сохранить.

__ wakeup вызывается unserialize (). Метод пробуждения должен принимать неэтериализованные значения и инициализировать их в них в объекте.

Для передачи данных между php и js вы должны использовать json_encode, чтобы превратить php-массив в действительный формат json. Или наоборот: используйте JSON.parese () для преобразования выходных данных (строки) в действительный объект json. Вы хотели бы сделать это, чтобы использовать локальное хранилище. (автономный доступ к данным)

5
задан JB. 18 September 2008 в 19:19
поделиться

3 ответа

Я предполагаю, что Вы запускаете Linux; я не знаю, относится ли этот совет к SunOS или какому-либо UNIX.

Во-первых, ответ: после сокета () и перед подключением () или первый sendto (), попытайтесь добавить этот код:

struct sockaddr_un me;
me.sun_family = AF_UNIX;
int result = bind(fd, (void*)&me, sizeof(short));

Теперь, объяснение: Unix (7) в странице справочника говорится это:

Когда сокет подключен, и он уже не имеет локального адреса, уникальный адрес в абстрактном пространстве имен будет сгенерирован автоматически.

К сожалению, страница справочника находится.

Исследуя исходный код Linux, мы видим, что unix_dgram_connect () только называет unix_autobind (), если SOCK_PASSCRED установлен во флагах сокета. Так как я не знаю то, что SOCK_PASSCRED, и это - теперь 1:00, я должен искать другое решение.

Исследуя unix_bind, я замечаю, что unix_bind называет unix_autobind, если переданный - в размере равен "sizeof (короткий)". Таким образом, решение выше.

Удача и доброе утро.

Ограбить

4
ответ дан 14 December 2019 в 01:21
поделиться

Я не так уверен, что понимаю Ваш вопрос полностью, но вот датаграммная реализация сервера эха, который я просто записал. Вы видите, что сервер отвечает клиенту на том же IP/порте, от которого он был отправлен.

Вот код

Во-первых, сервер (слушатель)

from socket import *
import time
class Listener:
    def __init__(self, port):
        self.port = port
        self.buffer = 102400

    def listen(self):

        sock = socket(AF_INET, SOCK_DGRAM)
        sock.bind(('', self.port))

        while 1:
            data, addr = sock.recvfrom(self.buffer)
            print "Received: " + data
            print "sending to %s" % addr[0]
            print "sending data %s" % data
            time.sleep(0.25)
            #print addr # will tell you what IP address the request came from and port
            sock.sendto(data, (addr[0], addr[1]))
            print "sent"
        sock.close()

if __name__ == "__main__":
    l = Listener(1975)
    l.listen()

И теперь, Клиент (отправитель), который получает ответ от Слушателя

from socket import *
from time import sleep
class Sender:
    def __init__(self, server):
       self.port = 1975
       self.server = server
       self.buffer = 102400

    def sendPacket(self, packet):
        sock = socket(AF_INET, SOCK_DGRAM)
        sock.settimeout(10.75)


        sock.sendto(packet, (self.server, int(self.port)))

        while 1:
            print "waiting for response"
            data, addr = sock.recvfrom(self.buffer)
            sock.close()
            return data



if __name__ == "__main__":
        s = Sender("127.0.0.1")
        response = s.sendPacket("Hello, world!")
        print response
-1
ответ дан 14 December 2019 в 01:21
поделиться

Немного запоздалый ответ, но для тех, кто находит это с помощью Google, как это сделал я. Ответ Роба Адама помог мне получить «настоящий» ответ на этот вопрос: просто используйте set (level SO_SOCKET , см. man 7 unix ), чтобы установить SO_PASSCRED равным 1. Нет необходимости в глупой привязке.

Я использовал это в PHP, но для него не определено SO_PASSCRED (глупый PHP). Тем не менее, он все еще работает, если вы определите его самостоятельно. На моем компьютере он имеет значение 16, и я считаю, что он будет работать вполне переносимо.

1
ответ дан 14 December 2019 в 01:21
поделиться
Другие вопросы по тегам:

Похожие вопросы: