好文档就是一把金锄头!
欢迎来到金锄头文库![会员中心]
电子文档交易市场
安卓APP | ios版本
电子文档交易市场
安卓APP | ios版本

套接字编程.ppt

44页
  • 卖家[上传人]:灯火****19
  • 文档编号:150471904
  • 上传时间:2020-11-06
  • 文档格式:PPT
  • 文档大小:68KB
  • / 44 举报 版权申诉 马上下载
  • 文本预览
  • 下载提示
  • 常见问题
    • 套接字编程,,Socket简介,80年代初,人们在UNIX操作系统下实现TCP/IP协议 研究人员为TCP/IP网络通信开发了一个API(应用程序接口) 这个API称为Socket接口(套接字) SOCKET接口是TCP/IP网络最为通用的API,也是在INTERNET上进行应用开发最为通用的APISocket简介,90年代初,Microsoft联合了其他几家公司共同制定了一套WINDOWS下的网络编程接口,即WindowsSockets规范 增加了一些异步函数,并增加了符合Windows消息驱动特性的网络事件异步选择机制 WINDOWSSOCKETS规范是一套开放的、支持多种协议的Windows下的网络编程接口 从1991年的1.0版到1995年的2.0.8版,经过不断完善并在Intel、Microsoft、Sun、SGI、Informix、Novell等公司的全力支持下,已成为Windows网络编程的事实上的标准 在实际应用中的WINDOWSSOKCETS规范主要有1.1版和2.0版 两者的最重要区别是1.1版只支持TCP/IP协议,而2.0版可以支持多协议 2.0版有良好的向后兼容性,任何使用1.1版的源代码,二进制文件,应用程序都可以不加修改地在2.0规范下使用。

      Socket简介,SOCKET实际在计算机中提供了一个通信端口,可以通过这个端口与任何一个具有SOCKET接口的计算机通信 应用程序在网络上传输,接收的信息都通过这个SOCKET接口来实现 在应用开发中就像使用文件句柄一样,可以对SOCKET句柄进行读,写操作Socket的机制是什么,简单的把Socket理解为一个可以连通网络上不同计算机程序之间的管道,把一堆数据从管道的A端扔进去,则会从管道的B端(也许同时还可以从C、D、E、F端冒出来) 管道的端口由两个因素来唯一确认,即机器的IP地址和程序所使用的端口号 端口号就是程序员指定的一个数字,如:http的80端口和ftp的21端口 建议大家自己写程序不要使用太小的端口号,它们一般被系统占用了,也不要使用一些著名的端口,一般来说使用10005000之内的端口比较好Socket的机制是什么,Socket可以支持数据的发送和接收 它定义一种称为套接字的变量,发送数据时首先创建套接字,然后使用该套接字的sendto等方法对准某个IP/端口进行数据发送 接收端也首先创建套接字,然后将该套接字绑定到一个IP/端口上,所有发向此端口的数据会被该套接字的recv等函数读出。

      如同读出文件中的数据一样所需的头文件、库文件和DLL,最广泛的Windows Socket2.0版本,所需的一些文件如下(以安装了VC6为例说明其物理位置): (1)头文件winsock2.h,通常处于C:“Program Files”Microsoft Visual Studio“VC98”INCLUDE;查看该头文件可知其中又包含了windows.h和pshpack4.h头文件,因此在windows中的一些常用API都可以使用 (2)库文件Ws2_32.lib,通常处于C:Program FilesMicrosoft Visual StudioVC98Lib; (3)DLL文件Ws2_32.dll,通常处于C:WINDOWSsystem32编写Socket程序需要的编程基础,(1)C++语法; (2)一点windows SDK的基础,了解一些SDK的数据类型与API的调用方式; (3)一点编译、链接和执行的技术UDP,所谓UDP,就是发送出去就不管的一种网络协议 UDP编程的发送端只管发送就可以了,不用检查网络连接状态 下面用例1来说明怎样编写UDP,并会详细解释每个API和数据类型。

      SOCKET类型,SOCKET是socket套接字类型,在WINSOCK2.H中有如下定义: typedef unsigned int u_int; typedef u_int SOCKET; 可知套接字实际上就是一个无符号整型,它将被Socket环境管理和使用 套接字将被创建、设置、用来发送和接收数据,最后会被关闭WORD类型、MAKEWORD、LOBYTE和HIBYTE宏,WORD类型是一个16位的无符号整型,在WTYPES.H中被定义为: typedef unsigned short WORD; 目的是提供两个字节的存储,在Socket中这两个字节可以表示主版本号和副版本号 使用MAKEWORD宏可以给一个WORD类型赋值例如要表示主版本号2,副版本号0,可以使用以下代码: WORD wVersionRequested; wVersionRequested = MAKEWORD( 2, 0 ); 注意低位内存存储主版本号2,高位内存存储副版本号0,其值为0 x0002使用宏LOBYTE可以读取WORD的低位字节,HIBYTE可以读取高位字节WSADATA类型和LPWSADATA类型,WSADATA类型是一个结构,描述了Socket库的一些相关信息,其结构定义如下: typedef struct WSAData WORD wVersion; WORD wHighVersion; char szDescriptionWSADESCRIPTION_LEN+1; char szSystemStatusWSASYS_STATUS_LEN+1; unsigned short iMaxSockets; unsigned short iMaxUdpDg; char FAR * lpVendorInfo; WSADATA; typedef WSADATA FAR *LPWSADATA;,WSAStartup函数,WSAStartup函数被用来初始化Socket环境,它的定义如下: int PASCAL FAR WSAStartup(WORD wVersionRequired, LPWSADATA lpWSAData); 其返回值为整型,调用方式为PASCAL(即标准类型,PASCAL等于__stdcall),参数有两个,第一个参数为WORD类型,指明了Socket的版本号,第二个参数为WSADATA类型的指针。

      若返回值为0,则初始化成功,若不为0则失败WSACleanup函数,这是Socket环境的退出函数返回值为0表示成功,SOCKET_ERROR表示失败socket函数,socket的创建函数,其定义为: SOCKET PASCAL FAR socket (int af, int type, int protocol); 第一个参数为int af,代表网络地址族,目前只有一种取值是有效的,即AF_INET,代表internet地址族; 第二个参数为int type,代表网络协议类型,SOCK_DGRAM代表UDP协议,SOCK_STREAM代表TCP协议; 第三个参数为int protocol,指定网络地址族的特殊协议,目前无用,赋值0即可 返回值为SOCKET,若返回INVALID_SOCKET则失败setsockopt函数,函数用来设置Socket的属性,若不能正确设置socket属性,则数据的发送和接收会失败定义如下: int PASCAL FAR setsockopt (SOCKET s, int level, int optname, const char FAR * optval, int optlen); 其返回值为int类型,0代表成功,SOCKET_ERROR代表有错误发生。

      第一个参数SOCKET s,代表要设置的套接字; 第二个参数int level,代表要设置的属性所处的层次,层次包含以下取值:SOL_SOCKET代表套接字层次;IPPROTO_TCP代表TCP协议层次,IPPROTO_IP代表IP协议层次(后面两个我都没有用过); 第三个参数int optname,代表设置参数的名称,SO_BROADCAST代表允许发送广播数据的属性,其它属性可参考MSDN; 第四个参数const char FAR * optval,代表指向存储参数数值的指针,注意这里可能要使用reinterpret_cast类型转换; 第五个参数int optlen,代表存储参数数值变量的长度sockaddr_in,sockaddr_in定义了socket发送和接收数据包的地址,定义: struct sockaddr_in short sin_family; u_short sin_port; structin_addr sin_addr; char sin_zero8; ;,in_addr类型,in_addr的定义如下: struct 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; 首先阐述in_addr的含义,很显然它是一个存储ip地址的联合体(忘记union含义的请看c++书),有三种表达方式: 第一种用四个字节来表示IP地址的四个数字; 第二种用两个双字节来表示IP地址; 第三种用一个长整型来表示IP地址。

      inet_addr,给in_addr赋值的一种最简单方法是使用inet_addr函数,它可以把一个代表IP地址的字符串赋值转换为in_addr类型,如 addrto.sin_addr.s_addr=inet_addr(192.168.0.2); sockaddr_in的含义比in_addr的含义要广泛,其各个字段的含义和取值如下: 第一个字段short sin_family,代表网络地址族,如前所述,只能取值AF_INET; 第二个字段u_short sin_port,代表IP地址端口,由程序员指定; 第三个字段structin_addr sin_addr,代表IP地址; 第四个字段char sin_zero8,是为了保证sockaddr_in与SOCKADDR类型的长度相等而填充进来的字段,inet_ntoa函数,函数是inet_ntoa,可以把一个in_addr类型转换为一个字符串,sockaddr类型,sockaddr类型是用来表示Socket地址的类型,同上面的sockaddr_in类型相比,sockaddr的适用范围更广,因为sockaddr_in只适用于TCP/IP地址 Sockaddr的定义如下: struct sockaddr u_short sa_family; char sa_data14; ; 可知sockaddr有16个字节,而sockaddr_in也有16个字节,所以sockaddr_in是可以强制类型转换为sockaddr的。

      事实上也往往使用这种方法Sleep函数,线程挂起函数,表示线程挂起一段时间如,Sleep(1000)表示挂起一秒 定义于WINBASE.H头文件中 WINBASE.H又被包含于WINDOWS.H中,然后WINDOWS.H被WINSOCK2.H包含sendto函数,在Socket中有两套发送和接收函数,一是sendto和recvfrom;二是send和recv前一套在函数参数中要指明地址;而后一套需要先将套接字和一个地址绑定,然后直接发送和接收,不需绑定地址sendto的定义如下: int PASCAL FAR sendto (SOCKET s, const char FAR * buf, int len, int flags, const struct sockaddr FAR *to, int tolen); 第一个参数就是套接字; 第二个参数是要传送的数据指针; 第三个参数是要传送的数据长度(字节数); 第四个参数是传送方式的标识,如果不需要特殊要求则可以设置为0,其它值请参考MSDN; 第五个参数是。

      点击阅读更多内容
      关于金锄头网 - 版权申诉 - 免责声明 - 诚邀英才 - 联系我们
      手机版 | 川公网安备 51140202000112号 | 经营许可证(蜀ICP备13022795号)
      ©2008-2016 by Sichuan Goldhoe Inc. All Rights Reserved.