- 论坛徽章:
- 0
|
大家好,我现在遇到了一个问题,请大家帮忙看下。
我使用socket编程,TCP连接,做服务器。在客户端连接上之后,只要客户端退出,服务器端的软件也随之终止,这个问题该如何解决?
代码如下:
while (1)
{
if ((netlistenfd = InitSndSocket(&serverinfo,port)) > 0) //函数在下方
{
break;
}
}
SetBlock_Srv(netlistenfd,1);//函数在下方
if (bind(netlistenfd,(struct sockaddr*)&serverinfo,sizeof(serverinfo))<0)
{
printf("bind to port %d failure!\n",port);
exit(-1);
}
if (listen(netlistenfd,LISTENQUEUE) < 0)
{
printf("call listen failure!\n");
exit(-1);
}
DBG("Entering netlisten main loop.\n");
while(1)
{
clientinfolength = sizeof(clientinfo);
printf("listening......................\n");
netlistenclifd = accept(netlistenfd,(struct sockaddr*)&clientinfo,&clientinfolength);
printf("accept link : socket id:%d\n",netlistenclifd);
if (netlistenclifd < 0)
{
printf("error comes when call accept!\n");
}
else
{
if (pthread_create(&netsndThread, &pattr, netsndThrFxn, &netsndEnv)) //创建一个新线程处理,线程函数在本楼底部和第9楼都给了
{
ERR("Failed to create video thread\n");
cleanup(EXIT_FAILURE);
}
}
}
int InitSndSocket(struct sockaddr_in *serverinfo, int port)
{
int socketid = 0;
struct sockaddr_in serverfd;
// UDP Sockets
if((socketid=socket(AF_INET,SOCK_STREAM,0))<0) //SOCK_DGRAM
{
fprintf(stderr,"InitSndSocket() create socket: %d FAIL\n",socketid);
return(-1);
}
/// Initialize Socket Informations
memset((char *)&serverfd,0,sizeof(serverfd));
serverfd.sin_family=AF_INET;
serverfd.sin_addr.s_addr = htons(INADDR_ANY);//tcp server
serverfd.sin_port=htons(port);
*serverinfo = serverfd;
return(socketid);
}
int SetBlock_Srv(int fd,int flag)
{
int flags;
if((flags=fcntl(fd,F_GETFL,0))==-1)
{
perror("fcntl");
return -1;
}
if(flag==0)
{
// Non Block Socket
fcntl(fd,F_SETFL,flags|O_NDELAY);
}
else if(flag==1)
{
// Block Socket
fcntl(fd,F_SETFL,flags&~O_NDELAY);
}
return 0;
}
void *netsndThrFxn(void *arg)
{
NetsndBufferElement wFlush = { NETSND_FLUSH };
NetsndEnv *envp = (NetsndEnv *) arg;
void *status = THREAD_SUCCESS;
NetsndBufferElement we;
int i = 0,k = 0;
int netsndclifd = envp->socketid;
DBG("Message Send Thread Start\n");
DBG("Entering netsnd main loop.\n");
/// Message Send Loop
while (1)
{
if (FifoUtil_get(&envp->inFifo, &we) == FIFOUTIL_FAILURE) //获取数据,用于发送
{
ERR("fail:FifoUtil_get\n");
breakLoop(THREAD_FAILURE);
}
if (we.id == NETSND_FLUSH)
{
ERR("fail:NETSND_FLUSH\n");
breakLoop(THREAD_SUCCESS);
}
if (we.id != NETSND_PRIME && we.frameSize)
{
DBG("frameSize:%d\n",we.frameSize);
k = we.frameSize / 1400;
if(k)
{
for(i = 0;i < k;i++)
{
if ( send(netsndclifd, (char *)(we.encodedBuffer + i * 1400), 1400, 0) < 0 )
{
/* send error */
ERR("Error send the encoded data to network\n");
}
}
}
if ( send(netsndclifd, (char *)(we.encodedBuffer + k * 1400), we.frameSize - k * 1400, 0) < 0 )
{
/* send error */
ERR("Error send the encoded data to network\n");
}
}
else
{
we.id = NETSND_NORMAL;
}
if (FifoUtil_put(&envp->outFifo, &we) == FIFOUTIL_FAILURE) //通知其他线程,数据已经读取
{
ERR("Failed to put buffer in output fifo\n");
breakLoop(THREAD_FAILURE);
}
}
return status;
}
[ 本帖最后由 xinuaile2003 于 2009-3-6 08:52 编辑 ] |
|