1,最近做MP3推流中发现一拔掉网线整个程序就闪退,纠结其原因是librtmp 中 在rtmp.c中
WriteN(RTMP *r, const char *buffer, int n) 方法中
nBytes 为-1 时 会关掉socket 但是网线拔了关不掉 librtmp 会一直循环发送 直到程序崩溃为止
WriteN(RTMP *r, const char *buffer, int n) {
const char *ptr = buffer;
#ifdef CRYPTO
char *encrypted = 0;
char buf[RTMP_BUFFER_CACHE_SIZE];
if (r->Link.rc4keyOut)
{
if (n > sizeof(buf))
encrypted = (char *)malloc(n);
else
encrypted = (char *)buf;
ptr = encrypted;
RC4_encrypt2(r->Link.rc4keyOut, n, buffer, ptr);
}
#endif
while (n > 0) {
int nBytes;
if (r->Link.protocol & RTMP_FEATURE_HTTP)
nBytes = HTTP_Post(r, RTMPT_SEND, ptr, n);
else
nBytes = RTMPSockBuf_Send(&r->m_sb, ptr, n);
/*RTMP_Log(RTMP_LOGDEBUG, "%s: %d\n", __FUNCTION__, nBytes); */
//当突然拔掉网线nBytes 为-1会执行RTMP_Close
if (nBytes < 0) {
int sockerr = GetSockError();
RTMP_Log(RTMP_LOGERROR, "%s, RTMP send error %d (%d bytes)", __FUNCTION__,
sockerr, n);
if (sockerr == EINTR && !RTMP_ctrlC)
continue;
RTMP_Close(r);//前去关闭
n = 1;
break;
}
if (nBytes == 0)
break;
n -= nBytes;
ptr += nBytes;
}
#ifdef CRYPTO
if (encrypted && encrypted != buf)
free(encrypte