判断TCP包是否发送成功

send()

对发送端而言, 用户空间调用send(data)等发送接口将数据发送, 内核会将data拷贝到内和空间的socket对应的缓冲中, 而send()函数的返回值仅仅是表示本次send()调用中成功拷贝的字节数, 具体的发送和接收端的接收就由TCP协议完成.

判定是否接收成功

  1. 查看接收端是否回复应答消息.

  2. 计算发送端socket已发送数量, 利用接口ioctl(tcp_socket, SIOCOUTQ, &value).

TCP与UDP

经过UDP封装后的数据称为UDP数据包, UDP对应用程序数据的封装与TCP类似. 不同的是, UDP无需为应用层数据保存副本, 因为它提供的是不可靠服务, 发送后就会在内核空间的缓冲区中删除. 如果应用程序检测到该数据报未被接收端正确接收, 并打算重发这个包, 就需要应用程序重新通过用户空间将数据拷贝到内核的UDP发送缓冲区.