Ignore:
Timestamp:
Mar 19, 2014, 11:31:01 PM (11 years ago)
Author:
dmik
Message:

python: Merge vendor 2.7.6 to trunk.

Location:
python/trunk
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • python/trunk

  • python/trunk/Demo/sockets/mcast.py

    r2 r391  
     1#!/usr/bin/env python
     2#
    13# Send/receive UDP multicast packets.
    24# Requires that your OS kernel supports IP multicast.
    3 # This is built-in on SGI, still optional for most other vendors.
    45#
    56# Usage:
    6 #   mcast -s (sender)
    7 #   mcast -b (sender, using broadcast instead multicast)
    8 #   mcast    (receivers)
     7#   mcast -s (sender, IPv4)
     8#   mcast -s -6 (sender, IPv6)
     9#   mcast    (receivers, IPv4)
     10#   mcast  -6  (receivers, IPv6)
    911
    1012MYPORT = 8123
    11 MYGROUP = '225.0.0.250'
     13MYGROUP_4 = '225.0.0.250'
     14MYGROUP_6 = 'ff15:7079:7468:6f6e:6465:6d6f:6d63:6173'
     15MYTTL = 1 # Increase to reach other networks
    1216
    13 import sys
    1417import time
    1518import struct
    16 from socket import *
     19import socket
     20import sys
     21
     22def main():
     23    group = MYGROUP_6 if "-6" in sys.argv[1:] else MYGROUP_4
     24
     25    if "-s" in sys.argv[1:]:
     26        sender(group)
     27    else:
     28        receiver(group)
    1729
    1830
    19 # Main program
    20 def main():
    21     flags = sys.argv[1:]
    22     #
    23     if flags:
    24         sender(flags[0])
     31def sender(group):
     32    addrinfo = socket.getaddrinfo(group, None)[0]
     33
     34    s = socket.socket(addrinfo[0], socket.SOCK_DGRAM)
     35
     36    # Set Time-to-live (optional)
     37    ttl_bin = struct.pack('@i', MYTTL)
     38    if addrinfo[0] == socket.AF_INET: # IPv4
     39        s.setsockopt(socket.IPPROTO_IP, socket.IP_MULTICAST_TTL, ttl_bin)
    2540    else:
    26         receiver()
     41        s.setsockopt(socket.IPPROTO_IPV6, socket.IPV6_MULTICAST_HOPS, ttl_bin)
    2742
    28 
    29 # Sender subroutine (only one per local area network)
    30 def sender(flag):
    31     s = socket(AF_INET, SOCK_DGRAM)
    32     if flag == '-b':
    33         s.setsockopt(SOL_SOCKET, SO_BROADCAST, 1)
    34         mygroup = '<broadcast>'
    35     else:
    36         mygroup = MYGROUP
    37         ttl = struct.pack('b', 1)               # Time-to-live
    38         s.setsockopt(IPPROTO_IP, IP_MULTICAST_TTL, ttl)
    39     while 1:
     43    while True:
    4044        data = repr(time.time())
    41 ##              data = data + (1400 - len(data)) * '\0'
    42         s.sendto(data, (mygroup, MYPORT))
     45        s.sendto(data + '\0', (addrinfo[4][0], MYPORT))
    4346        time.sleep(1)
    4447
    4548
    46 # Receiver subroutine (as many as you like)
    47 def receiver():
    48     # Open and initialize the socket
    49     s = openmcastsock(MYGROUP, MYPORT)
    50     #
     49def receiver(group):
     50    # Look up multicast group address in name server and find out IP version
     51    addrinfo = socket.getaddrinfo(group, None)[0]
     52
     53    # Create a socket
     54    s = socket.socket(addrinfo[0], socket.SOCK_DGRAM)
     55
     56    # Allow multiple copies of this program on one machine
     57    # (not strictly needed)
     58    s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
     59
     60    # Bind it to the port
     61    s.bind(('', MYPORT))
     62
     63    group_bin = socket.inet_pton(addrinfo[0], addrinfo[4][0])
     64    # Join group
     65    if addrinfo[0] == socket.AF_INET: # IPv4
     66        mreq = group_bin + struct.pack('=I', socket.INADDR_ANY)
     67        s.setsockopt(socket.IPPROTO_IP, socket.IP_ADD_MEMBERSHIP, mreq)
     68    else:
     69        mreq = group_bin + struct.pack('@I', 0)
     70        s.setsockopt(socket.IPPROTO_IPV6, socket.IPV6_JOIN_GROUP, mreq)
     71
    5172    # Loop, printing any data we receive
    52     while 1:
     73    while True:
    5374        data, sender = s.recvfrom(1500)
    5475        while data[-1:] == '\0': data = data[:-1] # Strip trailing \0's
    55         print sender, ':', repr(data)
     76        print (str(sender) + '  ' + repr(data))
    5677
    5778
    58 # Open a UDP socket, bind it to a port and select a multicast group
    59 def openmcastsock(group, port):
    60     # Import modules used only here
    61     import string
    62     import struct
    63     #
    64     # Create a socket
    65     s = socket(AF_INET, SOCK_DGRAM)
    66     #
    67     # Allow multiple copies of this program on one machine
    68     # (not strictly needed)
    69     s.setsockopt(SOL_SOCKET, SO_REUSEADDR, 1)
    70     #
    71     # Bind it to the port
    72     s.bind(('', port))
    73     #
    74     # Look up multicast group address in name server
    75     # (doesn't hurt if it is already in ddd.ddd.ddd.ddd format)
    76     group = gethostbyname(group)
    77     #
    78     # Construct binary group address
    79     bytes = map(int, string.split(group, "."))
    80     grpaddr = 0
    81     for byte in bytes: grpaddr = (grpaddr << 8) | byte
    82     #
    83     # Construct struct mreq from grpaddr and ifaddr
    84     ifaddr = INADDR_ANY
    85     mreq = struct.pack('ll', htonl(grpaddr), htonl(ifaddr))
    86     #
    87     # Add group membership
    88     s.setsockopt(IPPROTO_IP, IP_ADD_MEMBERSHIP, mreq)
    89     #
    90     return s
    91 
    92 
    93 main()
     79if __name__ == '__main__':
     80    main()
Note: See TracChangeset for help on using the changeset viewer.