转至繁体中文版     | 网站首页 | 图文教程 | 资源下载 | 站长博客 | 图片素材 | 武汉seo | 武汉网站优化 | 
最新公告:     敏韬网|教学资源学习资料永久免费分享站!  [mintao  2008年9月2日]        
您现在的位置: 学习笔记 >> 图文教程 >> 软件开发 >> Delphi程序 >> 正文
ServerSocket,ClientSocket控件源码阅读笔记         ★★★★

ServerSocket,ClientSocket控件源码阅读笔记

作者:闵涛 文章来源:闵涛的学习笔记 点击数:6320 更新时间:2009/4/23 18:28:00

ServerSocket,ClientSocket控件源码阅读笔记

 

本篇将通过一次Socket通信操作来对ServerSocket和ClientSocket这两个控件的源码进行一次阅读,希望能理出一个脉络来,以供大家参考。其实说得确切一点,应该是对Scktcomp这个单元进行解读,但由于这个单元的代码太多了,所以不可能面面俱到,我试图以非阻塞式的通信来一步步说明它们是怎么样封装WinSock的API的,至于阻塞式的,在ServerSocket和ClientSocket并不常用,所以这一篇就不打算说了,可能源码中会有一些忽略掉,以后有时间来补一篇阻塞式的阅读吧。虽然现在Delphi已经用Indy控件替换了SS和CS等网络控件,但毕竟这两个控件是对Socket函数进行封装,学习它怎么样封装也好吧。

在这之前,须对WinSock有一个大概的了解,但也仅止大概,对Socket编程有一个总体的掌握行了,毕竟那不是我的能力所及。想要系统一点的学习Socket,可以去网上下WinSocket的中文文档以及参考MSDN。

Socket中分服务端和客户端,它们是怎么样互交的呢,请下面图例:

 

 

图3-1就是我们所说的UDP协议,而图3-2就是TCP协议,如果是用纯API编写,大概程序流程就是那上面那样子,这里将说的是图3-2的面向连接的Socket的应用,因为SS和CS就是封装这种形式的Socket编程的。

以下是说明这个过程中各个函数的声明

在开始使用WinSock的Api的时候,必须加载WinSock Dll的相应版本,这时用到的函数是:

int WSAStartup (
  WORD wVersionRequested
  LPWSADATA lpWSAData  
);

wVersionRequested指定用到的WinSock的最低版本,高字节指定副版本,低字节指定主版本,关于WinSock的版本,详见MSDN。

lpWSAData结构类型,系统把加载进去的版本信息添加到这个结构中。

该函数成功返回0,不成功则返回几个错误代码之一

这个函数和WSACleanup对应,查看MSDN

从MSDN列出一个例子:

WORD wVersionRequested;

WSADATA wsaData;

int err;

 

wVersionRequested = MAKEWORD( 2, 2 );

 

err = WSAStartup( wVersionRequested, &wsaData );

if ( err != 0 ) {

    /* Tell the user that we could not find a usable */

    /* WinSock DLL.                                  */

    return;

}

调用上面的函数之后,就可以用下面的函数来创建一个Socket了,Socket是WinSock定义的数据类型(整数),相当于句柄,用于标识系统中的每一个Socket连接

SOCKET socket (
  int af,       
  int type,     
  int protocol  
);

Af协议标志,Internet协议族的标志是PINET。

Type 协议类型志,SOCISTREAM表明是面向连接的字节流类型,SOCIDGRAM表明是面向无连接的数据报类型。

Protocol Socket采用的协议类型,如果采用IPPROTO_TCP常数就是采用了TCP协议。

如果调用失败,会返回INVALID_SOCKET值,正常的Socket取值范围是1~INVALID_SOCKET-1;

下面的函数将Socket与特定的主机进行绑定:

int bind (
  SOCKET s,                          
  const struct sockaddr FAR*  name
  int namelen                        
);

S就是一个Socket,由Socket()函数返回得到的。

Name是sockaddr结构的变量

Namelen是Name结构的长度。

如果函数调用成功,将返回0,如果不成功,将返回SOCKET_ERROR,可以从WSAGetLastError.函数获得错误代码。

现在说sockaddr这个结构,在Winsock中其实有两个功能相似的结构,它们是:

struct sockaddr {

        u_short    sa_family;

        char       sa_data[14];

};

struct sockaddr_in {

        short   sin_family;

        u_short sin_port;

        struct  in_addr sin_addr;

        char    sin_zero[8];

};

这两个结构在Delphi中被声明为一个变体记录,这两个指定通信的本地主机地址,本地协议端口,另外还有通信过程中使用的协议类型。

其中:sin_family规定了哪个协议用来实现套按字连接。WinSock必须设置常数AF_INET

sin_port;:WinSock应用程序使用的端口号

sin_addr:这个是32位IP地址

sin_zero[8];这个保留,没有使用。

Server端必须调用Bind()函数,设计时可以将地址设定为INADDR_ANY,这样WinSock会自动加入机器正确的地址.

以下是客户端向服务端连接时调用的函数

int connect (
  SOCKET s,                &nbs

[1] [2] [3] [4] [5] [6] [7] [8] [9]  下一页


没有相关教程
教程录入:mintao    责任编辑:mintao 
  • 上一篇教程:

  • 下一篇教程:
  • 【字体: 】【发表评论】【加入收藏】【告诉好友】【打印此文】【关闭窗口
      注:本站部分文章源于互联网,版权归原作者所有!如有侵权,请原作者与本站联系,本站将立即删除! 本站文章除特别注明外均可转载,但需注明出处! [MinTao学以致用网]
      网友评论:(只显示最新10条。评论内容只代表网友观点,与本站立场无关!)

    同类栏目
    · C语言系列  · VB.NET程序
    · JAVA开发  · Delphi程序
    · 脚本语言
    更多内容
    热门推荐 更多内容
  • 没有教程
  • 赞助链接
    更多内容
    闵涛博文 更多关于武汉SEO的内容
    500 - 内部服务器错误。

    500 - 内部服务器错误。

    您查找的资源存在问题,因而无法显示。

    | 设为首页 |加入收藏 | 联系站长 | 友情链接 | 版权申明 | 广告服务
    MinTao学以致用网

    Copyright @ 2007-2012 敏韬网(敏而好学,文韬武略--MinTao.Net)(学习笔记) Inc All Rights Reserved.
    闵涛 投放广告、内容合作请Q我! E_mail:admin@mintao.net(欢迎提供学习资源)

    站长:MinTao ICP备案号:鄂ICP备11006601号-18

    闵涛站盟:医药大全-武穴网A打造BCD……
    咸宁网络警察报警平台