刚学习网络开发,为啥偶的程序会core掉呢?

weixin_38049144 2007-04-29 03:08:22


#include <pthread.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <stdio.h>
#include <string.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <unistd.h>

int scListen=-1;
int igConnNum=5;

#define BUF_LEN_4K 4096



int        Sys_recv(char* pBuf, int iBufLen, int scCon )
{

        int iResult = 0;

        iResult = recv(scCon, pBuf, iBufLen, 0);

        return iResult;

}

int        Sys_send(char* pBuf, int iBufLen, int scCon )
{

        int iResult = 0;

                for (int iWrite = 0; iWrite < iBufLen; iWrite += iResult)
                {
                        iResult = send(scCon, pBuf + iWrite, iBufLen - iWrite, 0);
                        if (iResult <= 0)
                                return iResult;
                }


        return iBufLen;

}


int Sys_Connect( const char* szAddr, unsigned int uiPort)
{
        int scCon = -1;
        struct sockaddr_in addr;
       
        int nRv = 0;
       
        int nerr=0;
        int ndata=1;

       
        scCon = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
       

        if (scCon == -1)
        {
                return scCon;
        }

        if(szAddr)
        {  
                addr.sin_addr.s_addr = inet_addr(szAddr);
        }


        addr.sin_family = AF_INET;
        addr.sin_port = htons((short)uiPort);

        if (connect(scCon, (struct sockaddr *)&addr,sizeof(addr)) == -1)
        {
                close(scCon);
                scCon = -1;
        }

        return scCon;

}



void * internalThreadProc(void* lpParam)
{
        int  iCount = 0;

        int scCon=(int)(lpParam);

        fd_set fdRecv;
        struct timeval timeout;
        int scServer = -1;
        char* pBuffer        = NULL;
        int nRv = 0;
               
        scServer = Sys_Connect( "211.88.5.12", 80);
        if( scServer == -1 )
        {
                goto End;
        }

        pBuffer         = new char[BUF_LEN_4K+1024];
        if(pBuffer == NULL)
        {
                goto End;
        }

        timeout.tv_sec  = 300;
        timeout.tv_usec = 0;

        FD_ZERO(&fdRecv);
        FD_SET(scCon, &fdRecv);
        FD_SET(scServer, &fdRecv);

        int max;   
        max = (scCon > scServer) ? scCon : scServer;   
       
        while( select(max+1, &fdRecv, NULL, NULL, &timeout) > 0 )
        {
                if(FD_ISSET(scCon,&fdRecv))
                {
                       
                        memset(pBuffer, 0,BUF_LEN_4K);

ReadContinue:

                        iCount = Sys_recv(pBuffer, BUF_LEN_4K, scCon );
                        if (iCount>0)
                        {

                                iCount = Sys_send( pBuffer, iCount, scServer );
               
                                if(iCount > 0)
                                {
                                                goto NewRound;
                                }
                                else
                                {

                                        goto End;
                                }
                        }

                        else
                        {
                                goto End;
                        }
                }
                else if(FD_ISSET(scServer,&fdRecv))
                {
                        memset(pBuffer,0,BUF_LEN_4K);
                        iCount = Sys_recv( pBuffer, BUF_LEN_4K, scServer );
                        if (iCount>0)
                        {

                                iCount = Sys_send(pBuffer, iCount, scCon );
                                if(iCount <= 0)
                                {

                                                goto End;
                                }
                               
                       
                        }
                        else
                        {
                                goto End;
                        }


        }
               
NewRound:
                FD_ZERO(&fdRecv);
                FD_SET(scCon, &fdRecv);
                FD_SET(scServer, &fdRecv);
        }



End:
               
                if(scServer != -1)
                        close(scServer);
                       
                if (scCon!=-1)
                        close(scCon);



       
        if(pBuffer)
                delete[] pBuffer;


        return NULL;
       
}


int Sys_CreateListenPort( unsigned int uiPort, bool bTCP, char *sIP )
{
        struct sockaddr_in addr;
        int scListen = -1;

        if( bTCP )
                scListen = socket(AF_INET, SOCK_STREAM, NULL);
        else
                scListen = socket(AF_INET, SOCK_DGRAM, NULL);


        if( sIP != NULL )
                addr.sin_addr.s_addr =  inet_addr((const char*)sIP);
        else
                addr.sin_addr.s_addr =  htonl(INADDR_ANY);

        addr.sin_family = AF_INET;
        addr.sin_port = htons((short)uiPort);

        if (bind(scListen, (struct sockaddr*)&addr, sizeof(struct sockaddr)))
        {
                close(scListen);
                scListen = -1;
                return scListen;
        }

        if( bTCP )
        {               
                if (listen(scListen, igConnNum))
                {
                        close(scListen);
                        scListen = -1;
                        return scListen;
                }
        }

        return scListen;
}



void *CreateThreadForRequest(void *pPARAM)
{
        fd_set fds;
       
        struct        timeval timeout;
        int nerr=0;
       
        timeout.tv_sec = 10;
        timeout.tv_usec =0 ;   
        int ndata = 1;
       
        while(1)
        {
                FD_ZERO(&fds);
                FD_SET(scListen,&fds);
                if (select(scListen+1,&fds,NULL,NULL,&timeout)>0)
                {
                        int scClient=-1;
                       
                        scClient=accept(scListen,NULL,0);
                       
                        nerr=setsockopt(scClient, SOL_SOCKET, SO_REUSEADDR, (const char *)&ndata, sizeof(ndata));
                        if (nerr<0)
                        {
                                printf("setsocketopt failed\n");
                                break;
                        }
                       

                        pthread_t mythread;
                        pthread_attr_t attr;
                       
                        if (pthread_attr_init(&attr))
                        {
                                        printf("pthread_attr_init failed\n");
                                        break;
                        }

                        if (pthread_attr_setscope(&attr, PTHREAD_SCOPE_SYSTEM))
                        {
                                        printf("pthread_attr_setscope failed\n");
                                        break;
                        }
                                       
                        if (pthread_attr_setdetachstate(&attr,PTHREAD_CREATE_DETACHED))
                        {
                                printf("pthread_attr_setdetachstate failed\n");
                                break;
                        }

                        if (! pthread_create(&mythread, &attr, internalThreadProc, (void *)scClient) )
                        {
                               
                        }
                        else
                        {
                                        printf("create thread internalThreadProc failed\n");       
                        }

                }
               
        }
       
       
}

int main(int argc,char *argv[])
{
        pthread_t uiThreadID;
        void **ret=NULL;
       
       
        scListen=Sys_CreateListenPort(443,1,"211.88.8.182");
        if (scListen==-1)
        {
                printf("error in create listen socket\n");
                goto cleanup;
        }
       
        if(pthread_create(&uiThreadID,NULL,CreateThreadForRequest,NULL))
        {
                printf("create thread CreateThreadForRequest fail!!!!\n");
                return false;
        }
       
       
        if (pthread_join(uiThreadID,ret))
                {
                        printf("pthread join failed\n");
                        return false;
                }
       
       

cleanup:
        return 0;       
       
}
复制代码
编译如下:
g++ -c test.cpp  -g  
g++ -g  -o test test.o -lpthread  

使用loadrunner做压力,设置压力大小为800,很快core掉
我的freebsd版本是6.2-RELEASE FreeBSD 6.2-RELEASE #0: Fri Jan 12 11:05:30 UTC 2007     root@dessler.cse.buffalo.edu:/usr/obj/usr/src/sys/SMP  i386
gcc版本为:gcc (GCC) 3.4.6 [FreeBSD] 20060305
...全文
27 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
鸣谢 首先要感谢linus,给了我们一个可以自由翱翔的平台; 其次,要感谢网络上千万的linux/windows先行者,给予的有意或无意的指点和帮助; 再次,感谢陈皓兄的《跟我一起写makefile》,引导我走过了makefile的迷雾。后来发现于凤昌兄译的《GNU Make使用手册》,也有颇多受益。 背景 从2004年,我在一个公司作服务端软件的开发,要支持linux/windows平台,主要是为了容易维护,就设计、开发了这一套比较常用的类。 2005一直在windows下作IPTV的开发,在2006年底,又回到linux下作IPV6下IPTV的开发。在空闲时间,看看两年前的那些零散类文件,开始整理这些类成库,并写了简单的使用和测试范例,放在网上和朋友们共享。 由于早期的平台从windows98和VC6.0,redhat8.0,经历了些变迁,没有太多的时间再一一仔细测试,就用现在的windowsXP和VS.2003,Fedaro Core4.0作的测试。 主要是为了相互学习,希望能和朋友们共同进步!如有引用,请标明出处,不胜感激!禁止商业性的书籍的引用!很多不良的作者,完全是在骗钱。 功能简介 通用于linux/windows平台C++的应用。 主要是对一些系统功能,进行了简洁封装。 主要有读写锁类, 线程类, 线程池类, 定时器类, socket1.1的封装类, ini文件类, txt文件类, 可删除内容的文件类, 查找文件类, 调试输出类, 字符串类, 同步的普通队列和优先级队列类, 智能指针和内存自动管理类,数据库类. 特别声明:因为环境限制,这次测试代码中,没有测试数据库类。我以前也只是在PostgreSQL,SQL Server2000和Acess2000中实际用过。如有朋友用到,请自行修改、测试。 这些类的风格,与个人习惯密切相关。推荐QT,跨平台的类库,还是不错的;ACE就太难使用了! 编译和运行: 1. windwos下,用vs2003打开pub下的test.sln文件,所有的测试程序和类库文件就载入,编译即可。其它程序引用库时,请选中/MDd选项。 2. linux下,执行pub下的Makefile文件,编译即可。如果没有安装PostgreSql,数据库部分编译不过。 关于inline函数 我写的这些类的函数,大部分是可以写成inline函数的,对性能提高也有很大的帮助。但是,GCC和VC的不同版本编译器的支持程度不同,可能编译不过,所以就都没有为提高效率而写inline函数。依赖于编译器,对跨平台的程序来说,也比较麻烦! 不过,现在的硬件系统,对这些小小的性能提升,也感觉不出来的。 如有需要,请自行改写! 关于异常和错误处理 也是仁者见仁,智者见智! 习惯于C开发的朋友,大概喜欢函数错误时返回错误码。函数有返回值,就要处理,就使程序逻辑较为复杂,看去也比较的混乱。 我则喜欢用异常代替,主要是代码简洁和逻辑清晰。异常抛掷,使流程很简洁,只显示执行正确时的流程,错误集中处理 对于那些失败即意味着中止的一个操作,我让其抛掷异常。如果是正常的分支流程,则用返回失败值。就我遇到的情况,大部分则为操作失败,调用的流程一般都要中止的。 这个判断也是比较难下的。放在一个局部,异常可能导致操作中止;但放在更上一层,则异常又可能是正确程序流程处理。 bug的反馈和修改支持 如果有重大的错误需要修正,请发到linhweikuo@hotmail.com的邮箱,尽量说明问题的现象,我在一周内解决的(如果工作比较紧急的时候,不能即时就处理的)。

477

社区成员

发帖
与我相关
我的任务
社区描述
其他技术讨论专区
其他 技术论坛(原bbs)
社区管理员
  • 其他技术讨论专区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧