read
和 write
是通用的 I/O 操作系统调用函数,可以用于操作文件、设备、管道、以及套接字等。send
和 recv
是专门为套接字设计的函数,通常在网络编程中使用。也就是write函数是网络编程的基本函数,客户端与服务端,一端通过write写入数据,另一端通过read读取数据,从而实现网络间通信。
阻塞模式与非阻塞模式的区别
当你使用 write
或 send
函数向一个套接字发送数据时,发送的数据首先会被放入内核中的发送缓冲区。如果发送缓冲区已满,那么接下来的数据写入行为会受到影响,这就是阻塞模式与非阻塞模式的区别所在。
-
阻塞模式:
- 默认情况下,套接字是阻塞模式的。在这种模式下,如果发送缓冲区已满,
write
函数会阻塞,即程序会暂停执行,直到缓冲区有足够空间接收新的数据为止。函数会在写入成功后返回,返回值是实际写入的字节数。 - 这种模式确保数据可以完整发送,但如果网络传输速度较慢或接收方处理缓慢,可能会导致发送方程序在这段时间内无法继续执行其他操作。
- 默认情况下,套接字是阻塞模式的。在这种模式下,如果发送缓冲区已满,
-
非阻塞模式:
- 在非阻塞模式下,
write
函数会立即返回。如果发送缓冲区已满,write
不会等待缓冲区释放空间,而是返回-1
并设置errno
为EAGAIN
或EWOULDBLOCK
,提示调用者当前不能立即完成写入操作。 - 非阻塞模式适合需要处理并发任务的场景,比如服务器需要同时处理多个客户端连接。程序可以继续执行其他任务而不被阻塞。
- 在非阻塞模式下,