你心中最高大上最牛X的技術到底是什麼[轉載自北風之神巨佬的文章]

laravel重度使用者發表於2021-01-25

本文轉載自 北風之神的文章【他說他幾個月登入不了我們社群網站,徵求他同意,我轉發他的文章】
你們有問題的聯絡他,此文不是我本人所寫哦。
原文地址:segmentfault.com/a/119000003878211...

你心中最高大上最牛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

它們的資料來回傳輸大部分用read,write函式來實現
圖片.png
圖片.png
圖片.png
圖片.png

  • docker

圖片.png

圖片.png
dockerd服務ELF檔案呼叫的linux api相關函式庫

啟動docker服務,跟mysql一樣預設啟動一堆程式和執行緒
圖片.png
相關命令執行【對不起,我不喜歡背東西,你要是面試我時,問我docker有哪些命令選項,對不起我回家種地放牛了】
圖片.png
來用下測試
本文章是轉載自 北風之神的文章【他已經幾個月登入不了我們社群網站了,讓我轉發】
原文連結segmentfault.com/a/119000003878211...
執行過程
圖片.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 協議》,轉載必須註明作者和本文連結

相關文章