zoukankan      html  css  js  c++  java
  • Linux 网络通信 API详解【转载】

    TCP/IP分层模型

    OSI协议参考模型,它是基于国际标准化组织(ISO)的建议发展起来的,

    它分为7个层次:应用层、表示层、会话层、传输层、网络层、数据链路层及物理层。

    这个7层的协议模型虽然规定得非常细致和完善,但在实际中却得不到广泛的应用,其重要的原因之一就在于它过于复杂。

    但它仍是此后很多协议模型的基础。与此相区别的TCP/IP协议模型将OSI的7层协议模型简化为4层,从而更有利于实现和使用。

     

     

    协议结构:

     

    以太网协议格式

     

    IP协议格式

     

    TCP协议格式

     

    UDP协议格式

     

    TCP/IP的分层模型

    TCP/IP的协议参考模型和OSI协议参考模型的对应关系如下图 :

     

    API函数:

    1.socket

    函数的作用:建立一个新的socket套接字

    函数的原型:int socket(int domain,int type,int protocol)

    函数的参数:domain:表示使用何种地址类型,AF_INET:IPV4;  AF_INET6:IPV6

                type:SOCK_STREAM:TCP面向数据流的

                    SOCK_DGRAM: UDP使用不连续不可信赖的数据包连接

                    SOCK_RAM:提供原始网络协议

                protocol:指定socket传输协议编号,设为0即可

    返 回 值:成功返回socket套接字描述符,失败-1

    头 文 件:#include <sys/socket.h>

    2.bind

    函数的作用:绑定IP地址

    函数的原型:int bind(int sockfd,struct sockaddr * my_addr,int addrlen)

    函数的参数:sockfd:套接字描述符

               my_addr:主机地址

               addrlen:sockaddr的地址长度

                    struct sockaddr

                    {

                        unsigned short int sa_family;

                        char sa_data[14];

                    };

                

                    struct sockaddr_in

                    {

                        unsigned short sin_family;

                        uint16_t sin_port;   端口号

                        struct in_addr sin_addr;   IP地址

                        unsigned char sin_zero[8];

                    };

    头 文 件:#include <sys/types.h>

              #include <sys/socket.h>

    返 回 值:成功0;出错-1

    3.connect

    函数的作用:建立socket连接的通常客户端连接服务器使用

    函数的原型:int connect(int sockfd,struct sockaddr * serv_addr,int addrlen);

    函数的参数:serv_addr:表示要连接的服务器IP地址

                addrlen:struct sockaddr的长度

    返 回 值:成功0;出错-1

    4.listen

    函数的作用:聆听网络,等待连接

    函数的原型:int listen(int sockfd,int backlog)

    函数的参数:sockfd:描述符

                backlog:允许接入的客户端数目

    注意:listen并没有连接,只是设置socket的listen模式而已,真正连接的是accept!

    返 回 值:成功0,出错-1

    5.accept

    函数的作用:接收网络的连接,客户端连接,三次握手

    函数的原型:int accept(int sockfd,struct sockaddr *addr,int *addrlen);

    函数的参数:addr:连接成功填充远端客户机地址

                addrlen:struct sockaddr的长度

    返 回 值:成功返回新的fd,出错-1

    6.send

    函数的作用:经过socket传送数据,向对方发送数据

    函数的原型:int send(int sock_fd,const void * msg,int len,unsigned int flags)

    函数的参数:sock_fd:accept建立起来的socket连接描述符,连接远方的IP地址

                msg:发送的数据

                len:数据长度

                flags:设为0

    返 回 值:成功是实际传递出去的字节数,出错-1

    7.recv

    函数的作用:经过socket接收数据

    函数的原型:int recv(int socket_fd,void *buf,int len,unsigned int flag)

    函数的参数:sock_fd:accept以后的socket套接字描述符

                buf:存放地址

                len:接收数据的最大长度

    返 回 值:成功:接收的字节数,出错:-1

    8.一个例子胜过千言万语:

    union MyUnion
        {
            short value;
            char union_bytes[sizeof(short)];
        } test;
    
        test.value = 0x0102;
        if ((test.union_bytes[0] == 1) && (test.union_bytes[1] == 2))
        {
            printf("Big  endian. 
    ");//网络字节序,大端对齐(高位在前面)
        }
        else if ((test.union_bytes[1] == 1) && (test.union_bytes[0] == 2))
        {
            printf("little  endian. 
    ");//主机字节序,小端对齐
        }
    网络字节序,大端对齐(高位在前面)
    主机字节序,小端对齐

    字节序的转化函数:

    头文件:#include <apra/inet.h>

    从主机发送到网络:

    uint32_t  htonl(uint32_t,hostin32);  //32位数据传送,从主机到网络

    uint16_t  htonl(uint16_t,hostin16);  //16位数据传送,从主机到网络

    从网络到主机:

    uint32_t ntohs(uint32_t netint32);   //32位的数据接收,从网络到主机

    uint16_t ntohs(uint16_t netint16);   //16位的数据接收,从网络到主机

    9.地址格式的转化

    十进制点分形式转化成二进制形式:

    inet_addr()   

    函数的原型:unsigned long int inet_addr(const char *cp);

    返 回 值: 成功则返回对应的二进制的数字,失败-1

    函数的参数:cp:放置如:”192.168.1.100”的点分IP地址

    inet_port()

    函数的原型:int inet_pton(int af,const char * src,void *dst)

    函数的参数:af:AF_INET,AF_INET6

                src:点分的要转化的IP地址

    返 回 值:成功1,格式无效0,出错-1

    inet_ntop()

    函数的作用:二进制地址转换成十进制点分形式

    函数的原型:const char * inet_ntop(int af,const void * src,socket_t size)
    ————————————————
    版权声明:本文为CSDN博主「ZM_iTUDOU」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
    原文链接:https://blog.csdn.net/ky_heart/article/details/53057541

  • 相关阅读:
    文件处理
    集合 字符编码
    3-11作业
    win 10 在vs2017下对mpi的安装以及认识
    java中二维数组的排序
    java中Arrays的用法
    java中随机二维数组中寻找最大值并输出坐标
    用java打印图形
    面向对象object与constructor
    for each in for in 与for of
  • 原文地址:https://www.cnblogs.com/music-liang/p/11905943.html
Copyright © 2011-2022 走看看