互联网之移动网络编程复习_第1页
互联网之移动网络编程复习_第2页
互联网之移动网络编程复习_第3页
已阅读5页,还剩22页未读 继续免费阅读

下载本文档

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

文档简介

1、1、手机游戏简介及 TCP/IP网络编程基础知识1)常用缩写:什么叫 c/S、B/S、P2P ?C/S (Client客户端/Server服务器)B/S (Browser 浏览器 /Server 服务器)P2P (Peer to Peer)2)TCP/IP网络编程基础知识OSI (开放系统互连)模型与 TCP/IP模型对比应用层:该层负责实际的应用程序细节,包括FTP HTTPSMTP TELNET传输层:主要为两台主机上的应用程序提供端到端的数据通 信。主要有TCP/UDP两种传输模式。TCP/IP的核心部分是 传输层协议网络层:负责主机间数据的路由和网络上数据的存储,有IP/ICMP/AR

2、P/RARP。为 ICMP,TCP,UDP ( User Datagram Protocol用户数据报协议)提供分组发送服务。链路层(网络接口层):包括操作系统中的设备驱动程序和 计算机中对应的网卡,他们一起处理传输媒介的物理接口细 节。TCP ( Transmission Control Protocol 传送控制协议)/IP 协 议:实际上就是在物联网上的一组完整的网络协议(TCP :提供传输层服务,IP :提供网络层服务)2、Socket概述和TCP通信程序设计1、Socket 概述C/S通信模型一一不对称的模型TCP/IP模型TCP/IP协议的核心部分是传输层协议(TCP、UDP),网

3、络层协议(IP)和物理接口层,这三层通常是在操作系统内核中实 现。因此用户一般不涉及。2、什么是套接字/套接口 (socket) ?套接字,是支持 TCP/IP的网络通信的基本操作单元,可以 看做是不同主机之间的进程进行双向通信的端点,简单的说 就是通信的两方的一种约定,用套接字中的相关函数来完成 通信过程。从网络整体来看,它是不同主机上应用程序之间的一个虚拟 的接口,具有跨平台特性。从程序员角度来看,它是应用程序和网络设备的一个接口,特殊的I/O3、Berkeley socket 和 WinSock 的不同 Berkeley socket 是一个 int 数据类型, Win SockSock

4、则是SOCKET数据类型 WinSock 中以 SOCKET_ERROR 代表出错,Berkeley Socket 以-1 代表出错 WinSock应用必须首先调用WSAStartup()初始 化,并在结束前调用 WSACIeanup()释放资源,而BSD socket 不用。 WinSock使用closesocket中止一个连接,而BSDsocket 使用 close。4、Socket的分类字节流套接字(Stream Sockets)面向连接的数据报套接字(Datagram Sockets)无连接的原始套接字(Raw Sockets)只对Internet协议有效,用于直接访问IP协议5、不同

5、操作系统中的 SocketWindows Socket(Winsock)Linux Socket(BSD Socket)Mac Socket(BSD Socket)BSD Socket :需要使用的头文件一一数据类型:#include <sys/types.h>函数定义:#include <sys/socket.h>6、IP地址与端口如果把IP数据包的投递过程看成是给远方的一位朋友寄一 封信,那么IP地址就是这位朋友的所在位置,女口:广州华软学院游戏戏(依靠此信息进行路由)端口号就是这位朋友的名字(依靠这个信息最终把这圭寸信交 付给这位收信)7、套接字的数据结构: 通用

6、的套接字地址结构struct sockaddrunsigned short sa_family; / 地址家族char sa_data14; 14 字节协议地址;位于 sys/socket.h 文件中结构中sa_family为套接字的协议族地址类型, 例如对于通常 的TCP/IP协议(IPv4),它的值是 AF_INET; sa_data中存储着 具体的协议地址,不同的协议族有不同的地址格式。sa_data的存储内容往往是包含地址和端口信息,而仅使用一个变量,所以使用起来不太方便。 Sockaddr结构的并列形式struct sockaddr_inshort int sin_family;/

7、通信类型unsigned short int sin_port;/端口,2 bytesstruct in addr sin_addr; /Internet 地址,4 bytesunsigned char sin_zero8;;/填充的空白信息,这样就保持整个结构与sockaddr结构的长度相同;其中,in_addr结构定义如下:struct?in_addr?unsigned long?s_addr?;/*s_addr 必须是网络字节顺序?Network?Byte?Order */备注:sockaddr只是一个抽象的概述形式,并不实用。sockaddr_in更加结合了 TCP/IP协议族的特点,

8、易于使用, 所以编程中常使用这个结构。但是:socket本身所圭寸装的 API都是支持sockaddr结构的, 所以填充sockaddr_in结构需要强制转换成 sockaddr结构, 方可作为参数被socket的标准函数所使用。&字节顺序主机字节顺序(Host Byte Order)低位在前,高位在后(little-endian)基于Intel芯片的机器采取这种存储方式网络字节顺序(Network Byte Order)高位在前,低位在后 (big-endian)sockaddr_in的变量成员(端口和地址)都必须使用网络字节顺 序9、转换字节顺序的函数10将IP地址转换为网络字节顺

9、序inet_addrunsigned long inet_addr(const char *cp);sockaddr_in 的socket.将需要通信的IP地址转化为整数,并填充 sin_addr 成员inet_ntoachar * inet_ntoa(struct in_addr in);例如将0A00A8C0转化为“”11、TCP网络通讯编程创建一个被动模式(server,服务器)的建立应用层的连接Client/Server 交互在发送和接收数据之前client必须调用 connect连接服务器 server 必须调用 accept 接收 client的连接 发送和接收数据.关闭连接.12

10、、网络连接函数:socket创建套接字 connect 建立连接 bind 绑定本机端口 listen 监听端口 accept 接受连接 recv, recvfrom数据接收send, sendto 数据发送close, shutdown 关闭套接字13、TCP客户服务器通信机制14基本套接字函数-socket()基本套接字函数(2)- connect。基本套接字函数(2)-例子int fd;/*套接字描述符*/struct sockaddr_in srv; /* 套接字地址结构*/*创建socket,调用函数socket,语句同前面socket的例子*/ srv.sin_family = A

11、F_INET; /* connect: AF_INET 表示使用 Internet 地址族 */srv.sin_port = htons(8000);/* connect:目标是连向服务器的8000 号端口 */= inet_addr( “” );/* connect:目标服务器的 IP Address 是 “”*/if(connect(fd, (struct sockaddr*) & srv, sizeof(srv) < 0) fprintf(stderr, ” connect error!n");exit(1);基本套接字函数(3)- bind()基本套接字函数(3

12、)-例子int fd;/*套接字描述符*/struct sockaddr_in srv; /* 套接字地址结构*/*创建socket,调用函数socket,语句同前面socket的例子*/ srv.sin_family = AF_INET; /* AF_INET 表示使用 Internet 地 址族*/srv.sin_port = htons(80); /* 将 socket 绑定到 80 号端口 = htonl(INADDR_ANY);/* bind:INADDR_ANY表示服务器将接收来自本机上任何一块网卡的客户连接 */if(bind(fd, (struct sockaddr*) &am

13、p;srv, sizeof(srv) < 0) fprintf(stderr, ” bind error!n");exit(1);基本套接字函数(4)- listen()基本套接字函数(4)-例子int fd;/*套接字描述符*/struct sockaddr_in srv; /* used by bind() */* 1) create the socket */* 2) bind the socket to a port */if(listen(fd, 20) < 0) fprintf(stderr, ” listen error!n");exit(1);基

14、本套接字函数(5)- accept()基本套接字函数(5)-例子struct sockaddr_in cli; /* used by accept() */int newfd;/*用来存放accept返回的新的套接字*/int cli_len = sizeof(cli); /* used by accept() */* 1) create the socket */* 2) bind the socket to a port */* 3) listen on the socket */newfd = accept(fd, (struct sockaddr*) &cli, &cl

15、i_len);if(newfd < 0) fprintf(stderr, "accept error'n");exit(1);包含了客户的IP 地址cli.sin_port包含了客户的 端口数其他需要用到的函数int read( int fd, char *buf, int len);返回实际接收的缓冲区大小int write(int fd, char *buf, int len);返回实际发送的缓冲区大小int close(int sockfd);成功返回0,否则返回-1recv ()函数int recv (SOCKET s,char* bytesToRec

16、eive,int nBytes,int flags);s是已经连接的 SocketbytesToReceive指向用于接收数据的缓冲区的指针 nBytes是缓冲区的字节数flags0, MSG_DONTROUTE, or MSG_OOB当调用成功,recv()返回被接收的字节数; 如果返回0,则 说明连接已经被关闭;当调用失败,返回 SOCKET_ERROR。注意:recv()并不保证接收到所有请求的数据。 它实际接收的 字节数由返回值指示。也许需要循环调用recv()来得到需要的结果。recv()的典型用法#define BUFSIZE 1024SOCKET s;char bufBUFSIZ

17、E; / 缓冲区int bytesRecv;/创建socket并连接服务器/ .bytesRecv = recv(s, buf, BUFSIZE, 0);if( bytesRecv = SOCKET_ERROR )printf("recv()调用错误:%d", WSAGetLastError();else if(bytesRecv = 0)printf("对方已经关闭连接.");closesocket(s);else/处理缓冲区的数据send ()函数int send (SOCKET s,const char* bytesToSend,int nByte

18、s,int flags);s是已经连接的 SocketbytesToSend指向待发送数据缓冲区的指针nBytes是待发送数据的字节数flags指定调用方式。常用0注意:send()并不保证发送所有请求的数据。它实际发送的 字节数由返回值指示。也许需要循环调用send()来得到需要的结果。close ()函数15 BSD socket 与 winsocket 创建区别/ Berkeley 形式int socket(int family , int type, int protocol);/ WinSock 形式SOCKET socket (int family, int type, int p

19、rotocol);第三周:UDP网络通讯及其它 socket函数1、无连接UDP协议的Socket调用client/server UDP 通信基本套接口函数(7)与TCP不同的是,UDP在通信时,系统内部不记录套接口地址信息,都是函数中主动以参数的形式指明的.在TCP情况下,客户connect成功后(服务器accept成功后),每次发送接 收都只需指定套接口描述符就行了,但是这里每次发送接收都需要额外附加上对方的套接口地址信息.初始-建立socketint fd; /*套接口描述符 */if(fd = socket(AFNET, SOCK_DGRAM, 0) < 0) perror( “

20、 socket” );exit(1);/*建立socket,与TCP类似*/服务器和客户端bind服务器和客户端recvfrom服务器和客户端sendto2、其它常用socket api函数 gethostname() 从域名解析得到 IP地址(gethostbyname) inet_ntop 及 inet_pton3、阻塞阻塞模式:是socket的缺省方式,也是最常用的方式,即调 用结果返回之前,函数阻塞,当前线程会被挂起,suspend。可能造成阻塞的函数有:connect。、accept()、读写函数、gethostbynam e()等。4、再探 send 和 recvsend和recv

21、是socket编程中两个核心的函数。send表示发送数据,其实际上比不是直接将数据发送出去,而是将数据先发送到系统对应的socket的缓冲区,在由系统使用tcpip协议进行发送。此时send返回的结果只 是表明是否成功发送到系统的缓冲区。同样recv函数也是从系统的对应的socket缓冲区读取数据,而该缓冲区中的数据也是由协议保证的。 如果该缓冲 区没有数据,将区别对待:如果对应的 socket是阻塞的, 则recv工作在阻塞模式,将一直等到缓冲区中有数据才 返回,否则会一直挂起。5、非阻塞模式非阻塞和阻塞的概念相对应,指在不能立刻得到结果之前,该函数不会阻塞当前线程,而会立刻返回。如果指定非

22、阻塞模式,程序调用可能造成阻塞的函数时,如果会发生阻塞,这些函数返回-1并将errno设置为EAGAIN 或EWOULDBLOCK ,程序可继续向下运行。可能阻塞的函数对应的任务完成,则再次调用该函数时就返 回0表示运行结束。第四周:并发服务器与多进程1、知识回顾TCP:传输控制协议TCP是一种面向连接的、可靠的、基于 字节流的传输层通信协议。2、面向连接的C/S程序工作流程(TCP)服务器端工作流程使用socket()函数创建服务器端通信套接口使用bind()函数将创建的套接口与服务器地址绑定使用listen()函数使服务器套接口做好接收连接请求准备使用accept()接收来自客户端由con

23、nect。函数发出的连接请 求根据连接请求建立连接后,使用send()函数发送数据,或者使用recv()函数接收数据使用close ()函数关闭套接口 (可以先用shutdown。函数先关 闭读写通道)客户端程序工作流程使用socket()函数创建客户端套接口使用connect()函数发出也服务器建立连接的请求(调用前可以不用bind()端口号,由系统自动完成连接建立后使用send()函数发送数据,或使用recv()函数接收 数据使用close()函数关闭套接口3、UDP协议用户数据报协议(UDP )是ISO参考模型中一种无连接的 传输层协议,提供面向事务的简单不可靠信息传送服务。与TCP不同

24、,UDP并不提供对IP协议的可靠机制、流控制以 及错误恢复功能等。由于 UDP比较简单,UDP头包含很 少的字节,比TCP负载消耗少。UDP适用于一次只传送少量数据、对可靠性要求不高的应用环境。提供高效率服务;如果自己完成安全性检查,UDP 也可用于大型文件的传输。4、无连接UDP协议的Socket调用client/server UDP 通信5、无连接的C/S程序工作流程(UDP)无连接的数据报传输服务通信时,客户端与服务器端所使用的函数是类似的,其工作流程如下:使用socket()函数创建套接口,以确定协议类型调用bind()函数将创建的套接口与本地地址绑定,确定本地地址和本地端口号使用se

25、ndto()函数发送数据,或者使用recvfrom()函数接收数据使用close ()函数关闭套接口6、并发服务器按连接类型分类并发无连接服务器并发连接服务器按并发技术分类多进程多线程10多路复用7、单进程非阻塞并发服务器Objective_C常用容器NSArray?用于对象有序集合(相当于是数组)NSSet?用于对象无序集合NSDictionary用于键值映射以上三种集合类是不可变的(一旦初始化后,就不能改变)以下是对应的三种可变集合类(这三种可变集合类是对应上 面三 种集合类 的 子类 ):NSMutableArray ?NSMutableSet ?NSMutableDictionary注

26、:这些集合类只能收集 cocoa对象(NSOjbect对象),如 果想保存一些原始的C数据(例如,int, float, double, BOOL 等),则需要将这些原始的C数据圭寸装成NSNumber类型 的,NSNumber对象是 cocoa对象,可以被保存在集合类中。&关于阻塞的问题阻塞:是指一个线程执行了一个函数或者系统调用,该函数 由于某种原因不能立即完成,因而不能返回调用它的线 程,导致线程受控于这个函数而处于等待挂起的状态, 线程的这种状态称为阻塞。9、能引起阻塞的套接字调用在Berkeley套接字网络编程接口的模型中,套接字的默认行为是阻塞的,具体地说,在一定情况下,有

27、多个操作套 接字的系统调用会引起进程阻塞。(1 ) accept。(2 ) read()、recv()和 recvfrom()(3 ) write() 、send()和 sendto()(4 ) connect。(5 ) select()(6 ) close()10服务器实现非阻塞套接字设置(fcntl )1、获取文件的flags:? flags = fcntl(fd,F_GETFL,O);2、设置文件的flags:?fcntl(fd,F_SETFL,flags);3、增加文件的某个flags,比如文件是阻塞的,想设置成非 阻塞:? flags = fcntl(fd,F_GETFL,0);?

28、flags |= O_NONBLOCK; ?fcntl(fd,F_SETFL,flags);4、取消文件的某个flags,比如文件是非阻塞的,想设置成 为阻塞:?flags = fcntl(fd,F_GETFL,0);?flags &=O_NONBLOCK;? fcntl(fd,F_SETFL,flags);也可调用ioctl调用实现非阻塞设置服务器实现非阻塞fcntl例子int flags;if(flags = fcntl(socketListen,F_GETFL,0)=-1)perror("fcntl F_GETFL fail:");exit(1);flags

29、|= O_NONBLOCK;if(fcntl(socketListen,F_SETFL,flags)=-1)perror("fcntl F_SETFL fail:");exit(1);服务器实现非阻塞recv收到消息例子NSMutableSet *remove = NSMutableSet alloc init;?for (NSNumber* obj in sClientSet)char newMsgMSGSIZE;memset(newMsg,O,MSGSIZE);int intSocket=obj intValue;/调用recv接收到客户端的消息int nLen=rec

30、v(intSocket,newMsg,MSGSIZE,0);if(nLen>0) newMsgnLen='O'printf(” 接收到 %d:%srn",intSocket,newMsg);11、多进程并发执行的服务器程序fork()函数:pid_t fork()功能:创建一个新的进程.说明:本系统调用产生一个新的进程,叫子进程,是调用进程的一个复制品。调用进程叫父进程,子进程继承了父进程的几乎所有的属性。返回值:调用成功则对子进程返回 0,对父进程返回子进程号,这也是最方便的区分父子进程的方法.若调用失败则返回-1给父进程,子进程不生成.利用UNIX操作系统的

31、fork()系统调用,编制多进程并发执行 的服务器程序,可以创建子进程。对每一个客户端,用一个专门的进程为它服务,通过进程的并发执行,来对实现多个客户的并发服务.基本的编程框架是:父进程代码If (pid = fork() = 0) 子进程代码 else if (pid<0) 报错信息父进程代码12、多进程并发执行的服务器程序 #import <Foundation/Foundation.h>/* basic system data types/* basic socket definitions/* sockaddr_in and other/* inet(3) funct

32、ions */#import <sys/types.h>#import <sys/socket.h>#import <netinet/in.h> Internet defns */#import <arpa/inet.h> ?#define MAXLINE 1024 ?void handle(int connfd);int main (int argc, const char * argv) NSAutoreleasePool * pool = NSAutoreleasePoolinit;/ insert code here.NSLog(&quo

33、t;Hello, World!"); int listenfd, connfd; int serverPort = 8000; int listenq = 1024; pid_t childpid;char bufMAXLINE;socklen_t socklen;struct sockaddr_in cliaddr, servaddr;socklen = sizeof(cliaddr);bzer o(&servaddr, sizeof(servaddr);servaddr.sin_family = AF_INET;servaddr.sin_port = htons(serverPort);乙listenfd = socket(AFN ET, SOCK_STREAM, 0);if (listenfd < 0) perror("socket error");return -1;if (bind(listenfd, (struct sockaddr *) &servaddr, socklen)< 0) perror("bind error");return -1;if (listen(listenfd, listenq

温馨提示

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

评论

0/150

提交评论