• socket计划——一个简单的例子


    从一个简单易用TCP样品开始socket计划,的基本过程例如下列:

    server                                                  client

    +++++++                                          ++++++++

    创建socket                                          创建socket

    +++++++                                          ++++++++

          |                                                         |

          |                                                         |

          |                                                         |

    +++++++                                          ++++++++

    地址赋值(                                           地址赋值(

    自己的地址)                                        server地址)

    +++++++                                          ++++++++

          |                                                         |

          |                                                         |

          |                                                         |

    ++++++++                                              |

    用bind绑定                                                |

    socket和地址                                             |

    ++++++++                                              |

          |                                                         |

          |                                                         |

          |                                                         |

    +++++++                                                 |

    listen                                                         |

    +++++++                                                  |

          |                                                    ++++++++++

          |   <------------------------------          connect server         

          |                                                    ++++++++++

    +++++++                                                  |

    accept                                                        |

    +++++++                                                  |

          |                                                           |

          |                                                    +++++++++

          |                                                     recv 和send

          |                                                     进行数据处理

          |                                                     +++++++++

    +++++++++                                                |

    用accept得到                                                 |

    的socket进行                                                 |

    recv 和 send                                                 |

    +++++++++                                                |

          |                                                             |

          |                                                             |

          |                                                             |

    +++++++++                                        +++++++++

    close socket                                         close socket

    +++++++++                                        +++++++++

    依据以上步骤,server端的代码为

    client代码为:

    如今一个简单的使用tcp的socket通信的样例已经完毕了。这里有几个须要说明的问题

    1)头文件:

    sys/socket.h   包括了socket相关的函数,如socket。send 和recv, 以及struct sockaddr等

    netinet/in.h    包括了地址结构。如struct sockaddr_in

    errno.h           包括了errno 和 EINTR

    syslog.h         包括了syslog相关的信息,其打印结果在/var/log/messages里面

    2)socket地址

    对于IPv4来说,其地址用的是struct sockaddr_in,详细结构例如以下

    
     


    当中sin_len我们一般不关注。也不填(仅仅有在使用routing socket的时候才用到,被内核用来处理各种协议簇的地址结构)。
    bind, connect, sendto, 和 sendmsg会把socket地址从程序传递给内核; 而accept, recvfrom, recvmsg, getpeername, 和 getsockname会把地址从内核传递给程序。由于不同协议簇的地址结构是不一样的。所以必需要有一个通用的指针来传递地址。对于ANSI C来说我们一般使用void *,可是socket产生早于ANSI C。所以也就没有使用这个机制,而是使用一个通用的地址结构struct sockaddr来处理的


    IPv6的socket地址为struct sockaddr_in6



    对于sockaddr-in6来说。我们不能用通用的地址struct sockaddr来存储了,而是产用新的通用地址结构struct sockaddr_storage,这个结构足够大能够存储不论什么系统支持的地址。

    几种常见的地址结构

    3) 相关函数的的length
    对于从程序传地址给内核的函数(如connect),其长度是一个整型值。告诉内核要copy的地址长度。


    对于从内核传递给程序的函数(如accpt)。其长度是一个整型指针。是一个value-result參数。

    有两个目的:一告诉内核地址结构的长度。让内核在copy的时候不要超过这个长度;二返回内核真正copy的长度。

    4)字节序
    socket相关的函数都是使用网络字节序

    5)地址转换函数
    inet_aton, inet_ntoa, and inet_addr把IPv4字符串地址转为32位的网络字节序地址
    inet_ptonand inet_ntop能够转换IPv4和IPv6的地址


    6)listen中的backlog
    要知道这个值的含义先用说一下。对于一个listen的socket,有两个队列:一个是incomplete connection队列(只收到SYN)。一个是complete connection队列(三次握手完毕)。accept函数就是在complete connection队列中取一个socket。

    backlog就是指队列的个数。但不行的是各个地方都没有明白定义这个值,没有说明到底代表了哪个队列,或是两个队列之和。一般来说能够
    同一时候处理的连接数是backlog的1.5倍,非常多地方都用5.

    7) getsockname 和 getpeername
    这两个函数能够与socket关联的地址,getsockname 和 getpeername分别得到自己和对端的地址

    
     



















  • 相关阅读:
    被放弃的概率权,机器下围棋不理会沉没成本
    百位性感女明星三围大曝光,体型测试设计
    斯坦福大学机器学习,EM算法求解高斯混合模型
    Javascript图片预加载详解
    使用马尔可夫模型自动生成文章
    18种女粉引流方法、效果、评估
    既然认准了这条路,就不必打听要走多久!
    新媒体运营10个大坑,思维导图版
    谷歌发布"自动机器学习"技术 AI可自我创造
    Centos7下PHP的卸载与安装nginx
  • 原文地址:https://www.cnblogs.com/mengfanrong/p/4570809.html
Copyright © 2020-2023  润新知