当前位置:首页 » 编程博文
开发技术指南» 文章正文
    引言: 一、简介 Windows Sockets 是从 Berkeley Sockets 扩展而来的,其在继承 Berkeley Sockets 的基础上,又进行了新的扩充。
 

 

    摘要: 动态链接库的数据 dll可以包含全局数据及局部数据变量范围dll变量的默认范围与应用程序所声明的变量作用域相同,dll源文件中的全局变量对于使用dll的每个进程是全部可见的。静态变量受限于声明所在块范畴。默认情况下,每个进程具有自己的dll全局变量及静态变量实例。  你所使用的开发工具可能会允许你超越默认的全局及静态变量范围。更多信息参见开发工具相关文档。 动态内存分配   当dll用内存分配函......
 ·tomcat和jk2的安装配置    »显示摘要«
    摘要:jdk的安装第一步:直接运行 j2sdk1_4_2-win.exe,一路回车安装,我这里默认的安装路径为d:\jdk第二步:配置环境变量在我的电脑上点击鼠标右键-属性-点选高级-点选环境变量弹出环境变量对话框,新建以下变量名和值:-------------------------------------变量名:path变量值:.;d:\jdk\bin;d:\jdk;d:\webgui\apache......


Windows Socket1.1 程序设计
一.简介

【程序编程相关:[Eclipse CON 2005摘录]

【推荐阅读:VB指针,VB API编程

  windows sockets 是从 berkeley sockets 扩展而来的,其在继承 berkeley sockets 的基础上,又进行了新的扩充.这些扩充主要是提供了一些异步函数,并增加了符合windows消息驱动特性的网络事件异步选择机制. 【扩展信息:使用sql的一些tip

  windows sockets由两部分组成:开发组件与运行组件.

  开发组件:windows sockets 实现文档.应用程序接口(api)引入库与一些头文件.

  运行组件:windows sockets 应用程序接口的动态链接库(winsock.dll).

  二.主要扩充说明

  1.异步选择机制:

  windows sockets 的异步选择函数提供了消息机制的网络事件选择,当使用它登记网络事件发生时,应用程序相应窗口函数将收到一个消息,消息中指示了发生的网络事件,以及与事件相关的一些信息.

  windows sockets 提供了一个异步选择函数 wsaasyncselect(),用它来注册应用程序感兴趣的网络事件,当这些事件发生时,应用程序相应的窗口函数将收到一个消息.

  函数结构如下:

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.阻塞处理方法

  windows sockets 为了实现当一个应用程序的套接字调用处于阻塞时,能够放弃cpu让其它应用程序运行,它在调用处于阻塞时便进入一个叫“hook”的例程,此例程负责接收与分配windows消息,使得其它应用程序仍然能够接收到自己的消息并取得控制权.

  windows 是非抢先的多任务环境,即若一个程序不主动放弃其控制权,别的程序就不能执行.因此在设计windows sockets 程序时,尽管系统支持阻塞操作,但还是反对程序员使用该操作.但由于 sun 公司下的 berkeley sockets 的套接字默认操作是阻塞的,windows 作为移植的 sockets 也不可避免对这个操作支持.

  在windows sockets 实现中,对于不能立即完成的阻塞操作做如下处理:dll初始化→循环操作.在循环中,它发送任何 windows 消息,并检查这个 windows sockets 调用是否完成,在必要时,它可以放弃cpu让其它应用程序执行(当然使用超线程的cpu就不会有这个麻烦了^_^).我们可以调用 wsacancelblockingcall() 函数取消此阻塞操作.

  在 windows sockets 中,有一个默认的阻塞处理例程 blockinghook() 简单地获取并发送 windows 消息.如果要对复杂程序进行处理,windows sockets 中还有 wsasetblockinghook() 提供用户安装自己的阻塞处理例程能力;与该函数相对应的则是 swaunhookblockinghook(),它用于删除先前安装的任何阻塞处理例程,并重新安装默认的处理例程.请注意,设计自己的阻塞处理例程时,除了函数 wsacancelblockinghook() 之外,它不能使用其它的 windows sockets api 函数.在处理例程中调用 wsacancelblockinghook()函数将取消处于阻塞的操作,它将结束阻塞循环.

  4.出错处理

  windows sockets 为了与以后多线程环境(windows/unix)兼容,它提供了两个出错处理函数来获取与设置当前线程的最近错误号.(wsagetlasteror()与wsasetlasterror())

  5.启动与终止

  使用函数 wsastartup() 与 wsacleanup() 启动与终止套接字.

三.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.异步数据传输

  使用 send() 或 sendto() 函数来发送数据,使用 recv() 或recvfrom() 来接收数据.windows sockets 不鼓励用户使用阻塞方式传输数据,因为那样可能会阻塞整个 windows 环境.下面我们看一个异步数据传输实例:

  假设套接字 s 在连接建立后,已经使用了函数 wsaasyncselect() 在其上注册了网络事件 fd_read 与 fd_write,并且 wmsg 值为 um_sock,那么我们可以在 windows 消息循环中增加如下的分支语句:

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.出错处理


...   下一页
 ·配置win2003+apache+php+mysql    »显示摘要«
    摘要: 第一点: apache & mysql的安装没有什么要说的,基本采取next 一路下去就可以了。我的apache 安装目录是d:\webgui\apache2; 注意的地方是:httpd.conf 中添加: # for php# loadfile "d:/webgui/apache2/bin/php5ts.dll"loadmodule php5_module modu......
» 本期热门文章:

©2000-2007 All Rights Reserved. 最佳浏览:1024X768 MSIE