当前位置: 首页 > news >正文

在印尼用哪个网站做电商菏泽网页设计公司

在印尼用哪个网站做电商,菏泽网页设计公司,论述网站建设及运营流程,wordpress gallery大家好#xff0c;我是码农先森。 前言 各种编程语言百花齐放、百家争鸣#xff0c;但是 “万变不离其中”。对于网络通信而言#xff0c;每一种编程语言的实现方式都不一样#xff1b;但其实#xff0c;调用的底层逻辑都是一样的。linux 系统底层向上提供了统一的 Sock…大家好我是码农先森。 前言 各种编程语言百花齐放、百家争鸣但是 “万变不离其中”。对于网络通信而言每一种编程语言的实现方式都不一样但其实调用的底层逻辑都是一样的。linux 系统底层向上提供了统一的 Socket 通信系统函数动态链接库 /lib64/libc.so 中就是实现网络通信的关键类库。下面我们会以 Go 语言为例来分析网络通信数据传输的路径最终揭开各大编程语言网络通信的神秘面纱。 演示程序 1、使用 Go 编写一个简单的 Socket 程序 package mainimport (fmtnet )func main() {// 监听本地端口listener, err : net.Listen(tcp, :8080)if err ! nil {fmt.Println(Error listening:, err.Error())return}defer listener.Close()fmt.Println(Listening on localhost:8080)for {// 接收客户端连接conn, err : listener.Accept()if err ! nil {fmt.Println(Error accepting:, err.Error())return}// 处理客户端请求go handleRequest(conn)} }func handleRequest(conn net.Conn) {// 读取请求数据buffer : make([]byte, 1024)n, err : conn.Read(buffer)if err ! nil {fmt.Println(Error reading:, err.Error())return}// 处理请求数据message : string(buffer[:n])fmt.Println(Received message:, message)// 发送响应数据reply : Hello, client!conn.Write([]byte(reply))// 关闭连接conn.Close() }2、编译成二进制文件。 go build main.go [yxhdev01 demo]$ ls -l total 2536 -rwxr-xr-x 1 yangxionghai devops 2590837 Jun 2 15:42 main -rw-r--r-- 1 yangxionghai devops 1023 Jun 2 15:39 main.go3、执行 main 二进制文件 [yxhdev01 demo]$ ./main Listening on localhost:8080跟踪进程数据 1、跟踪 main 进程 # 找到进程ID [yxhdev01 demo]$ ps -aux | grep main yxh 32270 0.0 0.0 816460 1732 pts/3 Sl 16:47 0:00 ./main yxh 32404 0.0 0.0 112816 968 pts/13 S 16:47 0:00 grep --colorauto main2、使用 strace 跟踪进程 strace -f -s 2048 -i -T -o trace.log -p 32270命令各参数的解释 -f: 跟踪在运行时从父进程派生出来的子进程包括进程创建和退出等操作。 -s: 指定在输出中显示的字符串的最大长度为 2048 字节这样可以避免过长的输出导致日志文件过大。 -i: 在输出中同时显示系统调用的入口和返回地址。 -T: 在输出中显示每个系统调用花费的时间。 -o: 将输出的结果写入到名为 trace.log 的文件中而不是输出到控制台。 -p: 指定要跟踪的进程 ID 是 32270。3、使用 telnet 发生数据 # 客户端发送数据 [yxhdev01 ~]$ telnet 127.0.0.1 8080 Trying 127.0.0.1... Connected to 127.0.0.1. Escape character is ^]. ^]telnet # 客户端发生的数据 hello world # 服务端返回的数据 Hello, client! Connection closed by foreign host.4、服务端接收到数据 # 服务端接收到数据 [yxhdev01 demo]$ ./main Listening on localhost:8080 Received message: hello world深度分析 1、分析跟踪信息 我们先分析刚刚使用 strace 工具跟踪到的信息可以看到里面有很多的系统调用。具体每个系统函数的说明及用法可以去搜索引擎上查找资料学习。 # 跟踪到的信息 [yxhdev01 demo]$ cat trace.log 32275 [0000000000462943] futex(0x5e0058, FUTEX_WAIT_PRIVATE, 0, NULL unfinished ... 32274 [0000000000462943] futex(0xc000080150, FUTEX_WAIT_PRIVATE, 0, NULL unfinished ... 32273 [0000000000462943] futex(0xc000044d50, FUTEX_WAIT_PRIVATE, 0, NULL unfinished ... 32272 [0000000000462943] futex(0xc000044950, FUTEX_WAIT_PRIVATE, 0, NULL unfinished ... 32271 [0000000000462943] restart_syscall(... resuming interrupted restart_syscall ... unfinished ... 32270 [0000000000462b60] epoll_pwait(5, unfinished ... 32271 [0000000000462943] ... restart_syscall resumed) -1 ETIMEDOUT (Connection timed out) 25.495631 32271 [00000000004623bd] nanosleep({tv_sec0, tv_nsec20000}, NULL) 0 0.000107 32271 [0000000000462943] futex(0x5b1bd8, FUTEX_WAIT_PRIVATE, 0, {tv_sec60, tv_nsec0}) -1 ETIMEDOUT (Connection timed out) 60.000108 32271 [00000000004623bd] nanosleep({tv_sec0, tv_nsec20000}, NULL) 0 0.000100 32271 [0000000000462943] futex(0x5b1bd8, FUTEX_WAIT_PRIVATE, 0, {tv_sec60, tv_nsec0}) -1 ETIMEDOUT (Connection timed out) 60.000112 32271 [00000000004623bd] nanosleep({tv_sec0, tv_nsec20000}, NULL) 0 0.000123 32271 [0000000000462943] futex(0x5b1bd8, FUTEX_WAIT_PRIVATE, 0, {tv_sec60, tv_nsec0} unfinished ... 32270 [0000000000462b60] ... epoll_pwait resumed[{EPOLLIN, {u322087155416, u64140464697603800}}], 128, -1, NULL, 0) 1 188.828350 32270 [0000000000462943] futex(0x5b1bd8, FUTEX_WAKE_PRIVATE, 1) 1 0.000028 32271 [0000000000462943] ... futex resumed) 0 43.331766 32270 [000000000047f08a] accept4(3, unfinished ... 32271 [00000000004623bd] nanosleep({tv_sec0, tv_nsec20000}, unfinished ... 32270 [000000000047f08a] ... accept4 resumed{sa_familyAF_INET6, sin6_porthtons(9622), inet_pton(AF_INET6, ::ffff:127.0.0.1, sin6_addr), sin6_flowinfohtonl(0), sin6_scope_id0}, [112-28], SOCK_CLOEXEC|SOCK_NONBLOCK) 4 0.000019 32271 [00000000004623bd] ... nanosleep resumedNULL) 0 0.000076 32270 [0000000000462b38] epoll_ctl(5, EPOLL_CTL_ADD, 4, {EPOLLIN|EPOLLOUT|EPOLLRDHUP|EPOLLET, {u322087155184, u64140464697603568}} unfinished ... 32271 [00000000004623bd] nanosleep({tv_sec0, tv_nsec20000}, unfinished ... 32270 [0000000000462b38] ... epoll_ctl resumed) 0 0.000017 32270 [000000000047f0f6] getsockname(4, {sa_familyAF_INET6, sin6_porthtons(8080), inet_pton(AF_INET6, ::ffff:127.0.0.1, sin6_addr), sin6_flowinfohtonl(0), sin6_scope_id0}, [112-28]) 0 0.000017 32270 [000000000047f08a] setsockopt(4, SOL_TCP, TCP_NODELAY, [1], 4 unfinished ... 32271 [00000000004623bd] ... nanosleep resumedNULL) 0 0.000103 32270 [000000000047f08a] ... setsockopt resumed) 0 0.000016 32271 [00000000004623bd] nanosleep({tv_sec0, tv_nsec20000}, unfinished ... 32270 [000000000047f08a] setsockopt(4, SOL_SOCKET, SO_KEEPALIVE, [1], 4) 0 0.000017 32270 [000000000047f08a] setsockopt(4, SOL_TCP, TCP_KEEPINTVL, [15], 4) 0 0.000017 32271 [00000000004623bd] ... nanosleep resumedNULL) 0 0.000090 32270 [000000000047f08a] setsockopt(4, SOL_TCP, TCP_KEEPIDLE, [15], 4 unfinished ... 32271 [00000000004623bd] nanosleep({tv_sec0, tv_nsec20000}, unfinished ... 32270 [000000000047f08a] ... setsockopt resumed) 0 0.000016 32270 [0000000000462943] futex(0xc000080150, FUTEX_WAKE_PRIVATE, 1) 1 0.000020 32274 [0000000000462943] ... futex resumed) 0 188.828982 32270 [000000000047f08a] accept4(3, unfinished ... 32274 [0000000000462b60] epoll_pwait(5, unfinished ... 32271 [00000000004623bd] ... nanosleep resumedNULL) 0 0.000101 32274 [0000000000462b60] ... epoll_pwait resumed[{EPOLLOUT, {u322087155184, u64140464697603568}}], 128, 0, NULL, 0) 1 0.000014 32270 [000000000047f08a] ... accept4 resumed0xc000053c10, [112], SOCK_CLOEXEC|SOCK_NONBLOCK) -1 EAGAIN (Resource temporarily unavailable) 0.000037 32274 [0000000000462943] futex(0xc000044950, FUTEX_WAKE_PRIVATE, 1 unfinished ... 32271 [00000000004623bd] nanosleep({tv_sec0, tv_nsec20000}, unfinished ... 32274 [0000000000462943] ... futex resumed) 1 0.000018 32270 [0000000000462b60] epoll_pwait(5, unfinished ... 32274 [000000000047f01b] read(4, unfinished ... 32272 [0000000000462943] ... futex resumed) 0 188.829100 32274 [000000000047f01b] ... read resumed0xc00008e400, 1024) -1 EAGAIN (Resource temporarily unavailable) 0.000017 32270 [0000000000462b60] ... epoll_pwait resumed[], 128, 0, NULL, 2) 0 0.000039 32274 [0000000000462b60] epoll_pwait(5, unfinished ... 32272 [0000000000462b60] epoll_pwait(5, unfinished ... 32274 [0000000000462b60] ... epoll_pwait resumed[], 128, 0, NULL, 2) 0 0.000019 32271 [00000000004623bd] ... nanosleep resumedNULL) 0 0.000120 32270 [0000000000462b60] epoll_pwait(5, unfinished ... 32274 [0000000000462943] futex(0xc000080150, FUTEX_WAIT_PRIVATE, 0, NULL unfinished ... 32272 [0000000000462b60] ... epoll_pwait resumed[], 128, 0, NULL, 0) 0 0.000054 32271 [00000000004623bd] nanosleep({tv_sec0, tv_nsec20000}, unfinished ... 32272 [0000000000462943] futex(0xc000044950, FUTEX_WAIT_PRIVATE, 0, NULL unfinished ... 32271 [00000000004623bd] ... nanosleep resumedNULL) 0 0.000112 32271 [0000000000462943] futex(0x5b1bd8, FUTEX_WAIT_PRIVATE, 0, {tv_sec60, tv_nsec0} unfinished ... 32270 [0000000000462b60] ... epoll_pwait resumed[{EPOLLIN|EPOLLOUT, {u322087155184, u64140464697603568}}], 128, -1, NULL, 0) 1 8.305983 32270 [0000000000462943] futex(0x5b1bd8, FUTEX_WAKE_PRIVATE, 1 unfinished ... 32271 [0000000000462943] ... futex resumed) 0 8.305878 32270 [0000000000462943] ... futex resumed) 1 0.000035 32271 [0000000000462aa7] sched_yield( unfinished ... 32270 [000000000047f01b] read(4, unfinished ... 32271 [0000000000462aa7] ... sched_yield resumed) 0 0.000015 # 接收到来自客户端的数据 32270 [000000000047f01b] ... read resumedhello world\r\n, 1024) 13 0.000015 32271 [0000000000462943] futex(0x5b1ad8, FUTEX_WAKE_PRIVATE, 1) 0 0.000021 32271 [00000000004623bd] nanosleep({tv_sec0, tv_nsec20000}, unfinished ... 32270 [000000000047f01b] write(1, Received message: hello world\r\n\n, 32) 32 0.000025 # 服务端返回给客户端的数据 32270 [000000000047f01b] write(4, Hello, client!, 14 unfinished ... 32271 [00000000004623bd] ... nanosleep resumedNULL) 0 0.000092 32271 [00000000004623bd] nanosleep({tv_sec0, tv_nsec20000}, unfinished ... 32270 [000000000047f01b] ... write resumed) 14 0.000040 32270 [0000000000462b38] epoll_ctl(5, EPOLL_CTL_DEL, 4, 0xc00004ee3c unfinished ... 32271 [00000000004623bd] ... nanosleep resumedNULL) 0 0.000092 32270 [0000000000462b38] ... epoll_ctl resumed) 0 0.000067 32271 [00000000004623bd] nanosleep({tv_sec0, tv_nsec20000}, unfinished ... 32270 [000000000047f01b] close(4) 0 0.000033 32270 [0000000000462b60] epoll_pwait(5, [], 128, 0, NULL, 824634044416) 0 0.000017 32271 [00000000004623bd] ... nanosleep resumedNULL) 0 0.000101 32270 [0000000000462b60] epoll_pwait(5, unfinished ... 32271 [0000000000462943] futex(0x5b1bd8, FUTEX_WAIT_PRIVATE, 0, {tv_sec60, tv_nsec0}) -1 ETIMEDOUT (Connection timed out) 60.000106 32271 [00000000004623bd] nanosleep({tv_sec0, tv_nsec20000}, NULL) 0 0.000116 32271 [0000000000462943] futex(0x5b1bd8, FUTEX_WAIT_PRIVATE, 0, {tv_sec60, tv_nsec0}) -1 ETIMEDOUT (Connection timed out) 60.000107 32271 [00000000004623bd] nanosleep({tv_sec0, tv_nsec20000}, NULL) 0 0.000119strace 命令是 Linux 系统下的一个系统调用跟踪工具其主要作用是打印出程序执行时调用的所有系统调用以及相应的返回值。 2、分析 main 编译的可执行二进制文件 使用 ldd 查看二进制文件的动态链接调用库。 [yxhdev01 demo]$ ldd mainlinux-vdso.so.1 (0x00007ffd761d2000)libpthread.so.0 /lib64/libpthread.so.0 (0x00007f6cb5857000)# libc.so 库的主要作用是为开发者提供一些常用的、通用的基础函数例如字符串处理、文件操作、进程管理、网络通信等同时也提供了一些系统调用的封装接口。libc.so.6 /lib64/libc.so.6 (0x00007f6cb5489000)/lib64/ld-linux-x86-64.so.2 (0x00007f6cb5a73000)ldd 命令是 Linux 系统下的一个动态链接库依赖检查工具用于显示可执行程序或共享库文件所依赖的动态链接库列表。 分析 libc.so 动态链接库 [yxhdev01 demo]$ nm /lib64/libc.so.6 | grep read 000000000010c550 W pthread_setcancelstate 000000000010c580 T pthread_setcanceltype 000000000010c430 T pthread_setschedparam 000000000013e6c0 t __pthread_unwind # 读函数 00000000000ef990 W read 00000000000ef990 W __read 00000000000fe9a0 W readahead 00000000000fe9a0 t __readahead 0000000000033180 t read_alias_file[yxhdev01 demo]$ nm /lib64/libc.so.6 | grep write 00000000000f5510 T pwritev 00000000000f5510 T pwritev64 # 写函数 00000000000ef9f0 W write 00000000000ef9f0 W __write 0000000000100250 t write_gmon 00000000000ef9f9 t __write_nocancel 00000000001009a0 t __write_profiling 000000000012f440 t writetcpnm 是一个 Linux 系统下的二进制文件分析工具用于查看目标文件或者可执行文件的符号表信息以及相关的重定位信息等。 除了 read、write 还有 accept、sendto、recvfrom、setsockopt、getsockopt、epoll 等函数。 总结 唯一不变的是变化新技术层出不穷。对于我们技术人来说不断学习新的技术是永无止境的时间长了会陷入疲惫不堪。我们只有在不断变化中 “寻找不变化的东西”通过掌握本质的东西来以不变来应万变。这篇文章以 Go 语言为例来逐步的从应用层到系统层的跟踪剖析挖掘网络通信的本质深入了解 Socket 通信的底层逻辑。希望大家可以以本文中的 Go 语言为例举一反三。如果有什么问题可以评论留言。 欢迎关注、分享、点赞、收藏、在看我是微信公众号「码农先森」作者。
http://www.ho-use.cn/article/10816225.html

相关文章:

  • 外贸网站搭建服务商给传销做网站
  • 好的手机网站国内搜索引擎
  • 网站营销策划公司dw制作wap网站怎么做
  • 2017年做那个网站致富做网站编辑累吗
  • 为什么网站建设价格不一徐州专业网站制作公司
  • 餐饮网站源码百度推广费用多少
  • 个人可以备案网站的内容海外推广解决方案
  • 静态网站建设规划wordpress免费的吗
  • 微网站怎么注册账号青海省建设厅网站
  • 福州企业建站程序如何做网站的优化和推广
  • 网站开发方案论文wordpress 分页无效
  • 拖拽建站 wordpressfifa世界排名最新
  • html下载网站模板旅游新闻热点
  • 做网站公司流程蓝色大气网站模板
  • 网站开发 问题 关键技术为什么 要建设网站
  • 成都网站建设公司多少钱叫别人做网站需要注意什么
  • jsp网站建设项目实战wordpress最简洁主题
  • 合肥专业网站优化哪家好wordpress 欢迎插件
  • 西安网站建设推荐q479185700上墙免费空间最大的网盘
  • 网站大多用源码来做吗有免费的接码平台吗
  • 静态手机网站怎么开通微信公众号
  • 伦教网站建设骨科医院网站模板
  • 网站建设内部下单流程图网站开发及流行框架
  • 珠海商城网站wordpress标签加入文章列表
  • 做网站虚拟主机多少钱申请微信公众号
  • 网站图片上传功能怎么做的网站负面信息
  • 给别人做网站用做假酒验证将一个网站拉入黑名单怎么做
  • 网站重新建设的申请怎么建立自己网站
  • 搜索推广网站哪家做的最好凡科网做网站能达到什么效果
  • 网站设计 联系网站空间知识