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

下载本文档

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

文档简介

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

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

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

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

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

6、a_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; /通信类型unsigned short int sin_por

7、t; /端口, 2 bytesstruct in addr sin_addr; /Internet地址,4 bytes unsigned 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 的标准函数所使用。8、字节顺序主机字节顺序 (Host Byte Order)低位在前,高位在后 (little-endian)基于 Intel 芯片的机器采取这种存储方式网络字节顺序 (Network Byte Order)高位在前,低位在后 (big-endian)sockaddr_in 的变量成员 ( 端口和地址 ) 都必须使用网络字节顺序9、转换字节顺序的函数10、将IP地址转换为网络字节顺序i

9、n et_addrun sig ned long in et_addr(c onst char *cp);将需要通信的IP地址转化为整数,并填充sockaddr_in的sin_addr成员inet_n toachar * inet_n toa(struct in _addr in);例如将OAOOA8C0专化为“”11、TCP网络通讯编程创建一个被动模式(server,服务器)的socket.建立应用层的连接Clie nt/Server 交互在发送和接收数据之前client 必须调用connect连接服务器server 必须调用accept 接收client的连接发送和接收数据关闭连接.12、

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

11、/srv.sin_family = AF_INET; /* connect: AF_INETsrv.sin_port = htons(8000); /* connect:目标是连向服务器的 8000 号端口 */srv.sin_addr.s_addr = inet_addr( “”); /* connect: 目标服务器的 IP Address 是 “”*/if(connect(fd, (struct sockaddr*) &srv, sizeof(srv) 0) fprintf(stderr,”connect error!n);exit(1);基本套接字函数 (3)- bind()基本套接字

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

13、客户连接 */if(bind(fd, (struct sockaddr*) &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

14、error!n);exit(1);基本套接字函数 (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 sock

15、addr*) &cli, &cli_len);if(newfd 0) fprintf(stderr, accept errorn);exit(1);cli.sin_addr.s_addr 包含了客户的 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 (SOC

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

17、1024SOCKET s;char bufBUFSIZE; / 缓冲区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* bytesToS

18、end,int nBytes,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

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

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

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

22、unctions */?#define MAXLINE 1024?void handle(int connfd);int main (int argc, const char * argv) NSAutoreleasePool * pool = NSAutoreleasePool alloc init;/ insert code here.NSLog(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);bzero(&servaddr, sizeof(servaddr);servaddr.sin_family = AF_INET; servaddr.sin_addr.s_addr = htonl(INADDR_ANY); servaddr.sin_port = htons(serverPort);listenfd = socket(AF_INET, S

温馨提示

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

评论

0/150

提交评论