Ignore:
Timestamp:
Mar 19, 2014, 11:11:30 AM (11 years ago)
Author:
dmik
Message:

python: Update vendor to 2.7.6.

Location:
python/vendor/current/Demo/sockets
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • python/vendor/current/Demo/sockets/README

    r2 r388  
    66ftp.py                  A very simple ftp client.
    77gopher.py               A simple gopher client.
     8mcast.py                IPv4/v6 multicast example
    89radio.py                Receive time broadcasts from broadcast.py.
    910telnet.py               Client for the 'telnet' protocol.
     
    1213unixserver.py           Unix socket example, server side
    1314udpecho.py              Client and server for the UDP echo protocol.
    14 
    15 The following file is only relevant on SGI machines (or other systems
    16 that support multicast):
    17 
    18 mcast.py                A Python translation of
    19                         /usr/people/4Dgifts/examples/network/mcast.c
    20                         (Note that IN.py is in ../../lib/sgi.)
    21 
  • python/vendor/current/Demo/sockets/mcast.py

    r2 r388  
     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.