C++socket编程
虽迟但到灬
一起快乐的努力
展开
-
socket网络字节序相关概念
如下图:我们本机数据的存放方式我们把低位的0存在了前面,高位的1放在了后面我们在看如下图:这个1就是高位端存放的。原创 2022-01-30 20:38:15 · 273 阅读 · 0 评论 -
C++socket编程(九):9.1 UDP实战Syslog服务器
1.配置linux系统日志。2.在windows接收linux日志3.通过正则表达式分析出危险操作并警告首先我们先配置linux的转发vim /etc/rsyslog.conf这一样的IP地址是windows的ip*.* @192.168.16.79然后重启rsyslog:service rsyslog restart。xsyslog.cpp#include "XUdp.h"#incldue <iostream>using namespace std;int main(原创 2022-01-14 11:49:32 · 670 阅读 · 0 评论 -
C++socket编程(八)8.3:UDP广播
1.首先需要知道广播使用地址是:255.255.255.2552.本地广播信息是不会被路由器转发的。3.不需要知道服务端ip地址广播很重要一点是就是不用知道ip。服务器代码,可以参照上一篇博客,不用改动。客户端代码如下:#include <iostream>#ifdef WIN32#include <Windows.h>#else#include <sys/types.h>#include <sys/socket.h>#include原创 2022-01-13 22:35:49 · 1873 阅读 · 0 评论 -
C++socket编程(八):8.2简单的基于UDP的客户端和服务端
UDP中的服务器端和客户端没有连接UDP 不像 TCP,无需在连接状态下交换数据,因此基于 UDP 的服务器端和客户端也无需经过连接过程。也就是说,不必调用 listen() 和 accept() 函数。UDP 中只有创建套接字的过程和数据交换的过程。UDP服务器端和客户端均只需1个套接字TCP 中,套接字是一对一的关系。如要向 10 个客户端提供服务,那么除了负责监听的套接字外,还需要创建 10 套接字。但在 UDP 中,不管是服务器端还是客户端都只需要 1 个套接字。之前解释 UDP 原理的时候举原创 2022-01-13 22:16:08 · 1260 阅读 · 0 评论 -
C++socket编程(八):8.1 UDP讲解,用户数据报协议
1.UDP提供无连接服务2.UDP缺乏可靠性支持,应用程序必须实现:确认,超时,重传,流控等。3.UDP面向记录服务注意:极端情况下我们甚至可以不用校验。UDP应用场景:P2P,硬件上等,广播组播(局域网内部)...原创 2022-01-12 22:22:08 · 901 阅读 · 0 评论 -
C++socket编程(七):7.4 正则表达式分析用户请求
1.在实际的开发中用户访问一个姐买你可能有自己的具体操作。我们可以用C++自己的regex类包含的正则表达式的方式处理用户的请求。如下代码:#include <stdlib.h>#include <thread>#include <string.h>#include <string>#include <regex> //C++自带的正则表达啥用法#include"XTcp.h"using namespace std;cla原创 2022-01-11 22:52:47 · 184 阅读 · 0 评论 -
C++socket编程(七):7.3 http的响应协议
前面的章节我们将讲解了连接http协议连接的代码,但是我们在浏览器上建立请求了之后我们怎么建立相应呢,一般我们应当遵照一个http的连接通用。代码如下://回应http GET请求 string rmsg = ""; rmsg = "HTTP/1.1 200 OK\r\n";//回应一个状态,以\r\n作为分割 rmsg += "Server: XHttp\r\n"; //服务器类型 rmsg += "Content-Type: text/html\r\n"; //ht原创 2022-01-09 22:33:01 · 793 阅读 · 3 评论 -
C++socket编程(七):7.2 XHttp项目创建接收浏览器请求
http协议概念:http协议详解如下代码:一个非应答式的http协议简单框架#include <stdlib.h>#include <thread>#include <string.h>#include"XTcp.h"class HttpThread{public: void Main() { char buffer[10000] = {0}; //这个buffer用来接收和发送数据 //接收http客户端请求 int recvL原创 2022-01-09 22:03:42 · 488 阅读 · 0 评论 -
C++socket编程(七):7.1 http协议讲解,通过抓包和telnet分析
http协议分析:HTTP超文本传输协议,所有的www文件都必须遵守整个标准HTTP/1.0短连接,HTTP/1.1它支持持续连接。下面是HTTP协议的响应telnet www.baidu.com 端口号他的协议部分全是字符串。原创 2022-01-09 21:25:15 · 600 阅读 · 0 评论 -
C++socket编程(六):6.4 epoll多路复用IO高并发
现在开始讲讲linux中epoll多路复用高并发多路复用常用的有epoll,select等,前面已经讲过select处理延时阻塞的问题。而且时在windows上和linux上通用的。重点:目前在linux中,只推荐用epoll处理多路复用的问题。其他方案,效率没他高而且,代码也不简单。epoll处理那些问题:·大量并发连接中只有少量活跃。·LT(水平触发)(level triggered)解释:与select一样,与select性能区别,要遍历所有的值,与会导致效率较低。·ET(边缘触发)(e原创 2022-01-09 19:19:29 · 1106 阅读 · 0 评论 -
C++socket编程(六):6.3 并发测试工具ab的使用(apache工具)
在linux中先进行apt-get install agache2安装完了这个包之后就会有ab命令。即可以实现对web服务器进行测试。windows上雷西斯。ab -n 次数 -c 线程数 xxx地址如ab -n 100 -c 5 https://www.baidu.com/显示每次连接耗费的时间和整个用时,测了多少次列出来。...原创 2022-01-09 17:40:27 · 7948 阅读 · 0 评论 -
C++socket编程(六):6.2 通过select实现超时处理
完成了socket编程的阻塞与非阻塞,接下俩就要处理前面讲过的关于超时处理的内容了。select函数我们可以看下接口手册如下代码:FD_ZERO(&set); //文件句柄置空 FD_SET(sock, &set); //把这个sock加入到这个文件句柄当中 timeval tm; tm.tv_sec = 0; tm.tv_usec = timeoutms * 1000; if (select(sock + 1, 0, &am原创 2022-01-09 17:03:25 · 1164 阅读 · 0 评论 -
C++socket编程(六):6.1 设置socket的阻塞和非阻塞
在完成了tcp的客户端和服务端的连接和数据通信之后,我们要想到下面的问题。超时处理,因为网络并不是可靠的,存在各种异常情况。我们如何判断并处理这种异常情况,就变得很重要了。如下问题:如果我的客户端connect与服务端三次握手失败怎么半,超时时间有多长,如果超时时间有10s的话,那么我们的界面可能卡死10s,这对于一般用户来说时无法忍受的。解决方法:我们在做connect的时候,可以要求他不要阻塞。我们可以让他1s之内连不上进行接下来的操作。我们可以进行超时处理。而且如果兼容跨屏的话,完全可以时用sel原创 2022-01-07 21:47:05 · 3046 阅读 · 0 评论 -
C++socket编程(五):5.2 tcp编程总结
如下图:整个流程一句话总结:客户端:第一步创建socket套接字,注意整个socket除了指定协议,绑定端口号,ip等还能指定阻塞方式。第二步connect建立连接,也即完成了三次握手。然后send,recv数据。进行数据传导。最后,需要将socket关闭。服务器:第一步创建socket,指定协议类型。第二步,绑定端口和ip地址第三步,listen监听,一旦调用了listen这个接口系统就会接收客户端发过来的三次握手请求,哪怕你不调用接下来的accept,这边也能成功,第四步,accep原创 2022-01-07 20:39:37 · 624 阅读 · 0 评论 -
C++socket编程(五):5.1 创建tcpclient项目
现在我们要开始进行客户端的编码了。如下客户端代码:#include "XTcp.h"int main(){ XTcp client; //client创建之后要建立连接,第一步客户端和服务器都是一样的, //区别是第二步,客户端有需要connect去连接服务器有一个三次握手的过程 client.Connect("192.168.16.223", 8081); client.Send("clientyesyesyes", 20); cha原创 2022-01-07 20:28:48 · 906 阅读 · 0 评论 -
C++socket编程(四):4.2 创建XTcp动态链接库项目
前言:在完成了TCP的服务端Demo之后,现在开始尝试开发客户端方面的项目。在做客户端之前先想下,客户端和服务端是不是公用一些类,头文件,创建socket,关闭socket,recv,send。这些客户端和服务端应该是公用的。应该放在XTcp.h,XTcp.cpp中。如果我们直接把这些文件加入到我们的项目中,这个方案非常不灵活,每次编译项目的时候,都要加一大推文件。还要重新编译这部分代码。如果解决这个问题呢?这里提出一个动态库的概念。本博客重点将linux下将服务器的建立绑定连接socket功能接口的过原创 2022-01-06 23:04:28 · 1227 阅读 · 0 评论 -
C++socket编程(四):4.1 跨平台封装XTcp类接口
首先我们需要定义一个XTcp类,在这个类的头文件中将创建socket,绑定socket,监听socket和accept通信接口封装起来,分别封装成一个接口。XTcp.h如下代码:#pragma once#include <string>class XTcp{public: int CreateSocket(); bool Bind(unsigned short port); XTcp Accept(); //注意这个返回类型不是指针类型,我们需要在后面重新调用一个close原创 2022-01-05 22:45:17 · 809 阅读 · 0 评论 -
C++socket编程(三):3.9 TCPServer移植到windows中
如下代码:#ifdef WIN32#include <Windows.h>#define socklen_t int#else#include <sys/types.h>#include <sys/socket.h>#include <unistd.h>#include <arpa/inet.h>#define closesocket close#endif#include <stdio.h>#include &原创 2022-01-05 21:23:58 · 554 阅读 · 0 评论 -
C++scoket编程(三):3.8 TCPserver开启多线程并发
现在新加一个功能:每来一个客户端,就把它加入到新的线程当中。保证我们可以并发处理多个客户端的数据。如下代码:class TcpThread{public: void Main() { char buffer[1024] = { 0 }; for (;;) { int recvlen = recv(client, buffer原创 2022-01-04 12:40:04 · 828 阅读 · 0 评论 -
C++socket编程(三):3.7 服务端回应send客户端数据
为什么提到反馈send客户端数据,是因为本章博客,目前为止都是单线程的。我们一个服务端只能接收第一个连接进行的客户端发送的数据,在这个客户端断开连接之前,我们的服务端都无法接收其他客户端发过来的数据了。所以我们提出多线程的思想使得,一个服务端可以对应多个客户端,来完成我们的数据接收与反馈,而这之前,必须先讲一下send。如下代码:for (;;) { int recvlen = recv(client, buffer, sizeof(buffer) - 1, 0); //第四个参数这个0是fl原创 2022-01-03 21:31:15 · 409 阅读 · 0 评论 -
C++socket编程(三):3.6 服务端recv客户端发送的数据
服务端中获取客户端发送过来的数据一定是关闭套接字之前进行,close之后就收不到数据了。一般读取数据一般用read,windows上一般用recv(本质上也是read),但是为了跨平台,所以一般用revc。如下代码sockaddr_in caddr; socklen_t len = sizeof(caddr); int client = accept(sock, (sockaddr*)&caddr, &len);//创建一个新的socket,用来与客户端单独进行通信 prin原创 2022-01-03 21:19:10 · 1099 阅读 · 0 评论 -
C++socket编程(三):3.5 accept读取用户的连接信息
读取用户的连接信息:顾名思义,就是在服务段中获取连接进来的客户端的ip地址,套接字编号,ip地址,端口号等。下面开看代码,获取用户客户端的socket号。int client = accept(sock, 0, 0);//创建一个新的socket,用来与客户端单独进行通信 printf("accept client %d\n", client); closesocket(client);注意上面的代码,我们是要进行客户端scoket的id号获取,注意accept返回值是一个新的socket这原创 2022-01-03 20:21:10 · 1235 阅读 · 0 评论 -
C++socket编程(三):3.4 listen监听
1.在端口成功绑定了之后,我们并没有开始真正接收用户的连接信息。2.所以我们应该用到listen函数开始进行监听,收到信息才看是接收数据。linux中我们可以用如下命令进行连接测试telnet ip 端口号:那么我的linux中命令就是:telnet 192.168.16.223 8080可以看到我在启动了程序之后,就可以监听到连接了代码如下:listen(sock, 10); //这个函数已经调用,就会告诉系统,这个socket可以通过这原创 2022-01-03 17:35:35 · 1315 阅读 · 0 评论 -
C++socket编程(三):3.3 bind端口
在socket编程中,我们要用到bind绑定socket套接字,用上了你前面的逻辑创建的socket。如下代码://绑定 //用bind绑定,绑定哪一个端口 if (bind(sock, (sockaddr*)&saddr, sizeof(saddr)) != 0) { printf("bind port %d failed!\n",port); return -2; }如上代码中,成功绑定会返回0值,否则返回一个非零值。...原创 2022-01-03 17:22:24 · 1146 阅读 · 0 评论 -
C++socket编程(三)3.2 创建TCPServer设置服务信息并讲解网络字节序
一:创建TCPserver如下代码:创建TCPserver设置服务信息代码如下int sock = socket(AF_INET, SOCK_STREAM, 0); if (sock == -1) { printf("create socket failed!\n"); return -1; } unsigned short port = 8080; if (argc > 1) { port = atoi(argv[1]); } //创建 sockaddr_原创 2022-01-03 15:36:38 · 966 阅读 · 0 评论 -
C++socket编程(三):3.1 TCP/IP协议特点
1.TCP是面向连接的。就是当你想要开始传递数据的时候,之前应该先把连接建立起来。它不像UDP协议,可以直接发送数据。2.TCP提供可靠的数据传输,实现了丢失重传。RTT的估算。3.TCP通过给所发送数据的每一个段管理一个序号进行排列。每一个包都会有一个序列号,由底层内部按照序列号排序之后,再行发送。4.TCP提供流量控制和拥塞控制:报告窗口、拥塞窗口。5.TCP的连接是全双工的,同时发送和接受数据可以同时进行不受干扰。二:TCP协议头窗口分析包头内容:1.源端口:我们再开发的过程中不是特别原创 2022-01-03 14:29:00 · 676 阅读 · 0 评论 -
C++socket编程(二):系统socket库介绍
什么是套接字:套接字是一个介质,由操作系统控制,下面演示下windows和linux中的socket接口建立的代码,通用#ifdef WIN32#include <Windows.h>#else#include <sys/types.h>#include <sys/socket.h>#include <unistd.h>#define closesocket close#endif#include <stdio.h>原创 2022-01-02 22:01:31 · 1875 阅读 · 1 评论 -
C++socket编程(一):绪论
1.windows与linux2.socket3.tcpiposi 与 TCP/IP注意:网络介质层会封装成一个mac地址。IPV4,IPV6那一层我们要做的事是建立连接。通过ip地址将两层联系起立。4.网络抓包分析抓包工具,win下wireshark,linux下有相关命令。5.使用windows编辑工具直接编辑linux代码(1)sudo apt-get install samba(2)配置samba。vim /etc/samba/smb.conf(3)移动到文件最后一行。原创 2022-01-02 15:56:09 · 399 阅读 · 0 评论