8 analogous_love

尚未进行身份认证

暂无相关描述

等级
博文 189
排名 6k+

网络通信基础重难点解析 18: IOCP实例 - gh0st源码分析(以网络通信模块为重点)

上一小节,我们介绍了Windows系统上最强大的网络通信模型——完成端口模型(IOCP),但是只停留于一些用法介绍和理论讲解,这一节我们以gh0st这一曾经大名顶顶的远程控制软件的实战一下,我这个版本的gh0st网络通信模型使用的正是IOCP。由于,本小节的目的是为了演示前面各个章节介绍的网络通信基础,所以关于gh0st具体的一些业务逻辑细节不会作过多的介绍,而是以程序整体框架...

2019-03-21 18:40:33

网络通信基础重难点解析 17 :Windows 完成端口(IOCP)模型重难点解析

Windows完成端口(IOCP)模型重难点解析本人很多年前接触完成端口以来,期间学习和练习了很多次,本以为自己真正地理解了其原理,最近在看网狐的服务器端源码时又再一次拾起完成端口的知识,结果发现以前理解的其实很多偏差,有些理解的甚至都是错误的。网络上关于windows完成端口的介绍举不胜举,但大多数都是介绍怎么做,而不是为告诉读者为什么这么做。看了很多遍小猪的讲解:http://blog.c...

2019-03-21 18:30:51

网络通信基础重难点解析 16 :域名解析 API 介绍

为了便于记忆,有时候我们需要我们的程序可以使用域名和端口号去连接服务,这种情况下,我们需要使用socketAPIgethostbyname函数先把域名转换成ip地址,再使用connect函数连接。在Linux系统上,gethostbyname函数的签名如下:#include<netdb.h>structhostent*gethostby...

2019-03-21 18:01:01

网络通信基础重难点解析 15 :主机字节序和网络字节序

主机字节序和网络字节序主机字节序网络通信本质上是不同的机器进行数据交换,一般不同的机器有着不同的CPU型号,不同的CPU其字节序可能不一样。所谓字节序指的是对于存储需要多个字节(大于1字节)的整数来说,其每个字节在不同的机器内存中存储的顺序。这就是所谓的主机字节序,一般分为两类:little-endian(LE,俗称小端编码或小头编码)对于一个整数值,如果使用小端字节序,...

2019-03-21 17:59:52

网络通信基础重难点解析 14 :Windows 的 WSAAsyncSelect 网络通信模型

Windows的WSAAsyncSelect网络通信模型**WSAAsyncSelect**是Windows系统非常常用一个网络通信模型,它的原理是将socket句柄绑定到一个Windows窗口上并利于Windows的窗口消息机制实现了网络有消息时调用窗口函数。**WSAAsyncSelect**函数签名如下:intWSAAsyncSelect(SOCKE...

2019-03-21 17:58:22

网络通信基础重难点解析 13 :Windows WSAEventSelect 网络通信模型

WindowsWSAEventSelect网络通信模型WSAEventSelect网络通信模型是Windows系统上常用的一种异步socket通信模型,下面来详细介绍下其用法。WSAEventSelect用于服务器端我们先从服务器端来看这个模型,在Windows系统上正常的一个服务器端socket通信流程是先初始化套接字库,然后创建侦听socket,接着绑定ip...

2019-03-21 17:56:27

网络通信基础重难点解析 12 :Linux epoll 模型

Linuxepoll模型综合select和poll的一些优缺点,Linux从内核2.6版本开始引入了更高效的epoll模型,本节我们来详细介绍epoll模型。要想使用epoll模型,必须先需要创建一个epollfd,这需要使用epoll_create函数去创建:#include<sys/epoll.h>intepoll_create(i...

2019-03-21 17:53:15

网络通信基础重难点解析 11 :Linux poll 函数用法

Linuxpoll函数用法poll函数用于检测一组文件描述符(FileDescriptor,fd)上的可读可写和出错事件,其函数签名如下:#include<poll.h>intpoll(structpollfd*fds,nfds_tnfds,inttimeout);参数解释:fds:指向一个结构体数组的首个元素的指针,每个数组元素都是一个s...

2019-03-21 17:51:42

网络通信基础重难点解析 10 :Linux EINTR 错误码

LinuxEINTR错误码在类Unix操作系统中(当然也包括Linux系统),当我们调用一些socket函数时(connect、send、recv、epoll_wait等),除了函数调用出错会返回-1,这些函数可能被信号中断也会返回-1,此时我们可以通过错误码errno判断是不是**EINTR**来确定是不是被信号中断。在实际编码的时候,请读者务必要考虑到这种情况...

2019-03-21 17:43:24

网络通信基础重难点解析 09 :阻塞与非阻塞的 socket 的各自适用场景

阻塞与非阻塞的socket的各自适用场景阻塞的socket函数在调用send、recv、connect、accept等函数时,如果特定的条件不满足,就会阻塞其调用线程直至超时,非阻塞的socket恰恰相反。这并不意味着非阻塞模式的socket模式比阻塞模式的socket模式好,二者各有优缺点。非阻塞模式的socket,一般用于需要支持高并发多QPS的场景下(如服务...

2019-03-21 17:42:10

网络通信基础重难点解析 08 :connect 函数在阻塞和非阻塞模式下的行

connect函数在阻塞和非阻塞模式下的行为在socket是阻塞模式下connect函数会一直到有明确的结果才会返回(或连接成功或连接失败),如果服务器地址“较远”,连接速度比较慢,connect函数在连接过程中可能会导致程序阻塞在connect函数处好一会儿(如两三秒之久),虽然这一般也不会对依赖于网络通信的程序造成什么影响,但在实际项目中,我们一般倾向使用所谓的异步的con...

2019-03-21 17:40:29

网络通信基础重难点解析 07 :非阻塞模式下 send 和 recv 函数的返回值总结

非阻塞模式下send和recv函数的返回值总结我们来根据前面的讨论来总结一下send和recv函数的各种返回值意义:返回值n返回值含义大于0成功发送n个字节0对端关闭连接小于0(-1)出错或者被信号中断或者对端TCP窗口太小数据发不出去(send)或者当前网卡缓冲区已无数据可收(recv)我们来逐一介绍下这三种情况:...

2019-03-21 17:37:37

网络通信基础重难点解析 06 :send 和 recv 函数在阻塞和非阻塞模式下的行为

send和recv函数在阻塞和非阻塞模式下的行为send和recv函数其实名不符实。send函数本质上并不是往网络上发送数据,而是将应用层发送缓冲区的数据拷贝到内核缓冲区(下文为了叙述方便,我们以“网卡缓冲区”代指)中去,至于什么时候数据会从网卡缓冲区中真正地发到网络中去要根据TCP/IP协议栈的行为来确定,这种行为涉及到一个叫nagel算法和TCP_NODELAY的...

2019-03-21 17:34:19

网络通信基础重难点解析 05 :socket 的阻塞模式和非阻塞模式

socket的阻塞模式和非阻塞模式对socket在阻塞和非阻塞模式下的各个函数的行为差别深入的理解是掌握网络编程的基本要求之一,是重点也是难点。阻塞和非阻塞模式下,我们常讨论的具有不同行为表现的socket函数一般有如下几个,见下表:connectacceptsend(Linux平台上对socket进行操作时也包括write函数,下文中对send函数的讨论也适...

2019-03-21 17:30:26

网络通信基础重难点解析 04 :select 函数原理及重难点解析

select函数用法select函数是网络通信编程中非常常用的一个函数,因此应该熟练掌握它。虽然它是BSD标准之一的Socket函数之一,但在Linux和Windows平台,其行为表现还是有点区别的。我们先来看一下Linux平台上的select函数。Linux平台下的select函数select函数的作用是检测一组socket中某个或某几个是否有“事件...

2019-03-21 17:27:13

网络通信基础重难点解析 03:bind 函数难点解析

bind函数如何选择绑定地址上一节的服务器代码中演示了bind函数的使用方法,让我们再看一下相关的代码:structsockaddr_inbindaddr;bindaddr.sin_family=AF_INET;bindaddr.sin_addr.s_addr=htonl(INADDR_ANY);bindaddr.sin_port=htons(3000);if(...

2019-03-21 17:20:11

网络通信基础重难点解析 02:TCP 通信基本流程

TCP通信基本流程不管多么复杂的服务器或客户端程序,其网络通信的基本原理一定如下所述:对于服务器,其通信流程一般有如下步骤:1.调用socket函数创建socket(侦听socket)2.调用bind函数将socket绑定到某个ip和端口的二元组上3.调用listen函数开启侦听4.当有客户端请求连接上来后,调用accept函数接受连接,产生一个新的...

2019-03-21 17:17:30

网络通信基础重难点解析 01:常用 socket 函数基础

网络通信基础重难点解析01:常用socket函数基础常用socket函数基础Windows和Linux上常用的socketAPI函数并不多,除了特定操作系统提供的一些基于自身系统特性的API,大多数SocketAPI都源于BSDSocket(即伯克利套接字(BerkeleySockets)),因此这些socket函数在不同的平台有着相似的签名和参数。...

2019-03-21 17:13:59

网络通信基础重难点解析 专题介绍

网络通信基础重难点解析专题介绍不积跬步无以至千里,不积小流无以成江海。当我们了解了网络通信的基本原理后,你需要实际去编写一些网络通信程序,随着技术的更新换代、大浪淘沙,目前主要的网络通信技术都是基于TCP/IP协议栈的,对应到应用层的编码来说就是使用操作系统提供的socketAPI来编写网络通信程序。然而遗憾的是,拜各种网络库和开发IDE所赐,很多开发者或者网络编程的初学者都忽...

2019-03-21 16:53:00

Windows 一些常用到的文件路径相关的API

PathAPI需要头文件:shlwapi.h其中有一些函数功能存在重复,我在认为比较常用的的函数上加红。BOOLPathFileExists(LPCTSTRlpszPath)功能:检查文件/路径是否存在LPTSTRPathFindFileName(LPCTSTRpPath)功能:获得路径中的文件名例如:PathFileFileName(“c://ProgramFi...

2019-01-28 17:36:01
CSDN身份
  • 博客专家
奖章
  • 专栏达人
    专栏达人
    授予成功创建个人博客专栏的用户。专栏中添加五篇以上博文即可点亮!撰写博客专栏浓缩技术精华,专栏达人就是你!