zoukankan      html  css  js  c++  java
  • socket、bind、connect的学习

     下面是一个工作尽力
    1:这个bug从描述上(连接服务器失败),第一目光是放在connect上面的。在对TCP整套建立流程机制不熟悉的情况下,首先是想着查看我们的connect哪里不对或是错了。这样,如下图,在查看原接口之后,感觉没有任何问题--原因:我需要的参数都传了。为什么还是链接不了?
    2:再看下FAE提供的log以及他截图的地方。然后将目光锁定了在了log2177行的上面一行2176。只关注出错的地方的附近!
            好家伙,直接给带偏。这一行并没有看懂什么,继续向上查看有个dns_servers[0];显然dns_server 的值为0,是有问题的。结合lwip的源码可以知道,使我们没有给他赋值造成的。走到这边又卡住了,因为源码向下更深层次又是不懂或是看不到。但是到这一步面临的另一个问题就是dns机制不懂。属于进退两难。
    3:在上面之后,花了点时间将DNS 原理机制看了些。大致知道dns_server 是对端server发过来的。于是 开始考虑是因为网络不通,根本就没有互通过。那么当然connect失败了。
    在这里,有犯了个错误,想到或是猜想是网络不通,并没有想着方法去验证。或是根本就不知道用什么方法验证。
     
    4:接下来,便是厚着脸皮去请教了。“你觉得是网络不通,那就去抓包验证分析是不是网络不通,我们的设备正好可以抓包”。下面是抓包分析。其实啊,一开始是看不懂这些包来来回回的干什么的。但是有一点确认了,DNS是通的。一来一回两个IP。互通了,也拿到对端的ip了。 那么有为什么最后没有通呢? 根深蒂固的思想是,网络是好的,ip又有了,怎么可能不通呢?又为啥dns_server 是0 呢?
     
    5:这个时候进过老大提点开始看整个TCP连接过程(算是补习了!!!!!!)
            A:首先我们客户端是怎么与服务端连接的?B:这几步是否真的理解了?
            A:我们链接服务端,对于一个使用者来说(虽然我现在不是使用者啊)分为以下几个步骤:lwip_socket/socket   →  lwip_bind/bind  → lwip_connect/connect  
                    虽然大学里面对着几个流程 是滚瓜烂熟的,但是真正的含义确实。。。。。
                   ①: 首先来分析lwip_socket。
                    以下网上摘要:现在看到这些有些眉目了。首先第一个参数是选择使用的协议是ipv4还是ipv6;第二个参数使用的是TCP 还是UDP的选择。第三个 公司代码使用的是0.
                    至于源码这一步,就不做详解,我的理解解释创建了一个结构体或者专业点来说创建了一个pbc,提供后面数据的保存使用
                    ②:lwip_bind  原型没有找到参数 详解的直接上图;第一个参数就是我们socket  返回的fd;第二个就是就是bind的重点了,至于第三个参数意义很简单就是第二个结构体的大小。
    lwip_bind(a,b,c) 用来将之前创建的 socket 和本地的 IP_Addr / Port_num 绑定在一起。
                    至此再分析之前抓包好像依旧没什么变化。但是看到TCP只有我们给他们的发包。大师细心的会发现,发往对面的port是0 ?????网络中没有0端口(这句还是从老大口中得来的。好吧我是一个小白)
                    ③:为什么会没有port口?我们不是bind定了嘛?这是之前最郁闷的事,好吧完全不清楚,原来bind绑定的是本地ip和端口。(写到这里隐隐约约感觉以前看书是不是着重挤了一下这个地方?)
                            所以这里的原因着重 分析下,好吧 分析不出来,我们继续去分析。对比修改钱与修改后的代码:很轻易的发现。之前的代码是没有绑定任何东西的。只要IP,所以你看到的是上面那副图,ip是ok的但是port是没有的。至于 这个是怎么知道的? 一眼看出来的?不!菜鸡表示花了很长时间才发现他是有问题的。而且这里要和bind进行区别。 bind是绑定的自己的port和ip。  connect是对端的。
                ④:下面使我们修改完之后的抓包:
                  ⑤:前面看到了bind之后成功的模样。 现在看看 ,不bind, 但是connect是对的  ,抓包是什么现象。
    首先不管其他的,这个三次握手或者说是挥手那么明显的SYN,ACK一眼就看到了。貌似是一直进行这样的话操作。
        6:到这里我们看到了的是根据报文来分析,错误的原因。但是对于log中出现的问题,还没有解决。一开始看log,被带偏的就是dns_server.他与我们修改的两处bind 与connect有什么关联。dns的机制到底什么?  我们看到的(报文中)很清晰的看到的是dns收发正常。那么这个dns_server 为什么是0?
                首先要明白一点,一部手机可能有很多个IP。至少在公司的 设别上可以同事申请8路ip地址。(当然都是私有ip)清楚这个后面就逐渐知道怎么回事了。(也是老大说的。。。。。)
     
     
  • 相关阅读:
    ABP 数据库 -- ABP&EF中的多表、关联查询
    C# List集合基础操作
    C# ABP 允许跨域请求
    异或运算、与运算、或运算 运用在 多项选择题
    C# ABP 配置连接数据库&创建表
    C# ABP WebApi与Swagger UI的集成
    C# 深入了解泛型
    8、SpringBoot+Mybatis整合------参数取值方式
    7、SpringBoot+Mybatis整合------PageHelper简单分页
    6、SpringBoot+Mybatis整合------参数传递
  • 原文地址:https://www.cnblogs.com/Jlord/p/15157147.html
Copyright © 2011-2022 走看看