收藏 分享(赏)

linux-c语言实现网络通信简介.ppt

上传人:无敌 文档编号:51037 上传时间:2018-03-07 格式:PPT 页数:28 大小:298.52KB
下载 相关 举报
linux-c语言实现网络通信简介.ppt_第1页
第1页 / 共28页
linux-c语言实现网络通信简介.ppt_第2页
第2页 / 共28页
linux-c语言实现网络通信简介.ppt_第3页
第3页 / 共28页
linux-c语言实现网络通信简介.ppt_第4页
第4页 / 共28页
linux-c语言实现网络通信简介.ppt_第5页
第5页 / 共28页
点击查看更多>>
资源描述

1、Linux C语言实现网络通信简介,主要内容,TCP/IP协议概述Socket基础编程域套接字,一、TCP/IP协议概述,OSI参考模型及TCP/IP参考模型,负责应用程序的网络访问,通过端口号来识别各个不同的进程。,负责端对端之间的通信会话连接与建立。传输协议的选择根据数据传输方式而定。,负责将数据帧封装成IP数据包,并运行必要的路由算法。,负责将二进制流转换为数据帧,并进行数据帧的发送和接收。数据帧是独立的网络信息传输单元。,TCP,TCP(Transmission Control Protocol,传输控制协议):为应用程序提供可靠的通信连接,实现了从一个应用程序到另一个应用程序的数据传

2、递。适合于一次传输大批数据的情况,并适用于要求得到响应的应用程序。 建立一次TCP连接需三次握手,基本过程是服务器先建立一个套接口并等待客户端的连接请求,然后顺序进行三次握手: 第一次握手:当客户端调用 connect进行主动连接请求时,客户端TCP发送一个SYN,告诉服务器客户端将在连接中发送的数据的初始序列号; 第二次握手:当服务器收到这个SYN后也给客户端发一个SYN,里面包含了服务器将在同一连接中发送的数据的初始序列号; 第三次握手:最后客户再回送一个带有确认顺序号和确认号的数据段来确认服务器发的SYN。 到此为止,一个TCP连接被建立。,TCP 三次握手,TCP数据报头,UDP(Us

3、er Datagram Protocol,用户数据报协议):是一种无连接协议,不需要像TCP那样通过三次握手来建立一个连接。且不对传送包进行可靠的保障,适合于一次传输少量数据,其可靠性由应用层来负责。同时,一个UDP应用可同时作为应用的客户方或服务器方。UDP比TCP能更好地解决实时性的问题,包括网络视频会议系统在内的众多的客户/服务器模式的网络应用都使用UDP协议。,UDP数据报头,UDP,二、 Socket基础编程,socket概述,socket概念: 在Linux中的网络编程是通过socket接口来进行的。socket是一种特殊的I/O接口,它也是一种文件描述符,是一种常用的进程之间通信

4、机制,通过它不仅能实现本地机器上的进程之间的通信,而且能够实现不同机器上的进程之间的通信。socket类型:(1)流式socket(SOCK_STREAM):使用TCP协议(2)数据报socket(SOCK_STREAM):使用数据报协议UDP(3)原始socket:主要用于一些协议的开发流式socket和数据报socket的区别:前者在通信之前必须先建立连接,并且只能和一方通信;而后者在通信之前不用先建立连接,并且可以和多方通信。,socket,bind,recv/read,close,close,recv/read,connect,socket,send/write,send/write,

5、传输数据,传输数据,accept,listen,bind,等待客户连接请求的到来,三次握手过程建立TCP连接,服务器端,客户端,TCP协议socket编程的流程图,socket,recvfrom,sendto,bind,close,close,recv,connect,socket,send,send/sendto,recv/recvfrom,在connect之后也可以用read和write,或,或,传输数据,传输数据,UDP协议socet编程的流程图,进行socket编程的基本函数,socket():用于建立一个socket连接。可以指定socket类型等信息。在建立了socket连接之后,

6、可对socketaddr或socketaddr_in进行初始化,以保存所建立的socket信息。bind():用于将本地IP地址绑定到端口号,主要用于TCP的连接,在UDP的连接中不用。listen():用于创建一个等待队列,在其中存放未处理的客户端连接。connect():在TCP中用于与服务器端建立连接,而在UDP中connect()的作用是限定该套接字只能和指定的一方通信,即未使用connect之前,可以和任意的地址通信,而connect之后只能和一方通信。在TCP中一个socket只能connect一次,而在UDP中一个socket可以connect多次。,accept():用于等待并

7、接收客户端的连接请求,它通常从等待队列中取出第一个未处理的连接请求。send()和recv():分别用于发送和接收数据,可以用在TCP中,也可以用在UDP中。 sendto()和recvfrom():作用与send()和recv()类似。当用在TCP时,后面的几个与地址有关参数不起作用,作用等同于send()和recv();当用在UDP时,可以用在之前没有使用connect()的情况下,这两个函数可以自动寻找指定地址并进行连接。,Socket地址数据结构,struct sockaddr unsigned short sa_family; /*协议族*/ char sa_data14; /*协议

8、地址,包含该socket的IP地址和端口号。*/;struct sockaddr_in short int sa_family; /*协议族*/ unsigned short int sin_port; /*端口号*/ struct in_addr sin_addr; /*IP地址*/ unsigned char sin_zero8; /*填充0 以保持与struct sockaddr同样大小*/;,socket()函数:建立一个socket连接,bind()函数:将本地IP地址绑定到端口号(TCP),listen()函数:创建一个等待队列,connect()函数:与服务器端建立连接(TCP)

9、或限定该套接字只能和指定的一方通信(UDP),accept()函数:等待并接收客户端的连接请求,send()函数:发送数据,recv()函数:接收数据,sendto()函数,recvfrom()函数,三、域套接字,管道由于只能实现具有亲缘进程的进程间通信,使用受到了很大的限制,有名管道解决了这一问题。但是,无论是管道还是有名管道,都只能实现单向通信(在只创建一个管道的情况下)。 用套接字除了可以实现网络间不同主机间的通信外,还可以实现同一主机的不同进程间的通信,且建立的通信是双向的通信。这里所指的使用套接字实现进程间通信,是由将通信域指定为PF_UNIX来实现的,即Unix域套接字。,Unix

10、域套接字是通过套接字API实现的简单的协议族。实际上它并不代表一个网络协议;它只能连接到同一台机器上的套接字。它提供了灵活的IPC机制。它的地址是它所在的文件系统的路径名,创建之后套接字就和路径名绑定在一起。用来表示Unix域地址的套接字文件能够使用stat()但是不能通过open()打开,而且应该使用套接字API对它进行操作。Unix域套接字是面向连接的,每个套接字的连接都建立了一个新的通讯信道。服务器可能同时处理许多连接,但对于每个连接都有不同的文件描述符。这个属性使Unix域套接字能够比命名管道更好的适应IPC任务。,域套接字的函数的形式int socket(int domain, int type, int protocol);socket函数中的domain参数用于指定通信域,domain参数取PF_UNIX时,表示创建UNIX域的套接字。使用PFUNIX域的套接字可以实现同一机器上的不同进程间的通信。域套接字地址结构struct sockaddr_un sa_family_t sun_family; /* PF_UNIX或AF_UNIX */ char sun_path104; /* 要绑定的套接字文件路径 */ ,谢谢,

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 企业管理 > 管理学资料

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报