免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 4255 | 回复: 2

[C] 一个报文发送的问题 [复制链接]

论坛徽章:
0
发表于 2007-11-19 20:23 |显示全部楼层
20可用积分
同步长连接主函数

void *client_proc(void *args)
{
   CONNECT:

   /*检测Socket是否可用*/
                ilRn=socket_stat( sockfd , 0 );
                if (ilRn != 0){
                close(sockfd);
                etsDebug(0,"与二级[%s:%d]建立连接状态不正常sockfd[%d]",aYLip,iYLport,sockfd);
                slTermbuf.flag   = 99;       
                goto CONNECT;               
               
                /*2007-11-14 9:35增加发送超时判断*/
                rwto.tv_sec = 7;
                rwto.tv_usec= 0;
                ilRn = setsockopt(sockfd,SOL_SOCKET,SO_SNDTIMEO,&rwto,sizeof(rwto));
                if ( ilRn < 0 )
                etsDebug(0,"设置发送超时时间 setsockopt SO_SNDTIMEO error,ilRn=%d ,errno[%d]",ilRn,errno);
                /*2007-11-14 9:35增加发送超时判断*/
               
                etsDebug(0,"与二级[%s:%d]建立连接状态正常sockfd[%d],开始发送长度为[%d]的报文",aYLip,iYLport,sockfd,ilMsglen);
               
               
                ilRn = etsTcpsnd(sockfd, alMsgbuf, ilMsglen);

                if (ilRn == 0)
                   {
                       
                        etsDebug(0,"调用函数etsTcpSnd [%d] len [%d] 向二级发送通讯回执成功 IP=[%]",sockfd,ilMsglen,aYLip);
                       
                        ilMsglen=0;        /*此处赋值为0目的不重复发送*/
                   }
                else {
                        /*通讯失败处理*/
                        close(sockfd);
                        slTermbuf.flag   = 99;        /*通讯失败*/
                       
                        if (slTermbuf.flag == 0)
                        etsDebug(0,"调用函数etsTcpSnd  port[%d] len [%d] 向二级发送通讯回执失败 rc[%d] IP=,sockfd,ilMsglen,ilRn,aYLip);
                        goto CONNECT;
                    }
               
}





/****************************************************************/
/* 函数编号    :etsTcpsnd                                      */
/* 函数名称    :发送报文到通讯端口                             */
/* 作         者    :PC                                         */
/* 建立日期    :2007/10/11                                     */
/* 最后修改日期:2007/10/11                                     */
/* 函数用途    :                                               */
/* 函数返回值  : 成功:  0                                       */
/*               失败: -1                                       */
/****************************************************************/

int etsTcpsnd(int sockfd, char *buffer, int length)
{
   int  len;
   int  totalcnt;

   totalcnt = 0;
   while(totalcnt < length)
   {
      len = write(sockfd, buffer + totalcnt, length - totalcnt);
      if (len < 0)
      {
         if (errno==EINTR)
         {
           len = 0;
           break;
         }
         else
           return (-1);
       }
       else if (len == 0)
         break;
       totalcnt = totalcnt + len;
   }

   if(totalcnt == length)
      return(0);
   else
      return(-1);
}


错误提示
============================================================================
11-15 20:05:27:773 pid[3953]: 接收二级报文成功 IP=[172.17.72.11] socket=[4]len[18]alMsgbuf=[40120854000005麛.]
11-15 20:05:27:773 pid[3953]: 向数据库操作进程发送成功 q_reqid=[2]内容=[40120854000005麛.]
11-15 20:05:27:773 pid[3953]: 从数据库操作进程读消息成功,q_respid=[3]slTermbuf.data=[40120854000005麛.] len[18]
11-15 20:05:27:773 pid[3953]: 与二级[172.17.72.11:2001]建立连接状态正常sockfd[5],开始发送长度为[18]的报文
============================================================================

发送超时已经加了 为什么还会死在etsTcpsnd函数这里?(unix系统)

[ 本帖最后由 lcq6075217 于 2007-11-19 20:26 编辑 ]

论坛徽章:
3
CU大牛徽章
日期:2013-03-13 15:32:35CU大牛徽章
日期:2013-03-13 15:38:15CU大牛徽章
日期:2013-03-13 15:38:52
发表于 2007-11-20 14:46 |显示全部楼层
SO_SNDTIMEO / SO_RCVTIMEO 多数UNIX系统都没有实现,不要去用,使用Select来实现读写超时

论坛徽章:
3
CU大牛徽章
日期:2013-03-13 15:32:35CU大牛徽章
日期:2013-03-13 15:38:15CU大牛徽章
日期:2013-03-13 15:38:52
发表于 2007-11-20 14:50 |显示全部楼层
当然 除了用 select 以外, 还可以用alarm来实现超时
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP