symbian-qemu-0.9.1-12/python-2.6.1/Demo/sockets/mcast.py
changeset 1 2fb8b9db1c86
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/symbian-qemu-0.9.1-12/python-2.6.1/Demo/sockets/mcast.py	Fri Jul 31 15:01:17 2009 +0100
@@ -0,0 +1,93 @@
+# Send/receive UDP multicast packets.
+# Requires that your OS kernel supports IP multicast.
+# This is built-in on SGI, still optional for most other vendors.
+#
+# Usage:
+#   mcast -s (sender)
+#   mcast -b (sender, using broadcast instead multicast)
+#   mcast    (receivers)
+
+MYPORT = 8123
+MYGROUP = '225.0.0.250'
+
+import sys
+import time
+import struct
+from socket import *
+
+
+# Main program
+def main():
+    flags = sys.argv[1:]
+    #
+    if flags:
+        sender(flags[0])
+    else:
+        receiver()
+
+
+# Sender subroutine (only one per local area network)
+def sender(flag):
+    s = socket(AF_INET, SOCK_DGRAM)
+    if flag == '-b':
+        s.setsockopt(SOL_SOCKET, SO_BROADCAST, 1)
+        mygroup = '<broadcast>'
+    else:
+        mygroup = MYGROUP
+        ttl = struct.pack('b', 1)               # Time-to-live
+        s.setsockopt(IPPROTO_IP, IP_MULTICAST_TTL, ttl)
+    while 1:
+        data = repr(time.time())
+##              data = data + (1400 - len(data)) * '\0'
+        s.sendto(data, (mygroup, MYPORT))
+        time.sleep(1)
+
+
+# Receiver subroutine (as many as you like)
+def receiver():
+    # Open and initialize the socket
+    s = openmcastsock(MYGROUP, MYPORT)
+    #
+    # Loop, printing any data we receive
+    while 1:
+        data, sender = s.recvfrom(1500)
+        while data[-1:] == '\0': data = data[:-1] # Strip trailing \0's
+        print sender, ':', repr(data)
+
+
+# Open a UDP socket, bind it to a port and select a multicast group
+def openmcastsock(group, port):
+    # Import modules used only here
+    import string
+    import struct
+    #
+    # Create a socket
+    s = socket(AF_INET, SOCK_DGRAM)
+    #
+    # Allow multiple copies of this program on one machine
+    # (not strictly needed)
+    s.setsockopt(SOL_SOCKET, SO_REUSEADDR, 1)
+    #
+    # Bind it to the port
+    s.bind(('', port))
+    #
+    # Look up multicast group address in name server
+    # (doesn't hurt if it is already in ddd.ddd.ddd.ddd format)
+    group = gethostbyname(group)
+    #
+    # Construct binary group address
+    bytes = map(int, string.split(group, "."))
+    grpaddr = 0
+    for byte in bytes: grpaddr = (grpaddr << 8) | byte
+    #
+    # Construct struct mreq from grpaddr and ifaddr
+    ifaddr = INADDR_ANY
+    mreq = struct.pack('ll', htonl(grpaddr), htonl(ifaddr))
+    #
+    # Add group membership
+    s.setsockopt(IPPROTO_IP, IP_ADD_MEMBERSHIP, mreq)
+    #
+    return s
+
+
+main()