代码之家  ›  专栏  ›  技术社区  ›  JB.

自动命名af-unix本地数据报套接字?

  •  5
  • JB.  · 技术社区  · 16 年前

    我正在通过Unix本地套接字(af_Unix地址系列,即 非UDP )服务器被绑定到一个公共地址,它可以接收请求。不幸的是,在回答问题时, sendto 除非客户端也被绑定,否则将失败。(常见的错误是 Transport endpoint is not connected )

    绑定到某个随机名称(基于文件系统或抽象名称)可以工作。但我想避免:我是谁来保证我选的名字不会冲突?

    Unix Sockets的流模式文档告诉我们将在 connect 如果他们还没有时间的话。这种特性是否适用于面向数据报的套接字?

    4 回复  |  直到 16 年前
        1
  •  4
  •   Robᵩ    16 年前

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

    unix(7)

    Linux source code

    unix_bind

        2
  •  5
  •   CapnBry    13 年前

    unix(7)

    struct sockaddr_un me;
    const char name[] = "\0myabstractsocket";
    me.sun_family = AF_UNIX;
    // size-1 because abstract socket names are not null terminated
    memcpy(me.sun_path, name, sizeof(name) - 1);
    int result = bind(fd, (void*)&me, sizeof(me.sun_family) + sizeof(name) - 1);
    

        3
  •  1
  •   sth    15 年前

    SO_SOCKET man 7 unix SO_PASSCRED

        4
  •  -1
  •   Nick Stinemates    16 年前

    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