<html><head><meta http-equiv="Content-Type" content="text/html charset=us-ascii"></head><body style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space;"><div><blockquote type="cite"><div><div style="background-color: rgb(255, 255, 255); font-family: verdana, helvetica, sans-serif; font-size: 10pt; position: static; z-index: auto;"><div class="" style="font-size: 13.3333px; font-family: verdana, helvetica, sans-serif; background-color: transparent; font-style: normal;">I tried to fix the problem by this way:</div><div class="" style="font-size: 13.3333px; font-family: verdana, helvetica, sans-serif; background-color: transparent; font-style: normal;"><br style="" class=""></div><div class="" style="font-size: 13.3333px; font-family: verdana, helvetica, sans-serif; background-color: transparent; font-style: normal;">-      sendResult = send(socketNum, (char const*)(&data[numBytesSentSoFar]), numBytesRemainingToSend, 0/*flags*/);<br style="" class="">+      <br style="" class="">+      do {<br style="" class="">+           sendResult = send(socketNum, (char const*)(&data[numBytesSentSoFar]), numBytesRemainingToSend, 0/*flags*/);<br style="" class="">+      } while(sendResult == -1 && envir().getErrno() == EAGAIN);<br style="" class=""></div></div></div></blockquote><div><br></div>No, you can't do this (and there's not a 'problem' that needs fixing)!  If the TCP connection gets blocked permanently (e.g., because the receiving client has stopped running, or has a cable disconnected), then you can't just sit in a loop, attempting to send() over and over again.  That would starve out all other server activity.</div><div><br></div><div>There's no 'bug' or 'problem' here.  The "EAGAIN" error occurs when the sending OS's TCP buffer is full - which occurs if the stream's bitrate exceeds (at least temporarily) the capacity of the TCP connection.  When this happens, the only solution is to discard outgoing data.  Our code does so by ensuring that if/when data gets discarded, the discarded data will be a complete RTP (or RTCP) packet - equivalent to the loss of a packet if you were streaming over UDP.</div><div><br></div><div>Some people seem to think that streaming over TCP is a 'magic wand' that will avoid all data loss, regardless of the bitrate of your stream and the capacity of your network.  But that's impossible.  If your stream's bitrate exceeds the capacity of your network, you *will* lose data.  The only way to prevent this is either to transmit a slower stream, or use a faster network.</div><div><br></div><div>Yet again, let me remind everyone that streaming over TCP is something that you should be doing *only* if you are behind a firewall that blocks UDP packets</div><br><div apple-content-edited="true">
<span class="Apple-style-span" style="border-collapse: separate; color: rgb(0, 0, 0); font-family: Helvetica; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: normal; orphans: 2; text-align: -webkit-auto; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; -webkit-border-horizontal-spacing: 0px; -webkit-border-vertical-spacing: 0px; -webkit-text-decorations-in-effect: none; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px;  "><span class="Apple-style-span" style="border-collapse: separate; color: rgb(0, 0, 0); font-family: Helvetica; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: normal; orphans: 2; text-align: -webkit-auto; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; -webkit-border-horizontal-spacing: 0px; -webkit-border-vertical-spacing: 0px; -webkit-text-decorations-in-effect: none; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px;  ">Ross Finlayson<br>Live Networks, Inc.<br><a href="http://www.live555.com/">http://www.live555.com/</a></span></span>
</div>
<br></body></html>