免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: gloriajie
打印 上一主题 下一主题

socket的io操作为什么有的时候会阻塞? [复制链接]

论坛徽章:
0
11 [报告]
发表于 2004-09-12 20:46 |只看该作者

socket的io操作为什么有的时候会阻塞?

把代码帖出无妨啊?
这样问题很快就被发现了。

论坛徽章:
0
12 [报告]
发表于 2004-09-13 01:22 |只看该作者

socket的io操作为什么有的时候会阻塞?

代码挺长的,有耐心的朋友看看吧.
server(要在openvms中运行)
void main()
{
   printsystime(systime); //将系统时间放在systime数组里并打印出来
   sock=socket(AF_INET, SOCK_STREAM,0);  //建立套接字
   if(sock<0)   
   {  perror("opening stream socket failed/n";
       exit(0);}
     setsockopt(sock,SOL_SOCKET,SO_SNDBUF,(const char*)& Sndbuf,sizeof(int));
     server.sin_family=AF_INET;   
     server.sin_port=htons(8800);           
     server.sin_addr.S_un.S_addr=htonl(INADDR_ANY);                              
     if(bind(sock,(struct sockaddr *)&server,sizeof(server))<0)
         {   
        perror("binding stream socket";
                closesocket(sock);  
         }
     printf("port #%d\n",ntohs(server.sin_port));
     length=sizeof(server);
     if(getsockname(sock,(struct sockaddr *)&server,&length)<0)
          perror("getting socket name";  
         int time=1;          
     while(true)
    {        
      err=listen(sock,1);  
      printf("listen...";   
      if(err!=0)
      {
        printf("listen failed";
            closesocket(sock);
           }
      len=sizeof(struct sockaddr);            
      msgsock=accept(sock,(struct sockaddr*)&tcpaddr,(int *)&len);
      if (msgsock==-1)
            perror("accept failed\n";
      else
          {                      
                 if(time==2)  //从第二次开始就发送数据
                 {
                    printsystime(buf);
                    GetChar(data0,buf,DATAnum);
                    rval=send(msgsock,buf, sizeof(buf),0);
                    if(rval<=0)perror("接收出错";                           
                    if(rval>;0)printf
                                      ("sendsuccessful );                                                     }
                 if(time==1)//第一次就接受数据
                 {
                         printf("begin to recv\n";
                         memset(buf,0,sizeof(buf));                 
                         rval=recv(msgsock,buf,10000,0);
                         if(rval>;0)
                         {分析接收到的数据;
                         time=2;} //下一次发送数据          
                         else printf("recv error\n";                                 
                   }
             closesocket(msgsock);               
          }          
        }
    closesocket(sock);
}

论坛徽章:
0
13 [报告]
发表于 2004-09-13 01:40 |只看该作者

socket的io操作为什么有的时候会阻塞?

客户端是在windows里用vc写的,主要是定时(每隔2秒钟)执行:
if(sendorrecv(bbuf,1,true))  //一个函数根据参数不同接收或发送数据
{getFloat(ddata2,bbuf,DATAnum);  //数据转换,buf->;data2
insertdata(bbuf,ddata2,DATAnum,pid);  //将data2内容写入数据库
}

sendorrecv函数主要如下:
   int sock;  //每次定义新的
   sock=socket(AF_INET, SOCK_STREAM,0);  
   server.sin_family=AF_INET;
   server.sin_port=htons(port);//atoi(port)
   server.sin_addr.S_un.S_addr=inet_addr(serverip);   
if(connect(sock,(const sockaddr*)&server,sizeof(server))<0)  
      closesocket(sock);
   else                     //connect成功
{
         int nRcvBuf=10000;
          setsockopt(sock,SOL_SOCKET,SO_RCVBUF,(const char*)&nRcvBuf,sizeof(int));
                           memset(buf,0,10000);   
                           rval=recv(sock,buf,10000,0);
}
if(rval<=0)
{... closesocket(sock);}
if(rval>;0)
                  {
                           closesocket(sock);
                           return(true);                      }

论坛徽章:
0
14 [报告]
发表于 2004-09-13 09:23 |只看该作者

socket的io操作为什么有的时候会阻塞?

recv()<=0不一定是系统错误,需要判断一下错误号,如是WSAEWOULDBLOCK表示系统正常,不需要重新初始化!并且,你的server太简单了,没有超时判断,找找资料吧!

论坛徽章:
0
15 [报告]
发表于 2004-09-14 09:19 |只看该作者

socket的io操作为什么有的时候会阻塞?

是不是应该把while(true)循环中的listen拿到循环的外面来写呢?

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

socket的io操作为什么有的时候会阻塞?

我原来试过放在外面,只能连接一次,我再试试

论坛徽章:
0
17 [报告]
发表于 2004-09-14 09:31 |只看该作者

socket的io操作为什么有的时候会阻塞?

你的变量buf是如何定义的?

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

socket的io操作为什么有的时候会阻塞?

char buf[10000];

哦,listen可以放在循环外面.只要客户端每次connect之前新建一个套接字就行了.

论坛徽章:
0
19 [报告]
发表于 2004-09-14 09:59 |只看该作者

socket的io操作为什么有的时候会阻塞?

你总是调用listen是不对的,循环中应该是accept

论坛徽章:
0
20 [报告]
发表于 2004-09-14 10:43 |只看该作者

socket的io操作为什么有的时候会阻塞?

这个用起来倒是好像没什么问题,起码三天之内,(呵呵,唉)
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP