Sockethtml
Socket 简介git
Socket起源于 20 世 纪 80 年代早期,最先由 4.1c BSD UNIX 引入,因此也称之为“BSD Socket 或者 Berkeley Socket”。BSD Socket 是事实上的网络应用编程接口标准,其它编程语言每每也是用与这套(用C写成的编程接口)相似接口。程序员
用 Socket 可以实现网络上的不一样主机之间或同一主机的不一样对象之间的数据通讯。因此,如今 Socket 已是一类通用通讯接口的集合。github
大的类型能够分为网络 Socket 和本地 Socket 两种。编程
本地上的两个进程如何通讯?网络
内存共享(munmap());socket
消息和队列;编程语言
管道(匿名管道pipe()和命名管道mkfifo());测试
信号量(P V操做);url
RPC remote protocol control
本地Socket;
网路上的两个进程如何通讯?
本地进程间通讯(IPC)经过PID(在终端中输入ps -ef可查看PID)能够惟一肯定彼此,而后经过共享内存,消息队列来通;网络上的两个进程肯定彼此须要IP与端口号,经过传输层(TCP/UDP)协议进行通讯;
这就是网络 Socket 。
socket能够理解为:在TCP/UDP 加一个端口(在网卡注册的,还记得吧)绑定。
网路socket和 本地 Socket对比
在同一个设备上,两个进程若是须要进行通信最基本的一个前提能可以惟一的标示一个进程,在本地进程通信中可使用PID来惟一标示一个进程;
PID只在本地惟一,网络中的两个进程PID冲突概率很大,此时显然不行了,怎么办?
IP层的ip地址能够惟一标示主机,而TCP层协议和端口号能够惟一标示主机的一个进程,因此能够利用ip地址+协议+端口号惟一标示网络中的一个进程。
Socket通讯就是一种肯定了端口号的TCP/IP通讯,或者说Socket通讯与IP通讯差异就是端口肯定,协议肯定。
用一张图表达一下:
Socket.png
端口的打开是双方的,在C/S(Client&&Server)结构的TCP链接中不单单要注意到S的端口(监听的),实际上C也开了一个端口,而C端的端口是动态端口,TCP链接创建的时候,C端的端口会在三次握手结束后肯定,动态打开一个,这个端口不受用户/程序员的控制。
Socket C 端书写步骤
建立ke户端Socket
建立fu务器Socket
链接到fu务器(Socket编程)
发送数据给fu务器
接收fu务器返回的数据
关闭Socket : close(socketNumber)
一张经典的Socket C/S的步骤图。
Socket.jpg
按照上面步骤就能够写一个socket的通讯的小demo:
写好的已经放在了个人github;
此时没有写fu务端,怎么测试?
可利用:nc -lk 端口号:始终监听本地计算机此端口的数据。
eg:nc -lk 6666;
操做步骤gif
监听 6666端口
connettion;
发送socket;fu务器接收到socket;
fu务端send :hello socket;
操做步骤.gif
S端socket通讯步骤
提供一些fu务
将这个fu务与本身的IP地址、端口绑定
监放任何到这个IP+端口的TCP请求
接受/拒绝创建这个TCP链接
读写
断开TCP链接
socketfu务端下次再谈!以上就是本次回顾。