美文网首页
网络编程之“一切皆socket”

网络编程之“一切皆socket”

作者: 根号一2 | 来源:发表于2019-07-27 15:12 被阅读0次

    1:内网访问:通过内网IP直接访问,例:ping

    ip号

       外网访问:通过域名(ip号)+端口号访问例:http://www.bilibili.com--这就是域名

       补充:TCP在第一次寻路成功之后就会建立一条传输通道,虽然该通道不是实际存在的,但是以后的数据传输默认了一条传输通道,以太网帧格式在ip数据报前加了源地址与目的地址,该地址指的是mac地址实则就是每台电脑的网卡地址,ip地址(32位)在网络环境中唯一标识一台主机,mac地址应该是在硬件中唯一标识一台主机。192.168.0.0是局域网Ip范围。

    NAT映射与打洞机制??

    在通信通道还没建立之初,接受的目的mac地址能得到吗?不能,所以需要通过arp请求获得下一跳的MAC地址(16位)

      2:网络字节序的转换

         大端存储:低地址存高位(网络数据流使用的大端字节序)

         小端存储:低地址存地位(计算机是小端字节序)

       字节序的转换函数:

    3:ip地址转换函数

    [if !supportLists]a.      [endif]点分十进制字符串转网络参数函数:int inet_pton(int af,const char *arc,void *dst),其中af—ip地址族协议,分别是AF_INET(ipv4)or AF_INET6(ipv6);

    Src—传原地址,即点分十进制的字符串

    Dst—传出参数,直接被分装成void *的类型

    [if !supportLists]b.      [endif]网络字节序转点分十进制字符串函数:const char *inet_ntop(int af,const void *src,char *dst,socklen_t  size)

    Src—网络字节序

    Dst—字符串指针的位置

    Size—字符串存储的空间大小

    4:socksddr数据结构

    [if !supportLists]a.      [endif]需要强制性转参类型的函数

    [if !supportLists]b.      [endif]Struct sockaddr_in结构体的内容:

    Sin_port—传端口号(字节序转换)

    Sin_addr—传ip地址(字节序转换)

    5:网络编程=socket编程:二进制+IP+端口通讯的一种模式

    [if !supportLists]a.      [endif]在不同主机之间的通信现采用的均是socket接口,在该接口下提供了很多供应用层使用的接口函数,该接口是传输层提供给应用层调用本层方法的类似于函数的接口。不同的主机进程之间通信,由ip地址(网络层)确定唯一主机的位置,再由进程的端口号(传输层)确认进程的位置。

    [if !supportLists]b.      [endif]Socket必须成对出现,一个在发送端,一个在接受端;socket在使用时必须绑定ip和端口号;在socket在Linux的内核实现比较复杂,,一个文件描述符指向两个文件缓冲区

    [if !supportLists]c.      [endif]

    在网络环境中唯一标识的进程就是一个socket,在使用socket时c语言的头文件必须包含:

    #Include

    #include

    <sys/socket.h>

    [if !supportLists]d.      [endif]socket的使用:

    int socket(int domain, int type, int protocol);

    domain:即协议域,又称为协议族(family)。常用的协议族有,AF_INET、AF_INET6、AF_LOCAL(或称AF_UNIX,Unix域socket)、AF_ROUTE等等。协议族决定了socket的地址类型,在通信中必须采用对应的地址,如AF_INET决定了要用ipv4地址(32位的)与端口号(16位的)的组合、AF_UNIX决定了要用一个绝对路径名作为地址。

    type:指定socket类型。常用的socket类型有,SOCK_STREAM、SOCK_DGRAM、SOCK_RAW、SOCK_PACKET、SOCK_SEQPACKET等等(socket的类型有哪些?)。

    SOCK_STREAM—流式套接字,用到的传输层协议是TCP

    SOCK_DGRAM—数据包套接字,用到的传输层协议是UDP

    SOCK_RAW—原始套接字

    protocol:故名思意,就是指定协议。常用的协议有,IPPROTO_TCP、IPPTOTO_UDP、IPPROTO_SCTP、IPPROTO_TIPC等,它们分别对应TCP传输协议、UDP传输协议、STCP传输协议、TIPC传输协议(这个协议我将会单独开篇讨论!)。

    注意:并不是上面的type和protocol可以随意组合的,如SOCK_STREAM不可以跟IPPROTO_UDP组合。当protocol为0时,会自动选择type类型对应的默认协议。

    补充:在socket()函数创建成功之后,函数会返回一个socket的文件描述符,失败返回-1

    6.

    到底这里面的

    套接字socket是跟接受端的ip、端口号绑定还是跟发送端的端口号绑定?自己理解应该是绑定自己的ip与端口号

    7. 

    8. 服务器调用与客户端建立连接的函数

    9. 客户端调用的建立连接的函数

     Conststruct sockaddr *addr—里面放的是服务器的ip与端口号

    10.C/S模型的流程图

    [endif]

    Socket()

    [if !mso]

    [endif] 

    任何一个socket都需要与ip和端口号绑定才能通信,但是在客户端,没有调用bind()函数操作系统可以自动绑定一个ip与端口号,但是服务器不能自动绑定,因为自动绑定时我们在客户端申请建立连接调用connect()函数时无法得只服务器的ip与端口号,所以服务器的ip与端口号需要自己设置绑定。

    11:服务器代码实例

    相关文章

      网友评论

          本文标题:网络编程之“一切皆socket”

          本文链接:https://www.haomeiwen.com/subject/zdlerctx.html