免费注册 查看新帖 |

Chinaunix

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

请教:关于400 tcp通讯read超时的异常处理 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2011-08-22 09:56 |只看该作者 |倒序浏览
问题描述:

AS400作为客户端,通过tcp通讯与一台Unix主机进行数据通讯,在通讯过程中,创建socket成功后,AS400端通过read去读取数据,若数据读取超时,则系统异常退出了,如何获取这种异常不让进程异常退出?
操作时,我使用的是call的方式,直接在命令行调用我的程序,如果read时超时,则系统就自动退出了log in状态,报错:
job end abnormally
disp the job log for information
然后就退出了登录状态

请教:
(1)在as400上,对于超时信号的处理方式错误导致此种情况出现
(2)信号异常的获取不对,导致无法正常获取到信息
(3)如何查看出错的“disp the job log for information”日志信息?

相关代码:

sock读取的底层代码:
  1. int tipsReadn(int fd,char *ptr,int nbytes,int timeval)
  2. {
  3. int nleft, nread;
  4. void    catchAlarm( );

  5. signal ( SIGALRM, catchAlarm );
  6. nleft = nbytes;

  7. while ( nleft > 0 ) {
  8. setAlarm ( timeval );

  9. nread = read ( fd, ptr, nleft );

  10. clearAlarm ( );

  11. if ( nread < 0 ) {
  12.     if ( TIMEOUT )
  13.         return  FAILURE;
  14.     else
  15.         return  ( nread );
  16. }
  17. else
  18.      if ( nread == 0 )
  19.          break;

  20.      nleft -= nread;
  21.      ptr += nread;
  22. }

  23. return nbytes - nleft ;
  24. }


  25. /**
  26. * 获取超时信号处理函数
  27. */
  28. void catchAlarm()
  29. {
  30.     monitor_log(LOGERR, "timeout!!!" );
  31.     TIMEOUT = 1;
  32. }

  33. /**
  34. * 清除超时信号
  35. */
  36. void clearAlarm()
  37. {
  38.     alarm ( 0 );
  39. }

  40. /**
  41. * 设置超时信号
  42. */
  43. void setAlarm(int sec)
  44. {
  45.     TIMEOUT = 0;
  46.     alarm( sec );
  47. }
复制代码
我尝试在程序中修改,增加异常捕获:
/** 增加异常处理 */
volatile _INTRPT_Hndlr_Parms_T inf;
#pragma exception_handler(_end,inf,0,_C2_MH_ESCAPE,_CTLA_HANDLE_NO_MSG)

改后的代码如下:
  1. int tipsReadn(int fd,char *ptr,int nbytes,int timeval)
  2. {
  3. int nleft, nread;
  4. void    catchAlarm( );

  5. /** 增加异常处理 */
  6. [b]volatile _INTRPT_Hndlr_Parms_T inf;

  7. #pragma exception_handler(_end,inf,0,_C2_MH_ESCAPE,_CTLA_HANDLE_NO_MSG)[/b]
  8. signal ( SIGALRM, catchAlarm );
  9. nleft = nbytes;

  10. while ( nleft > 0 ) {
  11. setAlarm ( timeval );

  12. nread = read ( fd, ptr, nleft );

  13. clearAlarm ( );

  14. if ( nread < 0 ) {
  15.     if ( TIMEOUT )
  16.         return  FAILURE;
  17.     else
  18.         return  ( nread );
  19. }
  20. else
  21.      if ( nread == 0 )
  22.          break;

  23.      nleft -= nread;
  24.      ptr += nread;
  25. }

  26. _end:
  27. return nbytes - nleft ;
  28. }
复制代码
但是未起到任何作用,不知是否我这个#pragma的处理写的不对还是什么
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP