Socket进程通信机制
1、Socket通常称为“套接字”,用于描述IP地址和端口,是一个通信链的句柄。
2、应用程序通过套接字向网络发出请求或者应答网络请求。
3、Socket既不是一个程序,也不是一种协议,其只是操作系统提供的通信层的一组抽象API。
4、进程通信的相关概念:
网间进程通信要解决的是不同主机进程间相互通信问题。为此,首先要解决的是网间进程标识问题。同一主机上,不同进程可用唯一进程号(Process ID)标识。
(1)端口:网络中可以被命名和寻址的通信端口,是操作系统可分配的一种资源,用于标识通信的进程
传输层和网络层在功能上功能上的最大区别是传输层提供进程通信能力。
端口是一种抽象的软件结构。应用程序(即进程)通过系统调用与某端口建立连接(binding)后,传输层传给该端口的数据都被相应的进程所接收,相应的进程发给传输层的数据都通过该端口输出。
类似于文件描述符,每一个端口都拥有一个端口号,都是整数型标识符,用于区别不同端口。
TCP/UDP段结构中端口的地址都是16比特,有0~65535个端口号。
常见的端口号有,FTP(22)、HTTP(80)、SMTP(25)等。
(2)地址:
网络通信中通信的两个进程分别处在不同的机器上,应遵循以下原则:
某台主机可以与多个网络相连,必须指定一个特定的网络地址;
网络上每台主机应有唯一的地址;
每台主机的每个进程应有在该主机上的唯一标识符
(3)连接:
两个进程间的通信链路称为连接。连接表现为一些缓冲区和一组协议机制。
5、Socket是一种服务,与其实现的语言无关。基于这个性质,我们能实现不同服务之间,不同语言之间的互联互通。
6、注意一个小知识点:本地进程间通过TCP通信,使用Fiddler等抓包工具是抓不到数据的。主要是因为回环接口的机制,这些包不会到达网卡,数据包直接被返回到传输层的输入队列中去了。
7、Socket函数原型:
SOCKET socket(int af, int type, int protocol);
af:指定应用程序使用的通信协议的协议族,对于TCP/IP协议族该参数设置为AN_INET,对于UNIX可建立本地Socket
type:指定创建socket类型:
流套接字类型(SOCK_STREAM):最常见的类型,基于TCP协议
数据报套接字类型(SOCK_DGRAM):即UDP数据报
原始套接字类型(SOCK_RAW):在IP层对套接字进行编程
protocol:指定应用程序所使用的通信协议。最常用的是TCP和UDP
流套接字和数据报套接字不能完成的任务,可以在原始套接字中得以实现。
8、Socket从传输模式上又分为端对端和点对点的连接,流套接字和数据报套接字都属于端对端的连接,因此需要绑定端口号。而原始套接字是基于IP协议的,属于点对点的传输模式,是没有端口这个概念的。比如常用的监测网络连接ping命令,就是基于ICMP协议的,它不存在端口的概念。
9、PHP中的Socket函数:
(1)socket_create(int $domain, int $type, int $proticol):创建一个socket
第一个参数指定socket创建时所使用的通信协议族 AF_INET(基于IPv4)、AF_INET6(基于IPv6)、AF_UNIX(UNIX本地通信协议)
第二个参数指定socket通信的交互类型,SOCK_STREAM(可靠的全双工链接,支持TCP)、SOCK_DGRAM(自动寻址信息功能,支持UDP)等
第三个参数指定搜才可以使用何种类型处理协议,包括ICMP、UDP、TCP
(2)socket_bind(resource $socket, string $address[, int $port = 0]):将IP地址和端口绑定到socket_create()所创建的句柄
第一个参数是必选参数,其值是socket_create()创建的句柄
第二个参数是必选参数,其值是要绑定的IP地址
第三个参数是可选参数,其值是要绑定的端口号
(3)socket_listen($socket[, $backlog = 0]):用于监听客户端数据
第一个参数是socket句柄
第二个参数的允许的最大连接数
(4)socket_set_block($socket):设置为非阻塞模式
(5)socket_write($socket, $buffer[, $length=0]):使用此函数想socket写入数据
(6)socket_read($socket, $length[, $type = PHP_BINARY_READ]):读取指定长度的数据
(7)fsockopen($hostname, [$port = -1 [, $errno [, $errstr [$timeout = ini_get["default_socket_timeout"] ]]]) :实现长连接
(8)socket_set_option($socket, $level, $optname, $optval):设置socket的控制选项
(9)socket_last_error([$socket]):返回操作中任何socket产生的最后错误,返回值是一个int型的错误代号
接下来用PHP创建一个socket例子:
<?php
$host = "127.0.0.1";
$port = 8880;
set_time_limit(0); //创建socket
$socket = socket_create(AF_INET, SOCK_STREAM, 0) or die('create error'); //绑定socket到指定端口
$result = socket_bind($socket, $host) or die('bind error'); //开始监听连接
$result = socket_listen($socket, 3) or die('listen error'); //接收连接请求并调用另一个子socket处理客户端——服务器间的信息
$spawn = socket_accept($socket) or die('accept error'); //读取客户端输入
$input = socket_read($spawn, 1024) or die('spawn read error'); $output = "我是返回的数据";
//返回服务端
socket_write($spawn, $output, strlen($output)) or die('write error'); //关闭socket
socket_close($socket);
socket_close($$spawn);
?>
Socket进程通信机制的更多相关文章
- Socket进程通信机制及应用
Socket通常称为“套接字”,用于描述IP地址和端口,是一个通信链的句柄.应用程序通过套接字向网络发出请求或者应答网络请求.Socket即不是一个程序,也不是一个协议,其只是操作系统提供的通信层的一 ...
- 图文详解 Android Binder跨进程通信机制 原理
图文详解 Android Binder跨进程通信机制 原理 目录 目录 1. Binder到底是什么? 中文即 粘合剂,意思为粘合了两个不同的进程 网上有很多对Binder的定义,但都说不清楚:Bin ...
- Android 进程通信机制之 AIDL
什么是 AIDL AIDL 全称 Android Interface Definition Language,即 安卓接口描述语言.听起来很深奥,其实它的本质就是生成进程间通信接口的辅助工具.它的存在 ...
- Qt 的内部进程通信机制
Qt 的内部进程通信机制 续欣 (xxin76@hotmail.com), 博士.大学讲师 2004 年 4 月 01 日 Qt 作为一种跨平台的基于 C++ 的 GUI 系统,能够提供给用户构造图形 ...
- http,socket,进程通信,网络通信(1)
众所周知,网络通信本质上就是进程间通信,进程间通信有以下常见的通信方式: 1,管道pipe:管道是一种半双工的通信方式,数据只能单向流动,而且只能在具有亲缘关系的进程间使用,进程的亲缘关系通常指父子进 ...
- Storm进程通信机制
storm的worker进程之间消息传递机制图: 每个worker都有一个独立的监听进程,监听配置文件中配置过的端口列表supervisor.slots.ports,topology.receiver ...
- AIDL/IPC Android AIDL/IPC 进程通信机制——超具体解说及使用方法案例剖析(播放器)
首先引申下AIDL.什么是AIDL呢?IPC? ------ Designing a Remote Interface Using AIDL 通常情况下,我们在同一进程内会使用Binder.Broad ...
- Socket的通信机制?
套接字(socket)是通信的基石,是支持TCP/IP协议的网络通信的基本操作单元.它是网络通信过程中端点的抽象表示,包含进行网络通信必须的五种信息:连接使用的协议,本地主机的IP地址,本地进程的协议 ...
- IPC进程通信机制
select.poll.epoll之间的区别总结[整理] 进程间通信---共享内存 信号量和互斥锁的区别 http://www.2cto.com/os/201510/445553.html http: ...
随机推荐
- 【洛谷P1896【SCOI2005】】互不侵犯King
题目描述 在N×N的棋盘里面放K个国王,使他们互不攻击,共有多少种摆放方案.国王能攻击到它上下左右,以及左上左下右上右下八个方向上附近的各一个格子,共8个格子. 输入输出格式 输入格式: 只有一行,包 ...
- 第14月第17天 automaticallyAdjustsScrollViewInsets contentInsetAdjustmentBehavior
1. automaticallyAdjustsScrollViewInsets self.edgesForExtendedLayout = UIRectEdgeNone; if ([self resp ...
- OO第三阶段总结
软件形式化方法历史 形式化方法的研究高潮始于20世纪60年代后期,针对当时所谓"软件危机",人们提出种种解决方法,归纳起来有两类:一是采用工程方法来组织.管理软件的开发过程:二是深 ...
- 2017-2018-2 165X 『Java程序设计』课程每周成绩公布
2017-2018-2 165X 『Java程序设计』课程 每周成绩公布 本博客将跟随教学进度不定期更新,每次更新后将在课程群公布.如对成绩有疑问,请于公布成绩后的1天之内联系助教,进行审核确认. - ...
- nginx入门一
配置文件: server_name user root; worker_processes 2; error_log logs/error-test.log; #pid logs/nginx.pid; ...
- Jetson tk1 hash sum mismatch
sudo apt-get update遭遇Hash Sum Mismatch 修改DNS服务器地址: sudo gedit /etc/resolv.conf 解决办法: 在装有goagent的情况下: ...
- 说说流控制(RTS/CTS/DTR/DSR 你都明白了吗?)【转】
转自:http://bbs.ednchina.com/BLOG_ARTICLE_129041.HTM 以前写的博文,转过来 ============== 先引用一篇网文,作者不详,因几个地方都说自己是 ...
- setfacl报错Operation not supported
对文件目录setfacl权限设置时报错Operation not supported Google一下,发现是分区acl权限问题 一般情况下(ext4),默认acl支持都是加载的.但如果遇到二般情况, ...
- java多线程系列六、线程池
一. 线程池简介 1. 线程池的概念: 线程池就是首先创建一些线程,它们的集合称为线程池. 2. 使用线程池的好处 a) 降低资源的消耗.使用线程池不用频繁的创建线程和销毁线程 b) 提高响应速度,任 ...
- C#实现Zip压缩解压实例
原文地址:https://www.cnblogs.com/GoCircle/p/6544678.html 本文只列举一个压缩帮助类,使用的是有要添加一个dll引用ICSharpCode.SharpZi ...