iOS总结-Socket的分析(二)之什么是Socket?

对于Socket,我也是自己慢慢学习,参考大神文章https://www.jianshu.com/p/2dbb360886a8
https://blog.csdn.net/yeyuangen/article/details/6799575
什么是Socket? 
socket引入是为了解决不同计算机间进程间通信问题
socket与进程间的关系: socket用来让一个进程和其他的进程互相信息,而Socket接口是TCP/IP网络的API接口函数
socket与文件的关系: socket是种特殊的I/O
1.Socket最先应用于Unix系统
2.可对其进行文件操作
3.有文件描述符 文件描述符的本质是一个非负整数.
Socket是网络上运行的两个程序间双向通讯的一端,既可以接受请求,也可以发送请求,利用它可以较为方便的编写网络上数据的传输.
现在server与client想建立连接, server近知道client的IP,端口号不知道,能建立连接吗?
C和S是相对而言的,发起方是C,监听端口接受连接方式是server,client如果不知道server监听的端口,怎么发起连接
每个网络通信循环地进出主计算机的TCP,应用层,它被两个所连接的号码唯一地识别.这两个号码合起来叫做套接字,组成套接字的两个号码就是机器的IP 地址 和TCP 权健所使用的端口号.
通过socket()函数可以创建一个套接字,然后再把它绑定到端口号.
一个socket句柄代表两个地址对 本地ip:port -- 远程ip:port
socket的概念到底到哪里为止?如利用socket()可以产生一个套接字句柄,可是在bind() 或connect() 之前它只是一个文字描述符.
如果说socket代表一个两个地址对,那么句柄的作用是不是仅仅是在bind() 或 connect() 之后的用于区分和标记这样的地址对?因为这样它才能和网络的概念连接起来.这样,socket的意义应该是说用文件描述符描述的通信双方的IP地址和端口号地址对.
答: socket为内核对象,由操作系统内核来维护其缓冲区,引用计数,并且可以在多个进程中使用.​​​​​​至于称为句柄/文件描述符都是一样的,它只不过是内核开放给用户进程使用的整数而已.
对于句柄  ip   port 的关系:
      1. 每个socket 本质上都是指一个ip地址和端口对
      2.为了操作这样的地址对,使用了文件描述符
      3.socket() 函数只创建了一个普通的文件描述符,在进行bind() 或connect() 之前并不能说创建了用于网络通讯的套接字
      4.只有在进行了bind() 或 connect() 之后socket才被创立起来
       socket() 创建了一个socket内核对象, accept() 或 connect后, 才可以对socket句柄读写. 因为只有在 connect 或 bind,listen,accept后才会设置好socket内核对象里边的ip 和端口
     socket 和端口理解
     一个socket句柄代表两个地址对"本地ip: port " -- "远程ip:port"
    在windows下叫句柄, 在linux 下叫文件描述符
    socket建立连接的过程大致分为:
     1. 建立socket套接字
     2.给套接字赋予地址, 这个地址不是通常的网络地址的概念
     3.建立socket连接
     建立socket套接字时, 实际上是建立了一个数据结构.好像我们获得了一个像文件描述符那样的套接字描述符,就像我们队文件进行操作那样,我们可以通过向套接字里面写数据将数据传送到我们制定的地方,可以是远端的主机, 也可以是本地的主机.
依照建立套接字的目的不同,赋予套接字地址的方式有两种: 服务端使用bind , 客户端使用connect
Bind:  只要使用ip , port 就可以区分一个tcp/ip连接(如果要区分特定的主机间的连接, 还需要第三个属性hostname), 我们用bind函数来为一个使用在服务器端中的套接字赋予通信的地址和端口, 将通信的ip地址和端口合起来构成了一个socket地址, 而制定一个socket使用特定的ip和port来进行通信的过程就是赋予这个socket一个地址
 一个特定socket的地址生命期是bind成功以后到连接断开前.
connect: 对于客户端来说, 不使用bind , 它们通过connect函数来建立socket和socket地址之间的关系. 其中socket地址是想要连接的服务器端的socket地址. 在connect建立socket 和 socket地址两种关系的同时,它在尝试着建立远端的连接.
建立socket连接:   准备建立一个连接,服务端要2个步骤: bind 和 listen ; 客户端: connect 
                              如果服务器端accept一个connect, 而客户端得到了这个accept的确认, 那么一个连接就建立了


 

猜你喜欢

转载自blog.csdn.net/qq_28551705/article/details/85267441
今日推荐