服务器 几秒钟 处理一客户端

wuyanchao 2009-07-22 02:21:13
小弟,刚刚接触网络编程这块,碰到一个问题,服务器的代码 在运行过程有时会出错,原因在于 客户端那边,如果突然出错,服务器的代码 没有执行完 全部的代码 导致出错。
所以 我在想 有没有让服务器在规定时间,比如5秒处理完一个客户端,然后就结束,如果没有处理完,也强制关闭此连接。谢谢了,不胜感激~代码最好用c的
...全文
80 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
movaxeffext 2010-06-01
  • 打赏
  • 举报
回复
while(1)
{
int ret;//return select
printf("start\n");
memset(mbuf,0,MB);
new_fd=accept(sock_fd,(struct sockaddr *)&their_addr,&len);
if (new_fd<=0)
{
perror("accept");
continue;
}
printf("accept1\n");

while(1)
{

FD_ZERO(&fdsr);//read

FD_SET(new_fd,&fdsr);
tv.tv_sec=30;
tv.tv_usec=0;

ret=select(new_fd+1, &fdsr, NULL, NULL, &tv);

if (ret== -1)
{
perror("select1");
break;

}
else if (ret== 0)
{
//printf("timeout close\n");

break;

}
else
{

if (FD_ISSET(new_fd,&fdsr))
{
int i=0;
char tem[1000];
memset(tem,0,1000);

len = recv(new_fd,tem , 6, 0);//先收取数据长度
//strcat(mbuf,tem);
//printf("\n接受长度:%s\n",tem);




if (len > 0)
{
char a[10];
memset(a,0,10);
strncpy(a,tem,6);
//printf("a%s\n",a);
int datalen=atoi(a);
printf("datalen:%d\n",datalen);

if(datalen>1000)
{
if((10000<datalen) && (datalen<=80000))
sleep(1);

else if(datalen<=120000)
sleep(2);
else
sleep(3);
int f1=0,f2=0,f3=0;
for(i=0;i<datalen-1000;i=i+1000)
{
memset(tem,0,1000);
recv(new_fd,tem,1000,0);
strncat(mbuf,tem,strlen(tem));

if(strlen(mbuf)>=25000&&f1==0)
{sleep(3);f1=1;}
if(strlen(mbuf)>=50000&&f2==0)
{sleep(2);f2=1;}
if(strlen(mbuf)>=75000&&f3==0)
{sleep(2);f3=1;}
if(strlen(mbuf)>=100000&&f3==0)
{sleep(2);f3=1;}

//printf("tem:%slen:%d\n",tem,strlen(tem));



}
}
memset(tem,0,1000);
//printf("剩下:%d\n",datalen-i);
recv(new_fd,tem,datalen-i,0);
printf("last content:%slast len:%d\n",tem,strlen(tem));
strncat(mbuf,tem,strlen(tem));

//printf("111接收消息成功,共%d个字节的数据\n",strlen(mbuf));

if(Analyze_Header(mbuf)>=0)
{
printf("Succeed\n");
break;
}
else
{
printf("Fail\n");
break;
}
}

else {
if (len < 0)
printf
("消息接收失败!错误代码是%d,错误信息是'%s'\n",
errno, strerror(errno));
else
printf("对方退出了,终止\n");
break;
}

}




}
}
memset(mbuf,0,MB);

close(new_fd); //clear

FD_CLR(new_fd, &fdsr);

}




}
gunsand 2009-07-22
  • 打赏
  • 举报
回复
5秒太JB慢了。 处理数据至少要毫秒级的。 否则用户多了怎么办。
5秒后自动切断连接当然可以的。 我有比较好的SERVER架构代码 。你要是有兴趣发站内消息给我。
iambic 2009-07-22
  • 打赏
  • 举报
回复
你这属于逃避问题,结果只会制造更多的问题。找本好点的书好好看看吧。
emyueguang 2009-07-22
  • 打赏
  • 举报
回复
Sleep(5000); //休息5秒
closesocket(s); //断开链接
emyueguang 2009-07-22
  • 打赏
  • 举报
回复
在C中关闭一个SOCKET用closesocket函数
int closesocket(SOCKET s);
--说明
closesocket函数用来关闭一个描述符为s套接字。由于每个进程中都有一个套接字描述符表,表中的每个套接字描述符都对应了一个位于操作系统缓冲区中的套接字数据结构,因此有可能有几个套接字描述符指向同一个套接字数据结构。套接字数据结构中专门有一个字段存放该结构的被引用次数,即有多少个套接字描述符指向该结构。当调用closesocket函数时,操作系统先检查套接字数据结构中的该字段的值,如果为1,就表明只有一个套接字描述符指向它,因此操作系统就先把s在套接字描述符表中对应的那条表项清除,并且释放s对应的套接字数据结构;如果该字段大于1,那么操作系统仅仅清除s在套接字描述符表中的对应表项,并且把s对应的套接字数据结构的引用次数减1。
closesocket函数如果执行成功就返回0,否则返回SOCKET_ERROR
wuyanchao 2009-07-22
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 crst_zh 的回复:]
你先看看TCP/IP断开的过程(四次握手)。
[/Quote]
怎么说? 5m后,直接 断开 怎么写代码
crst_zh 2009-07-22
  • 打赏
  • 举报
回复
你先看看TCP/IP断开的过程(四次握手)。
wuyanchao 2009-07-22
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 crst_zh 的回复:]
应该是从容关闭的问题吧。
这样的话你可以考虑使用UDP方式可能更高,由高层来保证可靠性
[/Quote]
怎么从容关闭? 怎么检测?
crst_zh 2009-07-22
  • 打赏
  • 举报
回复
应该是从容关闭的问题吧。
这样的话你可以考虑使用UDP方式可能更高,由高层来保证可靠性

64,644

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧