zoukankan      html  css  js  c++  java
  • 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分别得到自己和对端的地址
    
     



















  • 相关阅读:
    Codeforces 992C(数学)
    Codeforces 990C (思维)
    Codeforces 989C (构造)
    POJ 1511 Invitation Cards(链式前向星,dij,反向建边)
    Codeforces 1335E2 Three Blocks Palindrome (hard version)(暴力)
    POJ 3273 Monthly Expense(二分)
    POJ 2566 Bound Found(尺取前缀和)
    POJ 1321 棋盘问题(dfs)
    HDU 1506 Largest Rectangle in a Histogram(单调栈)
    POJ 2823 Sliding Window(单调队列)
  • 原文地址:https://www.cnblogs.com/zfyouxi/p/4380431.html
Copyright © 2011-2022 走看看