免费注册 查看新帖 |

Chinaunix

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

请教,我的这个tcp短连接client端为何会down掉呢?? [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2008-08-27 10:39 |只看该作者 |倒序浏览
#include <stdio.h>
#include <string.h>
#include "mysock.h"
#include<time.h>
#include <sys/timeb.h>       
#include <sys/time.h>
#include "unixsocket.h"

#define MILLION 1000000

void * doit(void  *arg)
{
        struct timeval tpstart;
        struct timeval tpend;
        long   timerecv;
        int nNum = 0;
        int bFlg;
        char szBuff[512] = {0};
        int  iCn = 0;
        char szUrl[2048] = {0};
        char szIP[32] = {0};
        char szPort[16] = {0};
        int nSocket = -1;
        int nRet = 0;
        char szHost[512] = {0};
        char szRevBuff[1024] = {0};
        int nLen = 0;
        char myResponse[2048] = {0};

        char szGet[1024*4] = {0};


        //int aa = *(int *)arg;
        int aa = 0;
        printf("<%d>\n", aa);
        sleep(2);
        printf("test is start<%d> \n", aa);
        strcpy(szIP,"192.168.3.220");
        strcpy(szPort,"6999");       

        printf("IP<%s>\n",szIP);
        printf("PORT<%s>\n",szPort);
       

        int one= time((time_t*)NULL);
        char szTem[8] = {0};

        gettimeofday(&tpstart,NULL);

        int bb = aa+20000;

        /*
        while (!mysock.Connect(szIP, atoi(szPort)))
        {
                usleep(100);
                printf("wait...\n");
        }*/
       
        while(aa < 1000)
        {
        /*        while ((nSocket = connect_to(szIP, atoi(szPort))) == -1)
                {
                        usleep(100);
                        printf("wait...\n");
                }*/
                char szSendBuff[1024] = {0};
                CUnixSocket mysock;
                mysock.SetTimeOut(10*1000);
               
                while (!mysock.Connect(szIP, atoi(szPort)))
                {
                        usleep(100);
                        printf("wait...\n");
                }
               
                int g=0;

                szSendBuff[11] = '\0';

                char ss[10] = {0};
                int nlen = 0;
                memset(szSendBuff, 0, sizeof(szSendBuff));
                sprintf(szSendBuff, "%011d", aa);
                printf("begin to safe_send()<%d>\n",aa);
                //if (safe_send(nSocket, szSendBuff, sizeof(szSendBuff), 3) ==  sizeof(szSendBuff))
                if(mysock.SendMsg(szSendBuff, strlen(szSendBuff)))
                {
                        printf("safe_send: send<%s>\n",szSendBuff);
                        memset(ss, 0, sizeof(ss));
                        //nlen = safe_recv(nSocket, ss, 1, 3);
                        nlen = mysock.Receive(ss, 1);
                        if (nlen != 1)
                        {
                                printf("safe_recv: error<%d>\n", nlen);
                        }
                        else
                        {
                                printf("safe_recv: recv<%s> len<%d>\n\n", ss, nlen);
                        }
                        usleep(1000);
                }
                else
                {
                        printf("send error\n");
                }
        //        shutdown(nSocket, 2);
        //        close(nSocket);
                mysock.Close();
                aa++;
                sleep(1);
        }
        printf("<%d>\n", aa);
        //mysock.Close();
        gettimeofday(&tpend, NULL);

        int two= time((time_t*)NULL);

        timerecv = MILLION*(tpend.tv_sec - tpstart.tv_sec)+ tpend.tv_usec - tpstart.tv_usec;

        printf("<%ld>\n",timerecv);
        printf("one<%d>two<%d>time<%d>\n",one,two,two-one);
}


int main(int argc, char *argv[])
{
        pthread_t tid[20];
        int i = 0;
        int j = 0;
        for(i ; i<5; i++)
        {
                if (pthread_create(&tid,NULL,doit,NULL)!=0)
                {
                        printf("pthread_create is error[%d][%d]\n",i, j);
                }
                else
                {
                        printf("pthread_create is ok[%d][%d]\n",i,j);
                }
                j = j+ 250000;
        }

        for (i =0; i<5; i++)
        {
                pthread_join(tid,NULL);
        }


        return 0;
}

论坛徽章:
0
2 [报告]
发表于 2008-08-27 10:39 |只看该作者
运行一段时间就会down掉。好像是由于内存越界造成。那位高手能帮我看一下?

论坛徽章:
0
3 [报告]
发表于 2008-08-27 10:42 |只看该作者
内存越界的话,用gdb调试一下core
然后用where看看哪个地方出错

论坛徽章:
0
4 [报告]
发表于 2008-08-27 10:49 |只看该作者
core文件显示如下:
#0  0x401db1bc in memcpy () from /lib/i686/libc.so.6
#1  0x0804a31c in CUnixSocket::Connect(char*, int) (this=0x42a9123c, pSvrIp=0x42a9349c "192.168.3.220",
    nPort=6999) at unixsocket.cpp:173
#2  0x08049479 in doit(void*) (arg=0x0) at main.c:70
#3  0x40029f60 in pthread_start_thread () from /lib/i686/libpthread.so.0
#4  0x4023c327 in clone () from /lib/i686/libc.so.6


相关函数如下:
bool CUnixSocket::Connect(char *pSvrIp, int nPort)
{      
        struct sockaddr_in svraddr;
        struct hostent *pHostptr = NULL;
        memset(&svraddr, 0, sizeof(svraddr));
        if(m_hSocket > 0)
                Close();
               
        pHostptr = gethostbyname(pSvrIp);
        if(pHostptr == NULL)
        {
                return false;
        }
        if(!Socket(AF_INET, SOCK_STREAM, 0))
                return false;
        memcpy(&svraddr.sin_addr,pHostptr->h_addr_list[0],pHostptr->h_length);
        svraddr.sin_family = AF_INET;
        svraddr.sin_port   = htons(nPort);
        int nRet = connect(m_hSocket, (struct sockaddr *)&svraddr, sizeof(svraddr));
        if(nRet < 0)
        {
                return false;
        }
        return true;
}

论坛徽章:
0
5 [报告]
发表于 2008-08-27 10:53 |只看该作者
自己顶。。。。。。高手出来。。。。

论坛徽章:
0
6 [报告]
发表于 2008-08-27 10:57 |只看该作者
gdb下frame 0看看

论坛徽章:
0
7 [报告]
发表于 2008-08-27 10:59 |只看该作者
(gdb) frame 0
#0  0x401db1bc in memcpy () from /lib/i686/libc.so.6

论坛徽章:
0
8 [报告]
发表于 2008-08-27 11:06 |只看该作者
自己调试一下吧,加加打印语句,看看函数有没有用错
看到像是memcpy出错,这个基本上应该是内存非法访问了吧

论坛徽章:
0
9 [报告]
发表于 2008-08-27 11:13 |只看该作者
倒。

目前看来因该是发生了资源争用所造成,但是在哪个地方阿。此程序单线程没有问题,多线程跑一会就会报错。那位高人能帮帮兄弟。

补充一下:

begin to safe_send()<2>
safe_send: send<00000000002>
safe_recv: recv<1> len<1>

begin to safe_send()<2>
Segmentation fault

总是打印到begin to safe_send()后down掉,具体循环次数不定。

[ 本帖最后由 zhaofei1318 于 2008-8-27 11:16 编辑 ]

论坛徽章:
0
10 [报告]
发表于 2008-08-27 11:25 |只看该作者
在线等。。。。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP