linux socket recv 出现报错resource temporarily unavailable

发布于 2022-10-15 09:21:25 字数 14173 浏览 27 评论 0

本帖最后由 liyandong106 于 2011-04-17 20:19 编辑

求帮助、

  1. nrecv = recv(fd, bp, data_len, 0);
  2.                 //debug(255)("->%s\n", data);
  3.                 printf("nrecv data_count = %d\n",nrecv);
  4.                 if (nrecv == -1)
  5.                 {
  6.                         if( (errno == EAGAIN)||(errno==EWOULDBLOCK) )
  7.                         {
  8.                                 debug(255)("recv error1\n");
  9.                                 //CloseConn(channel);
  10.                                 //return -1;
  11.                                 break;
  12.                         }
  13.                         else
  14.                         {
  15.                                 debug(255)("recv error2\n");
  16.                                 CloseConn(channel);
  17.                                 return -1;
  18.                         }   
  19.                 }      
  20.                 else if (nrecv == 0 )
  21.                 {   
  22.                         CloseConn(channel);
  23.                         return -1;
  24.                 }
  25. //                data_len-=nrecv;
  26. //                bp+=nrecv;
  27. //        }
  28.                 if(virus == 1)
  29.                 {
  30.                         /*
  31.                         if(check_buf_virus(data, nrecv, "TCP PROXY") == 0)
  32.                         {
  33.                                 CloseConn(channel);
  34.                                 return -1;
  35.                         }
  36.                         */
  37.                         if(clamav_scan_buf(data_count, count_len, "TCP PROXY") == 0)
  38.                         {
  39.                                 CloseConn(channel);
  40.                                 return -1;
  41.                         }
  42.                 }
  43.                 //sleep(30);
  44.                 if(logo == 1)
  45.                 {
  46.                         printf("come in BDProtocolParse\n");
  47.                         ret = BDProtocolParse(data_count,&count_len,&struBase26Info);
  48.                         printf("ret = %d\n",ret);
  49.                        
  50.                
  51.                         total_send = 0;
  52.                         while (total_send!=count_len)
  53.                         {
  54.                                 nsend = send(other_fd, data_count+total_send, count_len-total_send, 0);
  55.                         //        nsend = send(other_fd, data_count, count_len, 0);
  56.                                 if (nsend <= 0)
  57.                                 {
  58.                                         if( errno == EAGAIN )
  59.                                         {
  60.                                                 continue;
  61.                                         }
  62.                                         perror("send");
  63.                                         CloseConn(channel);
  64.                                         return -1;
  65.                                 }
  66.                                 total_send += nsend;
  67.                         }
  68.                         printf("nsen = %d\n",nsend);
  69.                 }
  70.                 else
  71.                 {
  72.                                 //sleep(30);
  73.                         total_send = 0;
  74.                         while (total_send!=nrecv)
  75.                         {
  76.                                 nsend = send(other_fd, data_count+total_send, nrecv-total_send, 0);
  77.                                 if (nsend <= 0)
  78.                                 {
  79.                                         if( errno == EAGAIN )
  80.                                         {
  81.                                                 continue;
  82.                                         }
  83.                                         perror("send");
  84.                                         CloseConn(channel);
  85.                                         return -1;
  86.                                 }
  87.                                 total_send += nsend;
  88.                         }
  89.                         printf("nsen = %d\n",nsend);
  90.                 }
  91.                 FD_ZERO(&rfds);
  92.                 FD_SET(channel->conn_sd, &rfds);
  93.                 FD_SET(channel->server_sd, &rfds);
  94.                 sd_max = channel->conn_sd>channel->server_sd? channel->conn_sd : channel->server_sd ;
  95.                 tv.tv_sec = 2;
  96.                 tv.tv_usec = 0;
  97.                 ret = select( sd_max+1, &rfds, NULL, NULL, &tv);
  98.                 if (ret < 0)
  99.                 {
  100.                         perror("2. Select:");
  101.                         debug(1)("2. select() error\n");
  102.                         CloseConn(channel);
  103.                         return -1;
  104.                 }
  105.                 else if(ret == 0)
  106.                 {
  107.                         debug(255)("timeout\n");
  108.                         break;
  109.                 }
  110.                 if ( FD_ISSET(channel->conn_sd, &rfds) )
  111.                 {
  112.                         channel->status = ST_CLIENT_READ_READY;
  113.                 }
  114.                 if ( FD_ISSET(channel->server_sd, &rfds) )
  115.                 {
  116.                         channel->status = ST_SERVER_READ_READY;
  117.                 }
  118.         }
  119.         free(data_count);
  120.         notify.sd_local = channel->conn_sd;
  121.         notify.sd_remote = channel->server_sd;
  122.         notify.from = THREAD_WORK;
  123.         notify.context = channel->context;
  124.         move_to_spare_pool(channel);
  125.         dispatch_local_ev(notify, thread_info);
  126.         return 0;
  127. }

复制代码

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(9

桃气十足 2022-10-22 09:21:25

你是把sockfd设为了nonblock了吧?

用while循环:
while( -1 == recv() && EAGAIN != errno )

紫南 2022-10-22 09:21:25

回复 2# osmanthusgfy

    麻烦看一下代码 谢谢

|煩躁 2022-10-22 09:21:25

你在创建socket之后是否调用了fcntl设置sockfd为Nonblock模式?
如果是,解决办法请看之前的回复.

"resource temporarily unavailable"就是errno == EAGAIN对应的错误信息.

客…行舟 2022-10-22 09:21:25

回复 4# osmanthusgfy

    你的意思是用fctl设置成非阻塞模式?

愚人国度 2022-10-22 09:21:25

回复 2# osmanthusgfy

    但是错误是在 else
                        {
                                debug(255)("recv error2\n");
                                CloseConn(channel);
                                return -1;
                        }   里面打印出来的

遮云壑 2022-10-22 09:21:25

是的,如果sockfd设置为非阻塞模式,数据还没有发给接收端时,调用recv就会返回-1,并且errno会被设为EAGAIN.
所以你必须循环调用recv并且检测errno.

风尘浪孓 2022-10-22 09:21:25

回复 7# osmanthusgfy

    但是我下面有select 可以控制描述符

半﹌身腐败 2022-10-22 09:21:25

回复  osmanthusgfy

    但是我下面有select 可以控制描述符
liyandong106 发表于 2011-04-17 20:33

    调用printf等函数都可能会改变errno的值

飘落散花 2022-10-22 09:21:25

學習學習

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文