gpt4 book ai didi

c# - 在 C# 中伪造 TCP 请求

转载 作者:太空狗 更新时间:2023-10-29 17:33:24 24 4
gpt4 key购买 nike

我的 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, 0, 4096);

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

我应该如何在 C# 中执行此操作?

编辑:
我想模拟的是连接本身 - 我想避免网络连接。

最佳答案

如果它正在监听套接字,则不是单元测试。用一个薄层包裹客户端并使用模拟来代替。这样你就可以伪造你想要的所有接收到的数据。

例如模拟套接字(简化示例):

使用您需要的所有方法创建接口(interface) ISocket:

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

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

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。当您需要新建一个套接字时,请使用 TcpSocket。如果您在系统内部深处创建套接字,您可能希望创建一个工厂而不是直接新建一个 TcpSocket。在测试中,您可以传递 ISocket(模拟)的不同实现(可能通过工厂创建)。您可以通过创建一个名为 MockSocket 的 ISocket 的第二个实现来实现您自己的模拟,它在 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 都应该隐藏在一个薄层后面,这不仅是为了测试,也是为了保持灵 active 。例如,如果您想使用更强大的套接字库而不是 System.Net.Socket,您可以让 TcpSocket 使用它,而无需在您自己的代码中更改套接字的每次使用。这也是为什么对接口(interface)编程而不是对具体实现编程通常是一个好主意的原因:您可以轻松切换实现(但这并不意味着您应该为所有类创建接口(interface))。如果这一切让你感到困惑,你可以阅读更多关于模拟的内容(比如这里:http://en.wikipedia.org/wiki/Mock_object)

关于c# - 在 C# 中伪造 TCP 请求,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9999341/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com