victory的博客

长安一片月,万户捣衣声

0%

从浏览器访问百度的整个访问过程

实际场景

在浏览器的地址输入栏,输入www.baidu.com访问百度。

访问过程

  1. 1.先要解析出baidu.com对应的ip地址
    1. 1.先要知道默认网关的MAC地址
      1. 1.使用ARP获取默认网关的MAC地址
    2. 2.组织数据发送给默认网关(IP还是DNS服务器的IP,但MAC地址是默认网关的MAC地址)
    3. 3.默认网关拥有转发数据的能力,把数据转发给路由器
    4. 4.路由器根据自己的路由协议来选择一个合适的较快的路径转发数据给目的网关
    5. 5.目的网关(DNS服务器所在的网关),把数据转发给DNS服务器
    6. 6.DNS服务器查询解析出baidu.com对应的IP地址,并把它原路返回给请求这个域名的客户端
  2. 2.得到了baidu.com对应的IP地址后会发送TCP的3次握手,进行连接
  3. 3.使用HTTP协议发送请求数据给WEB服务器
  4. 4.WEB服务器收到请求数据之后,通过查询自己的服务器得到响应的结果,原路返回个浏览器
  5. 5.浏览器接收到数据后,通过浏览器自己的渲染功能来显示这个网页
  6. 6.浏览器关闭TCP连接,即4次挥手

几种常见tcp、ip协议以及常见术语

ICMP(internet 控制报文协议)—>使用ping命令时

ARP(地址解析协议)—>根据IP地址找MAC地址

RARP(反向地址解析协议)—>根据MAC地址找IP地址

MAC(媒体访问控制地址)—>网卡的编号

IP:标记逻辑上的地址

mac:标记实际转发数据时的设备地址

DHCP(动态主机配置协议):发现当前局域网内没有IP的电脑,给这台电脑自动分配IP

netmask:和ip地址一起来确定网络号

默认网关:发送的ip不在同一个网段内,那么会把这个数据转发给默认网关
Note:
MAC地址在两个设备之间通信时在变化
IP地址在整个通信过程中都不会发生变化

tcp的客户端/服务器端代码编写

tcp服务器端代码编写

#coding=utf-8
from socket import *

# 创建socket
tcpSerSocket = socket(AF_INET, SOCK_STREAM)

# 绑定本地信息
address = ('', 7788)
tcpSerSocket.bind(address)

# 使用socket创建的套接字默认的属性是主动的,使用listen将其变为被动的,这样就可以接收别人的链接了
tcpSerSocket.listen(5)

# 如果有新的客户端来链接服务器,那么就产生一个新的套接字专门为这个客户端服务器
# newSocket用来为这个客户端服务
# tcpSerSocket就可以省下来专门等待其他新客户端的链接
newSocket, clientAddr = tcpSerSocket.accept()

# 接收对方发送过来的数据,最大接收1024个字节
recvData = newSocket.recv(1024)
print('接收到的数据为:%s'%recvData)

# 发送一些数据到客户端
newSocket.send("thank you !")

# 关闭为这个客户端服务的套接字,只要关闭了,就意味着为不能再为这个客户端服务了,如果还需要服务,只能再次重新连接
newSocket.close()

# 关闭监听套接字,只要这个套接字关闭了,就意味着整个程序不能再接收任何新的客户端的连接
tcpSerSocket.close()
阅读全文 »

使用tftp协议从服务器下载文件到客户端

Code

import struct
from socket import *
import time
import os

def main():


    #0. 获取要下载的文件名字:
    downloadFileName = raw_input("请输入要下载的文件名:")    

    #1.创建socket
    udpSocket = socket(AF_INET, SOCK_DGRAM)

    requestFileData = struct.pack("!H%dsb5sb"%len(downloadFileName), 1, downloadFileName, 0, "octet", 0)

    #2. 发送下载文件的请求
    udpSocket.sendto(requestFileData, ("192.168.119.215", 69))

    flag = True #表示能够下载数据,即不擅长,如果是false那么就删除
    num = 0
    f = open(downloadFileName, "w")

    while True:
        #3. 接收服务发送回来的应答数据
        responseData = udpSocket.recvfrom(1024)

        # print(responseData)
        recvData, serverInfo = responseData

        opNum = struct.unpack("!H", recvData[:2])

        packetNum = struct.unpack("!H", recvData[2:4])

        print(packetNum[0])

        # print("opNum=%d"%opNum)
        # print(opNum)

        # if 如果服务器发送过来的是文件的内容的话:
        if opNum[0] == 3: #因为opNum此时是一个元组(3,),所以需要使用下标来提取某个数据
            

            #计算出这次应该接收到的文件的序号值,应该是上一次接收到的值的基础上+1
            num = num + 1

            # 如果一个下载的文件特别大,即接收到的数据包编号超过了2个字节的大小
            # 那么会从0继续开始,所以这里需要判断,如果超过了65535 那么就改为0
            if num==65536:
                num = 0

            # 判断这次接收到的数据的包编号是否是 上一次的包编号的下一个
            # 如果是才会写入到文件中,否则不能写入(因为会重复)
            if num == packetNum[0]:
                # 把收到的数据写入到文件中
                f.write(recvData[4:])
                num = packetNum[0]

            #整理ACK的数据包
            ackData = struct.pack("!HH", 4, packetNum[0])
            udpSocket.sendto(ackData, serverInfo)

        elif opNum[0] == 5:
            print("sorry,没有这个文件....")
            flag = False

        # time.sleep(0.1)

        if len(recvData)<516:
            break

    if flag == True:
        f.close()
    else:
        os.unlink(downloadFileName)#如果没有要下载的文件,那么就需要把刚刚创建的文件进行删除

if __name__ == '__main__':
    main()

在linux环境下使用 udp+多线程 模拟QQ

分析

程序主要的两个功能

  • 发送数据(Send Data)
  • 接收数据(Reveive Data)

使用多线程的原因
不使用多线程的情况下,在程序暂停等待发送方输入发送内容时,若发送方不输入内容,则程序一直卡在这里;此时另外一放发送数据由于程序暂时等待输入内容也不能打印消息。
使用了多线程,接收数据、发送数据的程序分别由一个线程来处理,且两个线程互不影响,发送方不输入内容时,另一方发送消息发送方就能接收到。
Note:通信的两台计算机必须在同一个局域网!!!

阅读全文 »

在python代码中使用c语言编写的函数-以输出Hello World为例

linux环境下!!!

Step 1:编写c语言代码-sayHello.c

include<stdio.h>
void sayHello()
{
    printf("Hello World!");
}

Step 2:把c语言文件编译成一个动态库

gcc sayHello.c -shared -o lib-sayHello.so

Step 3:编写python代码-main.py

from ctypes import *

#加载动态库
lib = cdll.LoadLibrary("./lib-sayHello.so")
#调用sayHello函数
lib.sayHello()

Step 4:运行python代码

python3 main.py

递归与分治策略

分治与递归经常同时应用在算法设计中

递归(Recursion)

递归算法—直接或间接地调用自身的较小模式的算法
递归函数—用函数自身的较小模式给出其定义的函数

阅读全文 »

多进程拷贝文件

实现流程分析

  1. 获取要copy的文件夹的名字
  2. 创建一个文件夹
  3. 获取old文件夹中的所有的文件名字
  4. 使用多进程方式copy原文件夹中的所有文件到新的文件夹中

Code

from multiprocessing import Pool,Manager
import os
import time

def copyFileTask(name,oldFolderName,newFolderName,queue):
    "complete the function of coping a file"
    fr = open(oldFolderName+"/"+name)
    fw = open(newFolderName+"/"+name,"w")
    content = fr.read()
    fw.write(content)
    fr.close()
    fw.close()
    queue.put(name)

def main():
    #0.get the file name you want to copy
    oldFolderName = input("Please input the file name:")
    #1.create a file directory
    newFolderName = oldFolderName+"-copy"
    #pmrint(newFolderName)
    os.mkdir(newFolderName)
    #2.get all file name of old file directory
    fileNames = os.listdir(oldFolderName)
    #print(fileNames)
    #3.copy all file of old file directory to a new file directory
    pool = Pool(5)
    queue = Manager().Queue()
    for name in fileNames:
        pool.apply_async(copyFileTask,args=(name,oldFolderName,newFolderName,queue))
    num = 0
    allNum = len(fileNames)
    while num < allNum:
        queue.get()
        num += 1
        copyRate = num/allNum
        print("\rcopy process:%.2f%% "%(copyRate*100),end="")
        time.sleep(1)
    print('\ncompleted')
    pool.close()
    pool.join()
if __name__ == "__main__":
    main()

Artifacts reduction algorithms’s two main ways

Regression and Filtering Methods

Regression

The regression model use a function to fit the data to smooth the data.
Disadvantages:
1.this method only works for reference channels that are available.
2.EEG signal being non-linear and non-stationary process,linear regression is not the best choice for analysis in such applications.
3.it can only be used to treat few particular types of artifact,not all types.

Filtering

linear adaptive filters

Note:too sensitive and unstable to adjust the parameters

non-linear adaptive filters(include Volterra filters and neural network based adptive filters)

Note:stronger processing capabilities and complex calculation
Disadvantages:
filters may eliminate useful EEG signals during artifact deletion.
阅读全文 »