Ответ 1
Я бы, вероятно, издевался над ним, работая через интерфейс сокета (т.е. базовый класс) и реализуя тестовую версию этого базового класса.
Вы можете сделать это несколькими способами, например, проще всего указать весь API сокета в терминах интерфейса С++.
class ISocket
{
public:
virtual int socket(int domain, int type, int protocol) = 0;
virtual int bind(int sockfd...) = 0;
// listen, accept, write, etc
};
Затем укажите конкретную реализацию, которая работала через библиотеку сокетов BSD
class CBsdSocketLib : public ISocket
{
public:
// yadda, same stuff but actually call the BSD socket interface
};
class CTestSocketLib : public ISocket
{
public:
// simulate the socket library
};
Кодируя по интерфейсу, вы можете создать свою тестовую версию, чтобы делать все, что вам нравится.
Однако мы можем ясно видеть, что этот первый проход довольно странный. Мы обертываем целую библиотеку, это не класс, в том смысле, что он описывает объекты.
Вам лучше подумать о розелях и способах создания сокетов. Это было бы более объектно-ориентированным. Вдоль этих строк я разделил бы функциональность выше на два класса.
// responsible for socket creation/construction
class ISocketFactory
{
virtual ISocket* createSocket(...) = 0; // perform socket() and maybe bind()
};
// a socket
class ISocket
{
// pure virtual recv, send, listen, close, etc
};
Для живого использования:
class CBsdSocketFactory : public ISocketFactory
{
...
};
class CBsdSocket : public ISocket
{
...
};
Для тестирования:
class CTestSocketFactory : public ISocketFactory
{
};
class CTestSocket : public ISocket
{
};
И отделите вызовы библиотеки BSD на эти два разных класса, которые имеют свои собственные обязанности.