diff --git a/ipv4/readwrite_test.go b/ipv4/readwrite_test.go
index a2384b8..3896a8a 100644
--- a/ipv4/readwrite_test.go
+++ b/ipv4/readwrite_test.go
@@ -16,77 +16,47 @@
 	"golang.org/x/net/ipv4"
 )
 
-func benchmarkUDPListener() (net.PacketConn, net.Addr, error) {
-	c, err := net.ListenPacket("udp4", "127.0.0.1:0")
+func BenchmarkReadWriteUnicast(b *testing.B) {
+	c, err := nettest.NewLocalPacketListener("udp4")
 	if err != nil {
-		return nil, nil, err
-	}
-	dst, err := net.ResolveUDPAddr("udp4", c.LocalAddr().String())
-	if err != nil {
-		c.Close()
-		return nil, nil, err
-	}
-	return c, dst, nil
-}
-
-func BenchmarkReadWriteNetUDP(b *testing.B) {
-	c, dst, err := benchmarkUDPListener()
-	if err != nil {
-		b.Fatal(err)
+		b.Skipf("not supported on %s/%s: %v", runtime.GOOS, runtime.GOARCH, err)
 	}
 	defer c.Close()
 
+	dst := c.LocalAddr()
 	wb, rb := []byte("HELLO-R-U-THERE"), make([]byte, 128)
-	b.ResetTimer()
-	for i := 0; i < b.N; i++ {
-		benchmarkReadWriteNetUDP(b, c, wb, rb, dst)
-	}
-}
 
-func benchmarkReadWriteNetUDP(b *testing.B, c net.PacketConn, wb, rb []byte, dst net.Addr) {
-	if _, err := c.WriteTo(wb, dst); err != nil {
-		b.Fatal(err)
-	}
-	if _, _, err := c.ReadFrom(rb); err != nil {
-		b.Fatal(err)
-	}
-}
+	b.Run("NetUDP", func(b *testing.B) {
+		for i := 0; i < b.N; i++ {
+			if _, err := c.WriteTo(wb, dst); err != nil {
+				b.Fatal(err)
+			}
+			if _, _, err := c.ReadFrom(rb); err != nil {
+				b.Fatal(err)
+			}
+		}
+	})
+	b.Run("IPv4UDP", func(b *testing.B) {
+		p := ipv4.NewPacketConn(c)
+		cf := ipv4.FlagTTL | ipv4.FlagInterface
+		if err := p.SetControlMessage(cf, true); err != nil {
+			b.Fatal(err)
+		}
+		cm := ipv4.ControlMessage{TTL: 1}
+		ifi := nettest.RoutedInterface("ip4", net.FlagUp|net.FlagLoopback)
+		if ifi != nil {
+			cm.IfIndex = ifi.Index
+		}
 
-func BenchmarkReadWriteIPv4UDP(b *testing.B) {
-	c, dst, err := benchmarkUDPListener()
-	if err != nil {
-		b.Fatal(err)
-	}
-	defer c.Close()
-
-	p := ipv4.NewPacketConn(c)
-	defer p.Close()
-	cf := ipv4.FlagTTL | ipv4.FlagInterface
-	if err := p.SetControlMessage(cf, true); err != nil {
-		b.Fatal(err)
-	}
-	ifi := nettest.RoutedInterface("ip4", net.FlagUp|net.FlagLoopback)
-
-	wb, rb := []byte("HELLO-R-U-THERE"), make([]byte, 128)
-	b.ResetTimer()
-	for i := 0; i < b.N; i++ {
-		benchmarkReadWriteIPv4UDP(b, p, wb, rb, dst, ifi)
-	}
-}
-
-func benchmarkReadWriteIPv4UDP(b *testing.B, p *ipv4.PacketConn, wb, rb []byte, dst net.Addr, ifi *net.Interface) {
-	cm := ipv4.ControlMessage{TTL: 1}
-	if ifi != nil {
-		cm.IfIndex = ifi.Index
-	}
-	if n, err := p.WriteTo(wb, &cm, dst); err != nil {
-		b.Fatal(err)
-	} else if n != len(wb) {
-		b.Fatalf("got %v; want %v", n, len(wb))
-	}
-	if _, _, _, err := p.ReadFrom(rb); err != nil {
-		b.Fatal(err)
-	}
+		for i := 0; i < b.N; i++ {
+			if _, err := p.WriteTo(wb, &cm, dst); err != nil {
+				b.Fatal(err)
+			}
+			if _, _, _, err := p.ReadFrom(rb); err != nil {
+				b.Fatal(err)
+			}
+		}
+	})
 }
 
 func TestPacketConnConcurrentReadWriteUnicastUDP(t *testing.T) {
@@ -95,7 +65,7 @@
 		t.Skipf("not supported on %s", runtime.GOOS)
 	}
 
-	c, err := net.ListenPacket("udp4", "127.0.0.1:0")
+	c, err := nettest.NewLocalPacketListener("udp4")
 	if err != nil {
 		t.Fatal(err)
 	}
@@ -103,11 +73,7 @@
 	p := ipv4.NewPacketConn(c)
 	defer p.Close()
 
-	dst, err := net.ResolveUDPAddr("udp4", c.LocalAddr().String())
-	if err != nil {
-		t.Fatal(err)
-	}
-
+	dst := c.LocalAddr()
 	ifi := nettest.RoutedInterface("ip4", net.FlagUp|net.FlagLoopback)
 	cf := ipv4.FlagTTL | ipv4.FlagSrc | ipv4.FlagDst | ipv4.FlagInterface
 	wb := []byte("HELLO-R-U-THERE")
@@ -152,7 +118,7 @@
 			t.Error(err)
 			return
 		} else if n != len(wb) {
-			t.Errorf("short write: %v", n)
+			t.Errorf("got %d; want %d", n, len(wb))
 			return
 		}
 	}
diff --git a/ipv4/unicast_test.go b/ipv4/unicast_test.go
index bce8763..02c089f 100644
--- a/ipv4/unicast_test.go
+++ b/ipv4/unicast_test.go
@@ -28,18 +28,15 @@
 		t.Skipf("not available on %s", runtime.GOOS)
 	}
 
-	c, err := net.ListenPacket("udp4", "127.0.0.1:0")
+	c, err := nettest.NewLocalPacketListener("udp4")
 	if err != nil {
 		t.Fatal(err)
 	}
 	defer c.Close()
-
-	dst, err := net.ResolveUDPAddr("udp4", c.LocalAddr().String())
-	if err != nil {
-		t.Fatal(err)
-	}
 	p := ipv4.NewPacketConn(c)
 	defer p.Close()
+
+	dst := c.LocalAddr()
 	cf := ipv4.FlagTTL | ipv4.FlagDst | ipv4.FlagInterface
 	wb := []byte("HELLO-R-U-THERE")
 
