自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

认知 行动 坚持

涛哥不知何许人也,亦不详其姓字。闲静少言,不慕荣利。好读书,求甚解。常著文章自娱,颇示己志。忘怀得失,有始有终...

  • 博客(74)
  • 资源 (19)
  • 收藏
  • 关注

原创 php和apache其实没有什么关系

一说到php,  很多人会本能地想到apache, 其实, php和apache没有半毛钱的关系。 php是语言, 而apache是web服务器.       如果是单纯想学php语言, 那么可以直接在linux上安装php环境即可(不一定要安装apache),  安装后, 就可以用命令行执行php文件(脚本了), 这一点, 在实际开发中也很有用。       php是一门不错的语言, 有

2017-07-30 23:19:42 9274 1

原创 用linux下的daemon函数来玩守护进程------类似于nohup ./a.out &

前面讲了守护进程, 并且自己也写了一个简单的守护进程, 我们来继续看看更简单的方式:#include #include int main(){ daemon(1, 1); int x = 0; while(1) { printf("hello %d\n", x++); sleep(1); } return 0;}      运行一下./a.out, 可以发现,

2017-07-30 16:58:42 7987

原创 守护进程(daemon)很简单------第一次玩setsid函数

守护进程, 说白了, 就是已经成年的进程, 比较独立, 切割了一切与父进程相关的东西。 通常, 我们可以在孤儿进程的基础上做文章, 如下:#include #include #include#include #include #include #include #include int main(){ int pid = fork(); if(pid < 0

2017-07-30 16:45:29 9118 2

原创 别把&和nohup混为一谈, 根本不是同一个东西好不好 ------ 聊聊./a.out & , nohut ./a.out , nohup ./a.out &的区别

在第一家公司工作的时候, 我认识了&,在第二家公司工作的时候, 我认识了nohup, 这就是渊源。 随后, 我就一直糊涂用他们, 但并不懂这两个东西。 网上很多地方是乱扯, 瞎复制, 为什么不自己实践一下呢? 看个小程序:#include <stdio.h>#include <unistd.h>int mai...

2017-07-30 16:17:08 40164 19

原创 线程其实很简单

当年在某公司实习的时候, 涉及到多线程的概念(实际上就是主线程和网络线程), 小师傅问我, 懂不懂线程的概念, 我说不懂, 也确实不懂。       后来要找工作了, 再不懂就不好了, 所以跟大家一起看书, 书上说: 进程是正在运行的程序, 一个进程可以多多少线程。 擦, 无用的废话。 反正我一直没有理解线程是真么, 也没有搞清楚什么是线程, 只是看书上说, 线程可以提高程序效率。 呜呼哀哉。

2017-07-30 15:01:59 7971 11

原创 libtest.a: could not read symbols: Archive has no index; run ranlib to add one的原因和解决方案

最近写makefile, 在main.cpp链接libtest.a的时候, 遇到了这个问题:libtest.a: could not read symbols: Archive has no index; run ranlib to add one, 百思不得其解, 怎么会有问题呢?  在网上找了下, 众说纷纭, 有的说g++版本不对, 有的说32位/64位不兼容, 各种说法都有。 而我的情况,

2017-07-29 00:18:01 23886

原创 nm: test.o: File format not recognized的原因和解决方案

最近写makefile,  碰到了nm: test.o: File format not recognized这个错误, 一起看看:        test.h:void output();        test.cpp:#include #include "test.h"void output(){ printf("c is good\n");}         编译:

2017-07-29 00:11:58 39021 1

原创 g++: cannot specify -o with -c or -S with multiple files 和nm: test.o: File format not reco 的原因和解决方案

最近写makefile潦草不已, 于是就出现了g++: cannot specify -o with -c or -S with multiple files, 我们看案例:       test.h:void output();       test.cpp:#include #include "test.h"void output(){ printf("c is good

2017-07-29 00:06:38 17453 6

原创 用php代码获取机器的ip地址

最近要用用php代码获取机器的ip地址, 先来写个:<?phpfunction get_machine_ip(){ $result = shell_exec("/sbin/ifconfig"); if (preg_match_all("/inet (\d+\.\d+\.\d+\.\d+)/", $result, $match) !== 0) // 这里根据你机器的具体情况, 可能要

2017-07-27 23:37:08 9883 1

原创 linux accept函数与三次握手没有半毛钱的关系------三次握手可能发生在调用accept函数之前

想必大家对tcp三次握手已经乱熟于心了, 在很多地方, 描述三次握手的时候, 总把accept函数扯进去, 其实三次握手和accept函数没有半毛钱的关系。 在Linux中, accept函数的作用是: 从已经完成连接的socket队列中取出一个socket, 如果没有已经完成连接的socket, 那么accepte函数就会阻塞。 所以, 三次握手可以发生在accept函数调用之前, 来看看吧。

2017-07-26 23:34:57 8070 3

原创 linux fork多进程并发服务器模型之C/C++代码实战

在很早的文章中, 我们一起聊过服务器如何与多个客户端进行通信, 那时, 我们要么用select, 要么用多线程, 却没有用多进程。 其实, 多进程也可以实现与多个客户端进行通信。 如果是在while中循环accept, 然后循环处理事情, 此时, 这种服务是迭代服务, 只能逐一处理客户端的请求, 后一个请求必须等前一个请求处理完毕, 无法并发处理, 真是急死人。 要实现并发, 我们可以考虑多线程, 也可以考虑多进程, 本文来说说后者。 在我们的多进程服务器模型中, 我们用父进程来处理连接

2017-07-23 20:16:13 10124 10

原创 僵尸进程示例分析------顺便说说linux中的wait和waitpid

在之前的博文中, 我们说过孤儿进程, 在unix/linux中, 如果子进程活着, 而父进程死亡, 那么子进程就是孤儿进程, 很形象吧。 今天我们说说僵尸进程, 在unix/linux中, 如果父进程还活着, 但子进程死了, 那么unix/linux不会轻易地让子进程消息得一干二净, 而是会让子进程变成僵尸进程, 目的是为了保存一些子进程的信息, 便于让父进程知道。 否

2017-07-23 19:44:54 7583 1

原创 工作四年的一些经历和感悟------在扯淡的世界中尽力而为

        2013毕业, 7月24日第一次到深圳, 随后入职深圳某公司。 2015年7月下旬提出离职, 到9月初才正式离职。 随后, 又入职深圳另外一家公司, 直到现在。        四年了, 感觉很多东西想写, 但打开博文, 输入题目, 居然久久不知道该从何写起。 也许是没状态, anyway,   就这样吧, 题目留作纪念, 正文就不扯了。  ...

2017-07-22 22:40:58 10217 2

原创 shutdown能做哪些close做不了的事?

shutdown能做哪些close做不了的事呢? 我们来看看。       shutdown能力之一:       我们知道, 当在socket上调用close的时候, 就会终止socket进行读数据操作和写数据操作。 但是, tcp毕竟是全双工的, 你这样直接关闭两个方向, 真的好吗? shutdown就聪明多了, 参数提供了一个选项, 可以让应用程序自己来指定关闭的方向。

2017-07-22 13:05:53 7009 1

原创 聊聊tcp四次挥手中的TIME_WAIT状态存在的理由

记得在2012年的时候, 我开始找实习, 某公司笔试题目中提到了TIME_WAIT这些东西, 我简直是一脸懵逼, 第一次见, 这东西讨论来讨论去, 有用么? 呵呵哒。        下面叙述中, 用A表示tcp连接的主动关闭端, 用B表示被动关闭端。        我们知道, 在tcp四次挥手中, B发FIN包(第三次挥手)后, A马上回应最后的ACK,  此时, A的socket让然不能

2017-07-22 11:33:34 15709 15

原创 readn和writen函数一览------顺便说说recv函数的MSG_WAITALL参数

我博客中很少只给出某些代码的片段, 基本都是能够直接运行的完整代码, 本文我们只给片段(很简单), 下面来看看:ssize_t readn(int fd, void *buf, int n){ size_t nleft = n; // left的意思是“剩下”, 而非“左边” char *bufptr = buf; ssize_t nread; while(nleft > 0)

2017-07-22 10:25:41 9821 3

原创 正确理解tcp的可靠传输------其实并不100%可靠

在上大学那会, 学习计算机网络的时候, 书上有个蓝军红军通信的例子, 表明任何通信都不能保证100%可靠, 确实如此。       但是, 后来学了一个叫什么tcp的东西, 宣称自己提供可靠传输, 还在那里鄙视UDP的尽力而为传输, 我在想, tcp好牛逼啊, 居然能保证可靠传输。 后来, 又听人说, tcp是如何处理丢包的, 我就更纳闷了, tcp不是可靠吗? 怎么还会丢东西呢?

2017-07-22 09:52:32 10765 5

原创 居然很少有人质疑: 2MSL的TIME_WAIT时间真的足够保证旧连接上的所有包都消失吗?

看了不少TIME_WAIT方面的书籍和网络文章, 很多地方不过是在人云亦云的拷贝别人的说法和思想而已, 看得让人颇为无趣。        对于TIME_WAIT, 言必称2MSL, 当然, 如果是笔试面试, 我也会这么答, 因为这就是所谓的标准答案啊。 然而, 2MSL的TIME_WAIT时间真的足够保证旧连接上的所有包都消失吗? 我最近一直在思考这个问题。 从理论上来讲, 这是扯淡。 

2017-07-22 09:23:55 9330 2

原创 socket I/O上设置超时的三种方法及其比较

        在socket I/O上设置超时, 一般有三种方法, 下面我们来聊聊。       1.  select/poll        这是最好的方法, 也是最为推荐的, 对于send/sendto和recv/recvfrom, 都可以用select和poll来设置超时时间, 这种情况下, 一般要把socket先设置为临时的非阻塞socket.  在某次面试中, 面试官还让我现场写sel...

2017-07-22 00:13:21 11515 1

原创 tcp四次挥手中LAST_ACK状态一般持续多久?

我们知道, 在tcp四次挥手中, 被动关闭端在close socket后, 给主动关闭端发一个FIN包, 此时便进入到了LAST_ACK状态, 也就是等待最后一个ACK的回应。       那么LAST_ACK的持续时间, 实际上就是发FIN到接受ACK的时间, 在这段之间内, 被动关闭端的socket处于waiting for the lask ack的状态, 仔细看下, 这不就是一个包的来

2017-07-21 22:51:58 19067

原创 tcp四次挥手中FIN_WAIT2状态的最大时间是多长?

我们知道, 在tcp四次挥手中, A端主动关闭发FIN,  然后收到B端的ACK,  B端进入CLOSE_WAIT状态。 收到B端的ACK后, A端进入FIN_WAIT2状态, 等待B端发FIN包。       我们前面说过, B端的CLOSE_WAIT的理论最大时间是无穷大, 所以, A端理论上可能持续无穷大的时间才有机会获取到B端的FIN,  因此,  tcp四次挥手中FIN_WAIT2状

2017-07-21 19:34:18 10157 9

原创 在tcp半开连接(也就是死连接)上send数据, send函数会成功吗? 后续会怎样?

A, B两端tcp建立连接后, 如果中间的交换机断网、断电, 或者B端突然断电, 那么A是无感知的(不考虑心跳机制)。 有些书上喜欢把这种连接叫半开连接, 其实我更愿意叫它为死连接。        此时, 如果A端send一些数据, 会怎样呢? 只要A端的发送内核缓冲区没有满(一般都没满), 那么send函数就是成功返回得, 很显然, 在B端是接收不到数据的。 这再次说明了, send函数和实

2017-07-20 00:13:48 8920 2

原创 什么情况下,发送端的send函数成功, 但发送端抓不到对应的网络包?------深入理解send函数

什么情况狂下,发送端的send函数成功, 但发送端抓不到对应的网络包? 这是一个很有趣的问题。       我们看下服务端程序:#include #include #include #include #include #include #include #include #include #include #include #include #include #i

2017-07-20 00:01:16 10847 1

原创 那一年, 我第一次在工作中用到了三次握手的分析

那一年, 我会点socket编程, 但对tcp其实一无所知, 听说过三次握手, 但不知道这些有什么作用, 反正socket编程搞起来也是能跑通。呜呼哀哉。        某次, 我的客户端要去连接一个位于nat之后的嵌入式设备, 结果connect失败, 对方跟我说, 抓包发现没有建立三次握手。后来我才学会了三次握手在实际工作中的分析方法, 呵呵哒。        对了, 上述情况是行不通

2017-07-19 23:48:36 7254

原创 小心不可见字符组成的不可见字符串

最近打印log,  用了类似这样的格式(value是string类型的变量):       printf("value is [%]\n", value.c_str());       最后发现中括号里面的内容为空, 和预期不符。 于是怀疑是不可见字符串所致, 打印了一下value的size, 果然, 不为0.       呵呵哒, 要小心。

2017-07-19 23:41:31 8250

原创 tcp四次挥手中FIN_WAIT1状态的最大时间是多长?

我们知道, 在tcp四次挥手中, 主动关闭的一端发FIN包后, 进入FIN_WAIT1状态, 什么意思呢? 也就是在等在FIN的ACK回包。        在极端情况下, 如果主动关闭端的发送缓冲区满了, 发送端直接杀进程, 发FIN包, 那么接收端是无法接受到FIN包的, 塞满了啊。 这一点, 我们在之前的博文中探讨过。而且, tcpdump还抓不到这个FIN包, 回应的ACK更是无从谈起。

2017-07-19 23:35:03 11220 4

原创 tcp四次挥手中CLOSE_WAIT状态的最大时间是多长?

我们知道, 在tcp四次挥手中, 被动关闭的一方会进入CLOSE_WAIT状态, 这个状态是干啥的呢?  其实就是wait to close,  也就是wait应用程序(被动关闭端)close socket,  至于应用程序什么时候close, 那完全取决于程序。        所以, CLOSE_WAIT状态什么时候终结, 取决于应用程序什么时候来close socket,  所以, 从理论

2017-07-19 00:04:34 12749 2

原创 用实际案例来理解netstat -nao中的Recv-Q和Send-Q

我们先来看看:xxxxxx$ netstat -ano | head Active Internet connections (servers and established)Proto Recv-Q Send-Q Local Address Foreign Address State Timertcp 0 0 127.0.0.1:42222 0.0.0.0:*

2017-07-18 23:03:20 13209 4

原创 connect/select超时, 三次握手就一定不能建立吗? 非也非也

我们知道, 在非阻塞的socket编程中, connect函数失败, 并不意味着连接失败, 还要进行继续判断。本文先不说这个。 本文我们来讨论这样一种情况, 在connect的时候, 如果select函数检测到连接超时, 那么三次握手就一定不能建立吗? 非也非也。 客户端调用connect函数后, 触发协议栈发送syn包, 发起连接请求, 我们为connect函数设

2017-07-18 00:17:21 7675 3

原创 一个有趣的实验---tcp发送缓冲区满, 然后杀掉进程(处于FIN_WAIT1状态), 接收端是无感知的。

服务端程序:#include #include #include #include #include #include #include #include #include #include #include #include #include #include #include int main(){ int sockSrv = socket(AF_INE

2017-07-17 13:30:42 10352 6

原创 再聊tcp keepalive机制和与之相关的tcp RST

在http://blog.csdn.net/stpeace/article/details/44162349  《心跳机制tcp keepalive的讨论、应用及“断网”、"断电"检测的C代码实现(Windows环境下)》中, 我已经非常详细地给出了对应的实验和代码。那是很多年前的事了。 本文, 我们继续来简单聊聊这个话题, 简单说一下即可。        客户端和服务端建立tcp链接

2017-07-17 07:59:56 9079 4

原创 为什么三次握手建立后, 客户端突然发来一个RST ?

为什么三次握手建立后, 客户端突然发来一个RST ?  这是某哥遇到的一个场景, 目前还没有查明原因。       有点奇怪, 目前没有想明白原因。 网络包为:09:59:55.080816 IP 100.94.138.121.31324 > 10.241.100.83.18889: Flags [S], seq 3125490859, win 14600, options [mss 14

2017-07-17 07:43:06 12742 20

原创 tcp连接超时, 那么可能会出现两次握手后, 客户端发RST包

先看服务端:#include #include #include #include #include #include #include #include #include #include #include #include #include #include #include int main(){ int sockSrv = socket(AF_INE

2017-07-17 07:36:59 10004 6

原创 在一个处于CLOSE_WAIT状态下的socket上send数据,对方会毫不留情地RST(对方之前已经调用close发FIN)

在四次挥手中, 被动关闭的一端进入CLOSE_WAIT状态, 此时, 如果还在这个socket上发送数据, 那么主动关闭(这是说的是close关闭, 而非shundown关闭, 他们有区别, 我们后面再说)的一端会返回RST. 我们来看看: 服务端程序为:

2017-07-16 10:01:56 9408 7

原创 当接收端的内核缓冲区中的数据没有全部交给应用程序时, 如果接收端关闭socket(比如调用close或者进程挂掉),就会回以RST报文

在通常情况下,  调用close的时候, 会发FIN包, 但是, 如果接收端没有用recv把内核缓冲区的数据取完, 却执行了关闭socket的操作(比如调用close或者进程挂掉), 那么这就是异常的情况, 此时接收端会回RST报文。        我们来看看, 服务端程序为:#include #include #include #include #include #includ

2017-07-16 09:42:32 9242 6

原创 当对端IP可达但没有监听对应的端口时候, 对端会发出RST报文

我们知道, 如果服务端的IP不可达, 那么客户端在进行连接的时候, syn包收不到服务端的ack, 此时会进行超时重传。 如果服务端的IP可达, 但没有监听对应的端口时候, 会出现什么情况呢? 我们来看看。        客户端程序为:#include #include #include #include #include #include int main(){

2017-07-16 09:28:30 8013 1

原创 csdn服务器给我返回http 500, 呵呵哒!------后来才知道, 每天最多写5篇, 我晕啊, 能给个友好点的提示不?

提交文章, 发现提交不了, 难道是我单日写的文章太多? 抓个包看下:       呵呵哒。

2017-07-16 02:00:05 7072 1

原创 在linux下玩转带有超时时间的connect函数------某次面试遇到过

在之前的博文中, 我们在Windows下玩过带有超时时间的, 本文我们在linux下来玩。 在某次面试中, 还被遇到了这个问题, 有意思。        直接上客户端代码:#include #include #include #include #include #include #include #include #include #include #include

2017-07-16 01:54:09 7612 4

原创 很少有人能说清楚listen函数的blacklog的含义, 那就让linux来说说吧!------笔试考过

我发现一个现象, 网上关于backlog含义的讨论, 要么扯淡, 要么到处抄袭。 其实, 我也不懂, 本文仅根据比较权威的书和手册来学习和叙述。        在Stevens的《unix网络编程》中是这样描述的:        listen的参数backlog规定了内核应该为相应套接字进行排队的最大链接数。 这简直不是人话。         我们知道, 服务端的监听socket

2017-07-15 14:22:41 8138 1

原创 syn flood攻击和syn cookie预防简介------cat /proc/sys/net/ipv4/tcp_syncookies

1979年,那是一个春天,有一位老人在中国的南海边画了一个圈,神话般地崛起座座城,奇迹般地聚起座座金山。      1996年, 又是一个春天, 有一位hacker写了一个程序, 可以高速发出tcp syn包, 并且这个syn包的源ip地址被强制随机造假, 于是乎, 服务端接收到syn后, 迅速为每个syn包分配一个incomplete队列, 其中的socket都是暂时没有完成连接的syn_r

2017-07-15 13:52:46 9701 4

ipscanner.rar

获取网络的ip, host name和mac地址。我想免费让大家下载, 但csdn规定了必须设置积分, 没办法。

2017-12-01

linux protobuf安装文件

linux, google protobuf, 安装文件。 使用方法:http://blog.csdn.net/stpeace/article/details/53029812

2016-11-04

linux tree命令的源码

很多linux上没有tree命令, 该资源提供了tree命令的源码, 大家可以下载, 编译并安装, 具体请参考:http://blog.csdn.net/stpeace/article/details/49524273

2015-11-01

编译好的openssl库和头文件

编译好的openssl库, 欢迎使用, 具体使用方法, 请见http://blog.csdn.net/stpeace/article/details/41921287

2014-12-14

入门数据库sqlite3的最佳实践资料

入门数据库sqlite3的最佳实践资料, 里面是我打包好的程序, 附加一些数据库工具, 非常可以。 当然你也可以参考我的博文http://blog.csdn.net/stpeace/article/details/38503843

2014-08-12

Wireshark抓包工具

Wireshark抓包分析工具, 非常好用, 非常实用。

2014-06-08

优秀的截图软件

截图软件fast stone. 解压即可使用。 解压后, 可能会产生一些依赖性文件, 请不要轻易删除。

2014-05-25

获取网卡信息所需的头文件和库

获取网卡信息所需的头文件和库:IPEXPORT.H Iphlpapi.h IPHLPAPI.LIB IPRTRMIB.H IPTYPES.H

2013-10-19

哈希值计算软件

可以计算md5, sha1, sha256等哈希值的工具软件,我无法形容它的优秀。

2013-10-18

在Windows下学习Linux命令

在Windows下想学linux命令的同志,你终于找到了该资料。用法:解压,然后双击其中的cmd.exe, 然后就可以输入linux命令了,比如ls等(千万要注意,不要进行路径切换,否则linux命令就执行不了,总之,要确保相应文件在当前目录下)。

2013-08-08

计算机网络第5版谢希仁编配套光盘资料

计算机网络第5版谢希仁编配套光盘资料,这是计算机考研的指定教材对应的资料,你应该拥有它。

2013-07-19

OllyDBG反汇编工具

OllyDBG反汇编工具,非常强大。深化功底,需此工具。

2013-07-19

masm汇编器

微软的汇编器,其中有关键的masm.exe和link.exe,我试过,发现可用。

2013-07-19

word转pdf的插件

word转pdf的插件,直接安装即可,安装完后,“另存”word文档的时候,可以选择pdf(我用的word版本为2007)。

2013-07-18

音频处理软件Gold Wave

一款强大的音频处理软件,可以对音频进行各种处理。例如:如果你在准备某考试,需要听音频资料,但是,你嫌音频太慢,而且你的MP3播放器无法加速,那么你可以用该软件对音频本身进行加速,即改变音频本身,使之变快。另外,在处理的时候,可以实现批处理(我亲自实践过,发现可行)。

2013-07-17

H.264visa软件

一款非常强大的H.264视频码流的解析软件,可以看到解码后视频的像素值,运动矢量,宏块等非常多的信息(也可以打开原始的YUV视频,并看到像素值,但必须先用该软件打开某一H.264视频码流),比Elecard StreamEye软件(有bug)更为强大,我一直用H.264visa,目前没有发现有什么bug. 另外,该软件安装后1个月就会过期,没有关系,1个月后,你重新安装一次即可。

2013-07-13

Elecard StreamEye

Elecard StreamEye,一款分析H.264视频码流的工具,如果你在学习H.264,那么,你应该拥有它。

2013-07-13

YUVviewer :原始的YUV视频的播放器

原始的YUV视频的播放器(软件不是我写的),如果你做视频处理、视频压缩编码、视频通信、视频检索、视频取证,那么你很可能需要它。该软件的缺点是:你无法看到YUV视频的像素值。

2013-06-24

经典的C语言编译器:TC2.0

一款经典的C语言编译器:Borland Turbo C 2.0. 怀念Borland产品的人可以用一下,体验一下DOS下的编程。如果是C语言初学者,建议用MS的VC++6.0. 我试过,该TC2.0可以正常使用。

2013-06-23

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除