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

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

服务端流程:

  1. 初始化 Winsock :

    调用 AfxSocketInit 初始化 Winsock 库。

  2. 创建 CSocket 或 CAsyncSocket 对象 :

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

  3. 绑定地址 :

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

  4. 监听连接 :

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

  5. 接受连接 :

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

  6. 数据交换 :

    使用 Send 和 Receive 方法与客户端进行数据交换。

  7. 关闭连接 :

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

  8. 清理 Winsock :

    调用 WSACleanup 清理 Winsock 库。

客户端流程:

  1. 初始化 Winsock :

    同服务端。

  2. 创建 CSocket 或 CAsyncSocket 对象 :

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

  3. 连接到服务端 :

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

  4. 数据交换 :

    使用 Send 和 Receive 方法与服务端进行数据交换。

  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 的封装,使得网络编程变得更加简单和直观。

相关推荐
xiaoye-duck1 小时前
《C++ 项目:手写大模型接入 SDK》DataManager数据管理模块:SQLite持久化存储
开发语言·数据库·c++·sqlite
是main不是漫2 小时前
【C++——类和对象(上)】筑基篇:以封装奠定面向对象之基
c语言·开发语言·c++
小七在进步13 小时前
string的使用(1)
c++·visual studio
白杨尚青14 小时前
C++进阶篇(六):map 和 set 的模拟实现——用红黑树封装 mymap/myset(迭代器 + operator[])
开发语言·c++·迭代器·stl·set·map·红黑树
kloc17 小时前
聊天室项目入口网关子服务的实现
linux·c++
csdn_aspnet20 小时前
C++ 3个有序点的方向(Orientation of 3 ordered points)
c++·算法
小七在进步21 小时前
string的使用(2)
c++
青少儿编程课堂21 小时前
蓝桥杯·全国青少年信息素养大赛·电子学会Python/C++考级:折半搜索优化子集枚举(Meet in the Middle)解析
c++·python·算法·bfs·信息学竞赛
wo_jack1 天前
C++ 入门笔记(十七):list 入门 —— 为什么 list 不能 sort?
数据结构·c++·面试·stl·list
青少儿编程课堂1 天前
蓝桥杯青少组图形化 + 全国青少年信息素养大赛 + 电子学会Scratch考级:校园连连看解析
c++·python·算法·bfs·信息学竞赛