MSG_MORE 标志本质上意味着追加而不发送,调用者有更多数据要发送。一旦确定datagram 准备好实际发送,send() 会在没有MSG_MORE 的情况下被调用,并且带有所有附加的datagram 会被发送。但是如果发生错误,任何一直在增长的数据报都将不复存在。
char msgs[][20] = {"msg1", "message2","more messages", "yet another message"};
//scenario1 normal, no errors
send(s, msgs[0], strlen(msgs[0]+1,MSG_MORE);//datagram is started
send(s, msgs[1], strlen(msgs[1]+1,MSG_MORE);//datagram is appended
send(s, msgs[2], strlen(msgs[2]+1,MSG_MORE);//datagram is appended
send(s, msgs[3], strlen(msgs[3]+1,0);//dategram is appended and sent
//scenario2, with errors
send(s, msgs[0], strlen(msgs[0]+1,MSG_MORE);//datagram is started
send(s, msgs[1], strlen(msgs[1]+1,0);//dategram is appended and send
send(s, msgs[2], strlen(msgs[2]+1,MSG_MORE);//error occurs, datagram lost.
send(s, msgs[3], strlen(msgs[3]+1,0);//dategram is sent, but only `msgs[3]`
//scenario3 with errors at end
send(s, msgs[0], strlen(msgs[0]+1,MSG_MORE);//datagram is started
send(s, msgs[1], strlen(msgs[1]+1,MSG_MORE);//datagram is appended
send(s, msgs[2], strlen(msgs[2]+1,MSG_MORE);//datagram is appended
send(s, msgs[3], strlen(msgs[3]+1,0);//error occurs here, datagram lost.
这就是无网走钢丝的危险。网络的一种可能性是在您调用send/MSG_MORE 命令时将消息并行附加到缓冲区。保留它,直到您成功发送您的datagram。如果失败,将缓冲区打包并重新发送(不带MSG_MORE)。