你心中最高大上最牛X的技术到底是什么[转载自北风之神巨佬的文章]

本文在征得北风之神巨佬的同意下转发,原文链接如下
segmentfault.com/a/119000003878211...
我现在一边用go,一边用php,但我觉得这文章非常不错,推荐给大家。
巨佬说登录不了我们社区,他也同意转发了这文章

你心中最高大上最牛X的技术到底是什么【转载自北风之神巨佬的文章】

图片.png

图片.png

*高以下为基,贵以贱为本
互联网技术的核心根基就是TCP/IP,TCP/IP的实现依赖于Linux socket API【我们的项目大部分运行在上面】
没有它们各种高大上牛逼的技术就无从建立起来。而这根基对大家所用的java,go,py,php,c,c++,nodejs…都是一样的,只不过是基于Linux api做了各种各样的封装百家争鸣,百花齐放,跟易经里的阴阳构成64卦一样,当你刚开始撸程序时,可能并不会觉得基础的重要性,甚至可能几年内一直是框架crud boy,你并不会察觉到基础核心Linux socket api【一般来说linux内核的api很少变动,比较稳定,国内linux内核开发工程师估计也不会天天没事干,天天修改linux内核api】!
每天被各种新技术词汇遮蔽双眼,而基础知识你一直的错失和鄙视低估,就想一步飞龙在天,达到九五爻之位,并没有“以下为基” “以贱为本” *

甚至对于其它知识点你都持“下贱之态”只想与天齐名,从不脚踏实地从坤做起。

先给总结图 你再看下面的内容
图片.png

下面就是要告诉你所谓的牛逼技术到底是什么回事!!!
我们测试一下数据库,java,python,go,c/c++,php,redis,docker进行测试【测完你会发现点东西】
然后你再看图比较好

  • 先测试数据库接收数据时是不是用了Linux网络 socket API

图片.png
好启动了,没有什么可说的,ELF文件启动。
图片.png
.ibd是创建数据表时生成的文件,没啥可说的,DBA专业都知道
图片.png

我画线的地方调用了ACCEPT SOCKET API函数
图片.png
调用了SENDTO,RECVFROM SOCKET API 函数

mysql怎么实现我们管不着,但是数据来回的传输依赖于LINUX SOCKET API,这些都是网络接口API
图片.png
图片.png
调用了系统其它API函数库,我们看一下accept,sendto,recvfrom,setsockopt,getsockopt read,write,epoll相关函数
图片.png
图片.png
图片.png
图片.png
图片.png
图片.png
图片.png

  • redis 数据库

图片.png

启动redis
图片.png
测试
图片.png
epoll_wait 得到就绪的文件描述符读事件返回,然后调用read,其实跟RECVFROM功能一样
它的数据是:3rn$3rnsetrn4rnbfzsrn5rn10000rn
这一堆数据被各种大佬称为 redis的二进制通信请求协议!!!返回是+OKrn

图片.png

它们的数据来回传输大部分用read,write函数来实现
图片.png
图片.png
图片.png
图片.png

  • docker

图片.png

图片.png
dockerd服务ELF文件调用的linux api相关函数库
图片.png
启动docker服务,跟mysql一样默认启动一堆进程和线程
图片.png
相关命令运行【对不起,我不喜欢背东西,你要是面试我时,问我docker有哪些命令选项,对不起我回家种地放牛了】
图片.png
来用下测试
图片.png
运行过程
图片.png
图片.png
都在调用connect,socket,getpeerame,setsockopt,getsockopt,accept,sendto等LINUX SOCKET API函数
docker调用的LINUX API 函数库
图片.png
图片.png
图片.png
图片.png
图片.png

  • go语言写个网络程序

我直接复制粘粘给你运行对不起我背不了函数,要用就直接复制粘粘就好了
图片.png
图片.png

go ELF 文件
图片.png

来运行那个大家认为的源码文件
图片.png
先运行哪个函数,你自己看着办哦
图片.png

重点
图片.png
熟悉的一批,socket 创建socket文件描述符,然后命名【把ip,端口绑定到此文件上】,然后监听,并阻塞在accept函数上
图片.png
图片.png
图片.png

好了,go就这样子,它封装的比较骚,go elf编译器封装的牛逼,语法换了一套就称为编译型语言了。

  • python语言也写个网络程序测试下

图片.png
py的语法就是好,随便一撸就可以了,简直是粗暴又骚,语法嘛就这样,长得跟少妇一样
来先认识一下python elf文件 毕竟好多爬虫大佬可能没有见过
图片.png
图片.png
.php .py .go .java里的东西只是个文本内容,你们嘛叫源码,我没有文化,只能叫ascii text ^_^
图片.png

启动测试
图片.png
图片.png
有没有发现,熟悉的一批
图片.png
图片.png
图片.png
好了,到这里够意思了。

这么简单的语言,你去学语法就行了,简单又粗暴谁不喜欢呢。我都喜欢。 ^_^

  • java 语言网络程序测试

测试源码

cat GreetingServer.java
import java.net.*;
import java.io.*;

public class GreetingServer extends Thread
{
   private ServerSocket serverSocket;

   public GreetingServer(int port) throws IOException
   {
      serverSocket = new ServerSocket(port);
      serverSocket.setSoTimeout(100000000);
   }

   public void run()
   {
      while(true)
      {
         try
         {
            System.out.println("等待远程连接,端口号为:" + serverSocket.getLocalPort() + "...");
            Socket server = serverSocket.accept();
            System.out.println("远程主机地址:" + server.getRemoteSocketAddress());
            DataInputStream in = new DataInputStream(server.getInputStream());
            System.out.println(in.readUTF());
            DataOutputStream out = new DataOutputStream(server.getOutputStream());
            out.writeUTF("谢谢连接我:" + server.getLocalSocketAddress() + "\nGoodbye!");
            server.close();
         }catch(SocketTimeoutException s)
         {
            System.out.println("Socket timed out!");
            break;
         }catch(IOException e)
         {
            e.printStackTrace();
            break;
         }
      }
   }
   public static void main(String [] args)
   {
      int port = Integer.parseInt(args[0]);
      try
      {
         Thread t = new GreetingServer(port);
         t.run();
      }catch(IOException e)
      {
         e.printStackTrace();
      }
   }
}

看一下java elf文件,我相信java大佬肯定知道我就不费话了
图片.png
图片.png
编译一下
图片.png
我没有学过java,但是看一下报错就知道了,对不对,这么明显的提示,我phper都晓得 ^_^
图片.png
编译ok
图片.png
编译好是啥文件
图片.png
启动java程序开始测试
图片.png
图片.png
有没有发现,熟悉的一批
图片.png
图片.png
图片.png
好了,就这么多就行了,没有必要再截图了。

看接下,我们撸c[c++一样]

你们应该看出点熟悉的地方了
int main(int argc,char *argv[])
{

        if(argc<=2){

                printf("useage:%s ip_address port_number\n",basename(argv[0]));
                return 1;
        }

        const char *ip = argv[1];
        int port = atoi(argv[2]);

        int ret = 0;
        struct sockaddr_in address;
        bzero(&address,sizeof(address));
        address.sin_family = AF_INET;
        inet_pton(AF_INET,ip,&address.sin_addr);
        address.sin_port = htons(port);

        int listenfd = socket(PF_INET,SOCK_STREAM,0);
        assert(listenfd>=0);

        ret = bind(listenfd,(struct sockaddr*)&address,sizeof(address));

        assert(ret!=-1);

        ret = listen(listenfd,5);
        assert(ret!=-1);

        bzero(&address,sizeof(address));
        address.sin_family = AF_INET;
        inet_pton(AF_INET,ip,&address.sin_addr);
        address.sin_port = htons(port);

        int udpfd = socket(PF_INET,SOCK_DGRAM,0);
        assert(udpfd>=0);

        ret = bind(udpfd,(struct sockaddr*)&address,sizeof(address));
        assert(ret!=-1);

        struct epoll_event events[MAX_EVENT_NUMBER];
        int epollfd = epoll_create(5);
        assert(epollfd!=-1);

        addfd(epollfd,listenfd);
        addfd(epollfd,udpfd);

        while(1){

                int number = epoll_wait(epollfd,events,MAX_EVENT_NUMBER,-1);
                if(number<0){

                        printf("epoll failre\n");
                        break;
                }

                for(int i=0;i<number;i++){

                        int sockfd = events[i].data.fd;
                        if(sockfd ==listenfd){

                                struct sockaddr_in client_address;
                                socklen_t client_addrlength = sizeof(client_address);
                                int connfd = accept(listenfd,(struct sockaddr*)&client_address,&client_addrlength);
                                addfd(epollfd,connfd);
                        }
                        else if(sockfd == udpfd){

                                char buf[UDP_BUFFER_SIZE];
                                memset(buf,0,UDP_BUFFER_SIZE);
                                struct sockaddr_in client_address;
                                socklen_t client_addrlength = sizeof(client_address);

                                ret = recvfrom(udpfd,buf,UDP_BUFFER_SIZE-1,0,(struct sockaddr*)&client_address,&client_addrlength);
                                if(ret>0){

                                        sendto(udpfd,buf,UDP_BUFFER_SIZE-1,0,(struct sockaddr*)&client_address,client_addrlength);
                                }
                        }
                        else if(events[i].events & EPOLLIN){

                                char buf[TCP_BUFFER_SIZE];
                                while(1){

                                        memset(buf,0,TCP_BUFFER_SIZE);
                                        ret = recv(sockfd,buf,TCP_BUFFER_SIZE-1,0);
                                        if(ret<0){

                                                if((errno==EAGAIN)||(errno=EWOULDBLOCK)){

                                                        break;
                                                }
                                                close(sockfd);
                                                break;
                                        }
                                        else if(ret==0){

                                                close(sockfd);
                                        }
                                        else{

                                                send(sockfd,buf,ret,0);
                                        }
                                }
                        }else{

                                printf("something else happened\n");
                        }
                }
        }

        close(listenfd);
        return 0;
}

然后编译,编译好就这样
图片.png
图片.png
测试
图片.png
图片.png

好了,都不用我废话了,接下来还是测试下php吧,我觉得,虽然有的朋友觉得php咋样咋样,拍黄片嘛,在打黄打非的压力之下当然没啥好名声了。

  • php 网络程序测试
  • 图片.png

看下php elf文件
图片.png
启动并测试跟踪
图片.png
好了,不用我废话,大家也知道是怎么回事了。
图片.png

这些api函数怎么用呢?
man socket
图片.png

linux socket api 是所有语言,数据库等应用的核心低层技术知识,你框架掌握的再6,没有多少意义,语言掌握得再6也只是工具
分布式,集群,高大上的技术都要TCP/IP支持,而它的实现就是网络编程,各语言写法不同,但是核心基础知识没有变化,正所谓天下大事必作于细天下难事必作于易,一上来撸c/c++,java如果不合适你,那么上来就撸PHP掌握了共通的知识再换语言又何妨呢?

本作品采用《CC 协议》,转载必须注明作者和本文链接
《L03 构架 API 服务器》
你将学到如 RESTFul 设计风格、PostMan 的使用、OAuth 流程,JWT 概念及使用 和 API 开发相关的进阶知识。
《G01 Go 实战入门》
从零开始带你一步步开发一个 Go 博客项目,让你在最短的时间内学会使用 Go 进行编码。项目结构很大程度上参考了 Laravel。
讨论数量: 4
小李世界

汇编天下第一

6个月前 评论

大家有任何问题,请联系原文作者哦,我只是转发仔 :joy:

6个月前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!