- 博客(17)
- 资源 (14)
- 收藏
- 关注
翻译 bloom filter
一、什么是 Bloom filter Bloom filter 是由 Howard Bloom 在 1970 年提出的二进制向量数据结构,它具有很好的空间和时间效率,被用来检测一个元素是不是集合中的一个成员,这种检测只会对在集合内的数据错判,而不会对不是集合内的数据进行错判,这样每个检测请求返回有“在集合内(可能错误)”和“不在集合内(绝对不在集合内)”两种情况,可见 Bloom filte
2012-03-31 10:39:34 456
原创 校验和总结
1:IP校验和只校验20字节的IP报头,并不会计算数据部分的校验和。因为IP也是不可靠,尽最大努力投递。2:ICMP校验和覆盖整个报文(ICMP报头+ICMP数据);3:UDP和TCP校验和不仅覆盖整个报文(头部+数据),而且还有12字节的IP伪首部,其中包括源IP地址(4字节)、目的IP地址(4字节)、协议(2字节,第一字节补0)和TCP/UDP包长(2字节)。另外UDP、TCP数据报的
2012-03-31 09:08:36 578
原创 简易ping程序
当我把icmp的检验和设置成0时,ping百度是可以有echo返回。但是ping其他主机是没有返回响应。手动添加检验和后正常。原因:可能是baidu服务器并没有检测校验和就返回一个echo,这样可以减少服务器的负担。而其他一些站点都会校验。注意点:IPV4的icmp,在原始套接字收到后,收到的是包含IP头在内的完整数据报IPV6的icmp,则是去除所有ip头和扩展头部的
2012-03-31 08:40:23 482
原创 双向链表实现线程池 用于TCP并发连接
简述:自我感觉对C指针了解的还是比较透彻,能够运用自如,一方面练习一下多线程编程,另一方面练习一下数据结构链表。但是完成的过程中,各种问题还是扑面而来,共花了2个小时完成了此线程池来实现TCP并发连接,创建固定数目的线程时间仓促,可能有某些指针未释放,或者还没完善的地方,希望能共同讨论。双向链表提高扫描速度,信号等待用while保护,防止惊群,在任务提取和加入过程动态维护链表,防止链表
2012-03-28 19:16:44 1571
原创 简单进程池实现多TCP客户服务
根据预定义进程数创建进程池。父子进程通信使用的IPC方式为:UNIX域套接字父进程listen,aeecpt,并将连接套接字发送到子进程,交由子进程处理该连接。子进程处理完毕,与父进程通信,实现资源回收,并在下一连接到来交由该完毕的子进程。#include "unp.h"#include #define IDLE 0#define BUSY 1#define END
2012-03-28 09:31:40 1366
转载 链路层访问修改
首先例子中, udpcksum.h包含了两个头文件 ip_var.h/udp_var.h,我是centos5.5的,系统中并无这些头文件。如果自己隐掉,编译时明显就会报struct udpiphdr结构不存在。可在udpcksum.h中增加以下代码:struct ipvolg{ u_char ih_x1 [9]; //9 bit u_char ih_pr;
2012-03-22 20:50:41 554
原创 源路径选项
1. V4,V6头部差异IP源路径选项:对于IPV4,由于IP头部长度字段为4位,最大可以表示15,那么限制了IPV4的头部总长度为15*4 = 60字节。前10字节为固定的头部部分,所以最多有40个字节用来填充选项字段。对于IPV6,固定长度的40字节的IPV6头部和传输层头部之间可以有扩展头部。2. V4,6头部选项字段填充和获取使用setsockopt和getsockopt,传入参数
2012-03-19 19:39:20 1093
原创 原始套接口基础知识
原始套接口输出: 1如果已经连接,则可以使用write,writev,send 2.未连接,则使用sendto,sendmsg 3.开启IP_HDRINCL:进程需要自填充IP,进程调用输出函数时的字节数包括IP头部。 IPV4的标识字段可以设置成0,由内核填充该值; IPV4的头部校验和字
2012-03-19 14:30:40 618
原创 C语言中static相关
1. 对于全局static变量,初始化:首先是全局变量,被初始化为0,其次是static也被初始化为0;存放位置:存放于内存的静态区。作用域:开始于定义位置,终止于文件的结尾。 本文件之内在没有定义此static全局变量之前,想使用的话需要加extern声明。(最好在文件开始处就定义,避免使用extern)特殊性:static还有隐藏的作用,本文件定义了static全局变
2012-03-19 10:59:26 1864
原创 寻找第K小元素O(N)算法
快速排序时间复杂度:O(n*lgn)但是没必要完整排序后再O(1)选出第k元素。思想:利用快排分区思想,分界点为q,左边的数小于等于q,右边的数大于q这个规则。如果k小于左边区间个数则以左区间递归,否则在右区间递归。#include #define MAX 100000void swap(int *a, int *b){/*交换*/ int temp; temp = *
2012-03-16 21:22:56 869
原创 异步信号驱动IO实现回射服务器
#include "unp.h"#include /*server */#define QSIZE 10struct DG{ void *data; size_t datalen; struct sockaddr_in addr; socklen_t addrlen;};struct DG client[QSIZE]; /*循环队列*/int nqueue, nin,
2012-03-16 18:51:38 436
原创 利用Unix域套接字实现IPC
写完后,至少调试了30分钟时间。错误1:snprintf(argsockfd, sizeof(argsockfd), "%d", sockfd[1]);snprintf(argmode, sizeof(argmode), "%d", mode);写作:snprintf(argsockfd, sizeof(argsockfd), "%s", sockfd[1]);snprintf(arg
2012-03-14 21:39:16 590
原创 UDP 超时重传机制
问题来源:老式方法:UDP传输设定超时未N秒,发送一个请求后等待N秒钟,若超时都没有收到确认,则重发请求,重发一定次数后便丢弃。老式方法不合理的原因:由于网络上影响因素的不同,可能RTT差别较大,设定一个固定的超时时间使资源不能得到合理应用。较好的方法:根据实测的RTT及其他因素考虑在内来估计超时时间。术语RTO:重传超时Srtt:平滑化的RTT估算因子Reevar:平滑化平均偏差估
2012-03-14 14:43:13 13001 1
原创 关于sigsetjmp,siglongjmp注意点 (UDP超时重传应用)
问题来源:UDP编程中,应用程序实现的超时重传机制,在计算每个分组的RTO时。在发送请求和接受应答之间要运用超时重传机制,来提高UDP传输的可靠性。题外话:【Jacobson算法:每次测得一个RTT后就计算RTO以及重传时如何增加RTO。一般当定时器满,实行RTO指数回退。Karn算法:只有收到不是重传的请求时,才更新RTT并重新计算RTO。】使用alarm作为定时器,在对SIGALRM
2012-03-14 10:04:18 1742
原创 对于非阻塞connect的一点认识
一般如下:connect();select();由于是非阻塞,很自然connect立即返回,而不同于阻塞条件下的成功或者失败才返回。对于TCP来说,非阻塞的connect会立即返回一个错误EINPROGRESS,而且完成3路握手。对于UDP来说,个人觉得,由于内核只是检查是否存在立即可知的错误,并记录对方的IP和端口号,没必要使用非阻塞的connect。正常情况:
2012-03-13 21:20:51 625
原创 关于C语言中函数值传递的巩固,指向指针的指针 【网络编程获取借口列表时,使用了指针的指针的思考】
问题来源:单链表的建立时,定义List *header,为什么创建链表的时候用void creat_list(List **mylist)呢?而不是void creat_list(List *mylist)呢?当然不止这一种方法建立单链表,比如List* creat_list()来建立,但是我想利用值-结果参数来实现。#include #include typedef struct Lis
2012-03-13 20:52:25 567
串口调试助手高级版V0.1(升级版)
2012-11-15
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人