《网络编程基础》PPT课件

上传人:zhu****ei 文档编号:246235202 上传时间:2024-10-13 格式:PPT 页数:47 大小:640KB
返回 下载 相关 举报
《网络编程基础》PPT课件_第1页
第1页 / 共47页
《网络编程基础》PPT课件_第2页
第2页 / 共47页
《网络编程基础》PPT课件_第3页
第3页 / 共47页
点击查看更多>>
资源描述
,现代网络技术,现代网络技术,第,10,章,网络编程基础,10.1,socket,编程,10.2 利用,MySQL,C,接口实现多用户通信,10.1 socket,编程,10.1.1,基本概念,1,端口与插口,端口,用16 bit的地址码端口号进行标识,。,一个插口(,socket,),也称一个套接口,一个二元组(IP地址,端口号)。,一条连接需要用一对插口标识。这对插口组成一个四元组:,(本地IP地址,本地端口号,远程IP地址,远程端口号),现代网络技术,10.1 socket,编程,2,插口,API,为了简化网络应用程序的设计,为了使进程对通信信道的操作能够像对文件一样简单,伯克利的开发者们开发了一种称为,插口(,socket,)的逻辑文件。,当系统把一个socket分配给一个进程时,就是将一个进程连接到了一个信道的端点上,就好像一个用户把一台电话机接到了电话线上,只要对方也把电话机接到电话线上,双方就可以进行连接、通话了。,现代网络技术,10.1 socket,编程,Socket为整个网络通信提供协议基础。进程间的通信就通过连接两个进程的通路进行,软件设计人员不必考虑这个通路是什么,只要知道如何把一个进程连接到通路的端点即可;通路端点的分配由逻辑文件Socket进行,使得进程用文件描述符访问通路就像访问普通文件一样,大大简化了通信程序的设计。,现代网络技术,10.1 socket,编程,10.1.2 socket,概述,socket,接口,是TCP/IP网络的API,socket接口定义了许多函数或例程,程序员可以用它们来开发TCP/IP网络上的应用程序。,常用的,socket,类型有两种:,流式,socket,(,SOCK_STREAM,)流式,是一种面向连接的socket,针对于面向连接的TCP服务应用;,数据报式,socket,(,SOCK_DGRAM,),是一种无连接的socket,对应于无连接的UDP服务应用。,现代网络技术,10.1 socket,编程,10.1.3 socket,中的主要调用,1,建立,socket,为了建立socket,程序可以调用socket函数,该函数返回一个类似于文件描述符的句柄。socket函数原型为:,int socket(int domain,int type,int protocol);,现代网络技术,10.1 socket,编程,实际上“建立一个,socket,”,意味着为一个socket数据结构分配存储空间。socket执行体为你管理描述符表。,两个网络程序之间的一个网络连接包括五种信息:,通信协议、本地协议地址、本地主机端口、远端主机地址和远端协议端口。,socket,数据结构中包含这五种信息。,现代网络技术,10.1 socket,编程,2,socket,配置,面向连接的,socket,客户端,通过调用connect函数在socket数据结构中保存本地和远端信息。,无连接,socket,的客户端和服务端以及面向连接,socket,的服务端,通过调用bind函数来配置本地信息。,bind,函数原型为:,int bind(int sockfd,struct sockaddr*my_addr,int addrlen);,现代网络技术,10.1 socket,编程,struct sockaddr,结构类型是用来保存,socket,信息的:,struct sockaddr,unsigned short sa_family;/*,地址族,,AF_xxx*/,char sa_data14;/*14,字节的协议地址,*/,;,现代网络技术,10.1 socket,编程,另外还有一种结构类型:,struct sockaddr_in,short int sin_family;/*,地址族,*/,unsigned short int sin_port;/*,端口号,*/,struct in_addr sin_addr;/*IP,地址,*/,unsigned char sin_zero8;/*,填充,0,以保持与,struct sockaddr,同样大小,*/,;,现代网络技术,10.1 socket,编程,使用bind函数时,可以用下面的赋值实现自动获得本 机IP地址和随机获取一个没有被占用的端口号:,my_addr.sin_port=0;/*,系统随机选择一个未被使用的端口号,*/,my_addr.sin_addr.s_addr=INADDR_ANY;/*,填入本机,IP,地址,*/,现代网络技术,10.1 socket,编程,计算机数据存储有两种字节优先顺序:,高位字节优先,低位字节优先,。,Internet上数据以高位字节优先顺序在网络上传输,所以对于在内部是以低位字节优先方式存储数据的机器,在Internet上传输数据时就需要进行转换,否则就会出现数据不一致。,现代网络技术,10.1 socket,编程,下面是几个字节顺序转换函数:,(1)htonl():把32位值从主机字节序转换成网络字节序,(2)htons():把16位值从主机字节序转换成网络字节序,(3)ntohl():把32位值从网络字节序转换成主机字节序,(4)ntohs():把16位值从网络字节序转换成主机字节序,现代网络技术,10.1 socket,编程,3,连接建立,面向连接的客户程序,使用connect函数来配置socket并与远端服务器建立一个TCP连接,其函数原型为:,int connect(int sockfd,struct sockaddr*serv_addr,int addrlen);,现代网络技术,10.1 socket,编程,listen函数,使socket处于被动的监听模式,并为该so cket建立一个输入数据队列,将到达的服务请求保存在此队列中,直到程序处理它们。,int listen(int sockfd,,,int backlog);,现代网络技术,10.1 socket,编程,accept(),函数,让服务器接收客户的连接请求。在建立好输入队列后,服务器就调用accept函数,然后睡眠并等待客户的连接请求。,int accept(int sockfd,void*addr,int*addrlen);,现代网络技术,10.1 socket,编程,4,数据传输,send()和recv()这两个函数用于面向连接的socket上进行数据传输,。,send()函数原型为:,int send(int sockfd,const void*msg,int len,int flags);,现代网络技术,10.1 socket,编程,在程序中应该将send()的返回值与欲发送的字节数进行比较。当send()返回值与len不匹配时,应该对这种情况进行处理。,char*msg=Hello!;,int len,bytes_sent;,len=strlen(msg);,bytes_sent=send(sockfd,msg,len,0);,现代网络技术,10.1 socket,编程,recv(),函数原型为:,int recv(int sockfd,void*buf,int len,unsigned int flags);,sendto()和recvfrom()用于在无连接的数据报socket方式下进行数据传输。由于本地socket并没有与远端机器建立连接,所以在发送数据时应指明目的地址。,现代网络技术,10.1 socket,编程,sendto(),函数原型为:,int sendto(int sockfd,const void*msg,int len,unsigned int flags,const struct sockaddr*to,int tolen);,recvfrom(),函数原型为:,int recvfrom(int sockfd,void*buf,int len,unsigned int flags,struct sockaddr*from,int*fromlen);,现代网络技术,10.1 socket,编程,5,结束传输,当所有的数据操作结束以后,你可以调用,close(),函数来释放该,socket,,从而停止在该,socket,上的任何数据操作:,close(sockfd);,可以调用,shutdown(),函数来关闭该,socket,。,int shutdown(int sockfd,int how);,现代网络技术,10.1 socket,编程,10.1.4 socket,实例,代码实例中的服务器通过socket连接向客户端发送字符串“Hello,you are connected!”。只要在服务器上运行该服务器软件,在客户端运行客户软件,客户端就会收到该字符串。,现代网络技术,10.1 socket,编程,1,服务器软件代码,#include,#include,#include,#include,#include,#include,#include,#include,#define SERVPORT 3333/*,服务器监听端口号,*/,#define BACKLOG 9/,*,最大同时连接请求数,*/,main(),int sockfd,client_fd;/*sock_fd,:监听,socket,;,client_fd,:数据传输,socket*/,struct sockaddr_in my_addr;/*,本机地址信息,*/,struct sockaddr_in remote_addr;/*,客户端地址信息,*/,if(sockfd=socket(AF_INET,SOCK_STREAM,0)=-1),perror(socket,创建出错!,);exit(1);,现代网络技术,10.1 socket,编程,my_addr.sin_family=AF_INET;,my_addr.sin_port=htons(SERVPORT);,my_addr.sin_addr.s_addr=INADDR_ANY;,bzero(,if(bind(sockfd,(struct sockaddr*)&my_addr,sizeof(struct sockaddr),=-1),perror(bind,出错!,);,exit(1);,if(listen(sockfd,BACKLOG)=-1),perror(listen,出错!,);,exit(1);,现代网络技术,10.1 socket,编程,while(1),sin_size=sizeof(struct sockaddr_in);,if(client_fd=accept(sockfd,(struct sockaddr*)&remote_addr,&sin_size)=-1),perror(accept,出错,);,continue;,printf(received a connection from%sn,inet_ntoa(remote_addr.sin_addr);,if(!fork()/*,子进程代码段,*/,if(send(client_fd,Hello,you are connected!n,26,0)=-1),perror(send,出错!,);,close(client_fd);,exit(0);,现代网络技术,10.1 socket,编程,close(client_fd);,2,客户端程序代码,#include,#include,#include,#include,#include,#include,#include,#include,#define SERVPORT 3333,#define MAXDATASIZE 90/*,每次最大数据传输量,*/,现代网络技术,10.1 socket,编程,main(int argc,char*argv),int sockfd,recvbytes;,char bufMAXDATASIZE
展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 图纸专区 > 课件教案


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!