网络软件开发技术编程篇.ppt
《网络软件开发技术编程篇.ppt》由会员分享,可在线阅读,更多相关《网络软件开发技术编程篇.ppt(71页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、网络软件开发技术编程篇 Still waters run deep.流静水深流静水深,人静心深人静心深 Where there is life,there is hope。有生命必有希望。有生命必有希望Socket 简介简介lSocket是是TCP/IP协议族提供的协议族提供的应用编程接口应用编程接口。l应用层的应用系统通过调用应用层的应用系统通过调用Socket的接口来的接口来利用传输层提供的各种服务,包括可靠的流协利用传输层提供的各种服务,包括可靠的流协议议TCP和不可靠的数据报协议和不可靠的数据报协议UDP。应用程序传输层协议Socket11/15/20222Socket 简介简介l19
2、82-Berkeley Software Distributions 操操作系统引入了作系统引入了sockets 作为本地进程之间通信作为本地进程之间通信的接口的接口l1986-Berkeley 扩展了扩展了socket 接口使之支持接口使之支持UNIX 下的下的TCP/IP 通信通信l现在很多应用现在很多应用(FTP,Telnet,etc)都依赖这一都依赖这一接口接口11/15/20223Socket 简介简介lSocketl是一个编程接口是一个编程接口l是一种特殊的文件描述符是一种特殊的文件描述符(everything in Unix is a file)l并不仅限于并不仅限于TCP/IP
3、l通信协议通信协议l面向连接面向连接(Transmission Control Protocol-TCP/IP)l无连接无连接(User Datagram Protocol-UDP 和和 Inter-network Packet Exchange-IPX)11/15/20224WinSockl从从 Berkeley Sockets(Unix)移植移植l包括了许多对包括了许多对windows环境的扩展支持环境的扩展支持l开放的网络编程接口开放的网络编程接口lAPI 开放开放l多个厂商提供多个厂商提供 winsockl源码和二进制兼容性源码和二进制兼容性l最初的最初的Winsock版本是版本是1.
4、1版,在它的基础版,在它的基础上,微软又进一步提供了上,微软又进一步提供了Winsock2接口。接口。Winsock2支持多种底层的网络协议,如支持多种底层的网络协议,如TCP/IP、ATM、IPX等等11/15/20225WinSock.dllFTP WinSock.dllTCP/IPIPXAppleTalkNetBIOSRemote Access Service(RAS)FTP TCP/IPModemNetwork DriversLANApplicationWindows Socket,协议协议 和应用和应用Phone Line11/15/20226Berkeley socket 和和 W
5、inSock的的不同不同lBerkeley Socket 是一个是一个 int 数据类型数据类型,WinSock Socket 则是则是 SOCKET 数据类型数据类型lWinSock 中以中以SOCKET_ERROR 代表出错代表出错,Berkeley Socket 以以-1 代表出错代表出错lWinSock 应用必须首先调用应用必须首先调用 WSAStartup()初始初始化化,并在结束前调用并在结束前调用 WSACleanup()释放资源释放资源11/15/20227void main(void)/*The following two lines needed for Windows s
6、ocket*/WORD wVersionRequested=MAKEWORD(2,2);/*WSA 函数的参数 */WSADATA wsaData;/*WSA 函数的参数 */*初始化 winsock */WSAStartup(wVersionRequested,&wsaData);/*Create a socket*/My_SocketID=socket(.);Step 1:指定需要使用的Winsock规范的最高版本Step 2:初始化 Winsock,装入Winsock.dllStep 3:开始使用Winsock version 2.21.初始化初始化 Winsock11/15/20228
7、Winsock DLLl在装入在装入Winsock DLL 之前调用任何之前调用任何 Winsock 函数都会函数都会返回返回 SOCKET-ERROR 错误错误.l调用调用 WSAStartup装入装入Winsock DLL int WSAStartup(WORD wVersionRequested,LPWSADATA lpWSAData );lwVersionRequested Winsock DLL versionlX(high order):sub-versionlY(low order):main versionlMAKEWORD(X,Y)宏定义将两个字节组装成一个宏定义将两个字节组
8、装成一个WORD11/15/20229在在调用用“closesocket”函数之后函数之后程序程序结结束之前束之前,释放释放socket资源资源/*This stuff cleans-up winsock*/WSACleanup();Clear winsocktypedef struct WSAData WORD wVersion;WORD wHighVersion;char szD escriptionWSADESCRIPTION_LEN+1;char szSystemStatusWSASYS_STATUS_LEN+1;unsigned short iMaxSockets;unsigned
9、short iMaxUdpDg;char FAR*lpVendorInfo;WSADATA,*LPWSADATA;11/15/2022102.创建创建socket-socket()函数函数SOCKET socket_id=socket(AF_INET,SOCK_STREAM,0);“AF_INET”=使用 IP 协议“SOCK_STREAM”=使用 TCPReturns socket ID on successReturn INVALID_SOCKET on error总是 011/15/202211Basic Socket Calls(socket)/Berkeley 形式形式int soc
10、ket(int family int type,int protocol);/WinSock 形式形式SOCKET socket(int family,int type,int protocol);11/15/202212socket(续续)lSOCKET socket(int family,int type,int protocol);lfamily 是地址族是地址族lAF_INET /internet 协议协议lAF_UNIX/unix internal协议协议lAF_NS /Xerox NS协议协议lAF_IMPLINK /Interface Message协议协议ltypelSOCK_
11、STREAM /流式流式 socketlSOCK_DGRAM /数据报数据报 socketlSOCK_RAW /raw socketlprotocol 参数通常置为参数通常置为011/15/2022133.TCP Sockets 编程编程l创建一个被动模式创建一个被动模式(server,服务器,服务器)的的 socket.l建立应用层的连接建立应用层的连接lClient/Server 交互交互l在发送和接收数据之前在发送和接收数据之前lclient 必须调用必须调用 connect 连接服务器连接服务器lserver 必须调用必须调用 accept 接收接收client的连接的连接l发送和接收
12、数据发送和接收数据.l关闭连接关闭连接.11/15/202214TCP Sockets 编程基本流程编程基本流程socket()bind()listen()accept()send()recv()close()send()socket()recv()close()connect()recv()建立连接数据请求数据响应断连指示ClientServer11/15/202215socket()bind()listen()accept()close()调用调用socket创建一个套接字,并在传输层创建一个套接字,并在传输层实体中分配表空间,返回一个文件描述符,实体中分配表空间,返回一个文件描述符,用于
13、以后调用中使用。用于以后调用中使用。调用调用bind将某地址赋予,使得远程应用程序将某地址赋予,使得远程应用程序能访问本地应用程序。能访问本地应用程序。调用调用listen分配数据空间,以便存分配数据空间,以便存储多个用户的连接建立请求。储多个用户的连接建立请求。调用调用accept将本地应用程序阻塞起来,将本地应用程序阻塞起来,等待接收客户端发来的连接请求。等待接收客户端发来的连接请求。释放连接:使用释放连接:使用close原语单独释放连接。原语单独释放连接。服务器端11/15/202216socket()close()connect()调用调用socket创建一个套接字,并在传输创建一个套
14、接字,并在传输层实体中分配表空间,返回一个文件描层实体中分配表空间,返回一个文件描述符,用于以后调用中使用。述符,用于以后调用中使用。调用调用connect阻塞应用程序,传输层实阻塞应用程序,传输层实体开始建立连接,当连接建立完成时,体开始建立连接,当连接建立完成时,取消阻塞。取消阻塞。释放连接:使用释放连接:使用close原语单独释放连接。原语单独释放连接。客户端11/15/202217send()send()recv()recv()数据请求数据响应双方使用双方使用send和和receive完成完成数据的全双工发送数据的全双工发送数据传输11/15/202218int status=bind
15、(socket_id,(struct sockaddr_in*)my_addr,sizeof(my_addr);sockaddr_in 结构,描述本机的端口和 IP 地址Sockaddr_in 结构的字节长度Return code(SOCKET_ERROR if error)Socket ID returned by socket functionBind()函数函数11/15/202219Basic Socket Calls(bind)/Berkeley 形式形式int bind(int sockfd,struct sockaddr*addr,int addrLen);/WinSock 形式
16、形式int bind(SOCKET sockfd,struct sockaddr*addr,int addrLen);11/15/202220bind(续续)int bind(SOCKET sockfd,struct sockaddr*addr,int addrLen);lsockfd 由由socket()调用返回调用返回laddr 是指向是指向 sockaddr_in 结构的指针,包含结构的指针,包含server IP 地址和端口号地址和端口号lstruct sockaddr_inshort sin_family/address familyu_short sin_port /port nu
17、mberstruct in_addr sin_addr /IP address(32-bits)laddrLen-sizeof(struct sockaddr_in)11/15/202221struct sockaddr_in my_addr;/*My(client)Internet address */*Set My(clients)IP Address-*/my_addr.sin_family =AF_INET;/*Address Family To Be Used*/my_addr.sin_port =htons(6666);/*Port number to use*/my_addr.s
18、in_addr.s_addr=htonl(INADDR_ANY);/*My IP address*/Step 1:初始化该数据结构Step 2:填充信息The“sock_addr”structure11/15/202222地址结构地址结构l通用地址结构通用地址结构lstruct sockaddr u_short sa_family;/地址族地址族,AF_xxx char sa_data14;/14字节协议地址字节协议地址 ;lInternet协议地址结构协议地址结构lstruct sockaddr_in short sin_family;/地址族地址族,AF_INET,2 bytes u_sh
19、ort sin_port;/端口,端口,2 bytes struct in_addr sin_addr;/IPV4地址,地址,4 bytes char sin_zero8;/8 bytes unused ;lIPv4地址结构地址结构lstruct in_addr /internet address u_long s_addr;/socket address ;11/15/202223lunsigned long inet_addr(char *address);laddress是以是以NULL结尾的点分结尾的点分IPv4字符串。该函数返字符串。该函数返回回32位的地址,如果位的地址,如果cp字
20、符串包含的不是合法的字符串包含的不是合法的IP地地址,则函数返回。例:址,则函数返回。例:lin_addr addr;laddr.s_addr=inet_addr(202.117.50.26);lchar*inet_ntoa(struct in_addr address)laddress是是IPv4地址结构,函数返回一指向包含点分地址结构,函数返回一指向包含点分IP地址的静态存储区字符指针,如果错误则函数返回地址的静态存储区字符指针,如果错误则函数返回NULL地址转换函数地址转换函数(inet_addr()和和 inet_ntoa()11/15/202224gethostname()l得到本机
21、的名称得到本机的名称lint gethostname(char*hostname,int bufferLength)lhostname是一个字符数组,是一个字符数组,bufferLength是该是该数组的长度。当调用成功,函数返回数组的长度。当调用成功,函数返回0并且将本机的并且将本机的名称赋值给名称赋值给hostname;当调用失败,则返回;当调用失败,则返回SOCKET_ERROR.11/15/202225从域名解析得到从域名解析得到IP地址地址(gethostbyname)lgethostbyname():给定主机名,给定主机名,(例如例如 ),得到主机得到主机IP地址地址.lstruc
22、t hostent*getbyhostname(char*hostname)lchar*h_name;/official name of hostlchar*h_aliases;/alias listlshort h_addrtype;/address family(e.g.,AF_INET)lshort h_length;/length of address(4 for AF_INET)lchar*h_addr_list;/list of addresses(null pointer terminated)11/15/202226l下面的代码完成对下面的代码完成对的域名解析,得到其的域名解析
23、,得到其IP地址:地址:lhostent*phostent;/指向指向hostent结构的指针结构的指针lin_addr in;/IPV4地址结构地址结构lif(phostent=gethostbyname()=NULL)l printf(gethostbyname()错误:错误:%d,WSAGetLastError();lelsell /拷贝拷贝4字节的字节的IP地址到地址到IPV4地址结构地址结构l memcpy(&in,phostent-h_addr,4);l printf(主机主机%s 的的IP地址是:地址是:,phostent-h_name);l printf(%s,inet_nto
24、a(in);l域名解析示例域名解析示例11/15/202227字节序字节序l不同的计算机系统采用不同的字节序存储数据,不同的计算机系统采用不同的字节序存储数据,同样一个两字节的同样一个两字节的16位整数位整数(0X0304),在内存,在内存中存储的方式就不同:中存储的方式就不同:l一种方式是将低字节存储在起始地址,称为一种方式是将低字节存储在起始地址,称为“Little-Endian”字节序,字节序,Intel、AMD等采用的是等采用的是这种方式;这种方式;l另一种是将高字节存储在起始地址,称为另一种是将高字节存储在起始地址,称为“Big-Endian”字节序,由字节序,由Macintosh、
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 网络软件 开发 技术 编程
限制150内