网络编程
文章平均质量分 84
基于Linux的TCP/UDP网络编程
amoscykl
Casablanca!
展开
-
IP协议详解
从两个方面讨论IP协议:1.IP头部信息。用于指定IP通信的源端IP地址,目的端IP地址,指导IP分片和重组以及指定部分通信行为。2.IP数据报的路由和转发。 IPv4头部结构 IP路由 当IP模块接收到来自数据链路层的IP数据报时,首先对该数据报的头部做CRC校验,确认无误之后就分析其头部的具体信息。若该I...原创 2018-06-11 23:14:52 · 268 阅读 · 0 评论 -
TCP协议详解
TCP头部结构 16位端口号:告知主机该报文段的源端口和目的端口。32位序号:一次TCP通信过程中某一个传输方向上的字节流的每个字节的编号。32位确认号:用作对另一方发送来的TCP报文段的相应。其值是收到的TCP报文段的序号值加1。4位头部长度:标示该TCP头部有多少个32bit字(4字节)。因为4位最大能表示15,所以TCP头部最长是60字节。6位标志位: ....................原创 2018-06-11 23:15:03 · 233 阅读 · 0 评论 -
TCP/IP通信案例:访问Internet上的Web服务器
Web客户端和服务器之间使用HTTP协议通信。 HTTP代理服务器的工作原理在HTTP通信链上,客户端和目标服务器之间通常存在某些中转代理服务器,它们提供对目标资源的中转访问。一个HTTP请求可能被多个代理服务器转发,后面的服务器称为前面服务器上的上游服务器。代理服务器按照其使用方式和作用,分为正向代理服务器,反向代理服务器和透明代理服务器。 正向代理:要求客户端自己设置代理服务器的地址。客户的每...原创 2018-06-11 23:15:09 · 3372 阅读 · 0 评论 -
TCP/IP协议族
数据链路层:两个常用的协议是ARP协议(地址解析协议)和RARP协议,实现IP地址和机器物理地址(MAC地址)的转换。网络层使用IP地址寻找机器,而数据链路层使用物理地址寻找机器,因此网络层必须先将IP地址转化成其物理地址。网络层:实现数据包的选路和转发。网络层最核心的协议是IP协议,IP协议根据数据包的目的IP地址来决定如何投递它。传输层:为两台主机上的应用程序提供端到端的通信。传输层只关心...原创 2018-06-11 23:14:42 · 461 阅读 · 0 评论 -
为什么多线程读写 shared_ptr 要加锁? --shared_ptr的线程安全性
在《Linux 多线程服务端编程:使用 muduo C++ 网络库》第 1.9 节“再论 shared_ptr 的线程安全”中写道:(shared_ptr)的引用计数本身是安全且无锁的,但对象的读写则不是,因为 shared_ptr 有两个数据成员,读写操作不能原子化。根据文档(http://www.boost.org/doc/libs/release/libs/smart_ptr/shared_...原创 2018-06-06 17:51:04 · 1091 阅读 · 0 评论 -
mutex和lock_guard,muduo网络库的MutexLock 与MutexLockGuard
互斥锁是用来保护一段临界区的,它可以保证某段时间内只有一个线程在执行一段代码或者访问某个资源。 C++11的mutex和lock_guard C++11新增了mutex,使用方法和linux底下的常用使用方法差不多。先使用std::mutex 定义一个互斥锁,例如std::mutex XXXmutex在需要使用互斥锁的时候,使用XXXmutex.lock();上锁,以及使用XXXmutex.unl...原创 2018-06-08 16:33:11 · 912 阅读 · 0 评论 -
线程
文章先分享一篇之前讲线程的博客,建议先阅读此博客:线程 互斥量 信号量 基本线程函数pthread_create:int pthread_create(pthread_t *tid, const pthread_attr_t *attr,void *(*func)(void *),void *arg);//成功返回0tid为线程ID,线程有许多属性:优先级,初始栈大小....pthread_at...原创 2018-05-25 17:47:17 · 279 阅读 · 0 评论 -
非阻塞式I/O
套接字的默认状态是阻塞的。阻塞的套接字调用可分为以下四类:1.输入操作:包括read,readv,recv,recvfrom和recvmsg共5个函数。2.输出操作:包括write,writev,send,sendto和sendmsg共5个函数。3.接收外来连接,即accept函数。调用accept函数时尚无新的连接到达,调用进程将进入睡眠。4.发起外出连接,即connect函数。connect函...原创 2018-05-25 17:42:17 · 760 阅读 · 0 评论 -
Unix域协议
Unix域协议并不是一个实际的协议族,而是在单个主机上执行客户/服务器通信的一种方法。Unix域提供两类套接字:字节流套接字和数据报套接字。使用Unix域套接字的理由:1.Unix域套接字往往比通信两端位于同一个主机的TCP套接字快出一倍。2.Unix域套接字可用于在同一个主机上的不同进程之间传递描述符。3.Unix域套接字较新的实现把客户的凭证(用户ID和组ID)提供给服务器,从而能够提供额外的...原创 2018-05-25 17:36:53 · 1434 阅读 · 0 评论 -
客户/服务器程序设计范式
我们在需要开发一个服务器程序时,有较多的的程序设计范式可供选择,不同范式有其自身的特点和实用范围,明了不同范式的特性有助于我们服务器程序的开发。客户端程序通常比服务器容易些,当然客户端程序也可以使用这些程序设计范式,因为它们蕴含的道理都是想通的。本文所设计的服务器主要是指基于TCP的服务器并发服务器程序设计的两类变体:1.预先派生子进程:让服务器在启动阶段调用fork创建一个子进程池。每个客户请求...原创 2018-05-25 17:20:25 · 401 阅读 · 0 评论 -
APUE (七) :进程环境
七.进程环境atexit函数:函数atexit登记终止处理程序(函数),一个进程最多可以登记32个终止处理函数,这些函数由exit自动调用(return 语句也可以调用),即在程序结束时调用。#include<stdlib.h>int atexit(void (*func) (void));环境表:每个程序都会接受到一张环境表。环境表是一个字符指针数组。全局变量environ包含了该...原创 2018-04-27 01:51:48 · 254 阅读 · 0 评论 -
高级I/O函数
套接字超时套接字I/O操作上设置超时的方法有以下3种:1.调用alarm,在指定超时期满时产生SIGALRM信号。2.在select种阻塞等待I/O,一次代替直接阻塞在read或write调用上。3.使用较新的SO_RCVTIMEO和SO_SNDTIMEO套接字选项。 使用SIGALRM为connect设置超时以由调用者指定的超时上限调用connect。第四个参数为等待的秒数。#include "...原创 2018-05-21 22:32:28 · 291 阅读 · 0 评论 -
TCP和UDP套接字编程基本流程
TCP套接字编程服务器:1.创建套接字描述符(socket)2.设置服务器的IP地址和端口号(需要转换为网络字节序的格式)3.将套接字描述符绑定到服务器地址(bind)4.将套接字描述符设置为监听套接字描述符(listen),等待来自客户端的连接请求,监听套接字维护未完成连接队列和已完成连接队列5.从已完成连接队列中取得队首项,返回新的已连接套接字描述符(accept),如果已完成连接队列为空,则...原创 2018-05-21 14:29:04 · 1758 阅读 · 0 评论 -
基本UDP套接字编程
使用UDP编写的一些常见的应用程序有:DNS(域名系统),NFS(网络文件系统)和SNMP(简单网络管理协议) UDP客户/服务器交互中发生的典型情形的时间线图。 recvfrom和sendto函数 ssize_t recvfrom(int sockfd, void *buff, size_t nbytes, int flags, struct sockaddr *from, socklen_t...原创 2018-05-21 14:27:37 · 1658 阅读 · 0 评论 -
套接字选项
有很多方法获取和设置影响套接字的选项:-getsockopt和setsockopt函数-fcntl函数-ioctl函数 getsockopt和setsockopt函数int getsockopt(int sockfd, int level, int optname, void *optval, socklen_t *optlen);int setsockopt(int sockfd, int ...原创 2018-05-21 14:23:57 · 297 阅读 · 0 评论 -
IO复用:select和poll函数
I/O复用使用场景:-当客户处理多个描述符(通常是交互式输入和网络套接字)时,必须使用I/O复用。-一个客户同时处理多个套接字是可能的,不过比较少见。-如果一个TCP服务器既要处理监听套接字,又要处理已连接套接字,一般就要使用I/O复用。-如果一个TCP服务器既要处理TCP又要处理UDP,一般就要使用I/O复用。-如果一个服务器要处理多个服务或者多个协议,一般就要使用I/O复用。 I/O模型5种模...原创 2018-05-21 14:21:18 · 421 阅读 · 0 评论 -
TCP客户/服务器程序示例
TCP客户和服务器可以彼此通信之前,每一端都得指定连接的套接字对:本地IP地址,本地端口,外地IP地址,外地端口。 客户端角度: 客户端的外地IP地址和外地端口必须在客户调用connect时指定,而两个本地值通常就由内核作为connect的一部分来选定。客户也可在调用connect之前,通过调用bind来指定其中一个或两个本地值。客户可以在连接建立后通过调用getsockname获取由内核指定的两...原创 2018-05-21 14:14:19 · 341 阅读 · 0 评论 -
基本TCP套接字编程
TCP客户与服务器进程之间典型事件时间表: socket函数#include<sys/socket.h>int socket(int family, int type, int protocol);family参数执行协议族,该参数也往往被称为协议域。是以下某个常值: type参数指明套接字类型,是以下某个常值: protocol参数应设为下面某个协议类型常值,或者设为0,以选择...原创 2018-05-21 14:12:17 · 460 阅读 · 0 评论 -
套接字编程简介
套接字地址结构的比较: 字节排序函数 h代表host,n代表network,s代表short,l代表long。s是16位的值(端口号),l是32位的值(IPv4地址)。 字节操纵函数#include<strings.h>void bzero(void *dest, size_t nbytes);把目标字符串中指定树木的字节置为0。使用此函数...原创 2018-05-21 14:07:35 · 206 阅读 · 0 评论 -
传输层:TCP UDP
TCP : 传输控制协议TCP是一个面向连接的协议,为用户进程提供可靠的全双工字节流。TCP套接字时一个流套接字(stream socket)。TCP关心确认,超时和重传之类的细节。TCP提供客户端与服务器之间的连接。TCP提供流量控制,TCP总是告知对端在任何时刻它一次能够从对端接收多少字节的数据,这称为通告窗口。通告窗口指出接收缓冲区中当前可用的空间量,从而确保发送端发送的数据不会使接收缓...原创 2018-05-21 14:02:35 · 341 阅读 · 0 评论 -
exec函数详解
(1)exec函数说明fork函数是用于创建一个子进程,该子进程几乎是父进程的副本,而有时我们希望子进程去执行另外的程序,exec函数族就提供了一个在进程中启动另一个程序执行的方法。它可以根据指定的文件名或目录名找到可执行文件,并用它来取代原调用进程的数据段、代码段和堆栈段,在执行完之后,原调用进程的内容除了进程号外,其他全部被新程序的内容替换了。另外,这里的可执行文件既可以是二进制文件,也可以是...原创 2018-05-17 17:30:59 · 62711 阅读 · 2 评论 -
浅谈标准I/O缓冲区
标准I/O库提供缓冲的目的是尽可能地减少使用read和write调用的次数。它也对每个I/O流自动地进行缓冲管理,从而避免了应用程序需要考虑这一点所带来的麻烦。不幸的是,标准I/O库最令人迷惑的也是它的缓冲。标准I/O提供了三种类型的缓冲:1、全缓冲:在填满标准I/O缓冲区后才进行实际I/O操作。常规文件(如普通文本文件)通常是全缓冲的。2、行缓冲:当在输入和输出中遇到换行符时,标准I/O库执行I...转载 2018-05-16 20:00:33 · 601 阅读 · 0 评论 -
带缓冲I/O与不带缓冲I/O:文件I/O和标准I/O库
介绍标准I/O前,先介绍文件I/O,以便与区别比较。带缓冲和不带缓冲I/O的区别:所谓不带缓冲,并不是指内核不提供缓冲,而是只单纯的系统调用,不是函数库的调用。系统内核对磁盘的读写都会提供一个块缓冲(内核缓冲区)(在有些地方也被称为内核高速缓存),当用write函数对其写数据时,直接调用系统调用,将数据写入到块缓冲进行排队,当块缓冲达到一定的量时,才会把数据写入磁盘。因此所谓的不带缓冲的I/O是...原创 2018-05-16 19:52:03 · 654 阅读 · 0 评论 -
带缓冲I/O 和不带缓冲I/O的区别与联系
这里搜集从网上看到的一些言论,自认为还是比较靠谱的,有些不靠谱的根据自己的理解进行了修正。首先要明白不带缓冲的概念:所谓不带缓冲,并不是指内核不提供缓冲,而是只单纯的系统调用,不是函数库的调用。系统内核对磁盘的读写都会提供一个块缓冲(在有些地方也被称为内核高速缓存),当用write函数对其写数据时,直接调用系统调用,将数据写入到块缓冲进行排队,当块缓冲达到一定的量时,才会把数据写入磁盘。因此所谓的...转载 2018-05-16 19:04:21 · 1624 阅读 · 0 评论 -
UNP 学习笔记(一):简介
简介概述客户与服务器之间是通过某个网络协议通信的。焦点是TCP/IP协议族,也称为网际协议族。 同一网络应用的客户和服务器无需处于同一个服务器,而这两个局域网是使用路由器连接到广域网(WAN)的。路由器是广域网的架构设备。当今最大的广域网是因特网。 一个简单的时间获取服务器程序/* 一个简单的时间获取服务器程序 */#include "unp.h" ...原创 2018-05-02 00:44:46 · 5295 阅读 · 0 评论 -
制作HTTP服务器端
HTTP概要理解Web服务器端HTTP是Hypertext Transfer Protocol的缩写, Hypertext(超文本)是可以根据客户端请求而跳转的结构化信息。 HTTP协议:HTTP是以超文本传输为目的而设计的应用层协议,这种协议同样属于基于TCP/IP实现的协议,因此,可以直接实现HTTP。从结果上看,实现该协议相当于实现Web服务器端。浏览器属于基于套接字的客户端,因此连接到任意...原创 2018-05-15 23:10:36 · 1333 阅读 · 0 评论 -
线程 互斥量 信号量——多线程服务器端的实现
理解线程的概念 多进程模型的缺点:--创建进程的过程会带来一定的开销--为了完成进程间数据交换,需要特殊的IPC技术 最大的缺点:--每秒少则数十次,多则数前次的“上下文切换"是创建进程时最大的开销。 线程相比进程具有如下优点:--线程的创建和上下文切换比进程的创建和上下文切换更快。--线程间交换数据时无需特殊技术。 线程和进程的差异 ...原创 2018-05-15 14:24:35 · 940 阅读 · 0 评论 -
epoll 机制
epoll理解及应用基于select的I/O复用技术速度慢的原因--调用select函数后常见的针对所有文件描述符的循环语句。--每次调用select函数时都需要向该函数传递监视对象信息。(即每次调用select函数时向操作系统传递监视对象信息) select的优点如果需要满足如下两个条件,则可以选用select模型:--服务器端接入者少--程序应具有兼容性 ...原创 2018-05-15 14:02:18 · 537 阅读 · 0 评论 -
关于I/O流分离的其他内容 (dup & dup2函数)
分离I/O流 "流"分离带来的EOF问题服务器端代码:sep_serv.c#include<stdio.h>#include<stdlib.h>#include<string.h>#include<unistd.h>#include<arpa/inet.h>#include<sys/socket.h>#defi原创 2018-05-13 22:44:38 · 363 阅读 · 0 评论 -
套接字和标准I/O (fdopen & fileno函数)
标准I/O的优点标准I/O函数的两个优点--标准I/O函数具有良好的移植性--标准I/O函数可以利用缓冲提高性能 由上图可看到:使用标准I/O函数传输数据时,经过2个缓冲。例如:通过fputs函数传输字符串时,首先字符串传递到标准I/O函数的输出缓...原创 2018-05-13 22:38:30 · 606 阅读 · 0 评论 -
多播与广播
多播多播方式的数据传输是基于UDP完成的。与UDP服务器端/客户端的实现方式非常接近。区别是:UDP数据传输以单一目标进行,而多播数据同时传递到加入(注册)特定组的大量主机。采用多播方式时,可以同时向多个主机传递数据。 多播的数据传输方式及流量方面的优点传输特点:--多播服务器端针对特定多播组,只发送1次数据。--即使只发送1次数据,但该组内的所有客户端都会接收数据。--多播数组可在IP地址范围内...原创 2018-05-13 14:59:00 · 288 阅读 · 0 评论 -
多种I/O函数
send & recv函数Linux中的send & recvsend函数:recv函数:send函数和recv函数的最后一个参数是收发数据的可选项。利用位或运算同时传递多个信息。MSG_OOB:发送紧急消息就例如医院的急诊病人优先处理以及单独的急诊室。MSG_OOB可选项用于创建特殊发送方法俄通道以发送紧急消息。MSG_OOB使用示例:服务器端:/* MSG_OOB:紧急接收使用...原创 2018-05-13 00:29:38 · 293 阅读 · 0 评论 -
I/O复用---select函数实现并发服务器
基于I/O复用的服务器端 复用技术在服务器端的应用 多进程服务器端模型:(一个进程对应一个客户端) 在模型中引入复用技术,减少进程数。无论连接多少客户端,提供服务的进程只有1个。 ...原创 2018-05-12 21:37:53 · 2425 阅读 · 0 评论 -
进程间通信
进程间通信的基本概念进程间通信意味着两个不同进程间可以交换数据,操作系统中应提供两个进程可以同时访问的内存空间。 通过管道实现进程间通信基于管道(PIPE)的进程间通信结构模型: 通过管道完成进程间通信。管道不是进程的资源,属于操作系统的。两个进程通过操作系统提供的内存空间进行通信。创建管道的函数:父进程...原创 2018-05-11 23:35:27 · 286 阅读 · 0 评论 -
多进程服务器端 ---(2) *
信号处理父进程往往很繁忙,因此不能只调用waitpid函数以等待子进程终止。接下来讨论解决方案。 向操作系统求助子进程终止的识别主体是操作系统,因此,若操作系统能把终止信息告诉正忙于工作的父进程,父进程将暂时放下工作,处理子进程终止相关事宜。这将有助于构建高效的程序。 信号处理(Signal Handing)机制 信号是在特定事件发生时,由操作系统向进程发送的消息。 信号与signal函数信号注...原创 2018-05-11 15:59:15 · 262 阅读 · 0 评论 -
多进程服务器端 ---(1) 进程
进程概念及应用 两种类型的服务器端 服务器设计技术有很多,按使用的协议来分有TCP服务器和UDP服务器。按处理方式来分有循环服务器和并发服务器。目前最常用的服务器模型就这两种:--循环服务器:服务器在同一时刻只能响应一个客户端的请求--并发服务器:服务器在同一时刻可以响应多个客户端的请求 并发服务器端的实现方法网络程序中数据通信时间比CPU运算时间占比更大,因此,向多个客户端提供服务是一种有效利用...原创 2018-05-11 15:46:47 · 318 阅读 · 0 评论 -
套接字的多种可选项
套接字可选项和I/O缓冲大小套接字多种可选项之前的程序创建好套接字之后是直接使用的,此时通过默认的套接字特性进行数据通信。示例有时需要特别操作套接字特性,就要更改一些可选项。套接字可选项分层:IPPROTO_IP层可选项是IP协议相关事项IPPROTO_TCP层是TCP协议相关的事项SOL_SOCKET层是套接字相关的通用可选项函数getsockopt & setsockoptgetsoc...原创 2018-05-10 00:45:20 · 262 阅读 · 0 评论 -
域名及网络地址
域名系统DNS(Domain Name System :域名系统)是对IP地址和域名进行相互转换的系统,其核心是DNS服务器。 什么是域名提供网络服务的服务器端也是通过IP地址区分的,但几乎不可能以非常难记的IP地址形式交换服务器端地址信息。 DNS服务器在浏览器地址栏中输入Naver网站的IP地址222.122.195.5即可浏览Naver网站主页。但我们通常输入网站的域名www.naver.c...原创 2018-05-07 00:19:14 · 1885 阅读 · 0 评论 -
优雅地断开套接字连接--套接字半关闭
基于TCP的半关闭单方面断开连接带来的问题 调用close函数断开连接,意味着完全断开连接,不仅无法传输数据,而且也不能接收数据。 套接字和流(Stream)两台主机通过套接字建立连接后进入可交换数据的状态。把建立套接字后可交换数据的状态看作一种流。为了实现双向通信,套接字生成的两个流。 针对优雅断开的shutdown函数shu...原创 2018-05-07 00:13:21 · 1182 阅读 · 0 评论 -
基于UDP的服务器端/客户端
理解UDPUDP套接字的特点下面通过信件说明UDP的工作原理。寄信前先在信封上填好寄信人和收信人的地址,之后贴上邮票放进邮筒即可。无法确认对方是否收到信件,并且在邮寄过程中可能发生信件丢失的情况。也就是说,UDP是不可靠的数据传输服务。TCP为了提供可靠的数据传输服务,在不可靠的IP层进行流控制,所以TCP比UDP可靠,但UDP在结构上比TCP更简洁。流控制是区分UDP和TCP的最重要的标志。UD...原创 2018-05-06 11:45:41 · 6413 阅读 · 1 评论