客户端服务器升为select模型
服务端
#define WIN32_LEAN_AND_MEAN#define _WINSOCK_DEPRECATED_NO_WARNINGS#include <iostream>#include <WinSock2.h>#include <Windows.h>//只有在WIN里可以#pragma comment(lib,"ws2_32.lib")#include <vector>#pragma region 结构体定义enum CMD { CMD_LOGIN, CMD_LOGOUT, CMD_ERROR, CMD_LOGIN_RESULT, CMD_LOGOUT_RESULT, CMD_NEW_USER_JOIN};struct DataHeader { short dataLength; short cmd;};struct Login : public DataHeader {//DataPackage Login() { dataLength = si ...
nginx反向代理出错
使用yum安装好了nginx
问题再现进入路径配置好了nginx.conf文件
验证nginx.conf文件是否有语法错误
sudo nginx -t
重载nginx服务
sudo nginx -s reload
然后启动程序,发现nginx报错
在终端可以尝试输入了这样一句话
setsebool -P httpd_can_network_connect true
解释:可能是SELinux的原因,它会基于最小权限原则默认拦截了 Nginx 的请求
在虚拟机Centos 7中配置Redis环境
安装Redis# 下载fedora的epel仓库sudo yum install epel-release# 安装redis数据库sudo yum install redis
测试是否安装成功
#启动redisservice redis start#查看redis进程ps -ef | grep redis
配置Redis以需求为远程连接Redis为例
开始配置之前,先关闭Redis服务
#关闭redisservice redis stop
打开配置文件sudo vim /etc/redis.conf
进入编辑器后,输入/+搜索的内容然后回车进行搜索,按n键查找下一个(eg:修改端口号时输入/port),按i进入到插入模式进行修改,修改完后按Esc退出插入模式
修改端口号(按照需求修改)
修改默认密码(建议修改)
取消只允许在本机连接redis
将bind 127.0.0.1注释掉
然后输入:wq保存并退出
设置Redis开机自启chkconfig redis on
配置防火墙在linux下的防火墙中开放6379端口(如果上面更换了端口号就按自己的来)
sudo firewall-cm ...
建立一个简易的TCP客户端与服务端
TCP服务端分为一下六步:
建立一个socket 套接字
bind 绑定用于接受客户端连接的网络接口
listen 监听网络端口
accept 等待接受客户端连接
send 向客户端发送一条数据
关闭套接字closesocket
#define WIN32_LEAN_AND_MEAN#define _WINSOCK_DEPRECATED_NO_WARNINGS#include <iostream>#include <WinSock2.h>#include <Windows.h>//只有在WIN里可以#pragma comment(lib,"ws2_32.lib")using namespace std;int main() { //启动Windows socket 2.x环境 WORD ver = MAKEWORD(2, 2); WSADATA dat; WSAStartup(ver, &dat); // 用Socket API 建立一个简易的TCP服务端 // 1 建立一个socket 套接字 SOCKET ...
JZ22 链表中倒数最后k个结点
描述输入一个长度为 n 的链表,设链表中的元素的值为 a_i ,返回该链表中倒数第k个节点。
如果该链表长度小于k,请返回一个长度为 0 的链表。
数据范围:
0 \leq n \leq 10^5,0 \leq a_i \leq 10^9,0 \leq k \leq 10^9要求:空间复杂度 O(n),时间复杂度 O(n)
进阶:空间复杂度O(1),时间复杂度 O(n)
例如输入{1,2,3,4,5},2时,对应的链表结构如下图所示:
其中蓝色部分为该链表的最后2个结点,所以返回倒数第2个结点(也即结点值为4的结点)即可,系统会打印后面所有的节点来比较。
示例1输入:{1,2,3,4,5},2返回值:{4,5}说明:返回倒数第2个节点4,系统会打印后面所有的节点来比较。
示例2输入:{2},8返回值:{}
题解1首先求出链表的长度n,从题目的倒数第k个结点,推出是正数的第n - k个结点。若n - k < 0,则返回空值
/** * struct ListNode { * int v ...
jz23 链表中环的入口结点
描述给一个长度为n链表,若其中包含环,请找出该链表的环的入口结点,否则,返回null。
数据范围: n≤10000,1<=结点值<=10000
要求:空间复杂度 O(1),时间复杂度 O(n)
例如,输入{1,2},{3,4,5}时,对应的环形链表如下图所示:
可以看到环的入口结点的结点值为3,所以返回结点值为3的结点。
输入描述:输入分为2段,第一段是入环前的链表部分,第二段是链表环的部分,后台会根据第二段是否为空将这两段组装成一个无环或者有环单链表
返回值描述:返回链表的环的入口结点即可,我们后台程序会打印这个结点对应的结点值;若没有,则返回对应编程语言的空结点即可。
示例1输入:
{1,2},{3,4,5}
返回值:
3
说明:
返回环形链表入口结点,我们后台程序会打印该环形链表入口结点对应的结点值,即3
示例2输入:
{1},{}
返回值:
"null"
说明:
没有环,返回对应编程语言的空结点,后台程序会打印"null"
示例3输入 ...
JZ52 两个链表的第一个公共结点
输入两个无环的单向链表,找出它们的第一个公共结点,如果没有公共节点则返回空。(注意因为传入数据是链表,所以错误测试数据的提示是用其他方式显示的,保证传入数据是正确的)
数据范围: n≤1000要求:空间复杂度 O(1),时间复杂度 )O(n)
例如,输入{1,2,3},{4,5},{6,7}时,两个无环的单向链表的结构如下图所示:
可以看到它们的第一个公共结点的结点值为6,所以返回结点值为6的结点。
输入描述:输入分为是3段,第一段是第一个链表的非公共部分,第二段是第二个链表的非公共部分,第三段是第一个链表和第二个链表的公共部分。 后台会将这3个参数组装为两个链表,并将这两个链表对应的头节点传入到函数FindFirstCommonNode里面,用户得到的输入只有pHead1和pHead2。
返回值描述:返回传入的pHead1和pHead2的第一个公共结点,后台会打印以该节点为头节点的链表。
示例1输入:
{1,2,3},{4,5},{6,7}
返回值:
{6,7}
说明:
第一个参数{1,2,3 ...
jz25 合并两个排序的链表
描述输入两个递增的链表,单个链表的长度为n,合并这两个链表并使新链表中的节点仍然是递增排序的。
数据范围: 0≤10000≤n≤1000,−1000≤节点值≤1000−1000≤节点值≤1000要求:空间复杂度 O(1),时间复杂度 O(n)
如输入{1,3,5},{2,4,6}时,合并后的链表为{1,2,3,4,5,6},所以对应的输出为{1,2,3,4,5,6},转换过程如下图所示:
或输入{-1,2,4},{1,3,4}时,合并后的链表为{-1,1,2,3,4,4},所以对应的输出为{-1,1,2,3,4,4},转换过程如下图所示:
示例1输入:
{1,3,5},{2,4,6}
返回值:
{1,2,3,4,5,6}
示例2输入:
{},{}
返回值:
{}
示例3输入:
{-1,2,4},{1,3,4}
返回值:
{-1,1,2,3,4,4}
题解1可以使用虚拟头结点,可以再新建一个链表,然后把两个 ...
JZ24 反转链表
描述给定一个单链表的头结点pHead(该头节点是有值的,比如在下图,它的val是1),长度为n,反转该链表后,返回新链表的表头。
数据范围: 0≤10000≤n≤1000
要求:空间复杂度 O(1) ,时间复杂度 O(n) 。
如当输入链表{1,2,3}时,
经反转后,原链表变为{3,2,1},所以对应的输出为{3,2,1}。
以上转换过程如下图所示:
示例1输入:
{1,2,3}
返回值:
{3,2,1}
示例2输入:
{}
返回值:
{}
说明:
空链表则输出空
题解1使用栈当做中转站,把每个节点倒过来,然后重新拼成一个新链表
/** * struct ListNode { * int val; * struct ListNode *next; * ListNode(int x) : val(x), next(nullptr) {} * }; */class Solution { public: /** ...
JZ6 从尾到头打印链表
描述输入一个链表的头节点,按链表从尾到头的顺序返回每个节点的值(用数组返回)。
如输入{1,2,3}的链表如下图:
返回一个数组为[3,2,1]
0 <= 链表长度 <= 10000
示例1输入:
{1,2,3}
返回值:
[3,2,1]
算法思路1主要考察翻转数组的操作,把链表的数据放到数组里,然后在数组里操作,一个比较简单的操作是调用C++的库函数
class Solution {public: vector<int> printListFromTailToHead(ListNode* head) { vector<int> vt; ListNode* p = head; while(p != nullptr){ vt.push_back(p->val); p = p->next; } reverse(vt.begin(),vt.end()); ...