• 【linux高级程序设计】(第十三章)Linux Socket网络编程基础 2


    BSD Socket网络编程API

    创建socket对象

    int socket (int __domain, int __type, int __protocol) :成功返回socket文件描述符,失败返回-1.

    参数1:socket对象使用的地址簇或协议簇

           

       常用的有PF_LOCAL(本机通信)、PF_INET(IPv4协议簇)、PF_INET6(IPv6协议簇)

    参数2:socket的类型。共有六种。常见有:面向连接的数据流方式;面向无连接的数据报方式

    参数3:标识采用哪一种协议,0表示默认。

    绑定本地IP地址与端口

    int bind (int __fd, __CONST_SOCKADDR_ARG __addr, socklen_t __len) :成功返回0,失败返回-1

    参数1:用于绑定本地IP的文件描述符

    参数2:指向sockaddr结构的指针,标识本地地址信息。如果是IP地址,要求IP地址必须为本机IP地址,端口必须为一个未占用的本地端口。

    sockaddr数据结构定义如下:

    #define __CONST_SOCKADDR_ARG __const struct sockaddr *
    struct sockaddr {
        sa_family_t sa_family;  //协议簇
        char sa_data[14];       //协议地址
    };

    sockaddr只提供地址类型规范,根据不同,需要选用不同的类型。

      如果是UNIX套接字,即本机通信的套接字,socket需要与本地socket文件绑定。

    #define __SOCKADDR_COMMON(sa_prefix)  sa_family_t sa_prefix##family  //##为宏连接
    struct sockaddr_un
    {
        _SOCKADDR_COMMON (sun_);       //协议AF_UNIX
        char sun_path[108];            //文件路径名  不能与系统文件名冲突 使用完后删除
    };

      IPV4网络通信,sockaddr的结构体应选用下面定义:

    struct sockaddr_in
    {
        __SOCKADDR_COMMON(sin_);       //协议AF_INET
        in_port_t sin_port;            //端口号
        struct in_addr sin_addr;       //IP地址
        unsigned char sin_zero[sizeof(struct sockaddr) - _SOCKADDR_COMMON_SIZE - sizeof(in_port_t) - sizeof(struct in_addr)]; //预留位 以适应struct sockaddr位
    };

        其中IP地址的结构体定义为:

    struct in_addr{
        __u32 s_addr;
    };

    参数3:绑定的地址长度,一般sizeof求得。因为有多种地址类型。

    监听网络

    int listen (int __fd, int __n)  成功返回0,失败返回-1。

    参数1:绑定了IP及端口的socket文件描述符

    参数2:请求排队的最大长度。

    客户端发起连接

    int connect (int __fd, __CONST_SOCKADDR_ARG __addr, socklen_t __len) 成功返回0,失败返回-1.

    参数1:socket文件描述符

    参数2:连接的目的主机地址(包括IP地址和端口)

    参数3:该地址长度

    服务器接收连接

    int accept (int __fd, __SOCKADDR_ARG __addr, socklen_t *__restrict __addr_len)  在监听到客户端连接请求时通过该函数接收,未监听到时阻塞。成功返回新的文件描述符,失败返回-1.

    参数1:socket文件描述符

    参数2:stuct sockaddr类型的地址空间首地址

    参数3:该段地址空间的长度

    服务器通过源IP、源端口、目的IP、目的端口来区分某个连接

    读/写socket对象:默认以阻塞方式进行

    ssize_t read (int __fd, void *__buf, size_t __nbytes) __wur  读文件内容

    ssize_t write (int __fd, __const void *__buf, size_t __n) __wur 写文件内容

    TCP发送/接收数据

    ssize_t send (int __fd, __const void *__buf, size_t __n, int __flags) :发送数据。当第4个参数为0时与调用write一样。成功返回发送数据大小,失败返回-1.

    ssize_t recv (int __fd, void *__buf, size_t __n, int __flags) :接收数据。 成功返回接收数据大小,失败返回-1.

    参数1:目标socket对象

    参数2:欲发送/接收的数据位置

    参数3:欲发送/接收的数据大小

    参数4:说明数据处理方式。如下图:

    关闭socket对象

    int close (int __fd) : 会关闭读写通道

    int shutdown (int __fd, int __how) :有三种关闭方式。

    • howto = 0 :关闭读通道
    • howto = 1 :关闭写通道
    • howto = 2 :完全关闭读写通道

    获取socket本地/对端信息

    int getsocketname (int __fd, __SOCKADDR_ARG __addr, socklen_t *__restrict __len) :获得一个套接字的本地地址。成功0,失败-1.

    int getpeername (int __fd, __SOCKADDR_ARG __addr, socklen_t *__restrict __len) :获得已经连接上的套接字的远程信息,如IP地址和端口

  • 相关阅读:
    helm模板语法报错 wrong type for value; expected int; got float64
    资源预留 vs 驱逐 vs OOM
    K8S资源回收机制
    微信小程序JS定时器setTimeout与setInterval使用方法
    常见信息安全技术汇总
    安装.net4.8提示已处理证书链,但不在受信任什么
    golang常用的http请求操作 GET POST总结汇总
    Python list 间隔两个取数值
    JS实现隐藏手机号码中间4位数
    elementui实现table表格的嵌套(table表格嵌套)功能实现
  • 原文地址:https://www.cnblogs.com/dplearning/p/4693176.html
Copyright © 2020-2023  润新知