免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 897 | 回复: 7
打印 上一主题 下一主题

我实在是没办法了 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2004-09-26 10:09 |只看该作者 |倒序浏览
struct timespec reg;
        struct timeval regm;
        reg.tv_sec = 0;
        reg.tv_nsec = 500000000;
        regm.tv_sec = 10;
        regm.tv_usec = 0;
        fd_set rset;
        sock_descriptor = socket(AF_INET,SOCK_STREAM,0);
        if (sock_descriptor == -1){
          perror("call to socket";
              exit(1);
        }
        bzero(&sin,sizeof(sin));
        sin.sin_family = AF_INET;
        sin.sin_addr.s_addr = INADDR_ANY;
        sin.sin_port = htons(port);
        if (bind(sock_descriptor,(struct sockaddr *)&sin,sizeof(sin)) ==-1)
        {
                perror("call to bind";
        }
       
                strcat(tbuff,"received ... testing,";
  
        if (listen(sock_descriptor,1) == -1)
        {
                perror("call to listen";
        }
        for(;{
            FD_ZERO(&rset);
            FD_SET(sock_descriptor,&rset);
            retval = select(sock_descriptor + 1,&rset,NULL,NULL,&m);      
                if(retval){
        printf ("Accepting connections....\n";
        if( (temp_sock_descriptor = accept(sock_descriptor,(struct sockaddr *)&pin,&address_size)) == -1){
                printf("call to accept";
        }
        while(1){
                memset(buff,0,sizeof(buff));
                if ((lens = recv(temp_sock_descriptor,buff,sizeof(buff),0)) == -1){
                        printf("call to recv...\n";
                        break;
                }
                printf("lens==%d\n",lens);
                printf("client from:%s\n",inet_ntoa(pin.sin_addr));
                a = buff;
                Decode(a,lens);
                //nanosleep(&,NULL);
                if ((len = send(temp_sock_descriptor,buff,sizeof(buff),0)) == -1){
                        printf("call to send....\n";
                        break;
                }
                i++;
        }
    }else{
                printf("no data!\n";
                break;
                }

问了好几次,大家都说用select,但是现在这个问题还是依旧。我这是一对一通讯,但是客户端一关闭,我的这个服务端也跟着关闭。还有就是设置超时,屏幕输出了no data!之后又是关闭,我的break怎么都不能跳出这个for循环,继续监听是否有新的套接字呢?难道要用goto语句?
请大家给点具体的代码指点一下

论坛徽章:
0
2 [报告]
发表于 2004-09-26 10:32 |只看该作者

我实在是没办法了

更改了一下代码,将no data下的break去掉。发现,除了第一调用select是阻塞外,后面如果select的返回值是非正数的再次调用select,select就不是阻塞了

论坛徽章:
0
3 [报告]
发表于 2004-09-26 11:00 |只看该作者

我实在是没办法了

while(accept(...)){
  select..
  recv...
  send...
}

论坛徽章:
0
4 [报告]
发表于 2004-09-26 11:18 |只看该作者

我实在是没办法了

请教楼上的,那你select啊,recv之类的第一个参数应该用的是accept的返回值啊
如果拔开了网线,再插回去,服务端也会挂掉。这个怎么处理啊?

论坛徽章:
0
5 [报告]
发表于 2004-09-27 11:04 |只看该作者

我实在是没办法了

顶一下

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
6 [报告]
发表于 2004-09-27 11:28 |只看该作者

我实在是没办法了

请修改一下帖子的标题,给些面子,OK?

论坛徽章:
0
7 [报告]
发表于 2004-09-27 16:56 |只看该作者

我实在是没办法了

已经改了标题
我这样用select(sock_descriptor + 1,&rset,NULL,NULL,&m);
这个超时起了个什么作用啊?我觉得它根本就没有发挥作用

论坛徽章:
0
8 [报告]
发表于 2004-10-06 11:29 |只看该作者

我实在是没办法了

if ((len = send(temp_sock_descriptor,buff,sizeof(buff),0)) == -1)
这里,如果将sizeof(buff)改为strlen(buff)的话,当客户端断开的时候,我的服务端到达不了select,只在内部进行for循环,根本不阻塞,请问这是怎么回事,为什么会有这样的影响的?
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP