socket网络模型1
需积分: 0 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平台上一种高效处理多连接、多事件的方式,它避免了轮询检查的开销,通过消息机制实现了事件驱动的网络编程。这种模型特别适合于需要同时处理多个客户端连接的服务器应用。

高工-老罗
- 粉丝: 26
最新资源
- 下半年网络工程师试题及答案上午下午.doc
- 高速铁路电力变配电所自动化系统.pptx
- 网站设计规范参考.doc
- 电子与通信工程专业硕士研究生培养方案.doc
- 网络咨询医生培训教材.pptx
- 软件工程导论(第4章).ppt
- 信息化--企业发展新引擎.pptx
- 软件开发文档之详细设计说明书.doc
- 国家开放大学电大《数控加工工艺》《会计学概论》网络课形考网考作业(合集)答案.docx
- 嵌入式系统设计与实例开发.ppt
- 污水处理厂毕业设计包含CAD大图.doc
- 最新国家开放大学电大《工程经济与管理》网络核心课形考网考作业及答案.pdf
- 阈值分割算法研究及其在拉链缺陷检测中的应用.doc
- GIS毕业生就业状况调查报告.docx
- 数字图像处理期末复习题.doc
- unity3d摄像机跟随角色时被物体遮挡解决方案资料.doc