<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          你心中最高大上最牛逼的技術(shù)到底是什么大聲告訴我

          共 4178字,需瀏覽 9分鐘

           ·

          2021-01-07 19:35

          借用一句話,
          西北玄天一片云,烏鴉落進鳳凰群
          滿網(wǎng)都是英雄漢,誰是君來誰是臣
          **高以下為基,貴以賤為本
          互聯(lián)網(wǎng)技術(shù)的核心根基就是 TCP/IP,TCP/IP 的實現(xiàn)依賴于Linux socket API【我們的項目大部分運行在上面】
          沒有它們各種高大上牛逼的技術(shù)就無從建立起來。而這根基對大家所用的java,go,py,php,c,c++,nodejs...都是一樣的,只不過是基于Linux api做了各種各樣的封裝百家爭鳴,百花齊放,跟易經(jīng)里的陰陽構(gòu)成64卦一樣,當(dāng)你剛開始擼程序時,可能并不會覺得基礎(chǔ)的重要性,甚至可能幾年內(nèi)一直是框架crud boy,你并不會察覺到基礎(chǔ)核心Linux socket api!
          每天被各種新技術(shù)詞匯遮蔽雙眼,而基礎(chǔ)知識你一直的錯失和鄙視低估,就想一步飛龍在天,達到九五爻之位,并沒有“以下為基” “以賤為本” **
          甚至對于其它知識點你都持“下賤之態(tài)”只想與天齊名,從不腳踏實地從坤做起。

          先給總結(jié)圖 你再看下面的內(nèi)容

          下面就是要告訴你所謂的牛逼技術(shù)到底是什么回事?。?!
          我們測試一下數(shù)據(jù)庫,java,python,go,c/c++,php,redis,docker進行測試【測完你會發(fā)現(xiàn)點東西】
          然后你再看圖比較好,免得大家天天為了這個框架,那個框架,這個語言,哪個語言在b乎,快手,抖音,b站吵的跟少婦一樣[只是吐槽一下]
          ^_^

          • 先測試數(shù)據(jù)庫接收數(shù)據(jù)時是不是用了Linux網(wǎng)絡(luò) socket API


          好啟動了,沒有什么可說的,ELF文件啟動。

          .ibd是創(chuàng)建數(shù)據(jù)表時生成的文件,沒啥可說的,DBA專業(yè)都知道

          我畫線的地方調(diào)用了ACCEPT SOCKET API函數(shù)

          調(diào)用了SENDTO,RECVFROM SOCKET API 函數(shù)

          mysql怎么實現(xiàn)我們管不著,但是數(shù)據(jù)來回的傳輸依賴于LINUX SOCKET API,這些都是網(wǎng)絡(luò)接口API


          調(diào)用了系統(tǒng)其它API函數(shù)庫,我們看一下accept,sendto,recvfrom,setsockopt,getsockopt read,write,epoll相關(guān)函數(shù)






          • redis 數(shù)據(jù)庫

          啟動redis

          測試

          **epoll_wait 得到就緒的文件描述符讀事件返回,然后調(diào)用read,其實跟RECVFROM功能一樣
          它的數(shù)據(jù)是:3\r\n$3\r\nset\r\n4\r\nbfzs\r\n5\r\n10000\r\n
          這一堆數(shù)據(jù)被各種大佬稱為 redis的二進制通信請求協(xié)議?。?!返回是+OK\r\n**

          它們的數(shù)據(jù)來回傳輸大部分用read,write函數(shù)來實現(xiàn)



          • docker


          dockerd服務(wù)ELF文件調(diào)用的linux api相關(guān)函數(shù)庫

          啟動docker服務(wù),跟mysql一樣默認(rèn)啟動一堆進程和線程

          相關(guān)命令運行【對不起,我不喜歡背東西,你要是面試我時,問我docker有哪些命令選項,對不起我回家種地放牛了】

          來用下測試

          運行過程


          都在調(diào)用connect,socket,getpeerame,setsockopt,getsockopt,accept,sendto等LINUX SOCKET API函數(shù)
          docker調(diào)用的LINUX API 函數(shù)庫




          • go語言寫個網(wǎng)絡(luò)程序

          我直接復(fù)制粘粘給你運行對不起我背不了函數(shù),要用就直接復(fù)制粘粘就好了

          go ELF 文件

          來運行那個大家認(rèn)為的源碼文件

          先運行哪個函數(shù),你自己看著辦哦

          重點

          熟悉的一批,socket 創(chuàng)建socket文件描述符,然后命名【把ip,端口綁定到此文件上】,然后監(jiān)聽,并阻塞在accept函數(shù)上


          好了,go就這樣子,它封裝的比較騷,go elf編譯器封裝的牛逼,語法換了一套就稱為編譯型語言了。

          • python語言也寫個網(wǎng)絡(luò)程序測試下


          py的語法就是好,隨便一擼就可以了,簡直是粗暴又騷,語法嘛就這樣,長得跟少婦一樣
          來先認(rèn)識一下python elf文件 畢竟好多爬蟲大佬可能沒有見過


          .php .py .go .java里的東西只是個文本內(nèi)容,你們嘛叫源碼,我沒有文化,只能叫ascii text ^_^

          啟動測試


          有沒有發(fā)現(xiàn),熟悉的一批



          好了,到這里夠意思了。

          這么簡單的語言,你去學(xué)語法就行了,簡單又粗暴誰不喜歡呢。我都喜歡。^_^

          • java 語言網(wǎng)絡(luò)程序測試

          測試源碼

          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大佬肯定知道我就不費話了


          編譯一下

          我沒有學(xué)過java,但是看一下報錯就知道了,對不對,這么明顯的提示,我phper都曉得 ^_^

          編譯ok

          編譯好是啥文件

          啟動java程序開始測試


          有沒有發(fā)現(xiàn),熟悉的一批



          好了,就這么多就行了,沒有必要再截圖了。

          看接下,我們擼c[c++一樣]

          你們應(yīng)該看出點熟悉的地方了
          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
          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;
          }

          然后編譯,編譯好就這樣


          測試

          好了,都不用我廢話了,接下來還是測試下php吧,我覺得,雖然有的朋友覺得php咋樣咋樣,拍黃片嘛,在打黃打非的壓力之下當(dāng)然沒啥好名聲了。不過我就是色批,就是擼php了怎么了嘛。

          • php 網(wǎng)絡(luò)程序測試

          看下php elf文件

          啟動并測試跟蹤

          好了,不用我廢話,大家也知道是怎么回事了。

          這些api函數(shù)怎么用呢?
          man socket


          瀏覽 84
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          評論
          圖片
          表情
          推薦
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  午夜成人鲁丝片午夜精品 | 欧美成人精品 | 日韩AV小说| 日韩精品成人一区二区三区蜜桃 | 天堂中文最新版 |