gpt4 book ai didi

c++ - C++中面向对象的客户端套接字应用程序设计

转载 作者:行者123 更新时间:2023-11-30 04:26:59 24 4
gpt4 key购买 nike

几周前我开始了 Windows 套接字编程。

到目前为止,我已经创建了一个 C 风格的客户端应用程序(基于 IOCP),它与 VC++ 2010 中的联网硬件设备进行通信。该应用程序通过 LAN 或串行端口与设备(充当服务器)进行异步通信:

  • 创建套接字/或串口句柄
  • 连接到服务器
  • 构建 std::vector 类型的命令(例如,登录命令)
  • 通过套接字或串口发送命令
  • 通过套接字或串口接收响应
  • 断开与服务器的连接

现在我想让我现有的客户端应用程序更加面向对象,并且我提出了以下类层次结构(省略了参数):

class IClient
{
public:
virtual bool Connect() = 0;
virtual bool Disconnect() = 0;
virtual bool Send() = 0;
virtual bool Receive() = 0;
...
};

class Client : public IClient
{
public:
Client();
virtual ~Client();

virtual bool Connect() = 0;
virtual bool Disconnect() = 0;
virtual bool Send() = 0;
virtual bool Receive() = 0;
...

private:
std::string m_strConnectionSettings; // IP address, port number etc
};

class SerialClient : public Client
{
public:
bool Connect()
{
...
m_hPort = CreateFile(_T("COM3"), GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, 0, NULL);
...
}

bool Disconnect()
{
...
CloseHandle(m_hPort);
...
}

bool Send()
{
...
WriteFile(m_hPort, (LPCVOID)(&vecByteData[0]), vecByteData.size(), &dwNumberOfBytesWritten, NULL);
...
}

bool Receive()
{
...
ReadFile(m_hPort, (LPVOID)&vecBuffer[0], vecBuffer.size(), &dwNumberOfBytesRead, NULL);
...
}
...

private:
HANDLE m_hPort; // Handle returned by CreateFile().
DCM m_dcb;
};

class SocketClient : public Client
{
public:
SocketClient();
virtual ~SocketClient();

virtual bool Connect() = 0;
virtual bool Disconnect() = 0;
virtual bool Send() = 0;
virtual bool Receive() = 0;
...

private:
SOCKET m_socket; // Handle returned by WSASocket().
};

class TcpClient : public SocketClient
{
public:
TcpClient();
~TcpClient();

bool Connect()
{
...
WSAConnect(m_sock, (LPSOCKADDR)&server, sizeof(server), NULL, NULL, NULL, NULL);
...
}

bool Disconnect()
{
...
closesocket(m_sock);
...
}

bool Send()
{
...
WSASend(m_sock, ...);
...
}

bool Receive()
{
...
WSARecv(m_sock, ...);
...
}
...
};

class UdpClient : public SocketClient
{
public:
UdpClient();
~UdpClient();

bool Connect();
bool Disconnect();
bool Send();
bool Receive();
...
};

然而,我对计算机网络的了解仍然很初级,所以我发现很难将计算机网络概念转化为 C++ 设计。比如上面的设计,我不知道“Port”是从哪里来的。如果我有“Port”类和“Socket”类,那么“Port”类中会包含“Socket”类还是相反或废话?

如果您能就上述设计给我一些反馈,我将不胜感激。

  • 我简要了解了 Boost.Asio,了解它的设计方式。
  • 抱歉,如果我的问题含糊不清。

最佳答案

典型的套接字抽象模型

  • socket,服务器端的东西
  • 客户端,在服务器端建模的东西(一个套接字有多个客户端)
  • 连接,以客户端为模型

通常,端口号是服务器上 socket.listen 方法的一部分和客户端上 connection.connect 方法的一部分

同IP地址

关于c++ - C++中面向对象的客户端套接字应用程序设计,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11197645/

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