WindowsSocket基本概念.doc_第1页
WindowsSocket基本概念.doc_第2页
WindowsSocket基本概念.doc_第3页
WindowsSocket基本概念.doc_第4页
WindowsSocket基本概念.doc_第5页
已阅读5页,还剩1页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

曹老师课件tcp ip-3.ppt 第四帧开始Windows Socket 基本概念二、SOCKET 基本概念 (套接口)用户目前可以使用三种套接口,即流套接口、数据报套接口和原始套接口。首先我们看看在Windows系统中三种类型套接口是怎样定义的: #define SOCK_STREAM 1 #define SOCK_DGRAM 2 #define SOCK_RAW 3 流套接口提供了双向的,有序的,无重复并且无记录边界的数据流服务。 数据报套接口支持双向的数据流,但并不保证是可靠,有序,无重复的。就是说,一个从数据报套接口接收信息的进程有可能发现信息重复了,或者和发出时的顺序不同。 数据报套接口的一个重要特点是它保留了记录边界。对于这一特点,数据报套接口采用了与现在许多包交换网络(例如以太网)非常类似的模型。由于数据报套接字是无联接的,例如广播时的联接,所以并不保证接收端是否正在侦听。 原始套接口保存了数据包中的完整IP头,前面两种套接字只能收到用户数据。因此可以通过原始套接字对数据进行分析。 如果系统需要对IP数据报进行分析,就需要采用这种方式三、字节顺序问题 (Windows Socket 书上Page 25)在不同的计算机系统中,可能采用不同的字节序列存储数据。一种称为Little-Endian,此种在Intel 体系结构中采用。另一种称为 Big-Endian,此种在Macintosh 体系结构中采用。在计算机中把IP地址和端口号指定为多字节数字时,这个数就按照“主机字节(host-byte)”顺序表示,也就是little-endian 顺序但是在网络上指定IP地址和端口号,这个数必须按照“big-endian”形式来表示,也就是“网络字节(network-byte)”。htonl()函数和htons()函数实现从主机字节顺序转换为网络字节顺序的功能,其中“h”代表主机,“to”代表转换,“n”代表“net”,“l”代表“long”,“s”代表“short”。ntohl()函数和ntohs()函数实现从网络字节顺序转换为主机字节顺序的功能。四、错误处理 (曹老师课件tcp ip-3.ppt 第九帧)在UNIX中所有句柄包括套接口句柄,都是非负的短整数。Windows Sockets句柄则没有这一限制,除了INVALID_SOCKET 不是一个有效的套接口外,套接口可以取从0到INVALID_SOCKET-1 之间的任意值。所以检查在socket()和accept()函数返回值时,检查是否有错误发生就不应该使用把返回值和-1比较的方法,或判断返回值是否为负。取而代之的是,一个应用程序应该使用常量INVALID_SOCKET,该常量已在WINSOCK.H中定义。 常量SOCKET_ERROR是被用来检查Windows API调用失败的。虽然对这一常量的使用并不是强制性的,错误代码可以使用WSAGetLastError()调用得到。但是要注意:使用Windows宏和定义的常量时,必须在对SOCK初始化之后 WSAStartup()才可以使用。 七、地址和地址操作函数(曹老师课件tcp ip-3.ppt 第十七帧 书上Page 55)在Socket 编程过程中,经常会碰到3种类型的套接字地址结构。这分别是INET协议簇地址结构,IPV4地址结构和通用地址结构。1、INET协议簇地址结构 sockaddr_in结构 struct sockaddr_in short sin_family; u_short sin_port; struct in_addr sin_addr; char sin_zero8;sin _family 为网络地址类型,必须设定为AF_INET,以告知Windows Sockets 应用程序使用IP地址家族sin_port 为服务端口,注意不要使用已固定的服务端口,如HTTP的端口80等。如果端口设置为0,则系统会自动分配一个唯一端口。sin_addr 为一个unsigned long的IP地址。sin_zero 为填充字段,纯粹用来保证结构的大小,使之与SOCKADDR结构大小相同。2、IPV4地址结构-in_addrStruct in_addr union struct u_char s_b1,s_b2,s_b3,s_b4; S_un_b; struct u_short s_w1,s_w2; S_un_w; u_long S_addr; S_un;#define s_addr S_un.S_addr3、通用地址结构Sockaddr地址结构:struct sockaddr u_short sa_family;/* address family */ char sa_data14; /* up to 14 bytes of direct address */; 八、套接字的使用步骤 (曹老师课件tcp ip-3.ppt 第二十二帧 书上Page26)1、启动Winsock 对Winsock DLL进行初始化,协商Winsock的版本支持并分配必要的资源。 int WSAStartup( WORD wVersionRequested, LPWSADATA lpWSAData ) 2、面向的连接套接口应用程序流程描述 2.1、创建套接字SOCKET socket( int af, int type, int protocol );Af 为网络地址类型,一般为AF_INET,表示在 Internet域中使用。type为套接字类型,前面已经介绍过的三种类型。protocol为指定网络协议,一般为IPPROTO_IP。 2.2、套接字的绑定。将本地地址绑定到所创建的套接字上。int bind( SOCKET s, const struct sockaddr FAR * name, int namelen ) s 为已经创建的套接字。name 为socket地址结构,为sockaddr结构,一般使用sockaddr_in结构,在使用再强制转换为sockaddr结构。namelen 为地址结构的长度。 2.3、套接字的监听。 int listen(SOCKET s, int backlog ) s为一个已绑定但未联接的套接字。Backlog 为指定正在等待联接的最大队列长度,这个参数非常重要,因为服务器一般可以提供多个连接。 2.4、套接字等待连接。 SOCKET accept( SOCKET s, struct sockaddr FAR * addr , int FAR * addrlen )s为处于监听模式的套接字。addr为接收成功后返回客户端的网络地址。addrlen为网络地址的长度。 2.5、套接字的连结。int connect(SOCKET s, const struct sockaddr FAR * name, int namelen )该函数将两个套接字连结起来准备通信。 s为欲连结的已创建的套接字。 name为欲连结的socket地址。 namelen为socket地址的结构的长度。 2.6、套接字发送数据。 int send(SOCKET s, const char FAR * buf, int len, int flags ) s为服务器端监听的套接字。 buf为欲发送数据缓冲区的指针。 len为发送数据缓冲区的长度。 flags为数据发送标记。返回值为发送数据的字符数。 2.7、 套接字的数据接收 int recv( SOCKET s, char FAR * buf, int len, int flags ) s为准备接收数据的套接字。 buf为准备接收数据的缓冲区。 len为准备接收数据缓冲区的大小。 flags为数据接收标记。 2.8、 关闭套接字 int closesocket( SOCKET s ) 释放所占有的资源。 2.9 读取当前错误值 int WSAGetLastError(void ); 每次发生错误时,如果要对具体问题进行处理,那么就应该调用这个函数取得错误代码。 PS:原始套接字n 网络程序的两种套接字SOCK_STREAM, SOCK_DRAGM n 原始套接字(SOCK_RAW). 应用原始套接字, 可以编写出由TCP和UDP套接字不能够实现的功能.n int sock(AF_INET,SOCK_RAW,protocol) n 可以创建一个原始套接字.根据协议的类型不同我们可以创建不同类型的原始套接字 比:IPPROTO_ICMP,IPPROTO_TCP,IPPROTO_UDP等等.九、套接字选项 l 设置套接字选项l int setsockopt( SOCKET s, int level, int

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论