kcp_test.go 2.0 KB

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