当前位置: 首页 > news >正文

做网站软件是什么行业怎样做广告设计

做网站软件是什么行业,怎样做广告设计,做淘宝网站要求与想法,菜鸟html教程IPC#xff08;Inter-Process Communication 进程间通信#xff09; 一般方法#xff1a;(1) 半双工Unix管道 (2) FIFOs(命名管道) (3) 消息队列 (4) 信号量 (5) 共享内存 (6) 网络Socket (7) RPC(远程过程调用) #xff08;一#xff09;管道#xff08;Pipe#xff…IPCInter-Process Communication 进程间通信 一般方法(1) 半双工Unix管道 (2) FIFOs(命名管道) (3) 消息队列 (4) 信号量 (5) 共享内存 (6) 网络Socket (7) RPC(远程过程调用) 一管道Pipe 1.未命名管道ps aux | grep java cmd1 : exec.Command(ps, aux) cmd2 : exec.Command(grep, apipe)//cmd对象的底层Stdout与Stdin属性也是通过指向一个字节流实现读写的这里用新建的字节流代替 var outputBuf1 bytes.Buffer cmd1.Stdout outputBuf1 if err : cmd1.Start(); err ! nil {fmt.Printf(Error: The first command can not be startup %s\n, err)return } if err : cmd1.Wait(); err ! nil { //wait会阻塞cmd直到其运行完毕fmt.Printf(Error: Couldnt wait for the first command: %s\n, err)return } //cmd1的输出与cmd2的输入指向同一个字节流地址 cmd2.Stdin outputBuf1 var outputBuf2 bytes.Buffer cmd2.Stdout outputBuf2 if err : cmd2.Start(); err ! nil {fmt.Printf(Error: The second command can not be startup: %s\n, err)return } if err : cmd2.Wait(); err ! nil {fmt.Printf(Error: Couldnt wait for the second command: %s\n, err)return }2.命名管道mkfifo -m 777 myfifo cat src.log myfifo 操作作用特性reader, writer, err : os.Pipe()创建独立管道可以被多路复用不提供原子操作支持 reader, writer, err : os.Pipe() if err ! nil {fmt.Printf(Error: Couldnt create the named pipe: %s\n, err) } //Read与Write会在另一端还未就绪时对进程进行阻塞所以二者需要并发运行 go func() {output : make([]byte, 100)n, err : reader.Read(output)if err ! nil {fmt.Printf(Error: Couldnt read data from the named pipe: %s\n, err)}fmt.Printf(Read %d byte(s). [file-based pipe]\n, n) }() input : make([]byte, 26) for i : 65; i 90; i {input[i-65] byte(i) } n, err : writer.Write(input) if err ! nil {fmt.Printf(Error: Couldnt write data to the named pipe: %s\n, err) } fmt.Printf(Written %d byte(s). [file-based pipe]\n, n)操作作用特性reader, writer : io.Pipe()创建内存独立管道基于内存的提供原子操作保证的管道 reader, writer : io.Pipe() go func() {output : make([]byte, 100)n, err : reader.Read(output)if err ! nil {fmt.Printf(Error: Couldnt read data from the named pipe: %s\n, err)}fmt.Printf(Read %d byte(s). [in-memory pipe]\n, n) }() input : make([]byte, 26) for i : 65; i 90; i {input[i-65] byte(i) } n, err : writer.Write(input) if err ! nil {fmt.Printf(Error: Couldnt write data to the named pipe: %s\n, err) } fmt.Printf(Written %d byte(s). [in-memory pipe]\n, n) time.Sleep(200 * time.Millisecond)二信号Signal ​ IPC中唯一一种异步通信方法本质是利用软件来模拟硬件的中断机制信号用来通知某个进程有某个事件发生了。 ​ Linux中一共有62种信号1到31属于标准信号标准信号只会被处理并记录一次并且一次发送的多个标准信号其处理顺序是不确定的34到64属于实时信号多个同种类的实时信号都可以记录在案并且可以按照信号的发送顺序被处理。Ctrl—C SIGINT [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-z3UGR24Z-1638325000547)(…/…/Pic/image-20211124160241715.png)] type Signal interface{String() stringSignal() }方法作用func Notify(c chan- os.Signal, sig …os.Signal)当操作系统向当前进程发送指定信号时发出通知func Stop(c chan- os.Signal)删除定义的自处理通知通道恢复系统默认操作func FindProcess(pid int) (*Process, error)根据Pid返回一个进程对象可以向对象发送Signal信息syscall.SIGINT…syscall中定义了所有信号常量 os.Signal通道内部维护了一个包级私有字典用于存放以Signal接收通道为键并以信号集合为元素的键—元素对。调用Notify函数时若键—元素对不存在则会向字典中添加一个否则就更新其元素集合仅能扩大调用Stop函数时将删除该键—元素对。 /**1. Notify不会因为sigRecv1满而被阻塞2. 接收到信号而不做合适的处理相当于程序忽略掉了系统发来的信号3. SIGKILL和SIGSTOP永远不会被自处理或者忽略因为他们是提供给超级用户终止或停止进程的可靠方法即使Notify(,syscall.SIGKILL, syscall.SIGSTOP)也不会改变系统的处理动作 */ //同一个进程可以建立多个自定义信号处理通道 sigRecv1 : make(chan os.Signal, 1) sigs1 : []os.Signal{syscall.SIGINT, syscall.SIGQUIT} fmt.Printf(Set notification for %s... [sigRecv1]\n, sigs1)sigRecv2 : make(chan os.Signal, 1) sigs2 : []os.Signal{syscall.SIGQUIT} fmt.Printf(Set notification for %s... [sigRecv2]\n, sigs2) // arg1监测到信号时由此通知 arg2监测的信号类型不填则监控所有类型 signal.Notify(sigRecv1, sigs1...) signal.Notify(sigRecv2, sigs2...) // 删除sigRecv1之后恢复以系统默认方式处理信号 signal.Stop(sigRecv1) //此时只剩下sigRecv2还在工作三套接字Socket ​ 通过网络连接让多个进程建立通信并相互传递数据实现进程跨机器通信。socket本身并不是一个协议它只是提供了一个针对TCP或者UDP编程的接口即是对TCP/IP协议的封装。 一、三种协议 TCPTransmission Control Protocol 传输控制协议 ​ TCP是面向连接的、可靠的流协议。流就是指不间断的数据结构。TCP为提供可靠性传输实行“顺序控制”或“重发控制”机制。此外还具备“流控制流量控制”、“拥塞控制”、提高网络利用率等众多功能。 此外TCP作为一种面向有连接的协议只有在确认通信对端存在才会发送数据从而可以控制通信流量的浪费。 UDPUser Datagram Protocol 用户数据报协议 ​ UDP是不具有可靠性的数据报协议。细微的处理它会交给上层的应用去完成。在UDP的情况下虽然可以确保发送信息的大小却不能保证信息一定会到达。因此应用有时会根据自己的需要进行重发处理。 UDP不提供复杂的控制机制利用IP提供面向无连接的通信服务。由于UDP面向无连接它可以随时发送数据。 SCTPStream Control Transmission Protocol 流控制传输协议 ​ SCTP是面向消息的message-oriented协议。同时也是面向连接、端到端、全双工、带有流量和拥塞控制的可靠传输协议。SCTP的连接称为关联通过4次握手建立。SCTP能给在所连接的端点之间提供多个流每个流各自可靠地按序递送消息。一个流上某个消息的丢失不会阻塞同一关联其他流上消息的投递。 ——TCP VS UDP ​ 两者的区别在于TCP接收的是一堆数据而每次取多少由主机决定;而UDP发的是数据报客户发送多少就接收多少。 ​ 拥有这些区别的原因是由于TCP和UDP的特性不同而决定的。TCP是面向连接的也就是说在连接持续的过程中socket中收到的数据都是由同一台主机发出的因此知道保证数据是有序的到达就行了至于每次读取多少数据自己看着办。 而UDP是无连接的协议也就是说只要知道接收端的IP和端口且网络是可达的任何主机都可以向接收端发送数据。这时候如果一次能读取超过一个报文的数据则会乱套。比如主机A向发送了报文P1主机B发送了报文P2如果能够读取超过一个报文的数据那么就会将P1和P2的数据合并在了一起这样的数据是没有意义的。 ——TCP VS SCTP 1TCP是以字节为单位传输的SCTP是以数据块为单位传输的 ​ TCP接收端确认的是收到的字节数SCTP接收端确认的是接收到的数据块。 ​ 在实际的应用中TCP发送方的可以将应用程序需要发送的多个消息打包到一个TCP包里面发出去。接收端在收到这个TCP包时回给对端的ACK只是表明自己接收到了多少个字节TCP协议本身并不会把收到的数据重新拆散分成两条应用层消息并通知应用程序去接收。应用需要根据应用程序自己定义的格式去拆成两条消息。与TCP不同SCTP是将应用程序的每次调用sendmsg()发送的数据当作一个整体放到一个被称为DATA CHUNK的数据块里面接收端也是以DATA CHUNK为单位接收数据并重新组包通知应用程序接收。通常应用程序每次调用recvmesg()都会收到一条完整的消息。 2TCP通常是单路径传输SCTP可以多路径传输 ​ TCP的两端都只能用一个IP来建立连接连接建立之后就只能用这一对IP来相互收发消息了。如果这一对IP之间的路径出了问题那这条TCP连接就不可用了。SCTP两端都可以绑定到多个IP上只要有其中一对IP能通这条SCTP连接就还可以用。体现在socket API中TCP只能bind一个IP而SCTP可以bind到多个IP。 3TCP是单流有序传输SCTP可以多流独立有序/无序传输 ​ 一条SCTP连接里面可以区分多条不同的流stream不同的流之间的数据传输互不干扰。在同一条stream里面SCTP支持有序/无序两种传输方式应用程序在调用sendmsg()的时候需要指定用哪一条stream传输以及指定这条要发送的消息是需要有序传输还是无序传输的。如果在传输过程中丢包则有序传递模式可能会在接收端被阻塞而无序传输模式不会在接收端被阻塞。 4TCP连接的建立过程需要三步握手SCTP连接的建立过程需要四步握手 ​ TCP连接建立过程容易受到DoS攻击。在建立连接的时候client端需要发送SYN给server端server端需要将这些连接请求缓存下来。通过这种机制攻击者可以发送大量伪造的SYN包到一个server端导致server端耗尽内存来缓存这些连接请求最终无法服务。 ​ SCTP的建立过程需要四步握手server端在收到连接请求时不会立即分配内存缓存起来而是返回一个COOKIE。client端需要回送这个COOKIEserver端校验之后从cookie中重新获取有效信息比如对端地址列表才会最终建立这条连接。这样可以避免类似TCP的SYN攻击。 5SCTP有heartbeat机制来管理路径的可用性 ​ SCTP协议本身有heartbeat机制来监控连接/路径的可用性。SCTP两端都可以bind多个IP因此同一条SCTP连接的数据可以采用不同的IP来传输。不同的IP传输路径对应一条path不同的path都可以由heartbeat或者是数据的传输/确认来监控其状态。如果heartbeat没相应或者是数据在某条path超时没收到确认导致重传则认为该path有一次传输失败。如果一条连接的连续传输次数超过设定的“连接最大重传次数”则该连接被认为不可用该连接会被关闭并通知应用程序。 二、socket基本特性 1. 通信域 通信域含义地址形式通信范围AF_INETIPV4域地址4字节 端口2字节IPV4网络下两台计算机间的应用程序AF_INET6IPV6域地址16字节 端口2字节IPV6网络下两台计算机间的应用程序AF_UNIXUnix域路径名称同一计算机下的两个应用程序 2. socket类型 特性SOCK_DGRAMSOCK_RAWSOCK_SEQPACKETSOCK_STREAM数据形式数据报数据报字节流字节流数据边界有有没有没有逻辑连接没有没有有有数据有序性不能保证不能保证能保证能保证传输可靠性不具备不具备具备具备 3. socket通信过程 创建socket实例 socket() .(客户端)绑定本机地址 bind() ######(服务器)创建socket实例、绑定本机地址 bind()、在地址上监听 listen()连接服务器 connect() ———————请求并建立TCP连接——————— 等待连接接入 accept()发送数据 write() ———————— 数据(请求) ————————— 接收数据 read()接受数据 read() ——————— 数据(响应) —————————— 发送数据 write()关闭连接 close() ———————— 文件结束通知 ———————- 接收数据 read() 关闭连接 close() 4. Go API实现 ​ Go底层获取的是操作系统的非阻塞式socket实例即read()与write()不会阻塞程序运行。 部分读即调用read()时即使缓冲区没有任何数据操作系统不会阻塞该系统调用而是直接返回一个错误码EAGAIN应用程序应该忽略他并在稍后再次尝试读取在缓冲区有数据时无论有多少数据都会立即读取该数据并返回。 部分写即调用write()时即使缓冲区已满操作系统不会阻塞该系统调用而是直接返回一个错误码EAGAIN应用程序应该忽略他并在稍后再次尝试写入在缓冲区有部分空间时无论是否可以全部写入都会尽可能写入部分数据并返回写入的数据量。 ​ Go帮我们屏蔽了系统的EAGAIN错误屏蔽了其部分写特性而保留了部分读特性由于TCP字节流传输接收方无法感知数据边界所以不能帮助我们屏蔽部分读特性 方法作用func Listen(net, laddr string) (Listener, error)获取监听器func Accept()监听器开始接收请求func Dial(network, address string) (Conn, error)向指定网络发送连接建立申请func DialTimeout(network, address string, timeout time.Duration) (Conn, error)申请连接并设定连接超时等待时间func Read(b []byte) (n int, err error)从socket接收缓冲区读数据func Write(b []byte) (n int, err error)向socket写入缓冲区写数据func Close() (err error)关闭连接func LocalAddr() net.Addr | func RemoteAddr() net.Addr获取当前连接的本地地址和远程地址上面两方法的返回值可以调用两个方法.String() 网络地址 .Network() 协议类型func SetDeadline(time.Time) error | SetReadDeadline| SetWriteDeadline设置连接读、写超时时间 // 服务器端开启监听 listener, err : net.Listen(tcp, 127.0.0.1:8085) //协议名 监听地址 conn, err : listener.Accept()// 客户端开启发送注意客户端可以不绑定本机地址操作系统内核会为其分配一个 conn1, err : net.Dial(tcp, 127.0.0.1:8085) //协议名 发送地址 conn2, err : net.DialTimeout(tcp, 127.0.0.1:8085, 2*time.Second) //协议名 发送地址 TCP连接超时时间 //************************************************************************************* //1.直接通过Buffer读取 var dataBuffer bytes.Buffer b:make([]byte, 10) for{n, err : conn.Read(b)if err ! nil{if err io.EOF{ //发现TCP连接在另一端已经关闭conn.Close()}else{fmt.Printf(error:%s\n, err)}break}dataBuffer.Write(b[:n]) } //2.通过bufio读取 reader : bufio.NewReader(conn) line, err : reader.ReadBytes(\n) //3.通过bufio写入 writer : bufio.NewWriter(conn1) //************************************************************************************* conn.LocalAddr().String() //获取网络地址 conn.LocalAddr().Network() //获取协议类型 //************************************************************************************* // SetDeadline设置的是一个绝对时间即具体时间并且会对以后的每次读写都生效 // 所以循环读写的操作需要不断更新这个时间 b:make([]byte, 10) for{conn.SetDeadline(time.Now().Add(2*time.Second))n, err:conn.Read(b) } conn.SetDeadline(time.Time{}) //取消超时时间设置
http://www.zqtcl.cn/news/507841/

相关文章:

  • wordpress建站教程道一网页效果图素材
  • 广州网站开发哪家专业免费咨询怀孕医生
  • 洛阳网站的优化阿里云购买域名后怎么建网站
  • 我是做环保类产品注册哪些浏览量大的网站推销自己的产品比较好呢网站功能模块设计
  • 叫人做网站多少钱百度免费网站怎样建设
  • 本地南通网站建设新手编程入门先学什么
  • asp网站开发的背景与环境久久建筑网会员
  • 河北省住房建设厅官方网站个人计算机做服务器建网站
  • 上海自助建站费用页游网站
  • 浙江省住建厅网站沈阳网站建设专家
  • 基础建设文本网站施工企业在施工过程中发现设计文件和图纸有差错的应当
  • 做互联网交易网站的条件17网站一起做网店揭阳
  • 做公司网站合同asp.net sql server网站建设 pdf
  • 建筑兼职网站天津网站优化公司哪家好
  • 怎么做网站设计商城型网站开发网站建设
  • 建设网站目录帮别人做网站要投资吗
  • 网站meta 优化建议桥梁建设设计网站
  • 网站建设 甘肃wordpress rss去掉
  • 网站安全检测大连网龙建站优化推广
  • 人才网官方网站公众号排名优化软件
  • 淘宝返利网站建设软件开发哪里学好
  • 烟台网站制作公司如何注册国外网站
  • discuz企业网站网站可以做音频线吗
  • 怎样制作网站教程哪家好制作网页的的网站
  • 网站没有织梦后台无锡seo公司网站
  • 哈尔滨住房和城乡建设厅网站公司网站建设 费用入账
  • 网站图片缩略图t恤图案设计网站
  • 对招聘网站页面设计做建议网站流量 转化率
  • 怎么样做网站注册量郴州市北湖区
  • 山东企业展厅设计公司济南网站建设优化公司