自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

Qsir的专栏

日常学习,工作中的点滴记录与积累

  • 博客(31)
  • 资源 (2)
  • 收藏
  • 关注

转载 基于UDP的服务器端和客户端

前面的文章中我们给出了几个 TCP 的例子,对于 UDP 而言,只要能理解前面的内容,实现并非难事。UDP中的服务器端和客户端没有连接UDP 不像 TCP,无需在连接状态下交换数据,因此基于 UDP 的服务器端和客户端也无需经过连接过程。也就是说,不必调用 listen() 和 accept() 函数。UDP 中只有创建套接字的过程和数据交换的过程。UDP服务器端和客户端均只需1个套接...

2019-06-28 09:56:22 451

转载 再谈UDP和TCP

TCP 是面向连接的传输协议,建立连接时要经过三次握手,断开连接时要经过四次握手,中间传输数据时也要回复 ACK 包确认,多种机制保证了数据能够正确到达,不会丢失或出错。UDP 是非连接的传输协议,没有建立连接和断开连接的过程,它只是简单地把数据丢到网络中,也不需要 ACK 包确认。UDP 传输数据就好像我们邮寄包裹,邮寄前需要填好寄件人和收件人地址,之后送到快递公司即可,但包裹是否正确送达、...

2019-06-28 09:55:24 178

转载 gethostbyname()函数:通过域名获取IP地址

客户端中直接使用 IP 地址会有很大的弊端,一旦 IP 地址变化(IP 地址会经常变动),客户端软件就会出现错误。而使用域名会方便很多,注册后的域名只要每年续费就永远属于自己的,更换 IP 地址时修改域名解析即可,不会影响软件的正常使用。关于域名注册、域名解析、host 文件、DNS 服务器等本节并未详细讲解,请读者自行脑补。本节重点讲解如何使用域名。通过域名获取IP地址域名仅仅是 I...

2019-06-28 09:54:08 3516 1

转载 网络数据的大小端问题

不同 CPU 中,4 字节整数 1 在内存空间的存储方式是不同的。4 字节整数 1 可用 2 进制表示如下:00000000 00000000 00000000 00000001有些 CPU 以上面的顺序存储到内存,另外一些 CPU 则以倒序存储,如下所示:00000001 00000000 00000000 00000000若不考虑这些就收发数据会发生问题,因为保存顺序的不同意味...

2019-06-28 09:53:08 815

转载 socket编程实现文件传输功能

这节我们来完成socket文件传输程序,这是一个非常实用的例子。要实现的功能为:client 从 server 下载一个文件并保存到本地。编写这个程序需要注意两个问题:1) 文件大小不确定,有可能比缓冲区大很多,调用一次 write()/send() 函数不能完成文件内容的发送。接收数据时也会遇到同样的情况。要解决这个问题,可以使用 while 循环,例如://Server...

2019-06-28 09:52:13 680

转载 shutdown()函数:优雅地断开TCP连接

调用 close()/closesocket() 函数意味着完全断开连接,即不能发送数据也不能接收数据,这种“生硬”的方式有时候会显得不太“优雅”。图1:close()/closesocket() 断开连接上图演示了两台正在进行双向通信的主机。主机A发送完数据后,单方面调用close()/closesocket() 断开连接,之后主机A、B都不能再接受对方传输的数据。实际上,是完全无...

2019-06-28 09:49:16 1016

转载 图解TCP四次握手断开连接

建立连接非常重要,它是数据正确传输的前提;断开连接同样重要,它让计算机释放不再使用的资源。如果连接不能正常断开,不仅会造成数据传输错误,还会导致套接字不能关闭,持续占用资源,如果并发量高,服务器压力堪忧。建立连接需要三次握手,断开连接需要四次握手,可以形象的比喻为下面的对话:[Shake 1] 套接字A:“任务处理完毕,我希望断开连接。” [Shake 2] 套接字B:“哦,是吗?请稍等,...

2019-06-27 15:09:15 279

转载 详细分析TCP数据的传输过程

建立连接后,两台主机就可以相互传输数据了。如下图所示:图1:TCP 套接字的数据交换过程上图给出了主机A分2次(分2个数据包)向主机B传递200字节的过程。首先,主机A通过1个数据包发送100个字节的数据,数据包的 Seq 号设置为 1200。主机B为了确认这一点,向主机A发送 ACK 包,并将 Ack 号设置为 1301。为了保证数据准确到达,目标机器在收到数据包(包括SYN包、...

2019-06-27 15:08:09 390

转载 图解TCP数据报结构以及三次握手(非常详细)

TCP(Transmission Control Protocol,传输控制协议)是一种面向连接的、可靠的、基于字节流的通信协议,数据在传输前要建立连接,传输完毕后还要断开连接。客户端在收发数据前要使用 connect() 函数和服务器建立连接。建立连接的目的是保证IP地址、端口、物理链路等正确无误,为数据的传输开辟通道。TCP建立连接时要传输三个数据包,俗称三次握手(Three-way Ha...

2019-06-27 15:07:09 239

转载 TCP协议的粘包问题(数据的无边界性)

上节我们讲到了socket缓冲区和数据的传递过程,可以看到数据的接收和发送是无关的,read()/recv() 函数不管数据发送了多少次,都会尽可能多的接收数据。也就是说,read()/recv() 和 write()/send() 的执行次数可能不同。例如,write()/send() 重复执行三次,每次都发送字符串"abc",那么目标机器上的 read()/recv() 可能分三次接收,每次...

2019-06-27 15:06:07 221

转载 socket缓冲区以及阻塞模式详解

在《socket数据的接收和发送》一节中讲到,可以使用 write()/send() 函数发送数据,使用 read()/recv() 函数接收数据,本节就来看看数据是如何传递的。socket缓冲区每个 socket 被创建后,都会分配两个缓冲区,输入缓冲区和输出缓冲区。write()/send() 并不立即向网络中传输数据,而是先将数据写入缓冲区中,再由TCP协议将数据从缓冲区发送到目标...

2019-06-27 15:05:08 386

转载 如何让服务器端持续监听客户端的请求?

前面的程序,不管服务器端还是客户端,都有一个问题,就是处理完一个请求立即退出了,没有太大的实际意义。能不能像Web服务器那样一直接受客户端的请求呢?能,使用 while 循环即可。修改前面的回声程序,使服务器端可以不断响应客户端的请求。服务器端 server.cpp:#include <stdio.h> #include <winsock2.h> #p...

2019-06-27 15:03:53 1595

转载 socket编程实现回声客户端

所谓“回声”,是指客户端向服务器发送一条数据,服务器再将数据原样返回给客户端,就像声音一样,遇到障碍物会被“反弹回来”。对!客户端也可以使用 write() / send() 函数向服务器发送数据,服务器也可以使用 read() / recv() 函数接收数据。考虑到大部分初学者使用 Windows 操作系统,本节将实现 Windows 下的回声程序,Linux下稍作修改即可,不再给出代码。...

2019-06-27 15:02:45 685

转载 send()/recv()和write()/read():发送数据和接收数据

在Linux和 Windows 平台下,使用不同的函数发送和接收socket数据,下面我们分别讲解。Linux下数据的接收和发送Linux 不区分套接字文件和普通文件,使用 write() 可以向套接字中写入数据,使用 read() 可以从套接字中读取数据。前面我们说过,两台计算机之间的通信相当于两个套接字之间的通信,在服务器端用 write() 向套接字写入数据,客户端就能收到...

2019-06-27 15:01:22 579

转载 listen()和accept()函数:让套接字进入监听状态并响应客户端请求

对于服务器端程序,使用 bind() 绑定套接字后,还需要使用 listen() 函数让套接字进入被动监听状态,再调用 accept() 函数,就可以随时响应客户端的请求了。listen() 函数通过 listen() 函数可以让套接字进入被动监听状态,它的原型为:int listen(int sock, int backlog); //Linux int listen(S...

2019-06-27 14:59:55 868

转载 bind()和connect()函数:绑定套接字并建立连接

socket() 函数用来创建套接字,确定套接字的各种属性,然后服务器端要用 bind() 函数将套接字与特定的 IP 地址和端口绑定起来,只有这样,流经该 IP 地址和端口的数据才能交给套接字处理。类似地,客户端也要用 connect() 函数建立连接。bind() 函数bind() 函数的原型为:int bind(int sock, struct sockaddr *addr, ...

2019-06-27 14:58:01 778

转载 socket()函数用法详解:创建套接字

不管是 Windows 还是Linux,都使用socket() 函数来创建套接字。socket() 在两个平台下的参数是相同的,不同的是返回值。在《socket是什么》一节中我们讲到了 Windows 和 Linux 在对待 socket 方面的区别。Linux 中的一切都是文件,每个文件都有一个整数类型的文件描述符;socket 也是一个文件,也有文件描述符。使用 socket() 函数...

2019-06-26 14:39:05 2261

转载 WSAStartup()函数以及DLL的加载

本节讲解 Windows 下 DLL 的加载,学习LinuxSocket 的读者可以跳过。WinSock(Windows Socket)编程依赖于系统提供的动态链接库(DLL),有两个版本:较早的DLL是wsock32.dll,大小为 28KB,对应的头文件为 winsock1.h; 最新的DLL是ws2_32.dll,大小为 69KB,对应的头文件为winsock2.h。...

2019-06-26 14:38:02 300

转载 Windows下的socket演示程序

上节演示了Linux下的socket程序,这节来看一下 Windows 下的 socket 程序。同样,server.cpp 为服务器端代码,client 为客户端代码。服务器端代码 server.cpp:#include <stdio.h> #include <winsock2.h> #pragma comment (lib, "ws2_32....

2019-06-26 14:36:48 192

转载 Linux下的socket演示程序

和C语言教程一样,我们从一个简单的“Hello World!”程序切入socket编程。本节演示了Linux下的代码,server.cpp 是服务器端代码,client.cpp 是客户端代码,要实现的功能是:客户端从服务器读取一个字符串并打印出来。服务器端代码 server.cpp:#include <stdio.h> #include <string...

2019-06-26 14:35:39 184

转载 IP、MAC和端口号——网络通信中确认身份信息的三要素

在茫茫的互联网海洋中,要找到一台计算机非常不容易,有三个要素必须具备,它们分别是IP 地址、MAC 地址和端口号。IP地址IP地址是Internet Protocol Address 的缩写,译为“网际协议地址”。目前大部分软件使用 IPv4 地址,但 IPv6 也正在被人们接受,尤其是在教育网中,已经大量使用。一台计算机可以拥有一个独立的 IP 地址,一个局域网也可以拥有一个独立...

2019-06-26 14:32:41 407

转载 TCP/IP协议族

上节《OSI网络七层模型简明教程》中讲到,目前实际使用的网络模型是 TCP/IP 模型,它对 OSI 模型进行了简化,只包含了四层,从上到下分别是应用层、传输层、网络层和链路层(网络接口层),每一层都包含了若干协议。协议(Protocol)就是网络通信过程中的约定或者合同,通信的双方必须都遵守才能正常收发数据。协议有很多种,例如 TCP、UDP、IP 等,通信的双方必须使用同一协议才能通信。协议...

2019-06-26 14:31:25 199

转载 OSI网络七层模型简明教程

如果你读过计算机专业,或者学习过网络通信,那你一定听说过 OSI 模型,它曾无数次让你头大。OSI 是 Open System Interconnection 的缩写,译为“开放式系统互联”。OSI 模型把网络通信的工作分为 7 层,从下到上分别是物理层、数据链路层、网络层、传输层、会话层、表示层和应用层。OSI 只是存在于概念和理论上的一种模型,它的缺点是分层太多,增加了网络工作的复杂性,所...

2019-06-26 14:30:22 375

转载 面向连接和无连接的套接字到底有什么区别?

上一节《套接字有哪些类型》提到,流格式套接字(Stream Sockets)就是“面向连接的套接字”,它基于 TCP 协议;数据报格式套接字(Datagram Sockets)就是“无连接的套接字”,它基于 UDP 协议。这给大家造成一种印象,面向连接就是可靠的通信,无连接就是不可靠的通信,实际情况是这样吗?另外,不管是哪种数据传输方式,都得通过整个 Internet 网络的物理线路将数据传输...

2019-06-26 14:28:39 675

转载 套接字有哪些类型?socket有哪些类型?

这个世界上有很多种套接字(socket),比如 DARPA Internet 地址(Internet 套接字)、本地节点的路径名(Unix套接字)、CCITT X.25地址(X.25 套接字)等。但本教程只讲第一种套接字——Internet 套接字,它是最具代表性的,也是最经典最常用的。以后我们提及套接字,指的都是 Internet 套接字。根据数据的传输方式,可以将 Internet 套接字分...

2019-06-26 14:26:19 916

转载 socket是什么?套接字是什么?

网络编程就是编写程序使两台联网的计算机相互交换数据。这就是全部内容了吗?是的!网络编程要比想象中的简单许多。那么,这两台计算机之间用什么传输数据呢?首先需要物理连接。如今大部分计算机都已经连接到互联网,因此不用担心这一点。在此基础上,只需要考虑如何编写数据传输程序。但实际上这点也不用愁,因为操作系统已经提供了socket。即使对网络数据传输的原理不太熟悉,我们也能通过 socket 来编程。...

2019-06-26 14:24:59 230

转载 浅谈C/C++引用和指针的联系和区别

为什么C/C++语言使用指针?答案:①一方面,每一种编程语言都使用指针。不止C/C++使用指针。每一种编程语言都使用指针。C++将指针暴露给了用户(程序员),而Java和C#等语言则将指针隐藏起来了。“Everything uses pointers. C++ just exposes them rather than hiding them,”It's easier to gi...

2019-06-21 17:37:03 199

转载 微服务注册发现集群搭建——Registrator + Consul + Consul-template + nginx

在互联网应用领域,服务的动态性需求十分常见,这就对服务的自动发现和可动态扩展提出了很高的要求。微服务系统动辄上万个服务,而且还要动态伸缩。以人工写好的IP、Port 硬编码脚本的方式无法做到大规模自动化,稍微多点服务运维就傻了。微服务必然要做到ip和port自动分配,减少人工干预。我们需要让每个服务能动态的创建地址,同时调用方要能感知地址变化。这就需要有一个服务注册与发现的机制,这篇文件就...

2019-06-18 09:41:04 482

转载 微服务实战之扩展性

任何微服务的容量都是有限的, 但是理想情况下一般的微服务应该只局限于服务器的数量(计算能力), 存储的容量和网络的带宽.当用户的请求和用量增加时, 只要财务预算上没有问题, 理论上是可以接近无限地扩展的.实际上, 这个假定往往并不成立, 更大的数据量, 更多的请求, 更高的并发量, 你的服务会撑不住.你会想到加内存, 加存储, 加带宽, 加服务器, 然而事情没那么容易, 你的应用的服务...

2019-06-17 17:48:09 978

转载 工作经验小结 之二

当了几年的程序员了,虽然写码的时间多点,但手上也管理过、带过一部分程序员。一直都在想一个问题,什么是程序员,程序员应该做好那些事情,什么样的程序员是有素质的程序员?什么样的程序员算是负责的程序员呢? 工作当中我发现有不少员工是为了工作而工作,怎么回事呢?他们只是把我分配的工作分毫不差的完成,但从不问为什么?有些程序员是喜欢随便改变需求,自己感觉不错就得改,改了还不做报告,最后上交项目时才发现和需...

2019-06-17 16:43:30 259

转载 工作经验小结 之一

在一家公司呆久了,就容易思维固化。身边有朋友出去找工作也四处碰壁,即使入职了下一家公司,也很难立足。而我的分析是,1~2年的经验,其实已经足够让我们入门了,学习需求分析、项目管理,写出更好的代码,才是我现阶段应该做的。做开发很多年,这期间我获得了很多能力,技术能力、大厂经验、培训能力……但是在这里,我建议大家最值得训练的,还是学习和分析的能力。一、工程化管理工具不...

2019-06-17 16:14:31 385

优秀的开源Web开发资源

精选开源领域里的优秀技术和开发框架,为实现低成本高效率的web开发提供非常有价值的参考。

2013-01-31

Perl Debugger

Addison Wesley 出版 Perl 进阶宝典

2013-01-31

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除