使用套接字除了可以实现网络间不同主机间的通信外,
还可以实现同一主机的不同进程间的通信,且建立的通信是双向的通信。
同一个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 数据却不限于此(受限于进程最大文件描述符数据);
每个进程,在内核中都有一个表,保存了该进程申请并占用的所有 socket 描述符,在进程看来,socket 其实跟文件也没有什么不同,只不过通过描述符获得的对象不同而已,接口对应的系统调用也不同。其实不然,socket是一种资源,就像文件一样,一个进程打开了,另一个进程也可以用,只不过socket比较特殊而已。当然,父子进程间,还有线程间,进行 socket 的共享,是比较常见的。还可以实现同一主机的不同进程间的通信,且建立的通信是双向的通信。socket 是核心,是枢纽,是进程与网络建立关系的必经之路!
TCP/IP协议实际上就是在物理网上的一组完整的网络协议。其中TCP是提供传输层服务,而IP则是提供网络层服务。
套接字是网络的基本构件。它是可以被命名和寻址的通信端点,使用中的每一个套接字都有其类型和一个与之相连听进程。套接字存在通信区域(通信区域又称地址簇)中。套接字只与同一区域中的套接字交换数据(跨区域时,需要执行某和转换进程才能实现)。WINDOWS 中的套接字只支持一个域——网际域。套接字具有类型。
基本套接字
为了更好说明套接字编程原理,给出几个基本的套接字,在以后的篇幅中会给出更详细的使用说明。
客户机/服务器模式
在TCP/IP网络中两个进程间的相互作用的主机模式是客户机/服务器模式(Client/Server model)
进程间通信-
Socket
socket是一种借口技术,可以让不同的
进程进行同行,有两种
通信方式
既可以是
同一个计算机上的
进程,也可以是不同计算机上的
进程。
同一计算机的
进程通信
需要借助
socket的文件,进行
通信
#include <sys/types.h>
#include <sys/
socket.h>
int
socket(int domain, int type, int protocol);
功能:创建
socket对象
什么是socket通信?
TCP/IP协议是传输层协议,主要解决数据如何在网络中传输。HTTP是应用层协议,主要解决如何包装数据。
Socket是通信的基石,是支持TCP/IP协议的网络通信的基本操作单元。它是网络通信过程中端点的抽象表示,包含进行网络通信必须的五种信息:连接使用的协议、本地主机的IP地址、本地进程的协议端口、远程主机的IP地址、远程进程的协议端口。
通俗来说:网络上的两个程序通过一个双向的通信连接实现数据的交换,这个连接的一端称为一个socket。
什么是串口通信?
串口通信(Serial Communications)的概念非常简单,串口按位(bit)发送和接收字节。典型地,串口用于ASCII码字符的传输。通信使用3根线完成,分别是地线、发送、接收。由于串口通信是异步的,端口能够在一根线上发送数据同时在另一根线上接收数据。其他线用于握手,但不是必须的。串口通信最重要的参数是波特率、数据位、停止位和奇偶校验。对于两个进行通信的端口,这些参数必须匹配。
文件工程:实现了socket接收和串口接收两个功能。
备注:资料仅供学习参考,小白初入c#上位机,代码简单,大佬勿喷。
# 创建多个
socket对象
client1 =
socket.
socket(
socket.AF_INET,
socket.SOCK_STREAM)
client2 =
socket.
socket(
socket.AF_INET,
socket.SOCK_STREAM)
# 连接到服务器
client1.connect(server_address)
client2.connect(server_address)
# 发送消息
client1.send(b'Hello from client 1')
client2.send(b'Hello from client 2')
# 接收消息
data1 = client1.recv(1024)
data2 = client2.recv(1024)
# 打印接收到的消息
print(data1)
print(data2)
# 关闭
socket连接
client1.close()
client2.close()
在上面的示例中,我们创建了
两个socket对象client1和client2。然后它们都连接到
同一个服务器地址和端口。接下来,我们分别使用这
两个socket对象发送消息,并接收服务器返回的消息。最后,我们关闭这
两个socket连接。
注意,如果要在
同一个
进程中创建多个客户端,需要为每个客户端创建一个新的
socket对象。如果多个客户端使用
同一个
socket对象连接到服务器,会导致
通信出现问题。