高级编程之网络编程(二)

来源:互联网 发布:唐安琪烧伤真相知乎 编辑:程序博客网 时间:2024/05/16 19:31


 

常用网络测试工具:

1、telnet
 默认的redhat 企业版本 和 win 8 以上系统不再支持该程序。

 早期用于远程管理网络设备的系统命令。

 格式: telnet  ip地址  端口
 eg:    telnet 192.168.0.1  8888
 注意:断开可以不写,默认链接的是23 号端口。


2、netstat   测试网路端口的使用情况。

 netstat -lnp |grep 8888===>查看所有链接中端口是8888 的程序。

 netstat -n  ==》列出当前系统中的网络程序。
 netstat -n -t  ===>只列出TCP协议的网络程序。
 netstat -n -u  ===>只列出UDP协议的网络程序
 netstat -n -i  ===>列出当前物理接口上的数据流量

 

3、ping
  ping ip地址
  ping  域名
   
 
4、arp  地址解析命令  ===》列出当前系统中所有链接本机的主机ip+mac信息

 arp -a  ==>列出所有win链接信息
 arp -an ===> 列出所有linux的链接信息

 arp -d   ===>win 全部删除
     linux  arp -d ip地址

  


5、抓包工具
  5.1  wireshark  ===>windows  linux
   
    rpm -ivh wireshark-* libsmi-0.4.8-4.el6.i686.rpm


    过滤规则:
    1、根据ip地址过滤: ip.src == x.x.x.x
          ip.dst == x.x.x.x

    2、根据端口过滤:   tcp.srcport == xx;
          tcp.dstport == xx;

         udp.srcport == xx;
         udp.dstport == xx;
   3、根据协议过滤:
       tcp  udp  icmp  ....

   4、任意组合以上条件进行过滤

      与关系: and

      或关系: or
练习:同桌之间互相ping对方主机,并抓包查看是否有该数据包存在。
 


  5.2  tcpdump  ===>linux  ===>默认安装

    1、tcpdump  -n   ===>在默认接口上抓包
    2、tcpdump -n -i eth0  ===>在指定的eth0接口上抓包
    3、tcpdump -n -p tcp   ===>根据TCP协议抓包
    4、tcpdump -n src xx.xx.xx.xx ===》根据源地址抓包
                dst xx.xx.xx.xx
    5、tcpdump -n port xx    ===>根据端口来抓包
       -n src port xx
         -n dst port xx
      -n tcp port xx
      -n udp port xx
    6、tcpdump -n -x src xx.xx.xx.xx
        ===》将数据包中源地址是 xx.xx.xx.xx 的
        数据内容详情显示到屏幕
    7、混合抓包
      与关系: and
     或关系:  or


练习:
 同桌之间启动TCP程序,用抓包工具抓取三次握手的过程。
 并查看数据的来源和去向,同时要分析代码找出服务器
 和客户端代码中建立三次握手的函数是哪个?

 客户端: connect()
 服务器: listen()


 四次挥手

================================================================
UDP 编程

服务器端:socket() ==>bind()==>recvfrom()/sendto()==>close()
客户端:  socket()===>sendto()/recvfrom()===>close()

0、socket()函数的参数二调整为:SOCK_DGRAM    ///用户数据报套接字


1、ssize_t sendto(int sockfd, const void *buf, size_t len, int flags,
              const struct sockaddr *dest_addr, socklen_t addrlen);
功能:从buff中获取len长度的数据,用sockfd套接字以flag方式发送数据
   给地址是dest_addr的主机。
参数:sockfd 用来发送数据的本地套接子id
   buff 要发送的数据
   len  要发送的数据长度
   flag  发送方式 0  阻塞发送
   dest_addr  目标主机的地址信息
   addrlen 目标主机地址的长度。
返回值:成功 返回小于等于len的数据长度。
   失败  -1;


2、 ssize_t recvfrom(int sockfd, void *buf, size_t len, int flags,
                   struct sockaddr *src_addr, socklen_t *addrlen);
功能:从sockfd套接字中获取len长度的数据到buff内存中。
  数据的来源是src_addr 的地址。

参数:sockfd 要获取数据的套接字id
   buff  要存储数据的内存
   len  要获取的数据长度
   flags 获取数据的方式
   src_addr 数据来源,如果是NULL 表示不关心来源
      如果要获取源信息,需要事先定义变量
  addrlen 源地址长度。
返回值:成功 小于等于len的数据长度
  失败  -1;


练习:
1、通过以上函数学习,完成两台主机之间的简单UDP聊天程序。
2、继续完善以上程序,可以完成两台主机之间的文件传送。
3、继续完善,可以完成多人同时在线的UDP聊天室。

UDP聊天室:
 server 端:
   注册功能,允许任意新用户以IP+port的方式注册一个
   账户。
   广播功能:所有用户的上线,下线要通知在线用户。
   消息转发功能:在线用户的消息要转发给其他用户。
 client端:
   上线注册,通知服务器上线并注册
   接受消息,服务器的消息要用独立的进程来接受显示
   下线通知,客户端离开时候要通知服务器。

 

 


 

0 0
原创粉丝点击