借用一句话,
东南玄天一片云,乌鸦落进凤凰群
满网都是英雄汉,谁是君来谁是臣
上面就是要通知你所谓的牛逼技术到底是什么回事!!!
咱们测试一下数据库,java,python,go,c/c++,php,redis,docker进行测试【测完你会发现点货色】
而后你再看图比拟好,省得大家天天为了这个框架,那个框架,这个语言,哪个语言在b乎,快手,抖音,b站吵的跟少妇一样[只是吐槽一下]
^_^

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


好启动了,没有什么可说的,ELF文件启动。

.ibd是创立数据表时生成的文件,没啥可说的,DBA业余都晓得

我画线的中央调用了ACCEPT SOCKET API函数

调用了SENDTO,RECVFROM SOCKET API 函数

mysql怎么实现咱们管不着,然而数据来回的传输依赖于LINUX SOCKET API,这些都是网络接口API


调用了零碎其它API函数库,咱们看一下accept,sendto,recvfrom,setsockopt,getsockopt read,write,epoll相干函数






  • redis 数据库

启动redis

测试

**epoll_wait 失去就绪的文件描述符读事件返回,而后调用read,其实跟RECVFROM性能一样
它的数据是:3\r\n$3\r\nset\r\n4\r\nbfzs\r\n5\r\n10000\r\n
这一堆数据被各种大佬称为 redis的二进制通信申请协定!!!返回是+OK\r\n**

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



  • docker


dockerd服务ELF文件调用的linux api相干函数库

启动docker服务,跟mysql一样默认启动一堆过程和线程

相干命令运行【对不起,我不喜爱背货色,你要是面试我时,问我docker有哪些命令选项,对不起我回家种地放牛了】

来用下测试

运行过程


都在调用connect,socket,getpeerame,setsockopt,getsockopt,accept,sendto等LINUX SOCKET API函数
docker调用的LINUX API 函数库




  • go语言写个网络程序

我间接复制粘粘给你运行对不起我背不了函数,要用就间接复制粘粘就好了

go ELF 文件

来运行那个大家认为的源码文件

先运行哪个函数,你本人看着办哦

重点

相熟的一批,socket 创立socket文件描述符,而后命名【把ip,端口绑定到此文件上】,而后监听,并阻塞在accept函数上


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

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


py的语法就是好,轻易一撸就能够了,几乎是粗犷又骚,语法嘛就这样,长得跟少妇一样
来先认识一下python elf文件 毕竟好多爬虫大佬可能没有见过


.php .py .go .java里的货色只是个文本内容,你们嘛叫源码,我没有文化,只能叫ascii text ^_^

启动测试


有没有发现,相熟的一批



好了,到这里够意思了。

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

  • java 语言网络程序测试

看一下java elf文件,我置信java大佬必定晓得我就不费话了


编译一下

我没有学过java,然而看一下报错就晓得了,对不对,这么显著的提醒,我phper都知道 ^_^

编译ok

编译好是啥文件

启动java程序开始测试


有没有发现,相熟的一批



好了,就这么多就行了,没有必要再截图了。

看接下,咱们撸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;}

而后编译,编译好就这样


测试

好了,都不必我废话了,接下来还是测试下php吧,我感觉,尽管有的敌人感觉php咋样咋样,拍黄片嘛,在打黄打非的压力之下当然没啥好名声了。不过我就是色批,就是撸php了怎么了嘛。

  • php 网络程序测试

看下php elf文件

启动并测试跟踪

好了,不必我废话,大家也晓得是怎么回事了。

这些api函数怎么用呢?
man socket

上面是堆废话【慎看^_^】
如果你是个重视核心技术的敌人,能够关注我的材料https://edu.51cto.com/sd/75a3d,同时愿你成为大佬!
因为你学哪门语言都一样。如果你感觉你想又简略又能疾速的进入到socket api编程那么此材料就非常适合你。

linux socket api 是所有语言,数据库等利用的外围低层技术常识,你框架把握的再6,没有多少意义,语言把握得再6也只是工具,你要把握的是数据来回传输靠的TCP/IP协定,而这些协定的相干API 就是LINUX SOCKET API,做为一名码农我感觉你有必要学这套!!!没有这套SOCKET API 或是你没有把握,那只能受制于人!天天为外表的语法,框架,语言争吵。

分布式,集群,高大上的技术都要TCP/IP反对,而它的实现就是网络编程,各语言写法不同,然而外围基础知识没有变动,正所谓天下大事必作于细天下难事必作于易,一上来撸c/c++,java如果不适合你,那么上来就撸PHP把握了共通的常识再换语言又何妨呢?