刚学习网络开发,为啥偶的程序会core掉呢?
#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