加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

在C#中伪造TCP请求

发布时间:2020-12-15 03:54:04 所属栏目:百科 来源:网络整理
导读:我的n00b服务器的一部分: TcpClient client = tcpListener.AcceptTcpClient();Thread clientThread = new Thread(new ParameterizedThreadStart(handleClientRegistration));clientThread.Start(client);...//and in the clientThread we wait for databyte
我的n00b服务器的一部分:
TcpClient client = tcpListener.AcceptTcpClient();
Thread clientThread = new Thread(new ParameterizedThreadStart(handleClientRegistration));
clientThread.Start(client);
...
//and in the clientThread we wait for data
bytesRead = clientStream.Read(message,4096);

现在我想为这个片段编写单元测试.我想伪造客户端连接,传递任意数据并检查服务器如何处理它.

在C#中怎么做?

编辑:
我想要模拟的是连接本身 – 我想避免网络连接.

解决方法

它不是一个单元测试,如果它正在监听一个套接字.
包装客户端和薄层,并与模拟工作.这样你可以伪造所有收到的数据.

例如.模拟插座(简化示例):

使用您需要的所有方法创建一个接口ISocket

public interface ISocket
{
    ISocket Accept( int port );
    byte[] Receive( int numberOfBytes );
    bool Send( byte[] data );
    void Disconnect();
    bool Connect( string address,int port );
}

现在创建一个具体的类TcpSocket实现ISocket:

public class TcpSocket : ISocket
{
    private Socket socket;
    public TcpSocket()
    {
        socket = new Socket( AddressFamily.InterNetwork,SocketType.Stream,ProtocolType.Tcp );
    }

    // implement all methods of ISocket by delegating to the internal socket
}

无论您通常使用System.Net.Sockets.Socket,请改用ISocket.当您需要新建一个Socket时,请使用TcpSocket.如果您在系统的内心深处创建套接字,您可能需要创建工厂,而不是直接更新TcpSocket.在测试之前,您可以传递不同的实现的ISocket(Mock)(可能通过工厂创建).您可以通过创建一个名为MockSocket的第二个实现来实现自己的模拟,这个实现可以在Receive中返回测试数据,也可以使用无数的模拟框架来实现.

public class MockSocket : ISocket
{
     private byte[] testData;
     public void SetTestData(byte[] data)
     {
         testData = data;
     }

     public byte[] Receive(int numberOfBytes)
     {
         return testData;
     }

     // you need to implement all members of ISocket ofcourse...
}

这可能看起来很费劲,但除了玩具系统之外,边界api应该隐藏在薄层之后,不仅用于测试,而且还要保持灵活性.例如,如果要使用更强大的套接字库,而不是使用System.Net.Socket,则可以使TcpSocket无需在您自己的代码中更改每个使用的套接字.这也是为什么编程到界面而不是编程到具体实现的原因通常是一个好主意:您可以轻松地切换实现(但这并不意味着您应该为所有类创建接口).如果这一切都让您感到困惑,您可以阅读更多关于嘲笑的信息(如:http://en.wikipedia.org/wiki/Mock_object)

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读