网络编程
sukhoi27smk
学习是为了探索这个世界的本质
展开
-
boost::asio tcp客户端异步收发数据
#ifdef _MSC_VER#define _WIN32_WINNT 0x0A00#endif#include <iostream>#include <boost/shared_ptr.hpp>#include <boost/asio.hpp>#include <boost/lexical_cast.hpp>#include <boost/bind.hpp>#include <boost/function.hpp>.原创 2021-06-08 10:44:16 · 1035 阅读 · 0 评论 -
eventfd man
概要 #include int eventfd(unsigned int initval, intflags);描述eventfd()创建一个“eventfd对象”,这个对象能被用户空间应用用作一个事件等待/响应机制,靠内核去响应用户空间应用事件。这个对象包含一个由内核保持的无符号64位整型计数器。这个计数器由参数initval说明的值来初始化。从lin转载 2014-05-05 09:51:18 · 993 阅读 · 0 评论 -
SOCKET bind INADDR_LOOPBACK和INADDR_ANY的区别
今天写程序时候,服务器端启动了,然后客户端总是连接不上,connect返回错误号是10061,服务器积极拒绝请求。 用telnet连接一下端口,发现服务端服务没有开启,但是我程序是启动的,用netstat -a 命令看服务器是监听状态。 把流程走一遍,发现bind用的参数是INADDR_LOOPBACK,改成INADDR_ANY就OK了。 只是有些困惑,因为之前一个程序用的转载 2014-04-18 14:16:39 · 1897 阅读 · 0 评论 -
linux新的API signalfd、timerfd、eventfd使用说明
三种新的fd加入linux内核的的版本:signalfd:2.6.22timerfd:2.6.25eventfd:2.6.22三种fd的意义:signalfd:传统的处理信号的方式是注册信号处理函数;由于信号是异步发生的,要解决数据的并发访问,可重入问题。signalfd可以将信号抽象为一个文件描述符,当有信号发生时可以对其read,这样可以将信号的监听放到select、pol转载 2014-05-04 18:28:28 · 766 阅读 · 0 评论 -
linux新的API signalfd、timerfd、eventfd使用说明——eventfd
好久没更新了,今天看一下第三种新的fd:eventfd类似于管道的概念,可以实现线程间的事件通知,所不同的是eventfd的缓冲区大小是sizeof(uint64_t)也就是8字节,它是一个64位的计数器,写入递增计数器,读取将得到计数器的值,并且清零。看一下代码:[cpp] view plaincopy#include #include #include转载 2014-05-04 18:25:21 · 995 阅读 · 0 评论 -
滑动窗口机制
(1).窗口机制 滑动窗口协议的基本原理就是在任意时刻,发送方都维持了一个连续的允许发送的帧的序号,称为发送窗口;同时,接收方也维持了一个连续的允许接收的帧的序号,称为接收窗口。发送窗口和接收窗口的序号的上下界不一定要一样,甚至大小也可以不同。不同的滑动窗口协议窗口大小一般不同。发送方窗口内的序列号代表了那些已经被发送,但是还没有被确认的帧,或者是那些可以被发送的帧。下面举一个例子(假设转载 2014-03-18 14:10:13 · 722 阅读 · 0 评论 -
惊群现象
引用:http://www.cppblog.com/isware/archive/2011/07/20/151470.aspx---------------------------------------------------------------------------------------------------------------------------------------转载 2014-03-12 11:10:50 · 689 阅读 · 0 评论 -
FTP服务器和客户端源代码编写问题(ftp server client source)
最近关注FTP程序源代码的朋友非常多,这里简单说明一下。其实FTP也就是普通的Socket程序,只是需要按照FTP协议(RFC959, 1635?可能我记错了)去做,也就是每个消息有固定的结构的,比如头3个字节必须是200,201,300,400之类的数字表示操作结果。写FTP协议的程序主要要明白的一个关键问题是双socket,一个control socket,一个是data so转载 2014-02-11 16:22:37 · 1380 阅读 · 0 评论 -
MTU & MSS 详解记录
先学习理解一下帧的封装格式:需要注意的是,区别两种帧封装格式:802标准帧和以太网帧1,在802标准定义的帧格式中,长度字段是指它后续数据的字节长度,但不包括C R C检验码。RFC 1042(IEEE 802)2,RFC 894(以太网)所以,以太网帧报头为目的地址6+源地址6+类型2+CRC 4=18bytes而802帧没有CRC,所以为14bytes。Sniffer采转载 2014-01-22 22:06:04 · 8587 阅读 · 1 评论 -
HTTP代理原理以及HTTP隧道技术
通过HTTP协议与代理服务器建立连接,协议信令中包含要连接到的远程主机的IP和端口号,如果有需要身份验证的话还需要加上授权信息,服务器收到信令后首先进行身份验证,通过后便与远程主机建立连接,连接成功之后会返回给客户端200,表示验证通过,就这么简单,下面是具体的信令格式:CONNECT 124.xxx.xxx.xx:443 HTTP/1.1 //建立http隧道要443端口Proxy-Co转载 2014-01-06 16:48:11 · 6789 阅读 · 0 评论 -
TCP心跳机制
所谓的心跳包就是客户端定时放送简单的信息给服务器端,告诉它我还在而已。代码就是每隔几分钟发送一个固定信息给服务器端,服务器端回复一个固定信息。如果服务器端几分钟后没有收到客户端信息则视客户端断开。比如有些通信软件长时间不适用,要想知道它的状态是在线还是离线,就需要心跳包,定时发包收包。 心跳包之所以叫心跳包是因为:它像心跳一样每隔固定时间发一次,以此来告诉服务器,这个客户端还活在。事实上转载 2013-12-18 13:07:02 · 1219 阅读 · 0 评论 -
reactor设计模式 1
Reactor这个词译成汉语还真没有什么合适的,很多地方叫反应器模式,但更多好像就直接叫reactor模式了,其实我觉着叫应答者模式更好理解一些。通过了解,这个模式更像一个侍卫,一直在等待你的召唤,或者叫召唤兽。 并发系统常使用reactor模式,代替常用的多线程的处理方式,节省系统的资源,提高系统的吞吐量。 先用比较直观的方式来介绍一下这种方式的优点,通过和常用的多线程方式比较一转载 2014-03-24 16:58:13 · 1464 阅读 · 0 评论 -
C++中的IPv6网络程序设计
IPv4 最初是由美国国防部开发的用于网际互联(IP)协议,后来它不仅发展了TCP,而且还进一步发展了IPv4(IP 协议4.0版)。IPv4现在已经广泛应用于Internet网络中,同时也应用于大多数计算机系统,局域网和广域网中。然而,随着Internet 中的计算机数量突飞猛涨,IPv4 的局限性越发明显: 1.IPv4地址数目面临耗尽,日近紧张; 2.IPv4寻址并非完全分等级,这使转载 2014-07-13 12:43:30 · 1928 阅读 · 0 评论 -
win32 ipv6 sendto recvfrom
在windows xp下进行ipv6的udp网络通新原创 2014-07-13 17:55:07 · 2728 阅读 · 0 评论 -
POLLERR的故事
今天code review时,同事B对我代码中的poll()的处理做法提出了异议。于是做了些研究,还发现了一些好玩的故事。异议的代码我的代码是参考manpage写的,类似下面的做法。同事B说没有处理POLLERR、而且应当使用else if。OK。我赞同补充POLLERR的处理,但不赞同使用else if。原因:fd的读事件、写事件可能会同时到达,因此我想同转载 2015-09-08 10:06:11 · 2725 阅读 · 1 评论 -
EISCONN的故事
在这春风明媚的日子里,有位T同学很苦恼。忙碌了一整天,有个BUG愣是定位不出来。简单描述呢,现象是这样子的:第一次处理是正常的,但是后续的处理就是报错。sendto()调用错误码是 EISCONN(已被连接)。忧伤的问题当然,代码BUG的范围也很快确定了,就是新加入的statsd-client-cpp工具库里。代码量不到两百行,失败的地方就是在sendto()的执行里(转载 2015-09-08 10:01:22 · 2102 阅读 · 0 评论 -
两个结构体ifconf和ifreq
用ioctl获得本地ip地址时要用到两个结构体ifconf和ifreq,它们对于大多数人来说都是比较陌生的,这里给大家一种比较简单的理解方法,当然只一种帮助理解的方法,在描述中可能会有一些地方与真实定义有所出入,仅供参考.首先先认识一下ifconf和ifreq://ifconf通常是用来保存所有接口信息的//if.hstruct ifconf {转载 2015-03-26 15:58:53 · 1188 阅读 · 0 评论 -
linux 下获得本机(通用网卡)ip地址
#include #include #include #include #include #include #include #include int main(void){ int s; struct ifconf conf; struct ifreq *ifr; char buff[BU转载 2015-03-26 15:57:56 · 586 阅读 · 0 评论 -
signal(SIGPIPE, SIG_IGN);
TCP是全双工的信道, 可以看作两条单工信道, TCP连接两端的两个端点各负责一条. 当对端调用close时, 虽然本意是关闭整个两条信道, 但本端只是收到FIN包. 按照TCP协议的语义, 表示对端只是关闭了其所负责的那一条单工信道, 仍然可以继续接收数据. 也就是说, 因为TCP协议的限制, 一个端点无法获知对端的socket是调用了close还是shutdown.这句转载 2015-02-12 11:54:48 · 7757 阅读 · 1 评论 -
socket中的函数遇见EINTR的处理
这几天,写服务器代码过程当中,遇见EINRT信号的问题,我是借鉴 《unp 》,采用continue或者goto again循环解决的。但是感觉这个还是很有必要记录一下。网络上查找到的信息很多。下面是我查找到的和EINTR有关的介绍:1 http://blog.csdn.net/yanook/article/details/7226019 慢系统调用函数如何处理中断信号EINTR2转载 2015-01-22 16:13:21 · 895 阅读 · 0 评论 -
Linux系统下UDP发送和接收广播消息小例子
// 发送端 #include #include #include #include #include #include #include #include #include using namespace std; int main() { setvbuf(stdout转载 2015-01-08 11:59:29 · 964 阅读 · 0 评论 -
wireshark过滤规则
1.过 滤IP,如来源IP或者目标IP等于某个IP例子:ip.src eq 192.168.1.107 or ip.dst eq 192.168.1.107或者ip.addr eq 192.168.1.107 // 都能显示来源IP和目标IP2.过滤端 口例子:tcp.port eq 80 // 不管端口是来源的还是目标的都显示tcp.port == 8转载 2014-11-25 10:52:13 · 523 阅读 · 0 评论 -
win32 ipv6 bind 10014问题
这两天实验了一下,windows xp系统下的 ipv6 udp原创 2014-07-13 17:39:52 · 2285 阅读 · 0 评论 -
windows下手动配置ipv6地址
在XP,2003等早期版本中,ipv6地址在“网络连接”的属性配置里是无法手工配置的,只能使用netsh配置。配置方法如下:首先,安装IPV6协议,ipv6 install第二步,查看当前使用的本地连接信息:如上图,我的为“本地连接 3”,依次执行以下命令:C:\Documents and Settings\Administrator>netsh转载 2014-07-13 17:57:04 · 2345 阅读 · 0 评论 -
tcp长连接和保活时间
tcp长连接和保活时间 TCP协议中有长连接和短连接之分。短连接在数据包发送完成后就会自己断开,长连接在发包完毕后,会在一定的时间内保持连接,即我们通常所说的Keepalive(存活定时器)功能。 www.2cto.com 默认的Keepalive超时需要7,200,000 milliseconds,即2小时,探测次数为5次。它的功效和用户自己实现的心跳机制是一样的。开启Keepa转载 2013-12-18 13:06:17 · 1705 阅读 · 0 评论 -
网络编程常用接口的内核实现----sys_listen()
listen()函数仅在TCP服务器端调用,它做两个事情:将套接字转换到LISTEN状态和设置套接上的最大连接队列。listen()对应的内核实现为sys_listen(),下面开始对其实现作具体的分析。一、sys_listen()函数sys_listen()的源码实现及分析如下所示:/* * Perform a listen. Basically, we allow the pr转载 2013-11-06 15:47:04 · 1038 阅读 · 0 评论 -
IP保留地址
IP地址是IP网络中数据传输的依据,它标识了IP网络中的一个连接,一台主机可以有多个IP地址。IP分组中的IP地址在网络传输中是保持不变的。 1.基本地址格式 现在的IP网络使用32位地址,以点分十进制表示,如172.16.0.0。地址格式为:IP地址=网络地址+主机地址或 IP地址=主机地址+子网地址+主机地址。 网络地址是由Internet权力机构(InterNIC)统一分配转载 2013-07-26 09:53:48 · 1096 阅读 · 0 评论 -
socket 编程入门教程(一)TCP server 端:3、sockaddr与sockaddr_in
收件人地址 一家化妆品公司将一批新产品的样品,准备发给某学校某个班的女生们免费试用。通常情况下,这件邮包的地址上可以这么写:收件人:全体女生。地址:A省B市C学校,X级Y班。但是,如果在描述地址的时候这样写呢:收件人:全体女生。地址:请打电话xxxxxxxx,找他们学校一个叫Lucy的女生,然后把东西送到她的班上。这种文字是相当的诡异啊-_-!转载 2013-09-22 16:17:26 · 785 阅读 · 0 评论 -
Linux TCP server系列(6)-select模式下的多线程server
目标: 修改上一篇的select模式下的server,让它使用多线程来处理客户端请求(多进程的模式已经在上篇中加了注释)。 思路: (1)服务器 我们已经在之前的客户端模型多个并发用户的过程中使用过多线程的技术了(其中还涉及到多线程利用条件变量进行线程同步),在这里我们可以很轻松的在上篇文章代码中加入线程部分代码。//for thread转载 2013-09-22 17:31:51 · 1045 阅读 · 0 评论 -
SELECT的学习以及在socket中的应用
Select在Socket编程中还是比较重要的,可是对于初学Socket的人来说都不太爱用Select写程序,他们只是习惯写诸如 connect、accept、recv或recvfrom这样的阻塞程序(所谓阻塞方式block,顾名思义,就是进程或是线程执行到这些函数时必须等 待某个事件的发生,如果事件没有发生,进程或线程就被阻塞,函数不能立即返回)。 可是使用Select就可以完成非阻转载 2013-09-22 17:16:33 · 819 阅读 · 0 评论 -
Linux TCP server系列(4)-浅谈listen与大并发TCP连接
背景: 服务器在调用listen和accept后,就会阻塞在accept函数上,accpet函数返回后循环调用accept函数等待客户的TCP连接。如果这时候又大量的用户并发发起connect连接,那么在listen有队列上限(最大可接受TCP的连接数)的情况下,有多少个connect会成功了。试验证明,当连接数远远高于listen的可连接数上限时,客户端的大部分TCP请求会被抛弃,只有当转载 2013-09-22 17:07:56 · 7976 阅读 · 0 评论 -
socket 编程入门教程(一)TCP server 端:7、接收与发送
现在,我们通过accept()创建了新的socket,也就是我们类中的数据成员communicationSock,现在,我们就可以通过这个socket进行通讯了。TCP通讯模型 在介绍函数之前,我们应该了解一些事实。TCP的Server/Client模型类似这样:ServApp——ServSock——Internet——ClntSock——ClntApp当然,转载 2013-09-22 16:57:25 · 938 阅读 · 0 评论 -
socket 编程入门教程(一)TCP server 端:2、socket与文件描述符
UNIX中的一切事物都是文件(everything in Unix is a file!) 当我在这篇教程中提到UNIX的时候,其意思专指符合UNIX标准的所谓“正统”UNIX的衍生系统(其实我就用来带指那些买了最初UNIX源代码的商业系统)操作系统和类似Linux,BSD这些类UNIX系统。如果某些要点是Linux特有的,或者因为本人孤陋寡闻暂时搞不清楚是Linux特有的还转载 2013-09-22 16:41:06 · 821 阅读 · 0 评论 -
Vlan的转发过程
untag就是普通的ethernet报文,普通PC机的网卡是可以识别这样的报文进行通讯;tag报文结构的变化是在源mac地址和目的mac地址之后,加上了4bytes的vlan信息,也就是vlan tag头;一般来说这样的报文普通PC机的网卡是不能识别的;以下以inter e0/1下的所接的pc1访问inter e0/2下的所接的pc2为例进行说明;pc1所发出的数据转载 2012-12-17 10:35:50 · 787 阅读 · 0 评论 -
二层和三层转发
二层转发的机制是什么?学习线程和报文转发线程。二层只跟MAC地址有关 与IP无关所以在二层做IP-MAC绑定是无效的。 三层以太网交换机的转发机制主要分为两个部分:二层转发和三层交换。 先讲二层转发流程。 1、 MAC地址介绍 MAC地址是48 bit二进制的地址,如:00-e0-fc-00-00-06。 可以分为单播地址、多播地址和广播地址转载 2012-12-17 10:35:17 · 1343 阅读 · 0 评论 -
超文本传输协议及HTTP包
HTTP协议用于在Internet上发送和接收消息。HTTP协议是一种请求-应答式的协议 ——客户端发送一个请求,服务器返回该请求的应答,所有的请求与应答都是HTTP包。HTTP协议使用可靠的TCP连接,默认端口是80。HTTP的第一 个版本是HTTP/0.9,后来发展到了HTTP/1.0,现在最新的版本是HTTP/1.1。HTTP/1.1由RFC 2616 定义。在HTTP 中,Clie转载 2012-11-18 12:50:28 · 523 阅读 · 0 评论 -
socket 编程入门教程(一)TCP server 端:1、建模
绝大部分关于socket编程的教程总是从socket的概念开始讲起的。要知道,socket的初衷是个庞大的体系,TCP/IP只是这个庞大体系下一个很小的子集,而我们真正能用上的更是这个子集中的一小部分:运输层(Host-to-Host Transport Layer)的TCP和UDP协议,以及使用这两个协议进行应用层(Application Layer)的开发。即使是socket的核心部分,网络层转载 2013-09-22 16:27:29 · 823 阅读 · 0 评论 -
socket 编程入门教程(一)TCP server 端:4、构造函数涉及的概念
话题回到“黑社会办公室”的例子,讲概念已经扯得比较远了,不过,这一节我们还得讲概念,不过好在有些程序的例子。如果大家不想翻回去看TcpServer类的原型,我这里直接给出这个头文件的完整源代码://Filename: TcpServerClass.hpp#ifndef TCPSERVERCLASS_HPP_INCLUDED#define TCPSERVERCLASS_HPP_I转载 2013-09-22 16:44:40 · 800 阅读 · 0 评论 -
socket 编程入门教程(一)TCP server 端:5、创建监听嵌套字
前面一小节,我们已经写出了TcpServer的构造函数。这个函数的实际作用,就是创建了listen socket(监听嵌套字)。这一节,我们来具体分析这个创建的过程。socket和sockaddr的创建是可以相互独立的 在函数中,我们首先通过socket()系统调用创建了listenSock,然后通过为结构体赋值的方法具体定义了服务器端的sockaddr。(memse转载 2013-09-22 16:50:25 · 757 阅读 · 0 评论 -
大型网站的负载均衡器、db proxy和db
大型网站的负载均衡器、db proxy和db本文主要分析网站后台架构中的负载均衡器,企业常用的硬件负载均衡器软件负载均衡器、数据库代理服务器和数据库。1.1 负载均衡在大型网站部署中,负载均衡至少有三层部署。第一层为web server或者缓存代理之上的负载均衡,第二层为数据库之上的负载均衡,第三层为存储设备之上的负载均衡。在第一层部署中,最常使用的是硬件负载均衡器转载 2013-05-14 03:05:15 · 661 阅读 · 0 评论