Changeset 388 for python/vendor/current/Demo/sockets
- Timestamp:
- Mar 19, 2014, 11:11:30 AM (11 years ago)
- Location:
- python/vendor/current/Demo/sockets
- Files:
-
- 2 edited
Legend:
- Unmodified
- Added
- Removed
-
python/vendor/current/Demo/sockets/README
r2 r388 6 6 ftp.py A very simple ftp client. 7 7 gopher.py A simple gopher client. 8 mcast.py IPv4/v6 multicast example 8 9 radio.py Receive time broadcasts from broadcast.py. 9 10 telnet.py Client for the 'telnet' protocol. … … 12 13 unixserver.py Unix socket example, server side 13 14 udpecho.py Client and server for the UDP echo protocol. 14 15 The following file is only relevant on SGI machines (or other systems16 that support multicast):17 18 mcast.py A Python translation of19 /usr/people/4Dgifts/examples/network/mcast.c20 (Note that IN.py is in ../../lib/sgi.)21 -
python/vendor/current/Demo/sockets/mcast.py
r2 r388 1 #!/usr/bin/env python 2 # 1 3 # Send/receive UDP multicast packets. 2 4 # Requires that your OS kernel supports IP multicast. 3 # This is built-in on SGI, still optional for most other vendors.4 5 # 5 6 # 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) 9 11 10 12 MYPORT = 8123 11 MYGROUP = '225.0.0.250' 13 MYGROUP_4 = '225.0.0.250' 14 MYGROUP_6 = 'ff15:7079:7468:6f6e:6465:6d6f:6d63:6173' 15 MYTTL = 1 # Increase to reach other networks 12 16 13 import sys14 17 import time 15 18 import struct 16 from socket import * 19 import socket 20 import sys 21 22 def 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) 17 29 18 30 19 # Main program 20 def main(): 21 flags = sys.argv[1:] 22 # 23 if flags: 24 sender(flags[0]) 31 def 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) 25 40 else: 26 receiver()41 s.setsockopt(socket.IPPROTO_IPV6, socket.IPV6_MULTICAST_HOPS, ttl_bin) 27 42 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: 40 44 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)) 43 46 time.sleep(1) 44 47 45 48 46 # Receiver subroutine (as many as you like) 47 def receiver(): 48 # Open and initialize the socket 49 s = openmcastsock(MYGROUP, MYPORT) 50 # 49 def 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 51 72 # Loop, printing any data we receive 52 while 1:73 while True: 53 74 data, sender = s.recvfrom(1500) 54 75 while data[-1:] == '\0': data = data[:-1] # Strip trailing \0's 55 print sender, ':', repr(data)76 print (str(sender) + ' ' + repr(data)) 56 77 57 78 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() 79 if __name__ == '__main__': 80 main()
Note:
See TracChangeset
for help on using the changeset viewer.