socket网络模型1

preview
需积分: 0 1 下载量 96 浏览量 更新于2022-08-03 收藏 746KB PDF 举报
【网络编程中的Socket模型】 在计算机网络编程中,Socket是一种通信接口,用于实现不同网络间的进程间通信。本文主要讨论的是基于Windows系统的一种异步I/O模型——WSAAsyncSelect模型,它允许应用程序通过Windows消息机制来处理网络事件。 ### 1. 阻塞与非阻塞模式 在传统的Socket编程中,`recv()`函数调用通常会阻塞,即当套接字无数据可读时,该函数会等待,直到有数据到来才返回。这种方式在单线程环境下可能导致主线程被长时间占用,无法处理其他任务。为解决这个问题,可以将套接字设置为非阻塞模式,通过`ioctlsocket()`函数实现: ```c ioctlsocket(s, FIOBIO, (unsigned long *)&ul); ``` 非阻塞模式下,`recv()`函数会立即返回,无论套接字是否有数据可读。然而,这需要程序员自行管理多个套接字的检查,通常通过轮询方式,判断每个套接字是否有数据到达。 ### 2. select()函数 `select()`函数是解决多路复用I/O问题的一个关键工具。它可以监控多个套接字,检查它们的可读、可写或异常状态,并在有事件发生时阻塞,直到超时或有事件发生。`select()`函数的使用方式如下: ```c int select( int nfds, // 监控的文件描述符集的最大值+1 fd_set *readfds, // 检查套接字可读性 fd_set *writefds, // 检查套接字可写性 fd_set *exceptfds, // 检查套接字异常 const struct timeval *timeout // 超时时间 ); ``` `fd_set`是一个位集合,可以包含多个套接字,通过`FD_*`系列宏来管理: - `FD_ZERO()`清空集合。 - `FD_SET()`将套接字添加到集合。 - `FD_CLR()`从集合中移除套接字。 - `FD_ISSET()`检查套接字是否在集合中。 ### 3. WSAAsyncSelect模型 在Windows平台上,WSAAsyncSelect提供了一种更方便的异步I/O模型。它允许应用程序通过注册窗口消息来接收网络事件,而无需轮询。使用`WSAAsyncSelect()`函数,可以将套接字关联到一个窗口句柄,并指定一组网络事件,当这些事件发生时,系统会发送消息到指定窗口。 ```c WSAAsyncSelect( SOCKET s, // 套接字 HWND hWnd, // 窗口句柄 UINT uMsg, // 消息ID long lEvent // 事件掩码 ); ``` 例如,可以注册一个消息ID,当有数据可读时,系统会发送该消息到指定窗口,让应用程序处理读取操作。 ### 4. 示例代码 以下是一个简单的服务器端示例,创建了一个监听套接字并启动一个工作线程来处理客户端连接: ```c // 主函数 int main() { // 初始化Windows套接字库 WSAStartup(0x0202, &wsaData); // 创建监听套接字 sListen = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); // 绑定地址和端口 local.sin_addr.S_un.S_addr = htonl(INADDR_ANY); local.sin_family = AF_INET; local.sin_port = htons(PORT); bind(sListen, (struct sockaddr*)&local, sizeof(SOCKADDR_IN)); // 监听 listen(sListen, 3); // 创建工作线程 CreateThread(NULL, 0, WorkerThread, NULL, 0, &dwThreadId); // 接受客户端连接并添加到客户端套接字数组 while (TRUE) { sClient = accept(sListen, (struct sockaddr*)&client, &iaddrSize); printf("Accepted client:%s:%d\n", inet_ntoa(client.sin_addr), ntohs(client.sin_port)); g_CliSocketArr[g_iTotalConn++] = sClient; } } ``` 工作线程`WorkerThread`通常会负责处理`select()`或`WSAAsyncSelect`,根据收到的消息来处理读写操作。 总结来说,Socket模型中的异步选择(WSAAsyncSelect)模型是Windows平台上一种高效处理多连接、多事件的方式,它避免了轮询检查的开销,通过消息机制实现了事件驱动的网络编程。这种模型特别适合于需要同时处理多个客户端连接的服务器应用。
身份认证 购VIP最低享 7 折!
30元优惠券