操作系统:08 socket套接字

Socket作为一种接口技术,允许同一计算机或不同计算机的进程间进行通信。它涉及AF_UNIX/AF_LOCAL(本地通信)、AF_INET(基于IPv4的网络通信)等地址簇,以及SOCK_STREAM(数据流协议)等类型。创建、绑定、监听、接受、连接、发送和接收是其主要操作步骤。

1 进程间通信-Socket套接字

1.1 基本特点

        Socket是一种接口技术,被抽象成一个文件操作,可以让同一计算机中的不同进程之间通信,也可以让不同计算机的进程之间进行通信(网络)

1.2 同一计算机中的socket进程间通信

        底层需要借助socket文件,进行在同一计算机下的进程间通信

1.3 使用

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

    功能:创建socket文件

    domain:

        AF_UNIX/AF_LOCAL    本地通信(进程间通信)

        AF_INET             基于IPv4地址网络通信

        AF_INET6            基于IPv6地址网络通信

    type:

        SOCK_STREAM     数据流协议 (本地)

        SOCK_DGRAM      数据报协议

    protocol:

        特殊通信协议,一般不用,写0即可

    返回值:

        成功返回socket描述符,失败返回-1

    int bind(int sockfd, const struct sockaddr *addr,socklen_t addrlen);

    功能:绑定socket描述符与通信地址

    sockfd:socket描述符

    addr:地址结构体

        实际传递的是sockaddr_un或者sockaddr_in结构体地址,但是最终都要把它们转换成sockaddr*,因为C语言不支持自建类型自动识别转换,因此要强转

    //  本地通信地址结构

    #include <sys/un.h>

    struct sockaddr_un {

    __kernel_sa_family_t sun_family; // 地址簇 domain的值

    char sun_path[UNIX_PATH_MAX];   // socket文件路径

    };

    //  网络通信地址结构体

    #include <netinet/un.h>

    struct sockaddr_in

    {

    __kernel_sa_family_t  sin_family; //地址簇

    in_port_t sin_port;                 //  端口号

    struct in_addr sin_addr;        //IP地址结构体

    }

    addrlen:通信地址结构体的字节数,用于区分sockaddr_un还是sockaddr_in

    返回值:成功返回0,失败-1

    注意:如果是本地通信,只有当bind成功后才会创建socket文件完成

    int listen(int sockfd, int backlog);

    功能:监听socket,只有数据流协议时才需要使用

    sockfd:socket描述符

    backlog:监听等待连接的排队数量,一般默认最大128

    返回值:成功返回0,失败-1

    int accept(int sockfd,struct sockaddr *addr, socklen_t *addrlen);

    功能:等待连接,只有数据流协议时才需要使用

    sockfd:socket描述符

    addr:获取连接者的通信地址(sockaddr_un\sockaddr_in)

    addrlen:获取地址结构的大小

    返回值:连接成功时返回一个新的socket描述符,用于与连接者进行通信

    注意:如果没有人要连接过来,该函数会阻塞等待

    int connect(int sockfd,const struct sockaddr *addr,

    socklen_t addrlen);

    功能:连接socket,数据流使用

    sockfd:socket描述符

    addr:要连接的目标的地址

    addrlen:通信地址结构体字节数

    返回值:连接成功返回0,失败返回-1

    ssize_t recv(int sockfd,void *buf, size_t len, int flags);

    功能:从socket中读取数据,数据流中使用

    sockfd:建立连接后的新的sockfd

    buf:存储数据的内存首地址

    len:存储数据内存的字节数

    flags:一般写0即可,阻塞等待读取

        MSG_DONTWAIT    不阻塞

    返回值:成功接收到的字节数,-1出现了错误,0表示断开连接

    ssize_t send(int sockfd,const void *buf,size_t len, int flags);

    功能:向socket发送数据,数据流中使用

    sockfd:建立连接后的新的sockfd

    buf:待发送数据的内存首地址

    len:要发送的数据的字节数

    flags:一般写0即可,阻塞

        MSG_DONTWAIT 不阻塞

    返回值:成功发送的字节数,-1表示出错

    注意:如果不需要额外的发送、接收的功能,read\write也可以进行发送和接收,但一般还是使用send/recv

    int close(int fd);

    功能:关闭socket

1.4 socket本地通信编程模型:

        进程A                                   进程B

    创建socket对象               创建socket对象  

    准备通信地址                   准备通信地址

    绑定socket和通信地址              ...

    监听                                          ...

    等待连接                            发起连接

    接收\发送数据                 发送\接收数据

    关闭socket                      关闭socket

    删除socket文件

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

就酱77叭

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值