zoukankan      html  css  js  c++  java
  • 用bash做个tcp客户端

     日常做后台服务开发,总免不了要写测试客户端。但是tcp客户端写起来其实还是比较罗嗦的,各种错误返回,各种异常判断。。。。而我们通常并不是要写一个健壮的客户端,我们只是要一个能用的客户端来测试服务端是否正确。
        这里给大家介绍一个简单易用的方法:用bash操作socket!很酷,是不是?

     
        man bash,查找tcp关键字,可以看到这么一段内容:
    1 /dev/tcp/host/port
    2        If host is a valid hostname or Internet address, and port is an integer port number or service  name,  bash attempts to open a TCP connection to the corresponding socket.
        把其中的host和port换成我们要连接的IP和端口,就可以用来建立tcp连接了。如下:
     
    1 exec 3<>/dev/tcp/10.6.221.149/9865
        上面就建立了一个到10.6.221.149:9865的可读可写的socket连接。
        其中3就是指定的连接后的socket fd,由于0、1、2分别被stdin、stdout、stderr占用,所以可用fd最小从3开始。
        ip换成域名其实也是支持的,比如
    1 exec 3<>/dev/tcp/www.xx.com/9865
        注意"<>"前后不要空格,否则会出错。

        发送请求其实很简单,就跟往文件里写数据一样。例如
    1 exec "hello world." >&3
        如果要发HTTP请求,那可以这样:
    1 echo -e "GET /crossdomain.xml HTTP/1.1\r\nHost:www.xx.com\r\n\r\n" >&3
         二进制请求可以这样发:
    1 cat bin_data >&3
        其中bin_data是已经写好的二进制包数据文件。
     
       读取服务器响应跟读文件差不多,可以这样写:
    1 cat <&3
        后台关闭连接以后,cat命令会自动结束。
        如果是读取的二进制内容,可以用hexdump来查看。
    1 hexdump -C -n 31 <&3
        读出来效果如下:

        其中-n是指示hexdump读31个字节就结束。
     
        一个好的编程习惯,建立了连接要记得关闭。
        要关闭上面的socket连接可以这么写:
    1 exec 3>&- # 关闭写,不能再发请求 
    2 exec 3<&- # 关闭读,不能再有返回
        当然,你不关闭其实也不一定有啥大问题,bash脚本执行结束,该连接会自动被关闭。

        下面是我测试用的一个客户端:
    1 #!/bin/sh
    2 exec 3<>/dev/tcp/10.6.221.149/9865
    3 echo "<policy-file-request>" >&3
    4 cat <&3
        瞧,这样的tcp客户端比C语言捣鼓出来的客户端代码少得不是一星半点啊。

        用bash操作udp也差不多的,如法炮制试试吧。
        当然,如果你很能捣鼓,还可以用bash写个服务端试试,捣鼓出来记得把代码分享给我看看。
     
  • 相关阅读:
    faster with MyISAM tables than with InnoDB or NDB tables
    w-BIG TABLE 1-toSMALLtable @-toMEMORY
    Indexing and Hashing
    MEMORY Storage Engine MEMORY Tables TEMPORARY TABLE max_heap_table_size
    controlling the variance of request response times and not just worrying about maximizing queries per second
    Variance
    Population Mean
    12.162s 1805.867s
    situations where MyISAM will be faster than InnoDB
    1920.154s 0.309s 30817
  • 原文地址:https://www.cnblogs.com/feisky/p/2247592.html
Copyright © 2011-2022 走看看