Windows Sockets 网络编程(三) —— WINDOWS SOCKETS 1.1 程序设计 一、简介
int PASCAL FAR WSAAsyncSelect(SOCKET s,HWND hWnd,unsigned int wMsg,long lEvent);参数说明: hWnd:窗口句柄 wMsg:需要发送的消息 lEvent:事件(以下为事件的内容) 值: 含义: FD_READ 期望在套接字上收到数据(即读准备好)时接到通知 FD_WRITE 期望在套接字上可发送数据(即写准备好)时接到通知 FD_OOB 期望在套接字上有带外数据到达时接到通知 FD_ACCEPT 期望在套接字上有外来连接时接到通知 FD_CONNECT 期望在套接字连接建立完成时接到通知 FD_CLOSE 期望在套接字关闭时接到通知 例如:我们要在套接字读准备好或写准备好时接到通知,语句如下: rc=WSAAsyncSelect(s,hWnd,wMsg,FD_READ|FD_WRITE);如果我们需要注销对套接字网络事件的消息发送,只要将 lEvent 设置为0 2、异步请求函数 在 Berkeley Sockets 中请求服务是阻塞的,WINDOWS SICKETS 除了支持这一类函数外,还增加了相应的异步请求函数(WSAAsyncGetXByY();)。 3、阻塞处理方法 4、出错处理 5、启动与终止 三、WINDOWS SOCKETS 网络程序设计核心 我们终于可以开始真正的 WINDOWS SOCKETS 网络程序设计了。不过我们还是先看一看每个 WINDOWS SOCKETS 网络程序都要涉及的内容。让我们一步步慢慢走。 1、启动与终止 在所有 WINDOWS SOCKETS 函数中,只有启动函数 WSAStartup() 和终止函数 WSACleanup() 是必须使用的。 启动函数必须是第一个使用的函数,而且它允许指定 WINDOWS SOCKETS API 的版本,并获得 SOCKETS的特定的一些技术细节。本结构如下: int PASCAL FAR WSAStartup(WORD wVersionRequested, LPWSADATA lpWSAData);其中 wVersionRequested 保证 SOCKETS 可正常运行的 DLL 版本,如果不支持,则返回错误信息。 我们看一下下面这段代码,看一下如何进行 WSAStartup() 的调用 WORD wVersionRequested;// 定义版本信息变量 WSADATA wsaData;//定义数据信息变量 int err;//定义错误号变量 wVersionRequested = MAKEWORD(1,1);//给版本信息赋值 err = WSAStartup(wVersionRequested, &wsaData);//给错误信息赋值 if(err!=0) { return;//告诉用户找不到合适的版本 } //确认 WINDOWS SOCKETS DLL 支持 1.1 版本 //DLL 版本可以高于 1.1 //系统返回的版本号始终是最低要求的 1.1,即应用程序与DLL 中可支持的最低版本号 if(LOBYTE(wsaData.wVersion)!= 1|| HIBYTE(wsaData.wVersion)!=1) { WSACleanup();//告诉用户找不到合适的版本 return; } //WINDOWS SOCKETS DLL 被进程接受,可以进入下一步操作关闭函数使用时,任何打开并已连接的 SOCK_STREAM 套接字被复位,但那些已由 closesocket() 函数关闭的但仍有未发送数据的套接字不受影响,未发送的数据仍将被发送。程序运行时可能会多次调用 WSAStartuo() 函数,但必须保证每次调用时的 wVersionRequested 的值是相同的。 2、异步请求服务 WINDOWS SOCKETS 除支持 Berkeley Sockets 中同步请求,还增加了了一类异步请求服务函数 WSAAsyncGerXByY()。该函数是阻塞请求函数的异步版本。应用程序调用它时,由 WINDOWS SOCKETS DLL 初始化这一操作并返回调用者,此函数返回一个异步句柄,用来标识这个操作。当结果存储在调用者提供的缓冲区,并且发送一个消息到应用程序相应窗口。常用结构如下: HANDLE taskHnd; char hostname="rs6000"; taskHnd = WSAAsyncBetHostByName(hWnd,wMsg,hostname,buf,buflen);需要注意的是,由于 Windows 的内存对像可以设置为可移动和可丢弃,因此在操作内存对象是,必须保证 WIindows Sockets DLL 对象是可用的。 3、异步数据传输 case UM_SOCK: switch(lParam) { case FD_READ: len = recv(wParam,lpBuffer,length,0); break; case FD_WRITE: while(send(wParam,lpBuffer,len,0)!=SOCKET_ERROR) break; } break;4、出错处理 Windows 提供了一个函数来获取最近的错误码 WSAGetLastError(),推荐的编写方式如下: len = send (s,lpBuffer,len,0); of((len==SOCKET_ERROR)&&(WSAGetLastError()==WSAWOULDBLOCK)){...} |
Windows Sockets 网络编程(三)
最新推荐文章于 2023-03-08 16:28:17 发布
来源:
http://www.vckbase.com/document/viewdoc/?id=536