美文网首页
009-套接字

009-套接字

作者: ottox | 来源:发表于2018-11-16 16:09 被阅读3次

一个连接由它的两个端点标识,这样的端点称为套接字。


image.png

套接字是支持TCP/IP协议的网络通信的基本操作单元。可以将套接字看作不同主机间的进程进行双向通信的端点。
上图连接1的一对套接字为:
(192.168.2.23,5000)和(192.168.2.122,8888)
上图连接2的一对套接字为:
(192.168.2.23,5001)和(192.168.2.122,8888)
对于UDP协议尽管两个进程之间没有建立连接,但是也同样存在发送端点,和接收端点,也同样使用套接字的概念。

套接字的类型有:
流式套接字:提供了面向连接的、可靠的、数据无错并且无重复的数据发送服务,而且接收数据的顺序和发送数据的顺序是相同的。
数据报套接字:提供了面向无连接的服务,它以独立的数据包形式发送数据(数据包长度不能大于32KB),不提供正确性检查,也不保证各数据包的发送顺序和接收顺序相同 ,因此,可能出现数据的重发、丢失等现象。
原始套接字:用于直接访问协议的较低层。常用于检验新的协议实现或访问现有服务中配置的新设备,一般不提倡直接使用原始套接字。

Socket类

Socket类包含在System.Net.Sockets命名空间中。
一个Socket实例包含了一个本地或者一个远程端点的套接字信息。
使用Socket类编程,由于很多细节都需要自己考虑,相对来说复杂一些,易出错。一般对套接字编程比较熟悉的人,或者使用非标准协议(自定义的新协议)进行编程的时候,才使用Socket类。

Socket类的构造函数为:

public Socket(
    AddressFamily addressFamily, //网络类型 
    SocketType socketType,       //套接字类型
   ProtocolType protocolType    //使用的协议 
 );  

参数含义:
(1)addressFamily
addressFamily表示网络类型,该参数使用AddressFamily枚举指定Socket使用的寻址方案
例如AddressFamily.InterNetwork表示IP版本4的地址


image.png

(2)socketType
socketTyp指定Socket的类型,该参数使用SocketType枚举指定使用哪种套接字。例如:
SocketType.Stream表明连接是基于流套接字的
SocketType.Dgram表示连接是基于数据报套接字
SocketType.Raw表示连接基于原始套接字;

(3)protocolType
protocolType指定Socket使用的协议,该参数使用ProtocolType枚举指定使用哪种协议。例如:
ProtocolType.Tcp表明连接协议是TCP
ProtocolType.Udp表明连接协议是UDP

Socket构造函数的三个参数中,对于网络上的IP通信来说,AddressFamily总是使用AddressFamily.InterNetwork枚举值。而SocketType参数则与ProtocolType参数配合使用,不允许其他的匹配形式,也不允许混淆匹配。下表列出了可用于IP通信的组合。


image.png

面向连接的套接字

IP连接领域有两种通信类型:

  • 面向连接的(connection-oriented)
  • 无连接的(connectionless)。
    根据连接启动的方式以及本地套接字要连接的目标,套接字之间的连接过程可以分为三个步骤:
  • 服务器监听
  • 客户端请求
  • 连接确认
  • 服务器监听:是指服务器套接字并不定位具体的客户端套接字,而是处于等待连接的状态,实时监控网络状态。
  • 客户端请求:是指由客户端的套接字提出连接请求,要连接的目标是服务器的套接字。为此,客户端的套接字必须首先描述它要连接的服务器的套接字,指出服务器套接字的地址和端口号,然后再向服务器套接字提出连接请求。
  • 连接确认:是指当服务器套接字监听到客户端套接字的连接请求时,它就响应客户端套接字的请求,把服务器套接字的信息发给客户端,一旦客户端确认了此信息,连接即可建立。而服务器套接字继续监听其他客户端套接字的连接请求。


    image.png
  • 同步TCP编写服务器端程序的一般步骤为:
    1. 创建一个包含采用的网络类型、数据传输类型和协议类型的本地套接字对象,并将其与服务器的IP地址和端口号绑定。这个过程可以通过Socket类。
    2. 在指定的端口进行监听,以便接受客户端连接请求。
    3. 一旦接受了客户端的连接请求,就根据客户端发送的连接信息创建与该客户端对应的Socket对象。
    4. 根据创建的Socket对象,分别与每个连接的客户进行数据传输。
    5. 根据传送信息情况确定是否关闭与对方的连接。
  • 使用同步TCP编写客户端程序的一般步骤为:
    1. 创建一个包含传输过程中采用的网络类型、数据传输类型和协议类型的Socket对象。
    2. 与远程服务器建立连接。
    3. 与服务器进行数据传输。
    4. 完成工作后,向服务器发送关闭信息,并关闭与服务器的连接。

1.建立连接(服务器)

IPHostEntry local = Dns.GetHostByName(Dns.GetHostName());
IPEndPoint iep = new IPEndPoint(local.AddressList[0], 1180);
Socket localSocket = new Socket(
    AddressFamily.InterNetwork, 
    SocketType.Stream, 
    ProtocolType.Tcp);
localSocket.Bind(iep);
locatSocket.Listen(10);
Socket clientSocket = localSocket.Accept();

2. 发送、接收信息(服务器)

    Socket clientSocket = localSocket.Accept();
    //建立连接后,利用Send方法向客户端发送信息
    clientSocket.Send(Encoding.ASCII.GetBytes("server send Hello"));
    //接收客户端信息
    byte[] myresult = new Byte[1024];
    int receiveNum = clientSocket.Receive(myresult);
    Console.WriteLine("接收客户端消息:{0}", Encoding.ASCII.GetString(myresult));

3. 发送、接收信息(客户端)

//建立连接成功后,向服务器发送信息
string sendMessage = "client send Message Hello"+DateTime.Now;
localSocket.Send(Encoding.ASCII.GetBytes(sendMessage));
Console.WriteLine("向服务器发送消息:{0}", sendMessage);
//接收服务器信息
byte[] result = new Byte[1024];
localSocket.Receive(result);
Console.WriteLine("接收服务器消息:{0}", Encoding.ASCII.GetString(result));

4.关闭连接

通信完成后,必须先用Shutdown方法停止会话,然后关闭Socket实例 。


image.png

例如:
sock.Shutdown(SocketShutdown.Both);
sock.Close();

无连接的套接字

UDP使用无连接的套接字,无连接的套接字不需要在网络设备之间发送连接信息。
注意:
必须使用Bind方法将套接字绑定到一个本地地址和端口之后才能使用ReceiveFrom方法接收数据,如果只发送而不接收,则不需要使用Bind方法。。

image.png

相关文章

  • 009-套接字

    一个连接由它的两个端点标识,这样的端点称为套接字。 套接字是支持TCP/IP协议的网络通信的基本操作单元。可以将套...

  • ss:一个统计网络和套接字信息的命令行工具

    ss简介 ss命令可以用来统计套接字信息,它支持PACKET套接字、TCP套接字、UDP套接字、DCCP套接字、R...

  • 2018-09-12 day18网络编程

    1.socket套接字 socket又叫套接字,就是进行数据通信两端。分为服务端套接字和客户端套接字 套接字编程:...

  • Mysql常用文件介绍

    套接字文件 Linux上本地连接Mysql默认采用套接字方式。套接字文件可由参数socket控制。查看套接字文件的...

  • 第十六章 网络IPC 套接字

    套接字描述 套接字是通信端点的抽象 套接字描述符:正如使用文件描述符访问文件,应用程序用套接字描述符访问套接字 套...

  • TCP/IP协议族、Socket、HTTP的知识整理

    Socket(套接字,业余计算机从业人员表示,这是什么垃圾翻译?!套接字是个什么鬼?套接就套接,什么叫套接字?)是...

  • Python基础语法-3

    socket套接字使用流程:1.创建套接字2.使用套接字收/发数据3.关闭套接字 创建一个TCP socket 创...

  • 套接字与套接字编程

    什么是套接字(Socket)? 使用端口(Port)可以标识不同的网络进程 端口使用16个bit位表示 4个字节 ...

  • Day18-总结

    01-服务端套接字 套接字又叫套接字,指的是实现通信的两个端。等待请求的一段叫服务端套接字,发送请求的叫客户端套接...

  • 第19天总结网络通信

    socket又叫套接字,实现网络通信的两端就是套接字。分为服务器对应的套接字和客户端对应的套接字 python通过...

网友评论

      本文标题:009-套接字

      本文链接:https://www.haomeiwen.com/subject/qwpmfqtx.html