MFC socket编程-服务端和客户端流程

MFC 提供了一套丰富的类库来简化 Windows 应用程序的网络编程。以下是使用 MFC 进行 socket 编程时服务端和客户端的基本流程:

服务端流程:

  1. 初始化 Winsock

    调用 AfxSocketInit 初始化 Winsock 库。

  2. 创建 CSocketCAsyncSocket 对象

    创建一个 socket 对象用于监听连接。

  3. 绑定地址

    使用 Bind 方法将 socket 绑定到一个本地地址和端口。

  4. 监听连接

    调用 Listen 方法开始监听进入的连接请求。

  5. 接受连接

    使用 Accept 方法接受客户端的连接请求,创建一个新的 socket 用于与客户端通信。

  6. 数据交换

    使用 SendReceive 方法与客户端进行数据交换。

  7. 关闭连接

    使用 Close 方法关闭与客户端的连接。

  8. 清理 Winsock

    调用 WSACleanup 清理 Winsock 库。

客户端流程:

  1. 初始化 Winsock

    同服务端。

  2. 创建 CSocketCAsyncSocket 对象

    创建 socket 对象用于发起连接。

  3. 连接到服务端

    使用 Create 方法创建 socket,并使用 Connect 方法连接到服务端。

  4. 数据交换

    使用 SendReceive 方法与服务端进行数据交换。

  5. 关闭连接

    使用 Close 方法关闭连接。

  6. 清理 Winsock

    同服务端。

示例代码:

服务端示例:
复制代码
// CServerSocket 类
class CServerSocket : public CAsyncSocket
{
public:
    CServerSocket() {
        if (!AfxSocketInit())
            AfxThrowSocketException(WSAEINITIALIZATION_FAILED);
    }

    void StartServer(unsigned short nPort) {
        if (!Bind((SOCKADDR_IN){AF_INET, htons(nPort), INADDR_ANY})) {
            AfxThrowSocketException(WSAGetLastError());
        }
        if (!Listen()) {
            AfxThrowSocketException(WSAGetLastError());
        }
    }

    CAsyncSocket* Accept() {
        CAsyncSocket* pSocket = AcceptEx(m_hSocket, NULL, NULL, NULL, NULL, NULL, NULL);
        if (pSocket) {
            pSocket->SetSockOpt(SO_UPDATE_ACCEPT_CONTEXT, &m_hSocket, sizeof(m_hSocket));
        }
        return pSocket;
    }
};

// 在应用程序中使用
CServerSocket serverSocket;
serverSocket.StartServer(8888);
while (true) {
    CAsyncSocket* clientSocket = serverSocket.Accept();
    // 处理客户端连接...
}
客户端示例:
复制代码
// CClientSocket 类
class CClientSocket : public CAsyncSocket
{
public:
    CClientSocket() {
        if (!AfxSocketInit())
            AfxThrowSocketException(WSAEINITIALIZATION_FAILED);
    }

    void ConnectToServer(const CString& strServer, UINT nPort) {
        SOCKADDR_IN sockAddr = {AF_INET, htons(nPort), inet_addr(strServer)};
        if (!Create() || SOCKET_ERROR == Connect(sockAddr)) {
            AfxThrowSocketException(WSAGetLastError());
        }
    }
};

// 在应用程序中使用
CClientSocket clientSocket;
clientSocket.ConnectToServer("127.0.0.1", 8888);
// 发送和接收数据...
clientSocket.Close();

注意事项:

  • 服务端的 AcceptEx 函数是 Windows 特有的,用于高效地接受大量连接。
  • 客户端示例中使用了 inet_addr 将点分十进制地址转换为网络字节顺序的整数。
  • 错误处理在网络编程中非常重要,示例中省略了详细的错误处理代码。
  • 确保服务器端和客户端的端口号一致,并且服务器端的IP地址正确。

MFC 的网络类库提供了对底层 Winsock API 的封装,使得网络编程变得更加简单和直观。

相关推荐
DARLING Zero two♡18 分钟前
接入 AI Ping 限免接口,让 GLM-4.7 与 MiniMax-M2.1 成为你的免费 C++ 审计专家
开发语言·c++·人工智能
程序喵大人35 分钟前
constexpr
开发语言·c++·constexpr
Larry_Yanan37 分钟前
Qt多进程(五)QUdpSocket
开发语言·c++·qt·学习·ui
冰西瓜6001 小时前
STL——vector
数据结构·c++·算法
闻缺陷则喜何志丹1 小时前
【离线查询 前缀和 二分查找 栈】P12271 [蓝桥杯 2024 国 Python B] 括号与字母|普及+
c++·算法·前缀和·蓝桥杯·二分查找··离线查询
ht巷子1 小时前
Qt:容器类的迭代
开发语言·c++·qt
chamu992 小时前
关于编译-__declspec(dllexport)的使用场景
c++
QQ_4376643142 小时前
C++11并发编程
开发语言·c++
leiming62 小时前
c++ 容器 queue
开发语言·c++
繁星星繁2 小时前
【项目】基于SDK实现的智能聊天助手(使用api接入deepseek)------(二)
c++·设计模式·学习方法