如何判断TCP包是否发送成功
1. TCP发送接口:send() TCP发送数据的接口有send,write,sendmsg。在系统内核中这些函数有一个统一的入口,即sock_sendmsg()。由于TCP是可靠传输,所以对TCP的发送接口很容易产生误解,比如sn = send(...); 错误的认为sn的值是表示有sn个字节的数据已经发送到了接收端。其实真相并非如此。 我们知道,TCP的发送和接收在在内核(linux)中是有对应的缓冲的: struct sock{ ... struct sk_buff_head receive_queue; //接收的数据报队列 struct sk_buff_head write_queue; //即将发送的数据报队列 ... } 对于发送端而言,用户空间调用send(data)等发送接口将数据发送, 内核会将data拷贝到内核空间的socket对应的缓冲中,即sock.write_queue。而send()函数的返回值仅仅是表示本次send()调用中成功拷贝的字节数(用户空间->内核空间对应的sock缓冲队列) 。 具体发送和接收端的接收就由TCP协议完成 ,虽然TCP是可靠传输,但是这个前提是发送端和接收端的网络是连接的,否则你懂得。这样,对于调用send()发送的用户而言,如果想要确定接收方是否成功接受数据,就得需要靠其他的办法查询。 2. send(