В основном, когда вы сериализуете массивы или объекты, вы просто превращаете их в допустимый строковый формат, чтобы вы могли легко хранить их вне сценария php.
Примечание для объекта вы должны использовать методы магии __sleep и __wakeup. __sleep вызывается serialize (). Метод sleep вернет массив значений из объекта, который вы хотите сохранить.
__ wakeup вызывается unserialize (). Метод пробуждения должен принимать неэтериализованные значения и инициализировать их в них в объекте.
Для передачи данных между php и js вы должны использовать json_encode, чтобы превратить php-массив в действительный формат json. Или наоборот: используйте JSON.parese () для преобразования выходных данных (строки) в действительный объект json. Вы хотели бы сделать это, чтобы использовать локальное хранилище. (автономный доступ к данным)
Я предполагаю, что Вы запускаете 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 (короткий)". Таким образом, решение выше.
Удача и доброе утро.
Ограбить
Я не так уверен, что понимаю Ваш вопрос полностью, но вот датаграммная реализация сервера эха, который я просто записал. Вы видите, что сервер отвечает клиенту на том же 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
Немного запоздалый ответ, но для тех, кто находит это с помощью Google, как это сделал я. Ответ Роба Адама помог мне получить «настоящий» ответ на этот вопрос: просто используйте set (level SO_SOCKET
, см. man 7 unix
), чтобы установить SO_PASSCRED
равным 1. Нет необходимости в глупой привязке.
Я использовал это в PHP, но для него не определено SO_PASSCRED
(глупый PHP). Тем не менее, он все еще работает, если вы определите его самостоятельно. На моем компьютере он имеет значение 16, и я считаю, что он будет работать вполне переносимо.