• 【转】TCP和UDP具体编程时的区别


    1 socket()的参数不同
    UDP Server不需要调用listen和accept
    UDP收发数据用sendto/recvfrom函数
    TCP:地址信息在connect/accept时确定
    UDP:在sendto/recvfrom函数中每次均 需指定地址信息
    UDP:shutdown函数无效
    通常我们在说到网络编程时默认是指TCP编程,即用前面提到的socket函数创建一个socket用于TCP通讯,函数参数我们通常填为SO
    CK_STREAM。即socket(PF_INET, SOCK_STREAM, 0),这表示建立一个socket用于流式网络通讯。
    通过查看socket的man手册可以看到socket函数的第一个参数的值可以为下面这些值:
    2 Name                              Purpose
    PF_UNIX, PF_LOCAL     Local communication
    PF_INET                         IPv4 Internet protocols
    PF_INET6                       IPv6 Internet protocols
    PF_IPX                           IPX - Novell protocols
    PF_NETLINK                  Kernel user interface device
    PF_X25                           ITU-T X.25 / ISO-8208 protocol
    PF_AX25                         Amateur radio AX.25 protocol
    PF_ATMPVC                    Access to raw ATM PVCs
    PF_APPLETALK             Appletalk
    PF_PACKET                    Low level packet interface
    3 第二个参数支持下列几种值:
    4 SOCK_STREAM
    Provides sequenced, reliable, two-way, connection-based byte streams. An out-of-band data transmission mechanism
     may be sup‐
    ported.
    5 SOCK_DGRAM
    Supports datagrams (connectionless, unreliable messages of a fixed maximum length).
    6 SOCK_SEQPACKET
    Provides a sequenced, reliable, two-way connection-based data transmission path for datagrams of fixed maximu
    m length; a con‐
    sumer is required to read an entire packet with each read system call.
    7 SOCK_RAW
    Provides raw network protocol access.
    8 SOCK_RDM
    Provides a reliable datagram layer that does not guarantee ordering.
    9 SOCK_PACKET
    Obsolete and should not be used in new programs; see packet(7).
    10 从这里可以看出,SOCK_STREAM这种的特点是面向连接的,即每次收发数据之前必须通过connect建立连接,也是双向的,即任何一方都可以收发数据,协议本身提供了一些保障机制保证它是可靠的、有序的,即每个包按照发送的顺序到达接收方。
    而SOCK_DGRAM这种是User Datagram Protocol协议的网络通讯,它是无连接的,不可靠的,因为通讯双方发送数据后不知道对方是否已经收到数据,是否正常收到数据。任何一方建立一个socket以后就可以用sendto发送数据,也可以用recvfrom接收数据。根本不关心对方是否存在,是否发送了数据。它的特点是通讯速度比较快。大家都知道TCP是要经过三次握手的,而UDP没有。
    基于上述不同,UDP和TCP编程步骤也有些不同,如下:
    11 /*********************************************************************
    *filename: UDP编程介绍
    *purpo
    se: 通过比较UDP和TCP编程对二者编程步骤进行总结说明****************************************************************
    *****/
    12 TCP编程的服务器端一般步骤是:
    1、创建一个socket,用函数socket();
    2、设置socket属性,用函数setsockopt(); * 可选
    3、绑定IP地址、端口等信息到socket上,用函数bind();
    4、开启监听,用函数listen();
    5、接收客户端上来的连接,用函数accept();
    6、收发数据,用函数send()和recv(),或者read()和write();
    7、关闭网络连接;
    8、关闭监听;
    13 TCP编程的客户端一般步骤是:
    1、创建一个socket,用函数socket();
    2、设置socket属性,用函数setsockopt();* 可选
    3、绑定IP地址、端口等信息到socket上,用函数bind();* 可选
    4、设置要连接的对方的IP地址和端口等属性;
    5、连接服务器,用函数connect();
    6、收发数据,用函数send()和recv(),或者read()和write();
    7、关闭网络连接;
    
    与之对应的UDP编程步骤要简单许多,分别如下:
    UDP编程的服务器端一般步骤是:
    1、创建一个socket,用函数socket();
    2、设置socket属性,用函数setsockopt();* 可选
    3、绑定IP地址、端口等信息到socket上,用函数bind();
    4、循环接收数据,用函数recvfrom();
    5、关闭网络连接;
    
    UDP编程的客户端一般步骤是:
    1、创建一个socket,用函数socket();
    2、设置socket属性,用函数setsockopt();* 可选
    3、绑定IP地址、端口等信息到socket上,用函数bind();* 可选
    4、设置对方的IP地址和端口等属性;
    5、发送数据,用函数sendto();
    6、关闭网络连接;socket()的参数不同
    UDP Server不需要调用listen和accept
    UDP收发数据用sendto/recvfrom函数
    TCP:地址信息在connect/accept时确定
    UDP:在sendto/recvfrom函数中每次均 需指定地址信息
    UDP:shutdown函数无效
    通常我们在说到网络编程时默认是指TCP编程,即用前面提到的socket函数创建一个socket用于TCP通讯,函数参数我们通常填为SOCK_STREAM。即socket(PF_INET, SOCK_STREAM, 0),这表示建立一个socket用于流式网络通讯。
    通过查看socket的man手册可以看到socket函数的第一个参数的值可以为下面这些值:
    Name                              Purpose
    PF_UNIX, PF_LOCAL     Local communication
    PF_INET                         IPv4 Internet protocols
    PF_INET6                       IPv6 Internet protocols
    PF_IPX                           IPX - Novell protocols
    PF_NETLINK                  Kernel user interface device
    PF_X25                           ITU-T X.25 / ISO-8208 protocol
    PF_AX25                         Amateur radio AX.25 protocol
    PF_ATMPVC                    Access to raw ATM PVCs
    PF_APPLETALK             Appletalk
    PF_PACKET                    Low level packet interface
    第二个参数支持下列几种值:
    SOCK_STREAM
    Provides sequenced, reliable, two-way, connection-based byte streams. An out-of-band data transmission mechanismmay be sup‐
    ported.
    SOCK_DGRAM
    Supports datagrams (connectionless, unreliable messages of a fixed maximum length).
    SOCK_SEQPACKET
    Provides a sequenced, reliable, two-way connection-based data transmission path for datagrams of fixed maximumlength; a con‐
    sumer is required to read an entire packet with each read system call.
    SOCK_RAW
    Provides raw network protocol access.
    SOCK_RDM
    Provides a reliable datagram layer that does not guarantee ordering.
    SOCK_PACKET
    Obsolete and should not be used in new programs; see packet(7).
    从这里可以看出,SOCK_STREAM这种的特点是面向连接的,即每次收发数据之前必须通过connect建立连接,也是双向的,即任何一方都可以收发数据,协议本身提供了一些保障机制保证它是可靠的、有序的,即每个包按照发送的顺序到达接收方。
    而SOCK_DGRAM这种是User DatagramProtocol协议的网络通讯,它是无连接的,不可靠的,因为通讯双方发送数据后不知道对方是否已经收到数据,是否正常收到数据。任何一方建立一个socket以后就可以用sendto发送数据,也可以用recvfrom接收数据。根本不关心对方是否存在,是否发送了数据。它的特点是通讯速度比较快。大家都知道TCP是要经过三次握手的,而UDP没有。
    基于上述不同,UDP和TCP编程步骤也有些不同,如下:
    /*********************************************************************
    *filename: UDP编程介绍
    *purpose:通过比较UDP和TCP编程对二者编程步骤进行总结说明*********************************************************************/
    TCP编程的服务器端一般步骤是:
    1、创建一个socket,用函数socket();
    2、设置socket属性,用函数setsockopt(); * 可选
    3、绑定IP地址、端口等信息到socket上,用函数bind();
    4、开启监听,用函数listen();
    5、接收客户端上来的连接,用函数accept();
    6、收发数据,用函数send()和recv(),或者read()和write();
    7、关闭网络连接;
    8、关闭监听;
    TCP编程的客户端一般步骤是:
    1、创建一个socket,用函数socket();
    2、设置socket属性,用函数setsockopt();* 可选
    3、绑定IP地址、端口等信息到socket上,用函数bind();* 可选
    4、设置要连接的对方的IP地址和端口等属性;
    5、连接服务器,用函数connect();
    6、收发数据,用函数send()和recv(),或者read()和write();
    7、关闭网络连接;
    
    与之对应的UDP编程步骤要简单许多,分别如下:
    UDP编程的服务器端一般步骤是:
    1、创建一个socket,用函数socket();
    2、设置socket属性,用函数setsockopt();* 可选
    3、绑定IP地址、端口等信息到socket上,用函数bind();
    4、循环接收数据,用函数recvfrom();
    5、关闭网络连接;
    
    UDP编程的客户端一般步骤是:
    1、创建一个socket,用函数socket();
    2、设置socket属性,用函数setsockopt();* 可选
    3、绑定IP地址、端口等信息到socket上,用函数bind();* 可选
    4、设置对方的IP地址和端口等属性;
    5、发送数据,用函数sendto();
    6、关闭网络连接;
  • 相关阅读:
    Redis源码分析(二十一)--- anet网络通信的封装
    leetcode 总结part1
    leetcode String to Integer (atoi)
    leetcode 165. Compare Version Numbers
    leetcode 189. Rotate Array
    leetcode 168. Excel Sheet Column Title
    leetcode 155. Min Stack
    leetcode 228. Summary Ranges
    leetcode 204. Count Primes
    leetcode 6. ZigZag Conversion
  • 原文地址:https://www.cnblogs.com/91program/p/5216606.html
Copyright © 2020-2023  润新知