1. Send 缓冲区满时阻塞代码:
Send底层调用函数tcp_sendmsg:
tcp_sendmsg: 。。。。。。。。。。。。。。。。。。。。。。。。。。。。。 new_segment: /* Allocate new segment. If the interface is SG, * allocate skb fitting to single page. */ if (!sk_stream_memory_free(sk)) goto wait_for_sndbuf;
。。。。。。。。。。。。。。。。。。。。。 wait_for_sndbuf: set_bit(SOCK_NOSPACE, &sk->sk_socket->flags); wait_for_memory: if (copied) tcp_push(sk, flags & ~MSG_MORE, mss_now, TCP_NAGLE_PUSH);
if ((err = sk_stream_wait_memory(sk, &timeo)) != 0) goto do_error;
mss_now = tcp_send_mss(sk, &size_goal, flags); } }
out: if (copied) tcp_push(sk, flags, mss_now, tp->nonagle); TCP_CHECK_TIMER(sk); release_sock(sk); return copied;
do_fault: if (!skb->len) { tcp_unlink_write_queue(skb, sk); /* It is the one place in all of TCP, except connection * reset, where we can be unlinking the send_head. */ < |