The behavior of send() and recv() in socket commun

2020-07-22 04:24发布

问题:

The following is the setup:

Server         Client
 |                |
accept         connect
 |                |
 v                |
send msg1->       | 
 |                |
 v                v
recv    <-     send
 |                |
 v                v
send msg2->    recv
 |                |
 v                v
               close

Here is my question:
1. Client actually receives msg1 before it closes, why is it like this?
2. send msg2 returns normally. Since client closes after receiving msg1, why is send msg2 successful?

P.S. I'm using stream socket for TCP.

回答1:

  1. The recv function will get whatever is next in the receive buffer. In the case of the client, if the socket is a datagram socket, what is next is msg1. If it is a stream socket then message boundaries are not maintained so the recv could include data from both msg1 and msg2 if msg2 has arrived and there is room for both in the recv buffer.

  2. send does not wait for the other side to recv the message, it just adds it to the send queue. It does not know at that point whether the client will close the connection before reading it. If you need to know that you should have the client send a response to acknowledge the message.



回答2:

After your connection is set up, the OS manages the packets entering and leaving your system, the recv() call just reads the packet buffer, and the send() call just queues the packets.