免费注册 查看新帖 |

Chinaunix

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

[C] 多进程循环socket问题 [复制链接]

论坛徽章:
0
发表于 2010-04-06 10:34 |显示全部楼层
本帖最后由 unix_neu 于 2010-04-06 17:04 编辑

我编写了一个压力测试模块,实现是创建多个子进程,每个子进程循环发送多次交易信息,现在我参数定位10个子进程,每个循环发送10次,结果服务 器却未能收到100条记录。发送到一定数量后,就停止发送。实在不明白为什么,希望各位大虾给予解答!!在线等待!!
下面是源码:
  1. int main(int argc, char *argv[])
  2. {
  3.   int                 nRet,i=0,j=0,itime=0;
  4.         char                saSleep[20];
  5.         char        sPwd[7];
  6.         struct sockaddr_in   Sin;
  7.         int   socket_id, Flag, Error, RetryTimeSap = 2, nRetryFlag = 0;
  8.         unsigned Port = 32005;
  9.         char Ip_addr[] = "11.1.160.131";        
  10.         char sCfgName[30];
  11.         char sDataName[30];
  12.         char sMsgGmInq[1024];
  13.         char sMsgAtmInq[1024];
  14.         char sMsgGmCwd[1024];
  15.         char sMsgAtmCwd[1024];
  16.         char sMsgXfr[1024];
  17.         char sMsgDps[1024];        
  18.         char sMsgDcl[1024];
  19.         char sMsgATMCwc[1024];
  20.         char sMsgGMCwc[1024];
  21.         char sHostSsn[9];
  22.         char sOrigSsn[9];
  23.         char sSendName[10];
  24.         struct   sigaction sa;
  25.         pid_t pid;
  26.         //char filename[10];
  27.         int lssn, iNum = 0;
  28.         char c;
  29.         char *p;
  30.         int         k;
  31.         int                m, sTIMES;
  32.         char        sNetMsgBuf[BUF_SIZE];
  33.         char        rspCode[3];
  34.         char sDataBuf[4000];
  35.         int  times;  //每个子进程循环发送迭代
  36.         int totle;
  37.         int totle_w;
  38.         int totle_r, nums;        
  39.         GetProfileString("SSN", "HOSTSSN", sHostSsn, "Ssn.cfg");
  40.         nums = atoi(argv[1]);
  41.         sTIMES = atoi(argv[2]);
  42.         
  43.         
  44.         sa.sa_handler=SIG_IGN;
  45.   sigaction(SIGPIPE,&sa,0);        
  46.         memset(&Sin, 0, sizeof(Sin));
  47.         memset(sCfgName,0,sizeof(sCfgName));

  48.         Sin.sin_port = htons(Port);
  49.         Sin.sin_family = AF_INET;
  50.         Sin.sin_addr.s_addr = inet_addr(Ip_addr);
  51.         strcpy(sSendName,"[1021]");        
  52.         
  53.         
  54.         printf("Connect to %s at port %d!\n", Ip_addr, Port);
  55.         sHostSsn[8] = 0;
  56.         //printf("Begin sHostSsn=%s\n",sHostSsn);
  57.         k=0;
  58.         strcpy(sSendName,"[1211]");
  59.         int nRc = Read8583Cfg(strcpy(sCfgName,FILE_CFG));
  60.         if( nRc < 0 )
  61.         {
  62.                         printf("读取8583配置文件[%s]出错。\n",sCfgName);
  63.                         return;
  64.         }
  65.         //printf("8583配置文件[%s]。\n",sCfgName);
  66.                 /* 读测试数据 */
  67.         for(;i<nums;i++)
  68.         {
  69.                 if((pid=fork())==0)
  70.                 {
  71.                 m=0;
  72.                 printf("成功创建第%d个进程\n",i+1);                                                                                                
  73.         totle_w=0;
  74.         totle_r=0;
  75.         memset(terminal_code, 0, sizeof(terminal_code));
  76.         sprintf(terminal_code, "%08d", i+1);
  77.         for(times=0;times<sTIMES;times++)
  78.         {
  79.                 while(1)
  80.                 {
  81.                         while ((socket_id = socket(AF_INET, SOCK_STREAM, 0)) < 0)
  82.                         {
  83.                                 printf("[%s][%d];socket Error!\n", __FILE__, __LINE__);
  84.                                 if (nRetryFlag++ == 5)
  85.                                 {
  86.                                         if ( RetryTimeSap<100) RetryTimeSap += 2;
  87.                                        
  88.                                         nRetryFlag = 0;
  89.                                 }
  90.                                 sleep(RetryTimeSap);
  91.                         }
  92.                         
  93.                         Setsokopt(socket_id);
  94.                         if (connect(socket_id, (struct sockaddr *)&Sin, sizeof(Sin)) < 0)
  95.                         {
  96.                                 printf("[%s][%d];socket Error!\n", __FILE__, __LINE__);
  97.                                 if (nRetryFlag++ == 5)
  98.                                 close(socket_id);
  99.                                 if (errno == ECONNREFUSED)
  100.                                 {
  101.                                         printf("\nCannot connect port %d:", Port);
  102.                                         perror("");
  103.                                         sleep(30);
  104.                                         continue;
  105.                                 }
  106.                                 printf("Connect %s port %d error!\n",
  107.                                                   Ip_addr, Port);
  108.             
  109.                         }
  110.                         break;
  111.                 }                                       
  112.                 printf("第%d个进程第%d次成功连接\n",i+1,times+1);        
  113.                 memset(sDataName,0,sizeof(sDataName));
  114.                 //sprintf(sDataName,"file/test0.cfg");
  115.                 sprintf(sDataName,"file/test%d.cfg",i);
  116.                 if (ReadPETestData(sDataName,sSendName,times) != 0)
  117.                 {
  118.                                 printf("[%s][%d];socket Error!\n", __FILE__, __LINE__);
  119.                                 if (nRetryFlag++ == 5)
  120.                                 return;
  121.                 }
  122.                 /* 读测试数据 over*/

  123.                 memset(MsgOut,0x00,sizeof(MsgOut));
  124.                 nMsgLen = getSendData(MsgOut);                        
  125.                 int ia = 0;
  126.                 /*
  127.                 while(ia != nMsgLen)
  128.                 {
  129.                         printf("%c",*(MsgOut+(ia++)) );               
  130.                 }
  131.                 */
  132.                
  133.                                 
  134.                         nRetVal = WriteSocket( socket_id, MsgOut, nMsgLen);
  135.                         if (nRetVal <=0)
  136.                         {
  137.                                 printf("Write socket call!\n");
  138.                                 close(socket_id);
  139.                                 /* return; */
  140.                         }
  141.                         printf("第%d个进程第%d次发送成功\n",i+1,times+1);
  142.                         alarm(20);
  143.                         memset(sNetMsgBuf, 0, sizeof(sNetMsgBuf));
  144.                         nMsgLen=ReadSocket(socket_id,sNetMsgBuf,637);
  145.                         if (nMsgLen <=0)
  146.                         {
  147.                                 alarm(0);
  148.                                 if (nMsgLen == E_SBREAK)
  149.                                 {
  150.                                 printf("[%s][%d];socket Error!\n", __FILE__, __LINE__);
  151.                                         printf("errno:[%d]\n",errno);
  152.                                         printf("read socket call!\n");
  153.                                         close(socket_id);
  154.                                          exit(1);
  155.                                 }
  156.                                    else
  157.                                    {
  158.                                    printf("errno:[%d]\n",errno);
  159.                                          return ;
  160.                                 }
  161.                         }
  162.                         else
  163.                         {
  164.                         }
  165.                         printf("第%d进程第%d次读取成功\n",i+1,times+1);
  166.                         alarm(0);
  167.                         /*解包,取出39域并打印*/
  168.                         memset(rspCode,0,3);
  169.                         Unpack8583(&sNetMsgBuf[11],128,rspCode);
  170.                         if(memcmp("00",rspCode,2)==0)
  171.                         {
  172.                                 totle_r++;
  173.                         }
  174.                         else
  175.                         {
  176.                                 totle_w++;
  177.                         }
  178.                 close(socket_id);
  179.           }
  180.                   printf("第%d个进程执行到这里了\n",i+1);
  181.                
  182.                         printf("\n终端号0000000%d  一共[%d]笔,成功了[%d],失败[%d]\n",i+1,times,totle_r,totle_w);
  183.                         
  184.                 //close(socket_id);
  185.                 exit(0);
  186.           }
  187.           if(pid<0)
  188.                   {
  189.                           printf("第%d次创建进程失败\n",i);
  190.                   }
  191.                   else{
  192.                                 //printf("[%s][%d];socket Error!\n", __FILE__, __LINE__);
  193.                           }
  194.                 }
  195.         }
复制代码

论坛徽章:
0
发表于 2010-04-06 11:54 |显示全部楼层
本帖最后由 yu835 于 2010-04-06 11:56 编辑

你看到创建的进程是有十次吗?SOCKET的while(1)里面有没有错误打印呢?一步步跟踪看是发送的时候没有循环发10次,还是发了但接收次数不够。

论坛徽章:
0
发表于 2010-04-06 12:27 |显示全部楼层
回复 2# yu835


    进程创建了10个 这个没问题。问题是  该模型是一发一收,循环某个read时停住了,造成了后面write不执行。我不清楚造成read时跳出函数的原因是什么?
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP