
网络编程
ljytower
专业方向:三维GIS、计算机图形学。
目前是一个什么都写一点的程序猿……
展开
-
Cpp-Socket网络编程(一)简易服务器端搭建(Mac OS环境)
写在前面:从今天正式开启学习网络编程,感谢@Evillla的推荐和安利,希望自己利用暑假的时间好好学习和消化网络编程相关知识,能在秋招中发挥到作用,收获心仪的offer!20190714:第一节 Socket基础API首先一幅图介绍Socket的基础API,可以理解为一个文件读写的过程:在客户端(前端)中,首先建立一个socket,类似于创建一个File*指针;连接服务...原创 2019-07-16 07:36:09 · 1708 阅读 · 1 评论 -
Cpp-Socket网络编程(五)网络报文的数据格式定义及使用
1. 网络数据报文的格式定义:报文由包头和包体组成,其中:- 包头:描述本次消息包的大小,描述数据的作用- 包体:存放数据enum CMD { CMD_LOGIN, CMD_LOGINOUT};//包头struct DataHeader { short dataLength; //数据长度 short cmd; //命令};//包体...原创 2019-07-22 22:53:10 · 2255 阅读 · 0 评论 -
Cpp-Socket网络编程(四)发送结构化的网络消息数据(Mac OS环境)
本篇内容相比于(三)服务器端和客户端业务逻辑上没有变化,只是消息组织形式发生改变。之前消息采用纯字符串形式,纯字符串的消息优点是处理简易命令方便快捷,缺点是传递大量数据时字符串解析消耗大。本篇采用结构化的二进制数据流传输网络消息,需要严格的网络字节序一致,但是方便、消耗小、解析快。定义结构化数据(采用结构体):struct DataPackage { //字节序顺序和对齐要保持一致...原创 2019-07-22 21:31:11 · 298 阅读 · 0 评论 -
Cpp-Socket网络编程(十)客户端升级为select网络模型
1. 在服务器端加入,如果有新用户连接服务器端则向所有连接的客户端发送消息:if (FD_ISSET(_sock, &fdRead)) { FD_CLR(_sock, &fdRead); //4. 等待客户端连接accept sockaddr_in clientAddr = {}; socklen_t nAddrLen = sizeof(soc...原创 2019-08-03 12:28:26 · 420 阅读 · 0 评论 -
Cpp-Socket网络编程(九)服务器端升级为非阻塞select模型,处理更多业务
对于服务器而言,除了响应多个客户端的需求,还需要主动向推送消息,那么就提出了在select() 查询结束后如果没有其他数据可操作,服务器还可以做一些其他工作的需求,因此本篇将服务器端的select模型改造为非阻塞式的。mac OS环境下,select的声明如下,这里第五个参数代表了查询的超时时间,即查询数据时如果等待了__restrict所定义的时间后还没有数据就立即返回。int ...原创 2019-08-03 10:33:11 · 300 阅读 · 0 评论 -
Cpp-Socket网络编程(三)建立能持续处理请求的C/S网络程序(Mac OS环境)
经过了网络编程(一)(二)的学习,完成了搭建简单的模型,但是:服务器端只能等待客户端的连接,向客户端发送一条数据,然后持续该循环;客户端只能在连接服务器之后接收服务器的数据,然后打印再退出。总结:这样的简单模型能够不停地处理客户端连接,但是不能处理复杂的业务,因此本篇对该简单模型进行改造,建立能持续处理请求的C/S网络程序。正式改造步骤:一、服务器端的改造拓展为八个步骤:建立一...原创 2019-07-21 16:17:05 · 429 阅读 · 1 评论 -
Cpp-Socket网络编程(二)简易客户端搭建(Mac OS环境)
0719:用socket API 四步建立客户端1. 建立一个socket2. 连接服务器3. 接受服务器信息recv4. 关闭套接字close socket//// client.cpp// SocketStepByStep//// Created by tower on 2019/7/19.// Copyright © 2019 tower. All r...原创 2019-07-20 23:44:06 · 789 阅读 · 2 评论 -
关于TCP三次握手的进一步分析
今天和小伙伴探讨了关于TCP的三次握手的特殊情况:TCP三次握手的第三个ACK丢了怎么办?(参考作者@john-zeng)正常情况:当客户端收到服务器端的SYN+ACK确认报文后,其状态变为ESTABLISHED,并发送ACK确认给服务器端。特殊情况:如果此时ACK丢失了,那么服务器端的状态变为SYN_RECV,并且等待3秒、6秒、12秒后重新发送SYN+ACK包给客户端(服务器端重发S...原创 2019-07-19 23:38:16 · 123 阅读 · 0 评论 -
Cpp-Socket网络编程(八)服务器端升级为select模型处理多客户端
之前学习的服务器端与客户端网络程序都是1对1的阻塞模式的网络程序,每次服务器端想要接收新的客户端连接时,都必须要新的客户端向服务器端发送连接;某一端想要调用recv函数接收数据时也必须要另一段真正的发送数据过来。那么当我们调用这些阻塞函数时,就必须要等待函数执行,不能进行其他的业务处理,服务器端就无法同时处理多个客户端的业务。为了令服务器端能够处理多客户端业务,这里使用select网络模型。s...原创 2019-07-28 23:10:17 · 288 阅读 · 0 评论 -
Cpp-Socket网络编程(六)将多次收发报文数据升级为一次收发
1. 为命令CMD的枚举增加两个成员:enum CMD { CMD_LOGIN, CMD_LOGIN_RESULT, CMD_LOGOUT, CMD_LOGOUT_RESULT, CMD_ERROR};2. 使用继承的方式,令Login/Logout/LoginResult/LogoutResult结构体继承于DataHeader,并在Login...原创 2019-07-23 22:53:37 · 444 阅读 · 0 评论 -
关于TCP四次挥手
今天看公众号编程珠玑推了TCP四次挥手的相关内容,想着打开复习一遍,在复习的过程中发现了一些新的问题,在此记录。首先回顾TCP四次挥手的几个步骤:客户端向服务器端发送释放报文FIN = 1,处于FIN_WAIT1状态;服务器端收到后发出确认,向客户端发送ACK = X + 1,处于CLOSED_WAIT状态。(此时TCP处于半关闭状态,服务器端可以向客户端发送数据,客户端不可以向服务器端发...原创 2019-07-15 20:56:02 · 191 阅读 · 0 评论 -
Cpp-Socket网络编程(七)网络消息接收长度问题
在复杂网络环境下,网络消息的长度并不总是固定的,网络数据包可分为固长数据、变长数据、粘包/拆包、少包/组包等情况。其中,粘包指,例如每次发送500字节数据到客户端或者服务端,但是由于网络延迟等原因,服务器端可能一次收到两个消息,即1000字节,也就是网络数据包粘在一起了,因此需要一个拆包的过程;分包指,例如一次发送1000字节数据,服务器端接收的时候,一开始只接收到500字节的数据,那么服务器端就...原创 2019-07-28 20:55:00 · 830 阅读 · 0 评论