- 博客(60)
- 资源 (19)
- 收藏
- 关注
原创 再谈函数指针/回调函数的用途------基础类如何调用主调模块
最近看一个网络库的源码, 其中涉及到TCP的收包, 我们都知道, tcp收包的时候, 要处理好粘包问题, 也就是说, 在网络基础库中, 要判断收包的完整性。 而收包是否完整, 这是由应用程序逻辑来决定的, 此时, 就涉及到基础库调用主调模块呢? 怎么搞起呢? 利用函数指针, 把待调的函数的指针告诉基础库, 基础库处理的时候,调用函数指针就行了, 这样就OK了。
2017-06-30 23:46:42 7050 1
原创 tcp send函数发送的最大长度可以超过65535字节吗?
在前面的文章中, 我们说过, udp socket中, sendto函数单次发送的最大业务数据是65507字节, 并给出了理论的计算方式。 那么, TCP包同样被IP包包住, 表面上看, 好像是TCP包不能超过65535个字节, 所以send函数不能超过65535个字节, 可实际呢? 先说结果, 实际上, 如果send函数的长度过大, 那么会分为多个tcp包来发, 如下:#in
2017-06-30 22:18:05 25148 6
原创 udp sendto的数据会分包发送吗?
在前面的文章中, 我们说过, udp的最大业务数据报的大小为65507个字节, 调用send后, 这些数据是一次udp包发送的吗? 来看看:#include #include #include #include #include #include #include #include int main(int argc, char *argv[]){ struct s
2017-06-30 22:00:52 10749 2
原创 我曾经以为内存泄露就是内存逐渐减少,于是内存逐渐丢失了, 要去买新内存条了。
我是大学毕业后的一段时间, 第一次听说内存泄露的。 当时觉得, 内存泄露好严重啊, 计算机的内存在不断减少, 于是计算机在不断损坏, 要去买新的内存了。 可悲可叹。
2017-06-29 22:58:33 7375 3
原创 正在被执行/打开的文件, 能删除掉么?------linux和Windows不一样
大学的时候, 那时还没电脑, 于是用同学的电脑, 不知怎么搞的, 我弄个让一个文件没法删除, 紧张得不得了。 后来, 同学说, 关机后, 重启就好了。 到后来我才明白, 原来是有进程死死地拽住了这个文件, 所以无法删除。 我相信大家也经常遇到这种问题。 在linux上就不一样了, 可以删除。 对于可执行程序也是如此。 说话废话: 因为linux是linux,
2017-06-29 22:45:18 10578 2
原创 iRet和iRetCode导致的bug
最近代码中混用了iRet和iRetCode, 出现了bug, 大约10多分钟才搞定。 代码风格和编程习惯真不是一句废话。
2017-06-29 22:36:31 7277 1
原创 用实际程序来测试udp sendto函数的最大发包大小------为什么是65507?
我们知道, IP包头有一个16bit的长度, 对应的二进制最大值是2^16 -1,也就是说一个IP包整个长度的最大值是2^16 - 1 字节, 如果考虑UDP通信, 那么除去IP头的20个字节, 除去UDP头的8个字节, 还剩2^16 - 1 - 20 - 8 字节。 我们来玩玩程序(本文只以客户端发数据为例)。
2017-06-29 22:16:15 10795 2
原创 关于udp socket recvfrom函数的一个易错问题: 如果应用程序指定的接收长度不够怎么办?
我们来看这样一个问题, 在udp socket变成中, sendto连续三次发送10个字节的数据,
2017-06-29 22:07:24 19338 8
原创 IP包头的两个长度分别是什么意思? TCP包头中的长度又是什么意思?------肉眼解析IP/TCP包
我们来看这样一个IP包:23:57:05.744655 IP 10.100.70.139.34209 > 10.100.70.139.19006: Flags [P.], seq 1:7, ack 1, win 171, options [nop,nop,TS val 1173340681 ecr 1173337789], length 6 0x0000: 4500 003a
2017-06-28 01:04:01 17250
原创 用shell来发tcp包
经常用tcpdump抓包来倒腾和学习, 但怎么触发tcp包呢? 写一个客户端程序, 然后朝server上发包, 肯定可以, 但还有更简单的方法:exec 8<>/dev/tcp/10.100.70.139/19006echo -e "stats" >&8 用tcpdump抓包的结果为:xxxxxx$ sudo tcpdump -iany port 19006 -Xnlp
2017-06-28 00:02:49 13606 1
原创 tcpdump中的Flags [S.]和Flags [.]是什么意思?------顺便看看三次握手包
我们用telnet发起tcp连接, 建立三次握手, 抓包来看看:xxxxxx$ sudo tcpdump -iany port 19006 -Xnlps0tcpdump: verbose output suppressed, use -v or -vv for full protocol decodelistening on any, link-type LINUX_SLL (Linux
2017-06-27 23:17:09 41690 12
原创 用tcpdump来抓包和分析IP/TCP的结构
抓包:xxxxxx$ sudo tcpdump -iany port 5432 -Xnlps0tcpdump: verbose output suppressed, use -v or -vv for full protocol decodelistening on any, link-type LINUX_SLL (Linux cooked), capture size 65535 by
2017-06-27 22:59:34 9574 1
原创 tcpdump抓的是哪一层的包?
tcpdump很强大, 导致有些同学以为它抓的是物理层面上的二进制流, 其实不然。 它抓的是网络层的数据, 如下:xxxxxx$ sudo tcpdump -iany port 3721 -Xnlps0tcpdump: verbose output suppressed, use -v or -vv for full protocol decodelistening on any, lin
2017-06-27 07:58:35 17704 2
原创 孤儿进程示例分析
父进程创建子进程后, 父进程先挂了, 于是子进程成了孤儿进程, 被新的init进程所领养。 来看代码:#include #include int main(){ int pid = 0; pid = fork(); if(pid < 0) { printf("error1\n"); return 1; } if (0 == pi
2017-06-27 07:55:37 7449 3
原创 谈谈误解------为什么select支持的fd数量有限制,而poll/epoll等支持的fd数量没有限制?
很多书本和网上都说: poll/epoll比select好的地方之一在于:select支持的最大fd数量有限制,而poll/epoll等支持的最大fd数量没有限制。 这句话本身没有太多问题, 但我纳闷, 一般来说, 单个进程(在一个典型的linux机器上, 比如我的机器就是这样)能打开的最大fd数据为1024, 你说select能最多能支持1024个fd, 我理解。 但你说poll/epoll
2017-06-25 17:21:49 12789 4
转载 一起 select 引起的崩溃------core dump
转载地址: http://blog.codingnow.com/2014/02/select_bug.html2 月 13 日,陌陌争霸 计划在下午 16:00 例行维护,之前已经稳定运行了很长时间了。没想到在 14:30 左右,有一台从机意外崩溃。再次之前,从机崩溃并不会引起系统坏死,只需要新启动一台从机即可。但这次似乎不一样,所有玩家均不能登陆游戏,不得已,提前进行了长达两
2017-06-25 17:00:13 8017 3
转载 我用select做多路复用踩到的坑------core dump
转载地址: http://blog.csdn.net/haust_wang/article/details/50995644既然说是用select踩到的坑,那么就先直接贴一段使用select的代码上来瞅一下:[cpp] view plain copy bool SocketAction(int fd, const char* buf,
2017-06-25 16:58:16 7480 1
原创 select的fd超过1024将会非常危险------select导致core dump (句柄增多/句柄泄露引起)
在一般系统上, 进程打开的句柄数目是1024, 但在有的系统上, 却不是这个数, 举个栗子:yyyyyy$ ulimit -n100001 下面,我们来看看程序:#include #include #include #include #include #include #include #include #include
2017-06-25 16:52:09 9520 2
原创 用linux命令和程序实际测试一下单进程能打开的最大的句柄数(也可以说是文件数)------并不一定是1024/2048哈
本文中, 我们继续来做小实验, 看看linux单进程能打开的最大的句柄数(其实也是文件数, 因为linux下一切皆文件嘛), 命令如下:xxxxxx:~/network> ulimit -acore file size (blocks, -c) unlimiteddata seg size (kbytes, -d) unlimitedschedul
2017-06-25 15:50:10 9467 1
原创 select的fd超过1024将会非常危险------FD_SET导致core dump
关于linux select无须多说, 来看代码:#include#include#include#include#include#includeint main(int argc, char *argv[]){ if(argc != 2) { printf("para error\n"); return -1; } struct timeval tv
2017-06-25 15:20:03 11940
转载 Linux select 文件描述符1024限制------此处容易导致core dump
转载地址: http://blog.csdn.net/sxtobj/article/details/53170782最近系统出现宕机的情况,分析core文件,所有的线程都在select处。最后怀疑是文件描述符超过了1024。但是想到Apache也是采用select的io模型。所以还是很不理解。查看了Linux的内核源码linux-2.6.32。static __inli
2017-06-25 12:58:45 8772 1
原创 tcp粘包和nagle算法
在前面的文章中, 我们讨论过tcp粘包问题, 当时考虑的场景是, 如果接收端来不及接受, 那么就会造成粘包, 事实上, 这是tcp粘包的一个原因之一, 这是接收端的粘包。 实际上, 粘包还可能发生在发送端。 接收端的粘包, 基本可以认为是应用程序没有及时读取所造成的。 而发送端的粘包, 则主要归因于TCP nagle算法。 先来看一个生活中的例子
2017-06-25 11:54:57 8848 1
原创 再谈tcp流式传输和udp数据报传输------大家顺便来做做这两个题目!
我的书算是白读了, 这个问题居然是我在工作后才明白的。 我不能怪老师没有讲清楚, 我只能认为自己没有好好学习。 计算机网络这门课, 真是个枯燥无比的东西, 至少我是这么觉得的。 当年在大学时, 貌似是选修课, 全部靠背诵一些无聊又无耻的东西, 最后何老师给我打了60分, 算是一辈子的人情吧。 寝室四个人, 两个人没及格, 我60分, 另外一个60多一点点, 呵呵哒。 学什么计算机网络啊, 课程应该直接从网络编程搞起, 然后逐步编程实践、抓包并分析, 然后深层次地理解
2017-06-25 10:49:05 12505 7
原创 一起来玩linux udp通信程序
在之前的博文中, 我玩过Windows下的udp, 而linux下的udp也类似, 而且, 相比较tcp而言, 我发现我越来越喜欢udp了。话不多说, 直接上菜: 服务端程序为:#include <stdio.h>#include <stdlib.h>#include <string.h>#include <sys/...
2017-06-25 10:09:33 8800 1
原创 我所经历过的tcp“粘包”及其处理
刚毕业参加工作的时候, 我对计算机网络和网络编程一无所知。 当时要负责一个客户端界面软件的维护和开发, 而另一个“同事”要离职, 哎, 扯远了。 我当时在代码中读到一个注释, 其中有“粘包”二字, 当时比较纳闷: 不都说tcp是好东西吗? 怎么会粘包呢? 可见, 我确实对网络一无所知。 后来, 我发现, 这个客户端居然真的能和服务端通信, 很显然啊, 不然也不会存在这么久。 于
2017-06-25 00:29:10 7724
原创 今天搞清楚了一年半前的那次网络收包错误原因
大约在一年半前, 也就是2005年圣诞的时候, 做了一个圣诞活动的需求。 当时, 我要给后台某服务发送一个通知, 实际上就是一个写请求。 在调试和上线阶段, 鞋操作都是OK的, 而且对方那边收到的收包和回包完全正常, 但是, 我接到对方的回包后, 发现解包错误, 怪哉。 当时时间比较紧, 而且考虑到这个写操作并不十分关键, 我就没有仔细去探究这里的原因。 今天,
2017-06-24 23:51:16 8651 3
转载 socket阻塞与非阻塞,同步与异步、I/O模型------非常值得一看!
转载地址: http://blog.csdn.net/hguisu/article/details/7453390/ socket阻塞与非阻塞,同步与异步作者:huangguisu1. 概念理解 在进行网络编程时
2017-06-24 19:29:57 7481
原创 初玩linux epoll------一个服务器如何与多个客户端进行通信? (笔试面试常考)
select和poll被鄙视得厉害, 因为有了linux epoll的存在。 网上讲解select/poll/epoll的例子不胜枚举, 各种比喻, 各种图示。 其实, epoll并没有那么玄乎。 本文中, 我们不进行画图讲解, 也尽量避免过多的文字描述, 只是初步来感受一下epoll. 服务端代码为:#include #include #include #incl
2017-06-24 17:41:41 9152 4
原创 基于linux poll模型的tcp服务器------一个服务器如何与多个客户端进行通信?
在之前的博文中, 我们一起玩了Windows下的select函数, 实现了一个服务器与多个客户端进行通信。 如果一直到linux, 那几乎是大同小异的。 现在, 我们不说select, 而来接续说说linux poll. 在前面的博文中, 我们也介绍了linux poll检测键盘终端输入, 主要是想在网络编程之前, 对poll的用法有个基本的了解。现在, 来玩一下基于...
2017-06-24 16:06:39 9562 3
原创 玩下linux中的的poll函数------可以用任何描述符号fd而不限于网络socket
前面我们玩了linux中的select函数, 今天我们来介绍一个与之类似的函数, 作用就是做轮询检测, 建议先看select, 再看poll. 至于函数原型和返回值, 就没有必要单独说了, 网上一搜一大堆。 直接上菜:#include #include #include #include #include #include #include #include
2017-06-24 14:40:33 8318 5
原创 tcp超时重传(RTO)之karn算法及其简要实验
我们都知道, tcp是面向连接的可靠传输, 其中的超时重传是可靠性保证之一。 好了, 不扯那么多理论了, 本来来玩一个简要的实验。 前面说过了, telnet ip port命令是在向ip, port发起tcp连接, 假如这个ip, port不存在, 那么客户端自然连接不上, 那么客户端不会因为一次失败而气馁。 试想一下, 你电话给你女朋友, 但你女朋友没有接,
2017-06-24 10:25:36 11870 1
原创 linux alarm函数简介
上代码:#include #include #include #include int main(int argc, char *argv[]) { alarm(5); sleep(20); printf("end!\n"); return 0; } 运行5秒后, 内核向进程发出SIGALRM信息, 进程被终止, 所以上述程序的结果是:Alarm c
2017-06-24 10:01:17 11652 1
原创 nm命令的-C参数
之前说过,nm命令中的结果符号, 是人不可读的, 这主要是因为C++的name mangling机制造成的, 但可以用c++filt进行转化为人为可读的。 实际上, 在nm中加上-C参数, 就可以直接展示为人可读的, 爽爽哒, 这点经常会用到。
2017-06-24 09:26:43 12246
原创 为什么linux select函数的第一个参数总应该是fdmax + 1 ?------poll和epoll不需要+1
先说明一下, 在Windows中, 并不要求select函数的第一个参数总应该是fdmax + 1(在Windows下, 给定-1就行), 那linux中为什么又是呢? 这就涉及到linux select第一个参数的函数: 待测试的描述集的总个数。 但要注意, 待测试的描述集总是从0, 1, 2, ...开始的。 所以, 假如你要检测的描述符为8, 9, 10, 那么...
2017-06-23 08:28:31 15910 3
原创 再次一起来玩linux select函数------可以用任何描述符号fd而不限于网络socket
在之前的网络编程中, 我们经常提到select函数, Windows select和linux select大同小异, 下面, 我们来玩玩linux select, 直接上菜:#include#include#include#include#include#includeint main(){ struct timeval tv; // 超时时
2017-06-22 23:56:49 8038
原创 linux中的 STDIN_FILENO,STDOUT_FILENO和STDERR_FILENO
直接上菜:#include#include#include#include// unistd.h中的一段代码:// #define STDIN_FILENO 0 /* Standard input. */ // #define STDOUT_FILENO 1 /* Standard output. */ // #define STDER
2017-06-22 23:47:28 11172 1
原创 将日志配置文件的error级别改为debug级别, cpu瞬间飙升!
不久前, 为了查问题, 就把日志配置文件的error级别临时改为debug级别, 顺便观察到一个现象: cpu使用率瞬间飙升。 当我改回道error级别后, cpu就降下来了。 这里要注意两个问题: 1. 狂刷log的debug级别, 如果放到外网上跑, 会影响服务性能。 上述事实证明确实如此。 2. 哪天万一遇到cpu飙升, log问题可
2017-06-22 23:41:05 13921
转载 Linux网络编程--recv函数返回值详解
转载地址: http://www.cnblogs.com/Genesis-007/p/5190552.html 说明: 文中红色部分是我的备注函数原型:1ssize_t recv(int sockfd, void *buf, size_t len, int flags);
2017-06-22 00:15:41 10245 1
转载 linux send与recv函数详解------内附代码
转载地址:http://blog.csdn.net/sjin_1314/article/details/9565743 [csharp]view plaincopyprint?1#include2ssize_trecv(intsockfd,void*buff,size_tnbytes,intfl
2017-06-22 00:11:27 23680 6
linux protobuf安装文件
2016-11-04
linux tree命令的源码
2015-11-01
编译好的openssl库和头文件
2014-12-14
入门数据库sqlite3的最佳实践资料
2014-08-12
在Windows下学习Linux命令
2013-08-08
音频处理软件Gold Wave
2013-07-17
H.264visa软件
2013-07-13
YUVviewer :原始的YUV视频的播放器
2013-06-24
经典的C语言编译器:TC2.0
2013-06-23
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人