http传输实时视频流,运行一个半小时,报错connection reset by peer ,连接断开,程序关闭
程序是用来传输实时视频流的,用http协议,多线程,一个线程编码,另一个线程发送数据,运行了几十次了,现象特别稳定,准准的一个半小时,程序就会报错connection reset by peer ,程序就会退出,真不知道这是为什么,两个月了,急死了,求求各位高手了源代码如下:
******************************************************************************
网络程序部分**********************************************************************************
#include <sys/socket.h>
#include <sys/types.h>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <error.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <netdb.h>
#include "comm.h"
#include "network.h"
#include <time.h>
#include <errno.h>
timespec diff(timespec start, timespec end);
int listensd, connectsd;
int sendflag=0;
struct sockaddr_in server;
struct sockaddr_in client;
struct http_send_buff send_buff;
unsigned char *dest;
static char buff[] = "HTTP/1.1 200 OK\r\n"
"connection:keep-alive\r\n"
"Keep-Alive: timeout=60, max=100\r\n"
"server:apache/1.3.14\r\n"
"cache-control:no-cache, must-revalidate, pre-check=0"
"max-age=0\r\n"
"pragma: no-cache\r\n\r\n";
extern pthread_mutex_t mutex;
extern pthread_cond_t cond;
HI_S32 networkinit()
{
int opt;
int nZero=0;
int nSendBuf=1000*1024;
int iBufSize = 0;
socklen_t ilen = 4;
listensd=socket(AF_INET,SOCK_STREAM,0);
if(listensd < 0)
{
perror("Creating listen socket failed!\n");
return HI_FAILURE;
}
printf("1. Socket created.\n");
opt=1;
setsockopt(listensd,SOL_SOCKET,SO_REUSEADDR,&opt,sizeof(opt)); //允许端口重用
int nNetTimeout=10000;//1秒
//发送时限
setsockopt(listensd,SOL_SOCKET,SO_SNDTIMEO,(char *)&nNetTimeout,sizeof(int));
setsockopt(listensd,SOL_SOCKET,SO_SNDBUF,(char *)&nZero,sizeof(nZero));
setsockopt(listensd,SOL_SOCKET,SO_SNDBUF,(const char *)&nSendBuf,sizeof(int));
// getsockopt(listensd, SOL_SOCKET, SO_SNDBUF, &iBufSize, &ilen);
// printf("Linux getsockopt SOL_SOCKET SO_SEDBUF iBufSize:%d", iBufSize);
bzero(&server,sizeof(server));
server.sin_family =AF_INET;
server.sin_port = htons(PORT);
server.sin_addr.s_addr=htonl(INADDR_ANY);
if(bind(listensd,(struct sockaddr *)&server,sizeof(server))<0)
{
perror("bind() error\n");
return HI_FAILURE;
}
printf("2. Socket binded.\n");
if(listen(listensd,5)==-1)
{
perror("listen() error\n");
return HI_FAILURE;
}
printf("3. Listening...\n");
return HI_SUCCESS;
}
HI_S32 networkaccept()
{
socklen_t sin_len;
sin_len=sizeof(client);
if((connectsd=accept(listensd,(struct sockaddr *)&client,&sin_len))<0)
{
perror("accept() error\n");
return HI_FAILURE;
}
printf("4. Accepted!\n");
return HI_SUCCESS;
}
HI_S32 httpinit()
{
char buffer1[1024] = {'\0'};
ssize_t size1;
size1 = read(connectsd, buffer1, 1024);//从网络上读数到buffer 客户端的请求
if (size1 < 0 )
{
perror("read size error\n");
return HI_FAILURE;
}
else if (size1 == 0)
{
printf("read size = 0\n");
}
else
{
printf("buffer1:%s!\n",buffer1);
fflush(stdout);
write(connectsd, buff, strlen(buff));
}
return HI_SUCCESS;
}
HI_S32 networksendn()
{
timespec time3, time4;
HI_S32 SOCKET_NUM;
char buffer1[1024] = {'\0'};
ssize_t size1;
while(1)
{
sem_wait(&sem_send);
loop:if(send_buff.length!=write(connectsd,dest,send_buff.length))
{
perror("network send failed!");
//printf("network send failed!");
if(errno==EINTR)
{
goto loop;
}
else
printf("network send failed!");
}
free(dest);
dest=NULL;
sem_post(&sem_dest);
}
return HI_SUCCESS;
}
******************************************************************************
网络初始化
**********************************************************************************
////网络初始化(kz)
networkinit();
networkaccept();
httpinit();
******************************************************************************
网络发送部分的程序牵扯太多了 就不贴了**********************************************************************************