Posted on

主要问网络方面的

  • Socket连接过程
  • TCP Handshake
  • TCP/UDP
  • Threads versus Processes
  • Website Access Control:数据吞吐量过大,数据保存时间不长,不能用数据库实现,用Hash Table在内存中运行
  • 预估全球所有计算机访问(IPv4)9 Byte的一个数据结构(ip, time, count)最大占用内存:40GB
  • time: UNIX时间从1970年1月1日开始的秒数

Website Access Control

实现功能:某特定IP在10秒钟内只能访问2次。

  • (1, 0) => true
  • (1, 1) => true
  • (1, 2) => false
  • (1, 10) => true

在牛客网(Nowcoder)上面试的,面试过程有点紧张,写完之后改了大概七八分钟才运行起来,还好面试官中途有事出去了一趟,我整理了一下代码和思路。

之前一个其他公司面试拿到一个前端offer是一个Coding Challenge,3天完成一个小项目即可,跟这次的感觉还是有点不一样的。

#include <iostream>
#include <map>
using namespace std;
struct User{
    int ip;
    int time;
    int count;
    User(int ip, int time, int count)
        :
        ip(ip),
        time(time),
        count(0)
        {}
};

map<int, User> m;
const int max_time = 10;

bool check(int ip, int time)
{
    auto user = m.find(ip);
    if(user == m.end()) {
        User* u = new User(ip, time, 1);
        m.insert(make_pair(ip, *u));
        return true;
    }
    if(time - user->second.time >= max_time) {
        user->second.time = time;
        user->second.count = 1;
        return true;
    }
    
    user->second.count++;
    
    if(user->second.count >= 2) return false;

    return true;
}

int main() {
    cout << check(1, 0) << endl;
    // cout << m.begin()->first << m.begin()->second.count;
    cout << check(1, 1) << endl;
    cout << check(1, 2) << endl;
    //cout << "\n1,2: " << m.begin()->first << m.begin()->second.count;
    cout << check(1, 10) << endl;
}

Related Topics

Berkely Sockets

https://csperkins.org/teaching/2007-2008/networked-systems/lecture04.pdf (page 8)
https://en.wikipedia.org/wiki/Berkeley_sockets#/media/File:InternetSocketBasicDiagram_zhtw.png

Leave a Reply

Your email address will not be published. Required fields are marked *