Socket套接字如何理解,TCP与UDP的编程实现的区别

1、对套接字的理解

TCP协议是面向连接的协议,所以使用TCP协议通信之前,必须要先建立TCP连接,在数据传输结束之后必须断开已经建立的TCP连接。TCP协议提供的是点对点的通信,每条TCP连接由两端的套接字唯一确定。TCP连接是一条虚连接,是逻辑连接,不是真实存在的物理连接。TCP连接可以看成是一种逻辑上的管道。可以理解为TCP连接两端的套接字来连起来就形成了管道,管道的两端或者说管道的端口就是Socket套接字。

端口号拼接到IP地址上就形成了套接字,每个套接字都对应一个套接字描述符,是一个小的整数。这是操作系统为套接字分配的用于网络通信的一些系统资源(如存储器空间、CPU、时间、网络带宽等)。套接字描述符表示这些系统资源的总和。套接字只是一个概念,不存在实体。或者说,套接字对应的内存空间中存储的用于通信的控制信息(IP地址、端口号、协议族等)就是实体。

TCP连接是面向字节流的,因此TCP连接这条管道中传输的是一连串无结构的字节序列。TCP协议提供全双工通信,数据收发操作就是数据通过管道的端口(套接字),沿着TCP连接这条管道的双向流动,数据从任意一端送入管道,在另一端被接收。

同一个IP地址可以有多个不同的TCP连接,同一个端口号也可以出现在多个不同的TCP连接当中。


2、 TCP与UDP的编程实现的区别

 从上图可以看出,UDP编程框架和TCP框架有两点差异:
(1)相对于TCP协议,UDP协议服务器和客户端的交互,没有listen()和accept()函数,也就是说缺少二者之间的连接过程。这是由UDP协议的特点决定的,因为UDP协议面向无连接(SOCK_DGRAM),为应用层提供不可靠、无连接和基于数据报的服务,因此客户端与服务器之间不需要建立连接。

① TCP
    ssize_t recv(int sockfd, void *buf, size_t len, int flags);
    ssize_t send(int sockfd, const void *buf, size_t len, int flags);
② UDP
    ssize_t recvfrom(int sockfd, void *buf, size_t len, intflags, struct sockaddr *src_addr, socklent_t *addlen);
    ssize_t sendto(int sockfd, void *buf, size_t len, intflags, struct sockaddr *src_addr, socklent_t addlen);


(2)TCP协议与UDP协议读写数据的函数不同,TCP协议读写数据用第①组函数recv()/send()函数,UDP读写数据用第②组函数recvfrom()/sendto()函数,这也是由两种协议的类型决定的。TCP协议是面向连接的,通信双方在进行数据交互之前,必须先建立连接。所以,创建SOCK_STREAM类型的套接字,通信双方建立TCP连接之后,通信双方的数据是可靠的、双向连接的字节流,建立连接之后发送数据不需要再明确对端的地址。因此TCP连接使用的上图中的第①组函数传输数据;然而UDP协议是面向无连接的,通信双方不需要一直保持联系,因此每次发送数据都要指定接收端的地址。所以UDP协议使用的是上图中的第②组函数。需要注意的是,recvfrom函数的最后一个参数是指针型,sendto函数的最后一个参数是LONG型,函数recv()的返回值是成功接收到的字节数。当返回值为-1时,表示有错误发生,当另一方使用正常的方式关闭连接时返回值为0,例如调用close()函数关闭连接。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值