...
关于tcp 连接的一些问题,当客户端连接上服务器后,服务器会停止在recv()函数等待,此时会有一下几种情况:
(1)当客户端突然终止连接时,recv()函数会返回一个小于0的整数,int ret = recv(); ret 小于0,此时可以判断后
让子进程结束,避免浪费资源。
(2)当多个进程的套接字进程创建后,如果,连接端没有意外断开,一直连接着,但一直不给服务器发送请求。这时候
大概2分钟左右,系统就会自动去检查,服务器的连接函数。如果客户端没有在2分钟内给服务器发送请求,则服务器中的系统
就会读到recv()函数的返回值为0.然后系统就会自动断开此进程的客户端连接,避免客户端一直连着却不请求从而浪费资源。
/*
char buf[1024]= {0};
printf(“start %s\n”,buf);
ret = recv(conn,buf,1024,0);
printf(" is who %s\n",buf);
if(ret< 0)
{
//continue;
printf(“cli conn error \n”);
exit(1);
}
if(0 == ret)
{
printf(“ser break error\n”);
exit(1);
}
*/
//客户端连接后一直不请求,会出现如下结果
start
is who
ser break error
the cli number is 1 //此句表明还有一个子进程
child over
is who
ser break error
the cli number is 0 //此句表明没有子进程
child over
/*
if(0 == ret)
{
printf(“ser break error\n”);
exit(1);
}*/
如果将此段注释后,2分钟子进程还是会被,kill ,并且被自己调用的函数回收,
而且不打印执行 printf(“ser break error\n”);
则可以说明,不是因为浏览器发送了请求,却没有发送正文,recv()函数才 返回0 ,来使子进程退出的。
可以说明,避免资源浪费的机制是由系统维护来完成的。