Socket 网络编程

1.TCP/IP、UDP

TCP/IP(Transmission Control Protocol/Internet Protocol)即传输控制协议/网间协议,是一个工业标准的协议集,它是为广域网(WANs)设计的。 
UDP(User Data Protocol,用户数据报协议)是与TCP相对应的协议。它是属于TCP/IP协议族中的一种。 
下面这张图,表明了这些协议的关系,如图TCP/IP协议族包括运输层、网络层、链路层: 
协议关系

2.Socket

在图1中,我们没有看到Socket的影子,那么它到底在哪里呢?还是用图来说话,一目了然。 
这里写图片描述

Socket是应用层与TCP/IP协议族通信的中间软件抽象层,它是一组接口。在设计模式中,Socket其实就是一个门面模式,它把复杂的TCP/IP协议族隐藏在Socket接口后面,对用户来说,一组简单的接口就是全部,让Socket去组织数据,以符合指定的协议。

3.使用socket

前人已经给我们做了好多的事了,网络间的通信也就简单了许多,但毕竟还是有挺多工作要做的。以前听到Socket编程,觉得它是比较高深的编程知识,但是只要弄清Socket编程的工作原理,神秘的面纱也就揭开了。 
这里写图片描述

一个生活中的场景。你要打电话给一个朋友,先拨号,朋友听到电话铃声后提起电话,这时你和你的朋友就建立起了连接,就可以讲话了。等交流结束,挂断电话结束此次交谈。生活中的场景就解释了这工作原理,也许TCP/IP协议族就是诞生于生活中,这也不一定。

4.代码示例

<code class="language-object c hljs  has-numbering" style="display: block; padding: 0px; background-color: transparent; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-top-left-radius: 0px; border-top-right-radius: 0px; border-bottom-right-radius: 0px; border-bottom-left-radius: 0px; word-wrap: normal; background-position: initial initial; background-repeat: initial initial;">    <span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">#import "ViewController.h"</span>
    <span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">#import <sys/socket.h></span>
    <span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">#import <netinet/in.h></span>
    <span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">#import <arpa/inet.h></span>

    @interface ViewController ()

    <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">// 客户端 socket</span>
    @property (nonatomic, assign) <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">int</span> clientSocket;

    @property (nonatomic, weak) IBOutlet UIWebView *myWebView;

    @end

    @implementation ViewController
    <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">/**
     ======= 请求头 =======
     1> 请求行
        GET / HTTP/1.1

        GET        表示从服务器"拿"数据
        /          访问服务器的根目录
        HTTP/1.1   HTTP的协议以及版本

     2> 请求头
        Host:              要访问的主机
        User-Agent:        用户代理,告诉服务器客户端的类型
        Accept:            告诉服务器客户端支持的数据格式
        Accept-Language:   告诉服务器客户端支持的语言
        Accept-Encoding:   告诉服务器客户端支持的解压缩类型

     HTTP请求本身的格式,是字符串格式的,最末一行,以 \n\n 结束,表示所有请求的内容发送完毕,服务器可以处理!

     提示:key 值是 HTTP 协议定义的,不能随意更改!

    ==========响应 ===========
     1> 状态行

        HTTP/1.1 200 OK

     HTTP/1.1   HTTP的协议以及版本
        200     状态码(404)
        2XX     成功
        4XX     客户端错误
        5XX     服务器错误

     2> 响应头,服务器告诉客户端的一些信息
     提示:响应的信息,通常在开发“下载”功能时,才会使用,平时用不着

     Date:      响应日期
     Server:    服务器的信息

     // 文件长度
     Content-Length: 24

     3> 数据实体,从服务器返回的二进制数据!
     println("hello world!");

     */</span>
    - (<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">void</span>)viewDidLoad
    {
        [super viewDidLoad];

        <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">// http 端口是 80</span>
        <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">if</span> ([self connectToHost:@<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"61.135.169.125"</span> port:<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">80</span>])
        {
            NSLog(@<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"连接成功"</span>);
        }

        <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">// 发送消息给 web 服务器</span>
        <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">// 建立请求字符串</span>
        NSString *request = @<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"GET / HTTP/1.1\n"</span>
        <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"Host: www.baidu.com\n"</span>
        <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"User-Agent: iPhone AppleWebKit\n\n"</span>;

        <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">// 对结果的处理</span>
        NSString *result = [self sendAndRecv:request];
        <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">// 找 \r\n 的出现的位置</span>
        NSRange range = [result rangeOfString:@<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"\r\n\r\n"</span>];

        <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">// 判断是否找到</span>
        <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">if</span> (range.location == NSNotFound)
        {
            NSLog(@<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"html 错误"</span>);
            <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">return</span>;
        }

        NSString *html = [result substringFromIndex:range.location];

        [self.myWebView loadHTMLString:html baseURL:[NSURL URLWithString:@<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"http://www.baidu.com"</span>]];
    }

    - (BOOL)connectToHost:(NSString *)host port:(<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">int</span>)port
    {
        <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">// 1. socket</span>
        <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">/**
         参数

         domain:    协议域,AF_INET
         type:      Socket 类型,SOCK_STREAM(流 TCP)/SOCK_DGRAM(报文,提示:
                    在有些公司的程序员给服务器发送数据,会说:发送报文)
         protocol:  IPPROTO_TCP,提示:如果输入0,会根据第二个参数,自动选择协议

         返回值
         socket     如果>0,就是正确的
         */</span>
        self.clientSocket = socket(AF_INET, SOCK_STREAM, <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span>);

        <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">// 2. 连接到另外一台计算机</span>
        <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">/**
         参数
         1> 客户端socket
         2> 指向数据结构sockaddr的指针,其中包括目的端口和IP地址
            C 语言中没有对象,实现都是通过结构体来实现的
         3> 结构体数据长度
         返回值
            0 成功/其他 错误代号,很多C语言的程序都会如此设计,原因:成功只有一个,失败会有很多种!
            C 语言中,通常是非零即真
         */</span>

        <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">struct</span> sockaddr_in serverAddress;

        <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">// 1> 地址 inet_addr 可以将 ip 地址转换成整数</span>
        <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">// 提示:在网络上的使用的很多数据,需要做字节翻转</span>
        serverAddress.sin_addr.s_addr = inet_addr(host.UTF8String);

        <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">// 2> 端口 htons 可以将端口转换成整数</span>
        <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">// 端口号同样要做字节翻转</span>
        serverAddress.sin_port = htons(port);

        <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">// 3> 协议</span>
        serverAddress.sin_family = AF_INET;

        <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">// 在 C 语言中,通常传递结构体的指针同时,会传递结构体的尺寸</span>
        <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">int</span> result = connect(self.clientSocket, (<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">const</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">struct</span> sockaddr *)&serverAddress, <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">sizeof</span>(serverAddress));

        <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">return</span> (result == <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span>);
    }

    <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">/**
     *  发送&接收消息
     */</span>
    - (NSString *)sendAndRecv:(NSString *)msg {
        <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">// 3. 发送数据给服务器</span>
        <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">/**
         参数
         1> 客户端socket
         2> 发送内容地址
         3> 发送内容长度
         4> 发送方式标志,一般为0
         返回值
         如果成功,则返回发送的字节数,失败则返回SOCKET_ERROR

         提示:在很多C语言框架中,会将基本数据类型进行封装,使用的时候,便于后续框架的调整
         */</span>

        <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">// 在 UTF8 编码中,一个中文对应 3 个字节</span>
        ssize_t sendLen = send(self.clientSocket, msg.UTF8String, <span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">strlen</span>(msg.UTF8String), <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span>);

        <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">// 4. 从服务器接收数据</span>

        uint8_t buffer[<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1024</span>];

        <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">// 1> 定义一个可变的二进制数据,方便拼劲</span>
        NSMutableData *dataM = [NSMutableData data];

        <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">// 服务器返回的回车计数</span>
        <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">int</span> count = <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span>;

        <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">while</span> (count == <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span>)
        {
            <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">// 2> 接收数据</span>
            ssize_t recvLen = recv(self.clientSocket, buffer, <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">sizeof</span>(buffer), <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span>);
            [dataM appendBytes:buffer length:recvLen];

            <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">// 通过跟踪,\r\n\r\n 需要继续等待,\r\n 表示传输结束</span>
            <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">// 取末尾一个字节</span>
            uint8_t lastByte = buffer[recvLen - <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span>];

            <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">// 取倒数第三个字节</span>
            uint8_t preLastByte = buffer[recvLen - <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">3</span>];

            <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">if</span> (lastByte == <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">'\n'</span> && preLastByte != <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">'\n'</span>) {
                count++;
            }
        }

        <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">return</span> [[NSString alloc] initWithData:dataM encoding:NSUTF8StringEncoding];
    }

    <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">/**
     *  断开连接
     */</span>
    - (<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">void</span>)disconnect {
        <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">// 5. 关闭连接</span>
        close(self.clientSocket);
    }

@end</code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; background-color: rgb(238, 238, 238); top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right;"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li><li style="box-sizing: border-box; padding: 0px 5px;">7</li><li style="box-sizing: border-box; padding: 0px 5px;">8</li><li style="box-sizing: border-box; padding: 0px 5px;">9</li><li style="box-sizing: border-box; padding: 0px 5px;">10</li><li style="box-sizing: border-box; padding: 0px 5px;">11</li><li style="box-sizing: border-box; padding: 0px 5px;">12</li><li style="box-sizing: border-box; padding: 0px 5px;">13</li><li style="box-sizing: border-box; padding: 0px 5px;">14</li><li style="box-sizing: border-box; padding: 0px 5px;">15</li><li style="box-sizing: border-box; padding: 0px 5px;">16</li><li style="box-sizing: border-box; padding: 0px 5px;">17</li><li style="box-sizing: border-box; padding: 0px 5px;">18</li><li style="box-sizing: border-box; padding: 0px 5px;">19</li><li style="box-sizing: border-box; padding: 0px 5px;">20</li><li style="box-sizing: border-box; padding: 0px 5px;">21</li><li style="box-sizing: border-box; padding: 0px 5px;">22</li><li style="box-sizing: border-box; padding: 0px 5px;">23</li><li style="box-sizing: border-box; padding: 0px 5px;">24</li><li style="box-sizing: border-box; padding: 0px 5px;">25</li><li style="box-sizing: border-box; padding: 0px 5px;">26</li><li style="box-sizing: border-box; padding: 0px 5px;">27</li><li style="box-sizing: border-box; padding: 0px 5px;">28</li><li style="box-sizing: border-box; padding: 0px 5px;">29</li><li style="box-sizing: border-box; padding: 0px 5px;">30</li><li style="box-sizing: border-box; padding: 0px 5px;">31</li><li style="box-sizing: border-box; padding: 0px 5px;">32</li><li style="box-sizing: border-box; padding: 0px 5px;">33</li><li style="box-sizing: border-box; padding: 0px 5px;">34</li><li style="box-sizing: border-box; padding: 0px 5px;">35</li><li style="box-sizing: border-box; padding: 0px 5px;">36</li><li style="box-sizing: border-box; padding: 0px 5px;">37</li><li style="box-sizing: border-box; padding: 0px 5px;">38</li><li style="box-sizing: border-box; padding: 0px 5px;">39</li><li style="box-sizing: border-box; padding: 0px 5px;">40</li><li style="box-sizing: border-box; padding: 0px 5px;">41</li><li style="box-sizing: border-box; padding: 0px 5px;">42</li><li style="box-sizing: border-box; padding: 0px 5px;">43</li><li style="box-sizing: border-box; padding: 0px 5px;">44</li><li style="box-sizing: border-box; padding: 0px 5px;">45</li><li style="box-sizing: border-box; padding: 0px 5px;">46</li><li style="box-sizing: border-box; padding: 0px 5px;">47</li><li style="box-sizing: border-box; padding: 0px 5px;">48</li><li style="box-sizing: border-box; padding: 0px 5px;">49</li><li style="box-sizing: border-box; padding: 0px 5px;">50</li><li style="box-sizing: border-box; padding: 0px 5px;">51</li><li style="box-sizing: border-box; padding: 0px 5px;">52</li><li style="box-sizing: border-box; padding: 0px 5px;">53</li><li style="box-sizing: border-box; padding: 0px 5px;">54</li><li style="box-sizing: border-box; padding: 0px 5px;">55</li><li style="box-sizing: border-box; padding: 0px 5px;">56</li><li style="box-sizing: border-box; padding: 0px 5px;">57</li><li style="box-sizing: border-box; padding: 0px 5px;">58</li><li style="box-sizing: border-box; padding: 0px 5px;">59</li><li style="box-sizing: border-box; padding: 0px 5px;">60</li><li style="box-sizing: border-box; padding: 0px 5px;">61</li><li style="box-sizing: border-box; padding: 0px 5px;">62</li><li style="box-sizing: border-box; padding: 0px 5px;">63</li><li style="box-sizing: border-box; padding: 0px 5px;">64</li><li style="box-sizing: border-box; padding: 0px 5px;">65</li><li style="box-sizing: border-box; padding: 0px 5px;">66</li><li style="box-sizing: border-box; padding: 0px 5px;">67</li><li style="box-sizing: border-box; padding: 0px 5px;">68</li><li style="box-sizing: border-box; padding: 0px 5px;">69</li><li style="box-sizing: border-box; padding: 0px 5px;">70</li><li style="box-sizing: border-box; padding: 0px 5px;">71</li><li style="box-sizing: border-box; padding: 0px 5px;">72</li><li style="box-sizing: border-box; padding: 0px 5px;">73</li><li style="box-sizing: border-box; padding: 0px 5px;">74</li><li style="box-sizing: border-box; padding: 0px 5px;">75</li><li style="box-sizing: border-box; padding: 0px 5px;">76</li><li style="box-sizing: border-box; padding: 0px 5px;">77</li><li style="box-sizing: border-box; padding: 0px 5px;">78</li><li style="box-sizing: border-box; padding: 0px 5px;">79</li><li style="box-sizing: border-box; padding: 0px 5px;">80</li><li style="box-sizing: border-box; padding: 0px 5px;">81</li><li style="box-sizing: border-box; padding: 0px 5px;">82</li><li style="box-sizing: border-box; padding: 0px 5px;">83</li><li style="box-sizing: border-box; padding: 0px 5px;">84</li><li style="box-sizing: border-box; padding: 0px 5px;">85</li><li style="box-sizing: border-box; padding: 0px 5px;">86</li><li style="box-sizing: border-box; padding: 0px 5px;">87</li><li style="box-sizing: border-box; padding: 0px 5px;">88</li><li style="box-sizing: border-box; padding: 0px 5px;">89</li><li style="box-sizing: border-box; padding: 0px 5px;">90</li><li style="box-sizing: border-box; padding: 0px 5px;">91</li><li style="box-sizing: border-box; padding: 0px 5px;">92</li><li style="box-sizing: border-box; padding: 0px 5px;">93</li><li style="box-sizing: border-box; padding: 0px 5px;">94</li><li style="box-sizing: border-box; padding: 0px 5px;">95</li><li style="box-sizing: border-box; padding: 0px 5px;">96</li><li style="box-sizing: border-box; padding: 0px 5px;">97</li><li style="box-sizing: border-box; padding: 0px 5px;">98</li><li style="box-sizing: border-box; padding: 0px 5px;">99</li><li style="box-sizing: border-box; padding: 0px 5px;">100</li><li style="box-sizing: border-box; padding: 0px 5px;">101</li><li style="box-sizing: border-box; padding: 0px 5px;">102</li><li style="box-sizing: border-box; padding: 0px 5px;">103</li><li style="box-sizing: border-box; padding: 0px 5px;">104</li><li style="box-sizing: border-box; padding: 0px 5px;">105</li><li style="box-sizing: border-box; padding: 0px 5px;">106</li><li style="box-sizing: border-box; padding: 0px 5px;">107</li><li style="box-sizing: border-box; padding: 0px 5px;">108</li><li style="box-sizing: border-box; padding: 0px 5px;">109</li><li style="box-sizing: border-box; padding: 0px 5px;">110</li><li style="box-sizing: border-box; padding: 0px 5px;">111</li><li style="box-sizing: border-box; padding: 0px 5px;">112</li><li style="box-sizing: border-box; padding: 0px 5px;">113</li><li style="box-sizing: border-box; padding: 0px 5px;">114</li><li style="box-sizing: border-box; padding: 0px 5px;">115</li><li style="box-sizing: border-box; padding: 0px 5px;">116</li><li style="box-sizing: border-box; padding: 0px 5px;">117</li><li style="box-sizing: border-box; padding: 0px 5px;">118</li><li style="box-sizing: border-box; padding: 0px 5px;">119</li><li style="box-sizing: border-box; padding: 0px 5px;">120</li><li style="box-sizing: border-box; padding: 0px 5px;">121</li><li style="box-sizing: border-box; padding: 0px 5px;">122</li><li style="box-sizing: border-box; padding: 0px 5px;">123</li><li style="box-sizing: border-box; padding: 0px 5px;">124</li><li style="box-sizing: border-box; padding: 0px 5px;">125</li><li style="box-sizing: border-box; padding: 0px 5px;">126</li><li style="box-sizing: border-box; padding: 0px 5px;">127</li><li style="box-sizing: border-box; padding: 0px 5px;">128</li><li style="box-sizing: border-box; padding: 0px 5px;">129</li><li style="box-sizing: border-box; padding: 0px 5px;">130</li><li style="box-sizing: border-box; padding: 0px 5px;">131</li><li style="box-sizing: border-box; padding: 0px 5px;">132</li><li style="box-sizing: border-box; padding: 0px 5px;">133</li><li style="box-sizing: border-box; padding: 0px 5px;">134</li><li style="box-sizing: border-box; padding: 0px 5px;">135</li><li style="box-sizing: border-box; padding: 0px 5px;">136</li><li style="box-sizing: border-box; padding: 0px 5px;">137</li><li style="box-sizing: border-box; padding: 0px 5px;">138</li><li style="box-sizing: border-box; padding: 0px 5px;">139</li><li style="box-sizing: border-box; padding: 0px 5px;">140</li><li style="box-sizing: border-box; padding: 0px 5px;">141</li><li style="box-sizing: border-box; padding: 0px 5px;">142</li><li style="box-sizing: border-box; padding: 0px 5px;">143</li><li style="box-sizing: border-box; padding: 0px 5px;">144</li><li style="box-sizing: border-box; padding: 0px 5px;">145</li><li style="box-sizing: border-box; padding: 0px 5px;">146</li><li style="box-sizing: border-box; padding: 0px 5px;">147</li><li style="box-sizing: border-box; padding: 0px 5px;">148</li><li style="box-sizing: border-box; padding: 0px 5px;">149</li><li style="box-sizing: border-box; padding: 0px 5px;">150</li><li style="box-sizing: border-box; padding: 0px 5px;">151</li><li style="box-sizing: border-box; padding: 0px 5px;">152</li><li style="box-sizing: border-box; padding: 0px 5px;">153</li><li style="box-sizing: border-box; padding: 0px 5px;">154</li><li style="box-sizing: border-box; padding: 0px 5px;">155</li><li style="box-sizing: border-box; padding: 0px 5px;">156</li><li style="box-sizing: border-box; padding: 0px 5px;">157</li><li style="box-sizing: border-box; padding: 0px 5px;">158</li><li style="box-sizing: border-box; padding: 0px 5px;">159</li><li style="box-sizing: border-box; padding: 0px 5px;">160</li><li style="box-sizing: border-box; padding: 0px 5px;">161</li><li style="box-sizing: border-box; padding: 0px 5px;">162</li><li style="box-sizing: border-box; padding: 0px 5px;">163</li><li style="box-sizing: border-box; padding: 0px 5px;">164</li><li style="box-sizing: border-box; padding: 0px 5px;">165</li><li style="box-sizing: border-box; padding: 0px 5px;">166</li><li style="box-sizing: border-box; padding: 0px 5px;">167</li><li style="box-sizing: border-box; padding: 0px 5px;">168</li><li style="box-sizing: border-box; padding: 0px 5px;">169</li><li style="box-sizing: border-box; padding: 0px 5px;">170</li><li style="box-sizing: border-box; padding: 0px 5px;">171</li><li style="box-sizing: border-box; padding: 0px 5px;">172</li><li style="box-sizing: border-box; padding: 0px 5px;">173</li><li style="box-sizing: border-box; padding: 0px 5px;">174</li><li style="box-sizing: border-box; padding: 0px 5px;">175</li><li style="box-sizing: border-box; padding: 0px 5px;">176</li><li style="box-sizing: border-box; padding: 0px 5px;">177</li><li style="box-sizing: border-box; padding: 0px 5px;">178</li><li style="box-sizing: border-box; padding: 0px 5px;">179</li><li style="box-sizing: border-box; padding: 0px 5px;">180</li><li style="box-sizing: border-box; padding: 0px 5px;">181</li><li style="box-sizing: border-box; padding: 0px 5px;">182</li><li style="box-sizing: border-box; padding: 0px 5px;">183</li><li style="box-sizing: border-box; padding: 0px 5px;">184</li><li style="box-sizing: border-box; padding: 0px 5px;">185</li><li style="box-sizing: border-box; padding: 0px 5px;">186</li><li style="box-sizing: border-box; padding: 0px 5px;">187</li><li style="box-sizing: border-box; padding: 0px 5px;">188</li><li style="box-sizing: border-box; padding: 0px 5px;">189</li><li style="box-sizing: border-box; padding: 0px 5px;">190</li><li style="box-sizing: border-box; padding: 0px 5px;">191</li><li style="box-sizing: border-box; padding: 0px 5px;">192</li><li style="box-sizing: border-box; padding: 0px 5px;">193</li><li style="box-sizing: border-box; padding: 0px 5px;">194</li><li style="box-sizing: border-box; padding: 0px 5px;">195</li><li style="box-sizing: border-box; padding: 0px 5px;">196</li><li style="box-sizing: border-box; padding: 0px 5px;">197</li><li style="box-sizing: border-box; padding: 0px 5px;">198</li><li style="box-sizing: border-box; padding: 0px 5px;">199</li></ul>

5. 延伸阅读

1.Linux socket 编程: 
http://www.ibm.com/developerworks/cn/education/linux/l-sock/l-sock.html 
2. 网络编程学习笔记一:Socket编程: 
http://blog.youkuaiyun.com/gneveek/article/details/8699198

1
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值