成都网站建设的定位,wordpress导航栏文字大小不一,设计师培训经历怎么写,微博营销案例1. TCP发送接口#xff1a;send() TCP发送数据的接口有send#xff0c;write#xff0c;sendmsg。在系统内核中这些函数有一个统一的入口#xff0c;即sock_sendmsg()。由于TCP是可靠传输#xff0c;所以对TCP的发送接口很容易产生误解#xff0c;比如sn send(...); 错误…1. TCP发送接口send() TCP发送数据的接口有sendwritesendmsg。在系统内核中这些函数有一个统一的入口即sock_sendmsg()。由于TCP是可靠传输所以对TCP的发送接口很容易产生误解比如sn send(...); 错误的认为sn的值是表示有sn个字节的数据已经发送到了接收端。其实真相并非如此。 我们知道TCP的发送和接收在在内核(linux)中是有对应的缓冲的 [cpp] view plain copy 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()阻塞和非阻塞
前面已说过snsend(data)负责将数据拷贝到内核空间而具体发送是有tcp后续完成这里面就包括流量控制等。对已阻塞和非阻塞仅仅是对于数据从用空空间拷贝到内核空间的发送缓冲这段期间而言的。 1. 如果发送缓冲剩余空间大于欲发送data的字节数对于阻塞和非阻塞而言都能成功将数据拷贝至内核缓冲返回的sn即等于欲发送的数据的字节数。 2.如果发送缓冲剩余空间小于欲发送data的字节数 a. 那么阻塞模式会进行阻塞等待内核缓冲的空闲空间然后继续将数据拷贝到内核缓冲中直到全部拷贝为止。返回rn即为data的数据量。 b. 非阻塞模式当内核发送缓冲被填满后立即返回。rn等于data中已被拷贝到发送缓冲的数据量。
3. 如何判定接收成功接收数据 1.接收端回复应答信息。 这个方法比较土但也是比较实用的。 2.计算发送端sock已发送数据量 可参考如何判断TCP数据包是否发送成功 作者提到可以使用 ioctl接口ioctl(tcp_socket, SIOCOUTQ, value);