socket 同一主机间两个进程之间通信

使用套接字除了可以实现网络间不同主机间的通信外,
还可以实现同一主机的不同进程间的通信,且建立的通信是双向的通信。

同一个IP,不同的端口。

本文属网络编程部分。
socket的引入是为了解决不同计算机间进程间通信的问题。

socket 是核心,是枢纽,是进程与网络建立关系的必经之路!

作者:kangomake
链接:https://www.jianshu.com/p/ed39c81d081b

1.内核是如何将数据包转发至 socket 的呢?
网络数据首先到达网卡,然后进入内核,由网络协议栈去处理,那么内核是如何进行数据分发的呢?它怎么知道该如何把数据交给特定的用户进程呢?
这时,就需要 socket 发挥作用了!
socket 中存储了特定的四元组: 源ip+port,目的ip+port;

1> bind 到特定 ip 和 port 的socket 对应 [src ip, src port) <=> (*, *)]2> connect 到特定目的ip+port 的 socket 对应 [src ip, src port) <=> (dst ip,  dst port)]3> accept 返回了的 socket 对应  [src ip, src port) <=> (dst ip,  dst port)]

那么内核根据数据包的四元组信息,就可以锁定特定的socket了。并可,系统中所有 socket 中的四元组信息,必定唯一,不可能重复!

2 进程与socket的关系是怎样的呢?
每个进程,在内核中都有一个表,保存了该进程申请并占用的所有 socket 描述符,在进程看来,socket 其实跟文件也没有什么不同,只不过通过描述符获得的对象不同而已,接口对应的系统调用也不同。
那么进程跟socket是一一对应的吗?
其实不然,socket是一种资源,就像文件一样,一个进程打开了,另一个进程也可以用,只不过socket比较特殊而已。
理论上,能够通过 sendmsg 将 socket 描述符传递给其他进程,这样其他进程就可以调用该描述符的接口了。这种场景确实不怎么会用到,也没有进行实际验证。
当然,父子进程间,还有线程间,进行 socket 的共享,是比较常见的。

3 进程与端口
进程与端口,其实并没有什么直接或必然的关系,关键还是socket!
wireshark 抓包查看tcp协议数据包详情:

总结
socket 的本质是一种资源,它包含了端到端的四元组信息,用来标识数据包的归属。因此,尽管 tcp 协议的端口号只有 65535 个,但是进程可拥有的 socket 数据却不限于此(受限于进程最大文件描述符数据);

  • 4
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
### 回答1: Qt中的QLocalSocket是一种用于进程通信的组件。它允许不同的进程同一台计算机上进行通信,通过该组件可以实现进程之间的数据交换和信息传递。 QLocalSocket是Qt的网络类之一,它继承自QTcpSocket类,用于在本地主机上建立起客户端-服务器类型的连接。使用QLocalSocket进行进程通信的基本步骤如下: 首先,创建一个QLocalSocket对象,并调用connectToServer()函数连接到目标进程的服务器端。在目标进程中,需要创建一个QLocalServer对象并调用其listen()函数来创建服务器端。 然后,通过write()函数向服务器端发送需要传递的数据。服务器端可以通过继承QLocalServer并重载incomingConnection()函数来接收客户端的连接请求,并使用read()函数读取来自客户端的数据。 QLocalSocket还提供了readyRead()信号,用于在客户端接收到数据时触发相应的槽函数进行处理。同时,error()信号可以用来捕获任何连接错误。 当数据传递完成后,可以调用disconnectFromServer()函数来断开客户端与服务器端之间的连接。 总之,Qt的QLocalSocket组件提供了一种方便和简单的方式实现进程通信。通过使用QLocalSocket,不同进程之间可以直接交换数据和信息,实现一些特定的功能,提高了应用程序的灵活性和可扩展性。 ### 回答2: Qt中的QLocalSocket类可用于进程通信进程通信是指两个或多个不同的进程之间交换数据或消息的过程。在Qt中,可以使用QLocalSocket类在本地主机上的进程建立通信。 QLocalSocket是一个套接字(Socket)类,它可以在本地主机上的不同进程之间建立双向通信。要使用QLocalSocket进行进程通信,首先需要创建一个QLocalServer对象作为服务器端,等待其他进程连接。然后在客户端进程中,创建一个QLocalSocket对象,用于与服务器端建立连接。 服务器端代码示例: ```cpp QLocalServer server; if (!server.listen("myApp")) { // 服务器启动失败 return; } // 服务器等待连接 QLocalSocket *socket = server.nextPendingConnection(); if (!socket) { // 连接失败 return; } // 接收数据 QObject::connect(socket, &QLocalSocket::readyRead, [&socket]() { QByteArray data = socket->readAll(); // 处理接收到的数据 }); // 发送数据给客户端 QByteArray sendData = "Hello from server"; socket->write(sendData); ``` 客户端代码示例: ```cpp QLocalSocket socket; socket.connectToServer("myApp"); // 检查连接状态 if (socket.state() != QLocalSocket::ConnectedState) { // 连接失败 return; } // 发送数据给服务器端 QByteArray sendData = "Hello from client"; socket.write(sendData); // 接收服务器端发来的数据 QObject::connect(&socket, &QLocalSocket::readyRead, [&socket]() { QByteArray data = socket.readAll(); // 处理接收到的数据 }); ``` 以上示例代码演示了一个基本的QLocalSocket进程通信的过程。服务器端创建QLocalServer对象并等待连接,客户端连接到服务器端并发送数据。服务器端收到数据后进行处理,然后发送数据给客户端。客户端接收到服务器端发送的数据后进行处理。 总而言之,使用QLocalSocket类可以实现方便的进程通信,方便不同进程之间的数据交换和消息传递。 ### 回答3: qt的QLocalSocket类是一个用于进程通信的工具。进程通信是指不同进程之间进行交流和数据传输的过程。 QLocalSocket通过本地套接字(Local Socket)来实现进程通信。本地套接字是一种特殊的套接字类型,它允许在同一台机器上的不同进程之间进行通信,而不需要经过网络。 使用QLocalSocket进行进程通信的基本步骤如下: 1. 创建一个QLocalServer对象,用于监听连接请求。本地服务器类(QLocalServer)提供了一种在本地环境中创建服务器的方法。 2. 创建一个QLocalSocket对象,用于与服务端建立连接。本地套接字类(QLocalSocket)提供了一种在本地环境中创建套接字的方法。 3. 在服务端,接受连接请求并建立连接。当服务端收到一个连接请求时,可以使用QLocalServer的nextPendingConnection()方法接受请求并返回一个QLocalSocket对象,用于进一步的通信。 4. 在客户端,连接到服务端。客户端使用QLocalSocket的connectToServer()方法来连接到服务端。 5. 通过QLocalSocket对象进行数据传输。一旦连接建立,就可以使用QLocalSocket的write()方法向对方发送数据,使用read()方法读取对方发送的数据。 QLocalSocket具有很多特性,例如支持阻塞和非阻塞的通信方式、支持对错误进行处理、支持多线程等。通过使用QLocalSocket,我们可以方便地在同一台机器上的不同进程之间进行通信,实现进程的数据传输和交流。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

学无止境2022

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

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

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

打赏作者

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

抵扣说明:

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

余额充值