随笔分类 -  网络编程

tcp流协议产生的粘包问题和解决方案
摘要:我们在前面曾经说过,发送端可以是一K一K地发送数据,而接收端的应用程序可以两K两K地提走数据,当然也有可能一次提走3K或6K数据,或者一次只提走几个字节的数据,也就是说,应用程序所看到的数据是一个整体,或说是一个流(stream),一条消息有多少字节对应用程序是不可见的,因此TCP协议是面向流的协议 阅读全文

posted @ 2018-02-26 14:01 AlanTu 阅读(888) 评论(0) 推荐(0) 编辑

使用fork并发处理多个client的请求和对等通信p2p
摘要:一、在前面讲过的回射客户/服务器程序中,服务器只能处理一个客户端的请求,如何同时服务多个客户端呢?在未讲到select/poll/epoll等高级IO之前,比较老土的办法是使用fork来实现。网络服务器通常用fork来同时服务多个客户端,父进程专门负责监听端口,每次accept一个新的客户端连接就f 阅读全文

posted @ 2018-02-26 13:59 AlanTu 阅读(724) 评论(0) 推荐(0) 编辑

最简单的回射客户/服务器程序、time_wait 状态
摘要:下面通过最简单的客户端/服务器程序的实例来学习socket API。 echoser.c 程序的功能是从客户端读取字符然后直接回射回去。 C++ Code 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 阅读全文

posted @ 2018-02-26 13:56 AlanTu 阅读(389) 评论(0) 推荐(0) 编辑

C/S程序的一般流程和基本socket函数
摘要:一、基于TCP协议的网络程序 下图是基于TCP协议的客户端/服务器程序的一般流程: 服务器调用socket()、bind()、listen()完成初始化后,调用accept()阻塞等待,处于监听端口的状态,客户端调用socket()初始化后,调用connect()发出SYN段并阻塞等待服务器应答,服 阅读全文

posted @ 2018-02-26 13:54 AlanTu 阅读(1002) 评论(0) 推荐(0) 编辑

socket概述和字节序、地址转换函数
摘要:一、什么是socket socket可以看成是用户进程与内核网络协议栈的编程接口。 socket不仅可以用于本机的进程间通信,还可以用于网络上不同主机的进程间通信。 socket API是一层抽象的网络编程接口,适用于各种底层网络协议,如IPv4、IPv6,以及以后要讲的UNIX Domain So 阅读全文

posted @ 2018-02-26 13:53 AlanTu 阅读(1245) 评论(0) 推荐(0) 编辑

Linux 最新SO_REUSEPORT特性
摘要:1、前言 昨天总结了一下Linux下网络编程“惊群”现象,给出Nginx处理惊群的方法,使用互斥锁。为例发挥多核的优势,目前常见的网络编程模型就是多进程或多线程,根据accpet的位置,分为如下场景: (1)单进程或线程创建socket,并进行listen和accept,接收到连接后创建进程和线程处 阅读全文

posted @ 2018-02-25 15:35 AlanTu 阅读(4502) 评论(0) 推荐(0) 编辑

Linux网络编程“惊群”问题总结
摘要:1、前言 我从事Linux系统下网络开发将近4年了,经常还是遇到一些问题,只是知其然而不知其所以然,有时候和其他人交流,搞得非常尴尬。如今计算机都是多核了,网络编程框架也逐步丰富多了,我所知道的有多进程、多线程、异步事件驱动常用的三种模型。最经典的模型就是Nginx中所用的Master-Worker 阅读全文

posted @ 2018-02-25 15:31 AlanTu 阅读(717) 评论(0) 推荐(0) 编辑

Linux下connect超时处理
摘要:1、前言 最近在写一个测试工具,要求快速的高效率的扫描出各个服务器开放了哪些端口。当时想了一下,ping只能检测ip,判断服务器的网络是连通的,而不能判断是否开放了端口。我们知道端口属于网络的传输层,因此需要用ip和端口来探测,这个时候就可以用connect来探测一下,针对TCP协议,connect 阅读全文

posted @ 2018-02-25 15:25 AlanTu 阅读(7115) 评论(0) 推荐(0) 编辑

TCP与UDP在socket编程中的区别
摘要:一、TCP与UDP的区别 基于连接与无连接 对系统资源的要求(TCP较多,UDP少) UDP程序结构较简单 流模式与数据报模式 TCP保证数据正确性,UDP可能丢包 TCP保证数据顺序,UDP不保证 部分满足以下几点要求时,应该采用UDP 面向数据报方式 网络数据大多为短消息 拥有大量Client 阅读全文

posted @ 2018-02-25 15:22 AlanTu 阅读(292) 评论(0) 推荐(0) 编辑

select、poll、epoll之间的区别
摘要:select,poll,epoll都是IO多路复用的机制。I/O多路复用就通过一种机制,可以监视多个描述符,一旦某个描述符就绪(一般是读就绪或者写就绪),能够通知程序进行相应的读写操作。但select,poll,epoll本质上都是同步I/O,因为他们都需要在读写事件就绪后自己负责进行读写,也就是说 阅读全文

posted @ 2018-02-25 15:17 AlanTu 阅读(2142) 评论(0) 推荐(0) 编辑

IO多路复用之epoll
摘要:1、基本知识 epoll是在2.6内核中提出的,是之前的select和poll的增强版本。相对于select和poll来说,epoll更加灵活,没有描述符限制。epoll使用一个文件描述符管理多个描述符,将用户关系的文件描述符的事件存放到内核的一个事件表中,这样在用户空间和内核空间的copy只需一次 阅读全文

posted @ 2018-02-25 15:00 AlanTu 阅读(1024) 评论(0) 推荐(0) 编辑

IO多路复用之poll
摘要:1、基本知识 poll的机制与select类似,与select在本质上没有多大差别,管理多个描述符也是进行轮询,根据描述符的状态进行处理,但是poll没有最大文件描述符数量的限制。poll和select同样存在一个缺点就是,包含大量文件描述符的数组被整体复制于用户态和内核的地址空间之间,而不论这些文 阅读全文

posted @ 2018-02-25 14:56 AlanTu 阅读(331) 评论(0) 推荐(0) 编辑

IO多路复用之select
摘要:1、基本概念 IO多路复用是指内核一旦发现进程指定的一个或者多个IO条件准备读取,它就通知该进程。IO多路复用适用如下场合: (1)当客户处理多个描述字时(一般是交互式输入和网络套接口),必须使用I/O复用。 (2)当一个客户同时处理多个套接口时,而这种情况是可能的,但很少出现。 (3)如果一个TC 阅读全文

posted @ 2018-02-25 14:54 AlanTu 阅读(438) 评论(0) 推荐(0) 编辑

linux获取系统启动时间
摘要:1、前言 时间对操作系统来说非常重要,从内核级到应用层,时间的表达方式及精度各部相同。linux内核里面用一个名为jiffes的常量来计算时间戳。应用层有time、getdaytime等函数。今天需要在应用程序获取系统的启动时间,百度了一下,通过sysinfo中的uptime可以计算出系统的启动时间 阅读全文

posted @ 2018-02-25 10:20 AlanTu 阅读(2537) 评论(0) 推荐(0) 编辑

Linux获取进程执行时间
摘要:1、前言 测试一个程序的执行时间,时间包括用户CPU时间、系统CPU时间、时钟时间。之前获取之前时间都是在程序的main函数用time函数实现,这个只能粗略的计算程序的执行时间,不能准确的获取其他时间。在看《APUE》时,书中有关程序时间测试程序,非常正规,提供这三个时间。如是,上网搜了一下,进行总 阅读全文

posted @ 2018-02-25 10:08 AlanTu 阅读(12679) 评论(0) 推荐(0) 编辑

linux下获取硬盘使用情况
摘要:1、前言 在嵌入式设备中,硬盘空间非常有限,在涉及到经常写日志的进程时候,需要考虑日志的大小和删除,不然很快就硬盘写满,导致日志程序崩溃。为了捕获硬盘写满的异常场景,我们需要在写日志过程中判断硬盘空间的使用情况,根据硬盘的使用情况,就可以判断是否写满了。如果将要写满了,就给出警告。这样就可以避免程序 阅读全文

posted @ 2018-02-25 10:04 AlanTu 阅读(2126) 评论(0) 推荐(0) 编辑

linux下判断文件和目录是否存在
摘要:1、前言 工作中涉及到文件系统,有时候需要判断文件和目录是否存在。我结合APUE第四章文件和目录,总结一下如何正确判断文件和目录是否存在,方便以后查询。 2、stat系列函数 stat函数用来返回与文件有关的结构信息。stat系列函数有三种情况,分别对应文件名称、文件描述符和符号链接文件。stat结 阅读全文

posted @ 2018-02-25 09:59 AlanTu 阅读(30944) 评论(1) 推荐(0) 编辑

Unix环境高级编程(二十)伪终端
摘要:1、综述 伪终端对于一个应用程序而言,看上去像一个终端,但事实上伪终端并不是一个真正的终端。从内核角度看,伪终端看起来像一个双向管道,而事实上Solaris的伪终端就是用STREAMS构建的。伪终端总是成对地使用的,就好像是个管道的两端。一端的设备称为"主设备"(master),另一端的设备称为"从 阅读全文

posted @ 2018-02-24 15:57 AlanTu 阅读(1498) 评论(0) 推荐(0) 编辑

Unix环境高级编程(二十一)数据库函数库
摘要:本章的内容是开发一个简单的、多用户数据库的C函数库。调用此函数库提供的C语言函数,其他程序可以读取和存储数据库中的记录。绝大部分商用数据库函数库提供多进程同时更新数据库所需要的并发控制,采用建议记录锁、B+树、动态散列实现数据库。 1、函数库 开发类似ndbm函数库,增加了并发控制机制,从而允许多进 阅读全文

posted @ 2018-02-24 15:57 AlanTu 阅读(432) 评论(0) 推荐(0) 编辑

Unix环境高级编程(十九)终端I/O
摘要:终端I/O应用很广泛,用于终端、计算机之间的直接连线、调制解调器以及打印机等等。终端I/O有两种不同的工作模式: (1)规范模式输入处理:终端输入以行为单位进行处理,对于每个读要求,终端驱动程序最多返回一行。(默认模式) (2)非规范模式输入处理:输入字符并不组成行。 终端设备是由一般位于内核的终端 阅读全文

posted @ 2018-02-24 15:55 AlanTu 阅读(690) 评论(0) 推荐(0) 编辑

导航