借用一句话,
东南玄天一片云,乌鸦落进凤凰群
满网都是英雄汉,谁是君来谁是臣
上面就是要通知你所谓的牛逼技术到底是什么回事!!!
咱们测试一下数据库,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 把握了共通的常识再换语言又何妨呢?