Created
November 11, 2014 12:06
-
-
Save mkozjak/0256c74c872780efb243 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
package main | |
import ( | |
_ "code.google.com/p/gcfg" | |
"code.google.com/p/go.net/ipv4" | |
_ "encoding/json" | |
"fmt" | |
_ "io/ioutil" | |
"net" | |
_ "net/http" | |
"os" | |
"strconv" | |
_ "time" | |
) | |
func main() { | |
iface, err := net.InterfaceByName("eth0") | |
if err != nil { | |
fmt.Println("net.InterfaceByName failed") | |
return | |
} | |
mcast := "232.50.100.1" | |
port := "3001" | |
b1, _ := strconv.Atoi(mcast[0:3]) | |
b2, _ := strconv.Atoi(mcast[4:6]) | |
b3, _ := strconv.Atoi(mcast[7:10]) | |
b4, _ := strconv.Atoi(mcast[11:]) | |
group := net.IPv4(byte(b1), byte(b2), byte(b3), byte(b4)) | |
localSock, err := net.ListenPacket("udp4", mcast+":"+port) | |
if err != nil { | |
fmt.Println("net.ListenPacket failed") | |
return | |
} | |
defer localSock.Close() | |
pktSock := ipv4.NewPacketConn(localSock) | |
if err := pktSock.SetControlMessage(ipv4.FlagDst, true); err != nil { | |
fmt.Println("pktSock.SetControlMessage failed") | |
return | |
} | |
if err := pktSock.JoinGroup(iface, &net.UDPAddr{IP: group}); err != nil { | |
fmt.Println("Failed to join mcast!") | |
return | |
} | |
file, err := os.OpenFile("/home/mkozjak/file", os.O_CREATE|os.O_TRUNC|os.O_WRONLY, 0600) | |
if err != nil { | |
fmt.Println("error opening file for appending") | |
} | |
defer file.Close() | |
pktSock.SetMulticastInterface(iface) | |
for { | |
pkt := make([]byte, 1500) | |
n, cmsg, _, err := pktSock.ReadFrom(pkt) | |
if err != nil { | |
fmt.Println("pktSock.ReadFrom failed") | |
return | |
} | |
// Check if created packet buffer is too large and slice it if needed | |
if len(pkt) > n { | |
newPkt := make([]byte, n) | |
copy(newPkt, pkt) | |
pkt = newPkt | |
} | |
// Slice off udp header | |
pkt = pkt[12:] | |
// Store file | |
if cmsg.Dst.IsMulticast() { | |
if cmsg.Dst.Equal(group) { | |
_, err := file.Write(pkt) | |
if err != nil { | |
fmt.Println("error writing to file") | |
return | |
} | |
} else { | |
continue | |
} | |
} | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment