Socket通信和MQ通信

一、Socket通信

  Socket 是应用层与TCP/IP协议族通信的中间软件抽象层,它是一组接口。在用户进程与TCP/IP协议之间充当中间人,完成TCP/IP协议的书写。

1. Socket API

(1)Socket() 创建 socket 描述符

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

(//返回值:成功则为0,失败为-1)

domain:协议域,又称协议族(family),决定了socket的地址类型,在通信中必须采用对应的地址。

type:信息传送方式。

protocol:对应协议。通常设置为0,让其自动匹配。

(domain 网络层相关协议,type 信息传送方式,protocol 运输层相关协议)

(2)bind() 绑定实际地址

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

(//返回值:成功则为0,失败为-1)

sockfd 一般服务端才需要绑定,客户端由系统内核解决
addr 所有协议都有一个公共的结构叫做const struct sockaddr,不同协议对应不同的具体结构,结构如下:

struct sockaddr

{   sa_family_t sin_family;    //地址族   

   char sa_data[14];    //14字节,包含套接字中的目标地址和端口信息  };

例如:ipv4结构体

struct sockaddr_in {
    sa_family_t    sin_family; 
    in_port_t      sin_port;   //typedef __uint16_t	 in_port_t;
    struct in_addr sin_addr;   
};

struct in_addr {
    uint32_t       s_addr;     
};

 addrlen:协议结构体大小,通常使用sizeof运算符计算

   sizeof(sockaddr_in); //IPv4 in:internet

(3)listen()、connect() 主机监听、从机连接

int listen(int sockfd,int backlog); //返回值:成功则为0,失败为-1

int connect(int sockfd, const struct sockaddr *addr, socklen_t addrlen); //返回值:成功则为0,失败为-1

listen决定需要开启的服务,connect拨打电话。

listen函数的  第一个参数即为要监听的socket描述字,

                     第二个参数为相应socket可以排队的最大连接个数。

socket()函数创建的socket默认是一个主动类型的,listen函数将socket变为被动类型的,等待客户的连接请求。

connect函数的

      第一个参数即为客户端的socket描述字,

      第二参数为服务器的socket地址,

      第三个参数为socket地址的长度。

客户端通过调用connect函数来建立与TCP服务器的连接。

(4)accept建立连接

int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen); //返回值:成功则为0,失败为-1

  第一个参数为服务器的socket描述字
  第二个参数为指向struct sockaddr *的指针,用于返回客户端的协议地址
  第三个参数为协议地址的长度

  如果accpet成功,那么其返回值是由内核自动生成的一个全新的描述字,代表与返回客户的TCP连接。后面的读写操作都是根据这个返回值来完成的。

(5)read和write函数

ssize_t read(int fd, void *buf, size_t count);
ssize_t write(int fd, const void *buf, size_t count);

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

ssize_t sendto(int sockfd, const void *buf, size_t len, int flags,
              const struct sockaddr *dest_addr, socklen_t addrlen);
ssize_t recvfrom(int sockfd, void *buf, size_t len, int flags,
                struct sockaddr *src_addr, socklen_t *addrlen);

ssize_t sendmsg(int sockfd, const struct msghdr *msg, int flags);
ssize_t recvmsg(int sockfd, struct msghdr *msg, int flags);

(6)close关闭服务

int close(int fd); //返回值:成功则为0,失败为-1

 

2. socket中TCP的三次握手建立连接

客户端的connect在三次握手的第二个次返回,而服务器端的accept在三次握手的第三次返回。

3. socket中TCP的四次握手释放连接

 

二、MQ通信

MQ( Message Queue(消息队列)),是在消息的传输过程中保存消息的容器。多用于分布式系统之间进行通信。(先进先出的数据结构)

生产者将消息发送给MQ。 MQ将消息推送给指定消费者,或者消费者去MQ获取特定的消息。

生产者和消费者又可以成为客户端,相对应MQ就是服务端。

  • 把数据放到消息队列叫做生产者
  • 从消息队列里边取数据叫做消费者

 

MQ中有broker的

broker可以理解为是一个中转站。生产者将消息发送给他就结束自己的任务了,broker将消息主动推送给消费者(具体的将消息推送到哪个队列,或者说消费者主动请求)

MQ中无broker的

直接使用socket进行通信。

socket主要用于即时通讯。socket是长连

传统的http请求随着服务端返回给客户端消息,两者之间的关联就消失了,所以服务端想要主动练习客户端就得靠轮询的方式,但是这种轮询比较耗费性能,既耗费客户端的性能,又耗费服务器资源,于是就有了长连接的概念。

 

小注:

客户端和服务器端使用socket通信,类似两方在打电话的过程,互相获取信息数据,电话挂断,则通信结束。

后将获取到的信息上传到mq中,让消费者来取。

posted @   浑浑噩噩一只小迷七  阅读(1526)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
点击右上角即可分享
微信分享提示