zoukankan      html  css  js  c++  java
  • socket套接字

     套接字(socket)是套接口描述字的简称。和文件句柄相似,SOCKET提供了一咱通讯机制,是WINDOWS的一种通

    讯方式。应用程序创建了一个套接字后,就能够获得这种机制提供的网络服务功能。对于服务器来说,它提供

    了监听网络的连接请求;对于客户机来说,它可以连接到一个给定的主计算机和特定的端口上。客户端和服务

    器端可以通过套接字对象来发送和接收数据。套接字提供了分别基于连接的协议(TCP)等和无连接的协议

    (UDP)等,以满足网络连接的可靠性、稳定性以及高速性的要求。

    WINSOCK是网络编程接口,它构成了WINDOWS平台下网络编程的基础。

    开放系统互连七层模型(OSI)
    应用层——表示层——会话层——传输层——网络层——数据链路层——物理层

    应用层:用户的应用程序与网络之间的接口
    表示层:协商数据交换格式
    会话层:允许用户使用简单易记的名称建立连接
    传输层:提供终端到终端的可靠连接
    网络层:使数据路由经过大型互联网络
    数据链路层:决定访问网络介质的方式
    物理层:将数据转换为可通过物理介质传送的位

    TCP、UDP协议是位传输层的协议,而IP协议则是位于网络层的协议。

    TCP是传输控制协议,它是一种面向连接的协议,向用户提供可靠的全双工的字节流。
    TCP关心数据传输的准确性。
    应用程序利用TCP进行通讯时,发送方和接收方之间会建立一个虚拟连接,通过这一连接,双方可以把数据当作

    一个双向的字节流来进行交流。它就像打电话。我们从摘机拨号开始,到拨通后建立连接、进行通话,再到挂

    机断开连接这一过程,正是抽象的面向连接的具体表现。首先,在开始通话前,拨号,双方响应,从而建立一

    条虚拟的“链路”。只有在双方都处于活动状态,这条“链路”才会保持存在。其次,我们可以通过这条“链

    路”进行双向的会话,并且在一般情况下,我们可以通过对方的回答来确定对方是否已经正确听到了我们所说

    的话,这相当于面向连接协议为保证传输正确而进行的额外校验。

    UDP是用户数据报协议,这是一种无连接的协议。UDP是一种不可靠的数据报协议,它不能保证每一个UDP数据报

    可以到达目的地。但是,正是由于它的不可靠性,减少了数据确认的过程,所以UDP传输数据的效率比较高。
    就像是邮信。我们只需封好信封,然后将其投到邮筒中即可,但是我们不能保证邮局在把信件发送出去和信件

    在发送过程中没有受到伤害。
    总体看来,面向连接的服务可以保证双方传递数据的正确性,但却要为此进行额外的校验,通信双方建立通信

    信道也需要许多系统开销。而无连接的服务最大的优点就是速度快,因为它不需要去验证数据的完整性,也不

    会数据是否已接收而操心。


    IP是网际协议,自20世纪80年代以来它一直都是网际协议的主力协议,它使用32位地址,为TCP、UDP、ICMP等

    协议提供传送的分组服务。

    在WINDOWS网络编程中,套接字接口主要有三种类型:流式套接字、数据报套接字以及原始套接字。

    流式套接字定义了一种可靠的面向连接的服务,实现了无差错无重复的顺序数据传输。对于建立在这种流式套

    接字类型上的套接字来说,数据可以是双向传输的字节流,无长度限制。

    数据报套字接口定义了一种无连接的服务,数据通过相互独立的报文进行传输,是无序的,并且不保证可靠。

    原始套接字允许对低层协议如IP或ICMP直接访问,主要用于网络协议的测试,例如WINDOWS带的PING程序,就是

    通过ICMP协议来实现的。
    客户/服务器模式
    在现在的网络应用中,通信双方最常见的交互模式便是客户/服务器模式。在这种模式下,客户向服务器发出服

    务请求,服务器收到请求后为客户提供相应的服务。


    客户/服务器模式通常采用监听/连接的方式实现。服务器端应用程序在一个端口监听对服务的请求,也就是说

    ,服务进程一直处于休眠状态,直到一个客户对这个服务提出了连接请求,此时服务线程被“唤醒”并且为客

    户提供服务,即对客户的请求作出适当的反应。

    面向连接的协议套接字的调用
    面向连接的服务器端首先调用SOCKET()建立一个套接字S,用来监听客户端的连接请求。接着,调用bind()将此

    套接字与本机地址、端口绑定起来。然后,调用listen()告诉套字S,对进来的连接进行监听并确认连接请求,

    于是S被置于被动的监听模式。一个正在进行监听的套接字将给每个请求发送一个确认信息,告诉发送者主机已

    经收到连接请求。当时监听套接字S实际上并不接受连接请求,在客户端请求被接受后,调用
    accept()将返回一个与S具有相同属性,但不能被用来进行监听,只用来进行数据收发的数据套接字NS,作为与

    客户端套接字相对应的连接的另一个端点。对于该客户端套接字后续的所有操作,都应该通过NS来完成。监听

    套接字S仍然用于接收其他客户的连接请求。

    面向连接的服务器一般是迸发服务器。在WINDOWS平台上,我们往往在调用accept()返回NS后,会创建一个请求

    /应答执行线程,将NS作为参数之一传递给该线程,由该线程来完成客户端与服务器端复杂的请求应答工作,而

    主线程会再次调用accept(),以接收新的客户端连接请求。

    面向连接的客户端也会调用socket()建立一个套接字C,但使用像TCP这样的面向连接的协议时,客户端不必关

    心协议使用什么样的本机地址,所以不用调用bind()。客户端调用connect()向服务器端发出连接请求,在与服

    务器建立连接之后,客户端和服务器端就存在了一条虚拟的“管道”,客户端套字C和服务器端套接字NS构成了

    “管道”的两个端点。客户端和服务器端通过这个“管道”进行数据交换,多次调用send()/recv()来进行请求

    /应答,最终完成服务后关闭用于传输的套接字C和NS,并断开连接,结束此次会话。

    面向无连接协议的套接字的调用
    采用无连接协议(UDP)时,服务器一般都是面向事务的。一个请求和一个应答就完成了客户程序与服务器程序

    之间的相互作用。

    无边的服务器使用socket()和bind()来建立和绑定套接字S。与面向连接的服务器端不同,我们不必调用

    listen()和accept(),只需要调用recvFrom()在套接字S上等待接收数据就可以了。因为是无连接的,因此网络

    上任何一台机器发送的套接字S的数据都可以收到。从这一点上你可以想象,它们是无序的。

    无连接的服务器一般都是迭代服务器。它们接收到一个数据报后,马上进行相应处理,直到处理完成后,才开

    始下一个数据报的接收、处理。所以采用无连接协议时,客户端和服务器端的交互往往是很简单的,一问一答

    或只问不答的方式很常见。

    无连接的服务器端只有在停止服务时,才会关闭套接字。

    无连接的客户端则更简单,只需要调用socket()建立一个套接字C,就可以利用sendto()和recvfrom()与服务器

    的数据进行交换。在完成会话后调用closeSocket()关闭套接字C。
  • 相关阅读:
    微信支付
    集成支付宝SDK流程
    使用ASIFormDataRequest完成用户的登录操作
    本地推送UILocalNotification
    iOS 远程推送通知 详解
    iOS 8 中如何集成 Touch ID 功能
    iOS指纹识别Touch ID的安全性探讨
    iOS 支付(含支付宝、银联、微信)
    iOS 社交化分享功能
    Python3内建函数sorted
  • 原文地址:https://www.cnblogs.com/hnxxcxg/p/2940996.html
Copyright © 2011-2022 走看看