socket套接字及缓冲区详解(一篇搞定~)
发布网友
发布时间:2024-10-03 12:48
我来回答
共1个回答
热心网友
时间:2024-11-29 18:51
一、域(domain)
域指明套接字通信所使用的网络介质。常见的是AF_INET(IPv4)或AF_INET6(IPv6),代表Internet网络。这类网络多用于Linux局域网和因特网。
二、类型(type)
流套接字(SOCK_STREAM):
流套接字提供面向连接且可靠的传输服务。它确保无差错、无重复、按序数据传输,通过使用TCP协议实现。
数据报套接字(SOCK_DGRAM):
数据报套接字提供无连接服务,不保证数据传输的可靠性,数据可能丢失或重复,且接收顺序不确定。它使用UDP协议传输数据。
原始套接字(SOCK_RAW):
原始套接字与标准套接字不同,它能读取内核未处理的IP数据包。标准套接字仅能读取TCP或UDP协议的数据。因此,访问其他协议需使用原始套接字。
三、协议(protocol)
协议用于指定通信协议,如使用默认协议(0)、TCP(IPPROTO_TCP)或UDP(IPPROTO_UDP)。
四、socket缓冲区以及阻塞模式
1、缓冲区简介
每个socket创建后,分配输入与输出缓冲区。write()/send()先将数据写入缓冲区,TCP协议负责发送至目标机器。read()/recv()从缓冲区读取数据。
2、使用write()/send()发送数据
【阻塞模式下】:
检查缓冲区,空间不足时阻塞,直至数据发送完毕或缓冲区空间足够。如果TCP发送数据,输出缓冲区锁定,直至解锁才允许写入。
【非阻塞模式下】:
数据拷贝至缓冲区,缓冲区空间不足时返回成功拷贝大小。若为0,返回-1并设置errno为EAGAIN。
3、使用read()/recv()读取数据
【阻塞模式下】:
检查缓冲区,有数据则读取,无数据阻塞直至数据到达。
【非阻塞模式下】:
接收数据时可能遇到“Resource temporarilyunavailable”错误,返回EAGAIN。此错误不影响同步,循环recv继续。
五、面试题:TCP服务端一直sleep,客户端发送数据问题
1、TCP发送数据过程:
TCP确保按序、无差错接收数据。服务端sleep不接收数据,客户端持续write,输入缓冲区和输出缓冲区最终会满,write无法继续。
2、阻塞方式:
服务端sleep,客户端write导致数据积压,直至缓冲区满或数据发送完毕。
3、非阻塞方式:
服务端sleep,客户端write返回-1并设置errno为EWOULDBLOCK,表示缓冲区空间不足。
总结,套接字是不同主机间进程通信的约定,通过特定的域、类型和协议定义。缓冲区管理数据传输,阻塞或非阻塞模式控制I/O操作。理解这些概念有助于解决网络编程中的问题。