Skip to content

Commit cbe65a8

Browse files
添加go常见问题
1 parent 999bcee commit cbe65a8

File tree

2 files changed

+76
-9
lines changed

2 files changed

+76
-9
lines changed

src/main.cpp

Lines changed: 57 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -22,24 +22,73 @@
2222

2323
using namespace std;
2424

25+
// 算法复杂度 O(logn)
26+
// 2. 查询原有数组下标
2527

2628

2729

30+
class Solution {
31+
public:
32+
// nums 是旋转之后的数组
33+
int search(vector<int>& nums, int target) {
34+
// 异常情况
35+
// 1. 数组为空, 2. ?
36+
if (nums.empty()) {
37+
return -1;
38+
}
39+
40+
41+
// 2. 定位target O(logn) 算法要求,需要使用二分查找
42+
int left = 0;
43+
int right = nums.size() - 1;
44+
// 先查看中间值
45+
int middle = 0;
46+
while (left < right) {
47+
// 每次循环需要重新定位中间值
48+
middle = (left + right) / 2;
49+
50+
//
51+
if (nums[middle] == target) {
52+
return middle;
53+
}
54+
55+
56+
57+
// 其他情况
58+
59+
if (nums[left] <= nums[middle]) {
60+
if (target < nums[middle]) {
61+
right = middle ;
62+
}
63+
else {
64+
left = middle;
65+
}
66+
}
67+
// 小于是乱序,大于是有序之后的后半段
68+
if (nums[right] )
69+
70+
}
2871

2972

30-
int main() {
3173

3274

33-
std::set<int> setAlices{1};
34-
std::set<int> setAlices2{2};
35-
std::set<int> setRet{};
3675

37-
std::set_difference(setAlices2.begin(), setAlices2.end(),
38-
setAlices.begin(), setAlices.end(), std::inserter(setRet, setRet.begin()));
3976

40-
for (const auto& index : setRet) {
41-
std::cout << index << std::endl;
77+
return -1;
4278
}
79+
};
80+
81+
82+
83+
84+
int main() {
85+
86+
Solution solution;
87+
88+
std::vector<int> num{4,5,6,7,0,1,2};
89+
90+
91+
std::cout << solution.search(num, 0) << std::endl;
4392

4493

4594

网络/tcp.adoc

Lines changed: 19 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,7 @@ netstat -nt |grep -i "127.0.0.1:8080" |grep -i 'SYV_RECV' | wc -l
4242

4343

4444

45-
=== tcp哪些不得不知的事情
45+
=== tcp那些不得不知的事情
4646

4747
.TCP
4848
****
@@ -590,6 +590,24 @@ SYSCALL_DEFINE2(listen, int, fd, int, backlog)
590590
用户使用的socket文件描述符,只是一个整数,内核是没有办法使用的,所以实际使用中需要根据用户提供的整数查找出内核使用的socket对象。
591591

592592

593+
=== time_wait
594+
595+
在网络通信中,TCP连接的关闭过程涉及到一个称为TIME_WAIT的状态。这个状态是TCP协议的一部分,用于确保数据包在网络中可能的重复传输不会影响新的连接。当一个TCP连接被关闭时,最后一个发送FIN(结束标志)的一方将进入TIME_WAIT状态。
596+
597+
具体来说,客户端和服务端都可以发起关闭连接的请求。假设客户端首先发起关闭请求,那么关闭过程如下:
598+
599+
1. 客户端向服务端发送一个FIN包,表示它已经没有数据要发送了。
600+
2. 服务端接收到FIN后,会回一个ACK确认包给客户端,确认号为客户端FIN序列号加1。
601+
3. 服务端可能还有未完成的数据需要发送给客户端,因此它会继续发送这些数据,直到所有数据都发送完毕。
602+
4. 当服务端完成了所有数据的发送后,它也会发送一个FIN包给客户端。
603+
5. 客户端接收到服务端的FIN包后,会回复一个ACK确认包给服务端,确认号为服务端FIN序列号加1。
604+
6. 此时,客户端会进入TIME_WAIT状态,等待一段时间(通常是2MSL,即两倍的最大段生命周期),以确保任何可能在网络中延迟的旧数据包都能过期失效,这样就不会干扰到将来可能建立的新连接。
605+
606+
所以,如果客户端是主动关闭连接的一方,那么客户端就会进入TIME_WAIT状态。而如果服务端是主动关闭连接的一方,则服务端会进入TIME_WAIT状态。通常情况下,哪一方先发送FIN包,哪一方就会负责处理TIME_WAIT状态。
607+
608+
在Linux系统中,可以通过`netstat -an | grep TIME_WAIT`命令查看处于TIME_WAIT状态的连接数量。如果系统中存在大量的TIME_WAIT状态连接,可能会占用较多的端口资源,此时可以考虑调整系统的TCP参数来优化这种情况。例如,可以减少TIME_WAIT的时间长度或开启TCP端口复用功能等。
609+
610+
593611

594612
=== tcp中用到的算法
595613

0 commit comments

Comments
 (0)