• socket


    TCP/IP协议

    要理解socket必须的得理解tcp/ip,它们之间好比送信的线路和驿站的作用,比如要建议送信驿站,必须得了解送信的各个细节。

    TCP/IP协议参考模型把所有的TCP/IP系列协议归类到四个抽象层中

    应用层:TFTP,HTTP,SNMP,FTP,SMTP,DNS,Telnet 等等

    传输层:TCP,UDP

    网络层:IP,ICMP,OSPF,EIGRP,IGMP

    数据链路层:SLIP,CSLIP,PPP,MTU

    socket

    而socket是工作在传输层到应用层之间的

    socket就在应用程序的传输层和应用层之间,设计了一个socket抽象层,传输层的底一层的服务提供给socket抽象层,socket抽象层再提供给应用层

    在tcp/ip协议中,tcp通过三次握手建立起一个tcp的链接,大致如下

         第一次握手:客户端尝试连接服务器,向服务器发送syn包,syn=j,客户端进入SYN_SEND状态等待服务器确认

        第二次握手:服务器接收客户端syn包并确认(ack=j+1),同时向客户端发送一个SYN包(syn=k),即SYN+ACK包,此时服务器进入SYN_RECV状态

       第三次握手:客户端收到服务器的SYN+ACK包,向服务器发送确认包ACK(ack=k+1),此包发送完毕,客户端和服务器进入ESTABLISHED状态,完成三次握手

    第一次握手:客户端需要发送一个syn j 包,试着去链接服务器端,于是客户端我们需要提供一个链接函数

         第二次握手:服务器端需要接收客户端发送过来的syn J+1 包,然后在发送ack包,所以我们需要有服务器端接受处理函数

         第三次握手:客户端的处理函数和服务器端的处理函数

         三次握手只是一个数据传输的过程,但是,我们传输前需要一些准备工作,比如将创建一个套接字,收集一些计算机的资源,将一些资源绑定套接字里面,以及接受和发送数据的函数等等,这些功能接口在一起构成了socket的编程

     举例

    服务器端

    import socket
    ser=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
    ser.bind(('127.0.0.1',8081))
    import subprocess
    ser.listen(5)
    
    while True:
        conn, addre = ser.accept()
        while True:
            try:
                print(addre)
    
                msg=conn.recv(1024)
                if not msg:
                    conn.close()
                    break
                cmd=msg.decode('utf-8')
                p = subprocess.Popen(cmd,stdout=subprocess.PIPE,stderr=subprocess.PIPE, shell=True)
    
                result_lines = p.stdout.read()
    
                err=p.stderr.read()
                if  err:
                    conn.send(err)
                print(result_lines.decode('GBK'))
                if not result_lines:
                    conn.send('0'.encode('utf-8'))
                conn.send(result_lines)
            except Exception as a:
                print(a)
                conn.close()
                break
    
    
    # ser.close()

    客户端

    import socket
    caller=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
    caller.connect(('127.0.0.1',8081))
    while True:
        cmd=input('输入命令,输入q退出')
        if cmd=='q':
            break
        caller.send(cmd.encode('utf-8'))
        msg=caller.recv(1024)
        print(msg.decode('GBK'))
    
    caller.close()

    服务器端:

    其过程是首先服务器方要先启动,并根据请求提供相应服务:

    (1)打开一通信通道并告知本地主机,它愿意在某一公认地址上的某端口(如FTP的端口可能为21)接收客户请求;

    (2)等待客户请求到达该端口;

    (3)接收到客户端的服务请求时,处理该请求并发送应答信号。接收到并发服务请求,要激活一新进程来处理这个客户请求(如UNIX系统中用fork、exec)。新进程处理此客户请求,并不需要对其它请求作出应答。服务完成后,关闭此新进程与客户的通信链路,并终止。

    (4)返回第(2)步,等待另一客户请求。

    (5)关闭服务器

    客户端:

    (1)打开一通信通道,并连接到服务器所在主机的特定端口;

    (2)向服务器发服务请求报文,等待并接收应答;继续提出请求......

    (3)请求结束后关闭通信通道并终止。

    从上面所描述过程可知:

    (1)客户与服务器进程的作用是非对称的,因此代码不同。

    (2)服务器进程一般是先启动的。只要系统运行,该服务进程一直存在,直到正常或强迫终止。

  • 相关阅读:
    HDU 6984
    洛谷 P6776
    C语言 error C4996: This function or variable may be unsafe
    C语言 sizeof 函数
    C语言 strlen 函数
    C语言 char 字符串
    C语言 goto 语句
    C语言 switch 语句
    C语言 do while 和 while 循环
    C语言 while 循环
  • 原文地址:https://www.cnblogs.com/duGD/p/10940394.html
Copyright © 2020-2023  润新知