由于要从事通信协议的开发工作,最近开始学习TCP-IP详解三卷书,希望通过不断的更新博客,同大家共同的学习,相信网络的力量是能够激发人的思维的!
1、如何区别DIXV2帧和IEEE帧?
由于二者在同一个局域网内是不能共存的。因此,IEEE允许现存的DIXV2网卡和网络设备到IEEE的标准设备的迁移。为了使设备可以识别使用的是哪种类型的帧,IEEE没有分配1536以下(十六进制为600)的数位协议类型代码。数据字段的最大值为1500字节。所以一台设备可以从源地址后的两个字节来判断是哪种类型的帧,如果值为1536(十进制)或更高则为类型字段,意味着是DIXV2帧,如果从源地址之后的2个字节小于1536,则可确定是长度字段,为IEEE802.3帧
2、TCP四次握手
由于TCP连接时全双工的,因此每个方向都必须单独进行关闭。这个原则是当一方完成它的数据发送任务后就能发送一个FIN来终止这个方向的连接。收到一个FIN意味着这个方向上没有数据流动,一个TCP连接收到一个FIN后仍能发送数据。一个主动关闭,一个被动关闭。
但为什么连接是三次握手,而关闭是四次握手?
因为服务器端的LISTEN状态下的socket当收到SYN报文的建连请求后,它可以把ACK和SYN(ACK其应答作用,SYN起同步作用)放在一个报文里来发送。
但关闭连接时,当收到对方的FIN报文时,它仅仅表示对方没有数据发送给你了,但未必你所有的数据都全部发送给对方了,所以你可以未必会马上关闭socket,也即你可能还需要发送一些数据给对方,再发送FIN报文给对方来表示你同意现在可以关闭连接了,所以它这里的ACK报文和FIN报文多数情况下是分开发送的。
1、下载swigwin,解压即可
2、编写c++代码如下
main.cpp
#include<iostream> #include"main.h" using namespace std; int compute(int a, int b) { return a+b; }main.h
#ifndef _main_h_ #define _main_h_ int compute(int a, int b); #endifmain.i
%module main %inline %{ #include "main.h" %} int compute(int a,int b);
3、将swigwin主目录添加到环境变量中去,打开cmd 切换到代码所在目录下,执行下面的命令
swig -c++ -python main.i
这时候我们会看到在该目录下生成了两个文件main.py和main_wrap.cxx
4、打开vs2010新建Win32 Console Application工程,选择空项目,Application type选择DLL
5、将我们的main.h 添加到头文件,将 main.cpp main_wrap.cxx 添加到源文件,将main.i添加到工程目录下
6、设置工程目录的属性,在属性页/配置属性/vc++目录 中添加包含目录和库目录 分别为python中的include目录和libs目录
7、编译生成main.dll文件 改名为_main.pyd, 将main.py 和 _main.pyd 文件拷贝到另外一个文件夹test中测试,在test中新建test.py
代码如下
import main aa = main.compute(5,2) print(aa)然后
执行后就可以看到结果
c:\C++>python test.py 7
gensim: http://radimrehurek.com/gensim/index.html
Gensim is a free Python framework designed to automatically extract semantic topics from documents, as efficiently (computer-wise) and painlessly (human-wise) as possible.
sudo apt-get install python-numpy python-scipy
pip install gensim
先准备数据,我爬了约2w篇豆瓣日记作为这次试验的数据,数据和代码可以在这里https://github.com/largetalk/yaseg 找到。
主要代码如下:
import jieba from gensim import corpora, models, similarities import os import random from pprint import pprint import string import re RESULT_DIR = 'douban_result' regex = re.compile(ur"[^\u4e00-\u9f5aa-zA-Z0-9]") class DoubanDoc(object): def __init__(self, root_dir='douban'): self.root_dir = root_dir def __iter__(self): for name in os.listdir(self.root_dir): if os.path.isfile(os.path.join(self.root_dir, name)): data = open(os.path.join(self.root_dir, name), 'rb').read() title = data[:data.find('\r\n')] yield (name, title, data) class DoubanCorpus(object): def __init__(self, root_dir, dictionary): self.root_dir = root_dir self.dictionary = dic