kcp_test.go 2.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101
  1. package kcp_test
  2. import (
  3. "crypto/rand"
  4. "io"
  5. "net"
  6. "sync"
  7. "testing"
  8. "time"
  9. v2net "v2ray.com/core/common/net"
  10. "v2ray.com/core/common/serial"
  11. "v2ray.com/core/testing/assert"
  12. "v2ray.com/core/transport/internet"
  13. . "v2ray.com/core/transport/internet/kcp"
  14. )
  15. func TestDialAndListen(t *testing.T) {
  16. assert := assert.On(t)
  17. listerner, err := NewListener(v2net.LocalHostIP, v2net.Port(0), internet.ListenOptions{
  18. Stream: &internet.StreamConfig{
  19. Network: v2net.Network_KCP,
  20. NetworkSettings: []*internet.NetworkSettings{
  21. {
  22. Network: v2net.Network_KCP,
  23. Settings: serial.ToTypedMessage(&Config{}),
  24. },
  25. },
  26. },
  27. })
  28. assert.Error(err).IsNil()
  29. port := v2net.Port(listerner.Addr().(*net.UDPAddr).Port)
  30. go func() {
  31. for {
  32. conn, err := listerner.Accept()
  33. if err != nil {
  34. break
  35. }
  36. go func() {
  37. payload := make([]byte, 4096)
  38. for {
  39. nBytes, err := conn.Read(payload)
  40. if err != nil {
  41. break
  42. }
  43. for idx, b := range payload[:nBytes] {
  44. payload[idx] = b ^ 'c'
  45. }
  46. conn.Write(payload[:nBytes])
  47. }
  48. conn.Close()
  49. }()
  50. }
  51. }()
  52. wg := new(sync.WaitGroup)
  53. for i := 0; i < 10; i++ {
  54. clientConn, err := DialKCP(v2net.LocalHostIP, v2net.UDPDestination(v2net.LocalHostIP, port), internet.DialerOptions{
  55. Stream: &internet.StreamConfig{
  56. Network: v2net.Network_KCP,
  57. NetworkSettings: []*internet.NetworkSettings{
  58. {
  59. Network: v2net.Network_KCP,
  60. Settings: serial.ToTypedMessage(&Config{}),
  61. },
  62. },
  63. },
  64. })
  65. assert.Error(err).IsNil()
  66. wg.Add(1)
  67. go func() {
  68. clientSend := make([]byte, 1024*1024)
  69. rand.Read(clientSend)
  70. go clientConn.Write(clientSend)
  71. clientReceived := make([]byte, 1024*1024)
  72. nBytes, _ := io.ReadFull(clientConn, clientReceived)
  73. assert.Int(nBytes).Equals(len(clientReceived))
  74. clientConn.Close()
  75. clientExpected := make([]byte, 1024*1024)
  76. for idx, b := range clientSend {
  77. clientExpected[idx] = b ^ 'c'
  78. }
  79. assert.Bytes(clientReceived).Equals(clientExpected)
  80. wg.Done()
  81. }()
  82. }
  83. wg.Wait()
  84. for i := 0; i < 60 && listerner.ActiveConnections() > 0; i++ {
  85. time.Sleep(500 * time.Millisecond)
  86. }
  87. assert.Int(listerner.ActiveConnections()).Equals(0)
  88. listerner.Close()
  89. }