Socket TCP 和 UDP最大的区别就是:
UDP 套接字没有 listen
TCP 套接字使用recv()/send(), UDP 套接字使用 recvfrom()/sendto()
TCP关闭的两种方式
- 主动关闭一段发送 FIN, 被动关闭一段回应 ACK,并发送 FIN, 主动关闭一端发送 ACK。这是优雅的关闭连接,保证所有数据都能正确发送接收。
- 一方发送 RST, 对方收到该报文,立刻断开连接。
shutdown()和close()的区别
- 调用close(), 它会将文件描述符的调用减一,仅在该计数变为 0 的时候才关闭套接字; 而 shutdown() 将直接激发TCP 关闭套接字。
- close()终止读和写两个方向的传输;shutdown() 可以选择只关闭 读 或者 写 或者读写都关闭。
recv()返回的三种情况
- 如果对端发送 TCP 数据, 套接字变为可读,返回一个大于0的数,这个数就是对方发送数据的字节数。
- 如果对端发送 FIN, 套接字变为可读, 返回 0(EOF), 表示对方关闭连接。
- 如果对端发送 RST(对端主机崩溃,并重新启动), 套接字变为可读, 返回 -1, errno包含明确的错误码。