当我写第一个网络程序时,我搜索并找到了各种例子来拼凑程序,并没有深入的理解。 用了这么多年这个东西,是时候静下心来检验一下我对这块知识的掌握程度了。
可以说,一个典型的网络程序是离不开的,它是系统为开发者提供网络运营的有力武器。
也称为,是一系列用于网络操作的API。 它的实现和表达会根据不同的系统平台和编程语言而有所不同,但实现的功能是相同的。
创建:
平台C版
SOCKET s = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
C#版本
Socket s=new Socket(AddressFamily.InterNetwork,SocketType.Stream,ProtocolType.Tcp);
上面两个都是用TCP协议创建的,里面的三个参数分别指定了IP层协议类型(IPV4和IPV6)、数据交互格式(字节流、数据报等)、传输层协议(TCP和UDP)。
套接字以文件描述符的形式存在于进程中,实际上是一个用于唯一标识套接字的数字,以不同的形式提供给开发者。
地址和端口:
地址指定了数据交换节点的设备。 如果设备有多个网卡,则该地址指定某个网卡; 端口标识设备上的某个进程。 来自网络的数据到达网卡后,向上经过数据链路层、网络层,到达传输层,然后根据端口确定需要哪个进程来交接数据。
数据接收:
数据接收由进程调用的接收函数发起。 该函数会向系统提交一个接收数据的IO请求。 请求的内容包括应用层存储数据的缓冲区、请求的数据大小以及缓冲区中存储数据的偏移值。
C#发起数据接收请求:
int rcvLen=m_socket.Receive(buf, offset, size, SocketFlags.None);
其中,buf为数据缓冲区,是接收到数据时buf中存储数据的起始地址,size是本次请求的字节大小,是接收成功后实际接收到的字节长度。
数据发送:
数据的发送是由进程调用的发送函数发起的。 该函数会向系统提交发送数据的IO请求,并将数据发送到指定的节点。 请求的内容包括发送数据的内容和长度。
C#发起的数据发送请求(TCP):
int sndLen= m_socket.Send(buf);
其中,buf为发送内容的字节码数组,为实际发送的字节长度。
TCP:
TCP是传输层协议,具有一定的复杂性,其目的是完成数据的可靠传输。 TCP实现的网络应用分为两类端点:服务器和客户端。 每个端点的实现对应不同的调用函数。
服务器端可以接受客户端的连接请求,连接完成后即可进行双向通信。
要建立服务器,需要创建服务器套接字,将服务地址和端口绑定到套接字,启用被动监听,并开始等待连接。
C#版本的服务器端创建代码
m_socketServer = CreateSocket_IPV4();
m_socketServer.Bind(CreateEndPoint(port, null));
m_socketServer.Listen(10);
m_conns = new List();
Task.Factory.StartNew(() =>
{
while (m_running)
{
var s = m_socketServer.Accept();
var conn = CreateConnection(s);
m_conns.Add(conn);
OnConnected?.Invoke(conn);
}
});
客户端的操作比较简单,只需要创建一个并向服务器发起连接请求即可。
C#版本的客户端代码
var s = CreateSocket_IPV4();
s.Connect(IPAddress.Parse(ip), port);
涵盖的内容非常丰富,这里我们只取出一些有代表性的内容进行介绍。