网络软件开发技术编程篇.ppt
《网络软件开发技术编程篇.ppt》由会员分享,可在线阅读,更多相关《网络软件开发技术编程篇.ppt(71页珍藏版)》请在三一文库上搜索。
1、8/3/2019,1,第5章 网络软件开发技术 编程篇,TCP socket & UDP socket 西安交通大学 计算机教学实验中心,软件开发技术基础,8/3/2019,2,Socket 简介,Socket是TCP/IP协议族提供的应用编程接口。 应用层的应用系统通过调用Socket的接口来利用传输层提供的各种服务,包括可靠的流协议TCP和不可靠的数据报协议UDP。,应用 程序,传输层 协议,Socket,8/3/2019,3,Socket 简介,1982 - Berkeley Software Distributions 操作系统引入了sockets 作为本地进程之间通信的接口 1986
2、 - Berkeley 扩展了socket 接口使之支持UNIX 下的TCP/IP 通信 现在很多应用 (FTP, Telnet, etc) 都依赖这一接口,8/3/2019,4,Socket 简介,Socket 是一个编程接口 是一种特殊的文件描述符 (everything in Unix is a file) 并不仅限于TCP/IP 通信协议 面向连接 (Transmission Control Protocol - TCP/IP) 无连接 (User Datagram Protocol -UDP 和 Inter-network Packet Exchange - IPX),8/3/201
3、9,5,WinSock,从 Berkeley Sockets (Unix)移植 包括了许多对windows环境的扩展支持 开放的网络编程接口 API 开放 多个厂商提供 winsock 源码和二进制兼容性 最初的Winsock版本是1.1版,在它的基础上,微软又进一步提供了Winsock2接口。Winsock2支持多种底层的网络协议,如TCP/IP、ATM、IPX等,8/3/2019,6,WinSock.dll,FTP WinSock.dll,TCP/IP,IPX,AppleTalk,NetBIOS,Remote Access Service (RAS),FTP TCP/IP,Modem,Ne
4、twork Drivers,LAN,Application,Windows Socket, 协议 和应用,Phone Line,8/3/2019,7,Berkeley socket 和 WinSock的不同,Berkeley Socket 是一个 int 数据类型, WinSock Socket 则是 SOCKET 数据类型 WinSock 中以SOCKET_ERROR 代表出错, Berkeley Socket 以 -1 代表出错 WinSock 应用必须首先调用 WSAStartup() 初始化, 并在结束前调用 WSACleanup() 释放资源,8/3/2019,8,void main
5、 (void) /* The following two lines needed for Windows socket */ WORD wVersionRequested = MAKEWORD(2,2); /* WSA 函数的参数 */ WSADATA wsaData; /* WSA 函数的参数 */,8/3/2019,9,Winsock DLL,在装入Winsock DLL 之前调用任何 Winsock 函数都会返回 SOCKET-ERROR 错误. 调用 WSAStartup装入Winsock DLL int WSAStartup( WORD wVersionRequested, LPW
6、SADATA lpWSAData ); wVersionRequested Winsock DLL version X (high order): sub-version Y (low order): main version MAKEWORD(X,Y)宏定义将两个字节组装成一个WORD,8/3/2019,10,在调用 “closesocket” 函数之后 程序结束之前 ,释放socket资源,/* This stuff cleans-up winsock */ WSACleanup( );,typedef struct WSAData WORD wVersion; WORD wHighVer
7、sion; char szD escriptionWSADESCRIPTION_LEN+1; char szSystemStatusWSASYS_STATUS_LEN+1; unsigned short iMaxSockets; unsigned short iMaxUdpDg; char FAR * lpVendorInfo; WSADATA, *LPWSADATA;,8/3/2019,11,SOCKET socket_id = socket (AF_INET, SOCK_STREAM, 0);,8/3/2019,12,Basic Socket Calls (socket),/ Berkel
8、ey 形式 int socket(int family int type, int protocol); / WinSock 形式 SOCKET socket (int family, int type, int protocol);,8/3/2019,13,socket (续),SOCKET socket (int family, int type, int protocol); family 是地址族 AF_INET / internet 协议 AF_UNIX / unix internal协议 AF_NS / Xerox NS协议 AF_IMPLINK / Interface Messa
9、ge协议 type SOCK_STREAM / 流式 socket SOCK_DGRAM / 数据报 socket SOCK_RAW / raw socket protocol 参数通常置为0,8/3/2019,14,3.TCP Sockets 编程,创建一个被动模式 (server,服务器)的 socket. 建立应用层的连接 Client/Server 交互 在发送和接收数据之前 client 必须调用 connect 连接服务器 server 必须调用 accept 接收client的连接 发送和接收数据. 关闭连接.,8/3/2019,15,TCP Sockets 编程基本流程,soc
10、ket(),bind(),listen(),accept(),send(),recv(),close(),send(),socket(),recv(),close(),connect(),recv(),建立连接,数据请求,数据响应,断连指示,Client,Server,8/3/2019,16,socket(),bind(),listen(),accept(),close(),调用socket创建一个套接字,并在传输层实体中分配表空间,返回一个文件描述符,用于以后调用中使用。,调用bind将某地址赋予,使得远程应用程序能访问本地应用程序。,调用listen分配数据空间,以便存储多个用户的连接建立
11、请求。,调用accept将本地应用程序阻塞起来,等待接收客户端发来的连接请求。,释放连接:使用close原语单独释放连接。,服务器端,8/3/2019,17,socket(),close(),connect(),调用socket创建一个套接字,并在传输层实体中分配表空间,返回一个文件描述符,用于以后调用中使用。,调用connect阻塞应用程序,传输层实体开始建立连接,当连接建立完成时,取消阻塞。,释放连接:使用close原语单独释放连接。,客户端,8/3/2019,18,send(),send(),recv(),recv(),数据请求,数据响应,双方使用send和receive完成数据的全双工
12、发送,数据传输,8/3/2019,19,int status = bind (socket_id, (struct sockaddr_in *) my_addr, sizeof(my_addr);,8/3/2019,20,Basic Socket Calls (bind),/ Berkeley 形式 int bind(int sockfd, struct sockaddr* addr, int addrLen); / WinSock 形式 int bind(SOCKET sockfd, struct sockaddr* addr, int addrLen);,8/3/2019,21,bind
13、(续),int bind (SOCKET sockfd, struct sockaddr* addr, int addrLen); sockfd 由socket() 调用返回 addr 是指向 sockaddr_in 结构的指针,包含server IP 地址和端口号 struct sockaddr_in short sin_family / address family u_short sin_port / port number struct in_addr sin_addr /IP address (32-bits) addrLen - sizeof (struct sockaddr_in
14、),8/3/2019,22,struct sockaddr_in my_addr; /* My (client) Internet address */,8/3/2019,23,地址结构,通用地址结构 struct sockaddr u_short sa_family; / 地址族, AF_xxx char sa_data14; / 14字节协议地址 ; Internet协议地址结构 struct sockaddr_in short sin_family; / 地址族, AF_INET,2 bytes u_short sin_port; / 端口,2 bytes struct in_addr
15、sin_addr; / IPV4地址,4 bytes char sin_zero8; / 8 bytes unused ; IPv4地址结构 struct in_addr / internet address u_long s_addr; / socket address ;,8/3/2019,24,unsigned long inet_addr(char *address); address是以NULL结尾的点分IPv4字符串。该函数返回32位的地址,如果cp字符串包含的不是合法的IP地址,则函数返回。例: in_addr addr; addr.s_addr = inet_addr(“ 20
16、2.117.50.26 “); char* inet_ntoa(struct in_addr address) address是IPv4地址结构,函数返回一指向包含点分IP地址的静态存储区字符指针,如果错误则函数返回NULL,地址转换函数 (inet_addr() 和 inet_ntoa(),8/3/2019,25,gethostname(),得到本机的名称 int gethostname(char *hostname, int bufferLength) hostname是一个字符数组, bufferLength是该数组的长度。当调用成功,函数返回0并且将本机的名称赋值给hostname ;
17、当调用失败,则返回SOCKET_ERROR.,8/3/2019,26,从域名解析得到IP地址(gethostbyname),gethostbyname(): 给定主机名, (例如 ), 得到主机IP地址. struct hostent* getbyhostname(char *hostname) char* h_name; / official name of host char* h_aliases; / alias list short h_addrtype; / address family (e.g., AF_INET) short h_length; / length of addr
18、ess (4 for AF_INET) char* h_addr_list; / list of addresses (null pointer terminated),8/3/2019,27,下面的代码完成对的域名解析,得到其IP地址: hostent * phostent; / 指向hostent结构的指针 in_addr in; / IPV4地址结构 if (phostent = gethostbyname(““) = NULL) printf(“gethostbyname() 错误:%d“, WSAGetLastError(); else / 拷贝4字节的IP地址到IPV4地址结构 m
19、emcpy( ,域名解析示例,8/3/2019,28,字节序,不同的计算机系统采用不同的字节序存储数据,同样一个两字节的16位整数(0X0304),在内存中存储的方式就不同: 一种方式是将低字节存储在起始地址,称为“Little-Endian”字节序,Intel、AMD等采用的是这种方式; 另一种是将高字节存储在起始地址,称为“Big-Endian”字节序,由Macintosh、Motorola等所采用,8/3/2019,29,字节序转换函数,把给定系统所采用的字节序称为主机字节序。为了避免不同类别主机之间在数据交换时由于对于字节序解释的不同而导致的差错,引入了网络字节序,即网络传输所采用的字
20、节序。规定网络字节序使用“Big-Endian”方式。 主机到网络 u_long htonl (u_long hostlong); u_short htons (u_short short); 网络到主机 u_long ntohl (u_long hostlong); u_short ntohs (u_short short);,8/3/2019,30,例子: 创建 SOCKADDR_IN,下面的代码演示了如何利用上面描述的inet_addr 和htons 函数来创建sockaddr_in结构。 sockaddr_in internetAddr; int port = 6666; intern
21、etAddr.sin_family = AF_INET; / 将点分的IP地址转换为4字节的整数并赋值给s_addr域 internetAddr.sin_addr.s_addr = inet_addr(“202.117.50.26“); / port变量以主机字节序存储,因此将它转换为网络字节序并赋值给sin_port internetAddr.sin_port = htons(port);,8/3/2019,31,int status = listen (socket_id, 3);,8/3/2019,32,Basic Socket Calls (listen),/ Berkeley for
22、m int listen(int sockfd, int backlog); / WinSock form int listen (SOCKET sockfd, int backlog);,8/3/2019,33,listen (续),int listen (SOCKET sockfd, int backlog); sockfd监听连接的Socket 1=backlog=5 指定了正在等待连接的最大队列长度,它的作用在于处理可能同时出现的几个连接请求。例如,假定backlog参数为2,如果三个客户机同时发出请求,那么头两个会被放在等待处理的队列中,以便服务器程序依次为它们提供服务,而第三个连接
23、的客户则会收到WSAECONNREFUSED错误。,8/3/2019,34,SOCKET child_sock = accept (socket_id, (struct sockaddr_in *) client_addr,sizeof (client_addr);,8/3/2019,35,Basic Socket Calls (accept),/ Berkeley form int accept(int s struct sockaddr* addr, int* pointerToAddrLen); / WinSock form SOCKET accept (SOCKET s, struct
24、 sockaddr* addr, int* pointerToAddrLen);,8/3/2019,36,accept (续),SOCKET accept (SOCKET s, struct sockaddr* addr, int* pointerToAddrLen); s是接受客户连接的Socket addr用于接收外来连接的地址信息,如果暂时不关心该地址信息,则可以置为NULL pointerToAddrLen是addr结构的长度 返回一个新的已连接的Socket,使用这个Socket可以和客户进行通信,而原来的监听Socket仍然可以接受其他客户的连接.,8/3/2019,37,Acce
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 网络软件 开发 技术 编程
链接地址:https://www.31doc.com/p-3229022.html