介绍套接字之前,我们先看一下传输层的协议TCP与UDP: TCP协议与UDP协议的区别 首先咱们弄清楚,TCP协议和UCP协议与TCP/IP协议的联系,很多人犯糊涂了,一直都是说TCP/IP协议与UDP协议的 区别,我觉得这是没有从本质上弄清楚网络通信! TCP/IP协议是一个协议簇。里面包括很多协议的。UDP只是其中的一个。之所以命名为TCP/IP协议,因为TCP,IP协议是 两个很重要的协议,就用他两命名了。 TCP/IP协议集包括应用层,传输层,网络层,网络访问层。 其中应用层包括: 超文本传输协议(HTTP):万维网的基本协议. 文件传输(TFTP简单文件传输协议): 远程登录(Telnet),提供远程访问其它主机功能,它允许用户登录 internet主机,并在这台主机上执行命令. 网络管理(SNMP简单网络管理协议),该协议提供了监控网络设备的方法,以及配置管理,统计信息收集,性能管理及安全管 理等. 域名系统(DNS),该系统用于在internet中将域名及其公共广播的网络节点转换成IP地址. 其次网络层包括: Internet协议(IP) Internet控制信息协议(ICMP) 地址解析协议(ARP) 反向地址解析协议(RARP) 最后说网络访问层:网络访问层又称作主机到网络层(host-to-network).网络访问层的功能包括IP地址与物理地址硬件 的映射,以及将IP封装成帧.基于不同硬件类型的网络接口,网络访问层定义了和物理介质的连接. 当然我这里说得不够完善,TCP/IP协议本来就是一门学问,每一个分支都是一个很复杂的流程,但我相信每位学习软件 开发的同学都有必要去仔细了解一番。 下面我着重讲解一下TCP协议和UDP协议的区别。 TCP(TransmissionControlProtocol,传输控制协议)是面向连接的协议,也就是说,在收发数据前,必须和对方建 立可靠的连接。一个TCP连接必须要经过三次“对话”才能建立起来,其中的过程非常复杂,只简单的描述下这三次对 话的简单过程:主机A向主机B发出连接请求数据包:“我想给你发数据,可以吗?”,这是第一次对话;主机B向主机A 发送同意连接和要求同步(同步就是两台主机一个在发送,一个在接收,协调工作)的数据包:“可以,你什么时候发 ?”,这是第二次对话;主机A再发出一个数据包确认主机B的要求同步:“我现在就发,你接着吧!”,这是第三次对 话。三次“对话”的目的是使数据包的发送和接收同步,经过三次“对话”之后,主机A才向主机B正式发送数据。 详细点说就是:(文章部分转载 shortintsin_family; unsignedshortintsin_port; structin_addrsin_addr; unsignedcharsin_zero[8]; }; lsin_family:用于指定地址族。 lsin_port:套接字通信的端口号。 lsin_addr:通信的IP地址。 lsin_zero[8]:用以填充0,保持与structsockaddr同样大小。 由于sockaddr数据结构与sockaddr_in数据结构的大小是相同的,指向sockaddr_in的指针可以通过强制转换,转换成指向sockaddr结构的指针。 intsocket(intdomain,inttype,intprotocol); socket函数用于创建通信的套接字,并返回该套接字的文件描述符。参数domain指定了通信域,该参数用于选择通信协议族参数type用于指定套接字的类型。套接字类型除了前面提到的流套接字、数据报套接字及原始套接字外,还有其他的几种类型参数protocol用于指定套接字使用的通信协议。正常情况下,对于给定的协议族,只有单一的协议支持特定的套接字类型。这时,只要将protocol参数设置为0即可 intconnect(intsockfd,conststructsockaddr*serv_addr,socklen_taddrlen); connect函数将使用参数sockfd中的套接字连接到参数serv_addr中指定的服务器。参数addrlen为serv_addr指向的内存空间大小。 如果参数sockfd的类型为SOCK_DGRAM,serv_addr参数为数据报发往的地址,且将只接收该地址的数据报。如果sockfd的类型为SOCK_STREAM或SOCK_SEQPACKET,调用该函数将连接serv_addr中的服务器地址。 ssize_tsend(ints,constvoid*buf,size_tlen,intflags); send函数用于将信息发送到指定的套接字文件描述符中。该函数只能用于已经建立连接的socket通信中,即只用于面向连接的通信中。参数s为要发送数据的套接字文件描述符。buf参数为指向要发送数据的指针。len为要发送数据的长度。flag参数可以包含如下的参数 ssize_trecv(ints,void*buf,size_tlen,intflags); recv函数用于从指定套接字中获取发送的消息。与send函数一样,该函数只能用于已经建立连接的socket通信中,即只用于面向连接的通信中。参数s为要读取信息的套接字文件描述符。buf参数为指向要保存数据缓冲区的指针。而len为该缓存的最大长度。 使用套接字除了可以实现网络间不同主机间的通信外,还可以实现同一主机的不同进程间的通信,且建立的通信是双向的通信。这里所指的使用套接字实现进程间通信,是由将通信域指定为PF_UNIX来实现的 AF表示ADDRESSFAMILY地址族,PF表示PROTOCOLFAMILY协议族,但这两个宏定义是一样的,所以使用哪个都没有关系。Winsock2.h中#defineAF_INET2,#definePF_INETAF_INET,所以在windows中AF_INET与PF_INET完全一样。而在Unix/Linux系统中,在不同的版本中这两者有微小差别。对于BSD,是AF,对于POSIX是PF。UNIX系统支持AF_INET,AF_UNIX,AF_NS等,而DOS,Windows中仅支持AF_INET,它是网际网区域。 AF_INET(又称PF_INET)是IPv4网络协议的套接字类型,AF_INET6则是IPv6的;而AF_UNIX则是Unix系统本地通信。选择AF_INET的目的就是使用IPv4进行通信。因为IPv4使用32位地址,相比IPv6的位来说,计算更快,便于用于局域网通信。而且AF_INET相比AF_UNIX更具通用性,因为Windows上有AF_INET而没有AF_UNIX。 2. SOCKET是进程间通信的一种方式,这个时候socket的创建、绑定、连接时的参数是与网络上不同主机间的通信不同的,比如对于socketaddr的使用,进程间通信使用的是sockaddr_un。而主机间的通信使用的是sockadd_in connect_fd=socket(PF_UNIX,SOCK_STREAM,0); if(connect_fd0) { perror(clientcreatesocketfailed); return1;} //setserversockaddr_un srv_addr.sun_family=AF_UNIX; strcpy(srv_addr.sun_path,UNIX_DOMAIN); //connecttoserver ret=connect(connect_fd,(structsockaddr*)srv_addr,sizeof(srv_addr)); 至于服务器的,参考下图: -------------------------------------------------------------------------------------------- 来源:网络 如果侵权,请第一时间回复联系,将第一时间为您处理 -------------------------------------------------------------------------------------------- 更多精彩内容: 1.回复“c语言”,查看c语言基础知识 2.回复“驱动”,查看驱动基础知识 3.回复uCOS,查看uCOS相关知识 4.回复Linux,查看Linux相关知识 5.回复汽车电子,查看汽车电子相关知识 兰州白癜风专科医院一般治疗白癜风要多少钱转载请注明原文网址:http://www.gzdatangtv.com/bcyykf/4769.html |