亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? socket.cpp

?? 自動調整大小的進程池類的實現。 一個運用進程池的server類。 一個socket類。
?? CPP
字號:
/**
 * Copyright 2007,神州數碼(中國)有限公司
 * All rights reserved.
 * 
 * 文件名稱:socket
 * 摘    要:socket
 * 
 * 當前版本:
 * 作    者:
 * 完成日期:
 *
 * 取代版本:1.1 
 * 原 作 者:gaozh
 * 完成日期:2007年
 *
 * 
 */
#include "socket.h"

extern volatile sig_atomic_t  QuitFlag;

void ignore_pipe()
{
	struct sigaction sig;
	sig.sa_handler = SIG_IGN;
	sig.sa_flags = 0;
	sigemptyset(&sig.sa_mask);
	sigaction(SIGPIPE,&sig,NULL);
}

/**
 * 以const char類型的端口為參數的ServerSocket的構造函數。
 * 首先設置監聽端口號,然后初始化tcp類型的socket
 */
ServerSocket::ServerSocket( const char* ps_port )
{
		ignore_pipe( );
    set_port( ps_port );
    init_socket( SOCK_STREAM );
}

/**
 * 以const int類型的端口為參數的ServerSocket的構造函數。
 * 首先設置監聽端口號,然后初始化tcp類型的socket
 */
ServerSocket::ServerSocket( const int& port )
{
		ignore_pipe( );
    set_port( port );
    init_socket( SOCK_STREAM );
}

ServerSocket::ServerSocket( const string& port )
{
		ignore_pipe( );
    set_port( port.c_str( ) );
    init_socket( SOCK_STREAM );
}

/**
 * 設置監聽端口號
 */
bool ServerSocket::set_port( const char *ps_port )
{
	long int port;
	char *errpos;
	
   port = strtol( ps_port, &errpos, 0 );

   	if ( ( errpos[0] != 0 ) || ( port < 1 ) || ( port > 65535 ) )
           /* Invalid port address */
           return false;
       /* convert to network byte order */
   	_port = htons(port);

    return true;
}

/**
 * 設置監聽端口號
 */
bool ServerSocket::set_port( const int& port )
{
	long int l_port;
	char *errpos;
  char ps_port[10];
	
  memset( ps_port, 0, sizeof( ps_port ) );
  sprintf( ps_port, "%d", port );

    /* Not client_addr_in services, maybe a number? */
   	l_port = strtol( ps_port, &errpos, 0 );

   	if ( ( errpos[0] != 0 ) || ( port < 1 ) || ( port > 65535 ) )
           /* Invalid port address */
           return false;
	/* convert to network byte order */
   	_port = htons(l_port);

    return true;
}

/**
 * 初始化socket
 */
bool ServerSocket::init_socket( const int& socket_type )
{
	struct sockaddr_in address;
	/*	int reuse_addr=0, keep_alive=1; */
	int reuse_addr = 1, keep_alive = 1 ;
	
	/* step1: create a socket */
	_listening_socket = socket( AF_INET, socket_type, 0 );
	if ( _listening_socket < 0 )
	{
		perror("socket");
		exit(EXIT_FAILURE);
	}
	/***************************************************************************/
	/* set socket options */
	/* Level: SOL_SOCKET  */
	/* Name: SO_REUSEADDR */
	/* Value: 1 on; 0 off */
	/*  which can prevent multi-running of tcpserver. */
	/* Name: SO_KEEPALIVE */
	/* Value: 1 on; 0 off */
	/***************************************************************************/
	setsockopt( _listening_socket, SOL_SOCKET, SO_REUSEADDR, &reuse_addr, sizeof(reuse_addr));
	setsockopt( _listening_socket, SOL_SOCKET, SO_KEEPALIVE, &keep_alive, sizeof(keep_alive));

	/* Step2: bind() transfer address(client) with socket */
	/* Setup internet address information. */
	memset( &address, 0, sizeof(address));
	address.sin_family = AF_INET;
	address.sin_port = _port;
	/*
	By default, not indicate local address, it is the same as any invalid address
	so, for client, who known my tcpserver address, it just can communcati0on to me.
	for example, for client, 202.127.197.1,202.127.196.1 is the same .
	*/
	address.sin_addr.s_addr = htonl(INADDR_ANY);

	if (bind( _listening_socket, (struct sockaddr *) &address, sizeof(address)) < 0)
	{
		perror("bind");
		close(_listening_socket);
		exit(EXIT_FAILURE);
	}

 	/* Step3: set the socket into listen status */
	if (socket_type == SOCK_STREAM) {
   	/* before accept(),max wait queue length */
		listen( _listening_socket, 50 ); /* Queue up to five connections before
                                 having them automatically rejected. */
	} /* end if(socket_type == SOCK_STREAM) */
	return true;
}

/**
 * 接受連接請求
 */
Socket* ServerSocket::accept_connect( )
{
    int accept_socket = -1;
		struct sockaddr_in client_addr;
//	socklen_t size;
		int size;
		struct in_addr client_addr_in;
		Socket *s;
		int status;
	
	cout<<"accept"<<endl;
    while( !QuitFlag )
    {
			/* Step4: wait for connection */
			size = sizeof(struct sockaddr_in);
			memset( &client_addr_in, 0, sizeof( in_addr ) );
			accept_socket = accept( _listening_socket, (struct sockaddr *)&client_addr, (socklen_t *)&size );
    	
			if ( accept_socket < 0 ) 
			{
			   	/* Either a real error occured, or blocking was interrupted for
	  	       some reason.  Only abort execution if a real error occured. */
				if ( errno != EINTR ) 
				{ /* EINTR is 'interruped system call' error */
					 perror("accept");
					 close( _listening_socket );
					 status = -1;
					 exit( status );
				}
				else	  
					continue;
				/* don't fork - do the accept again */
			} /* end if(accept_socket<0) */
    	
			/* printf which host connect to me */
			memcpy( &client_addr_in.s_addr, &client_addr.sin_addr, size );
    	    _ipaddr = inet_ntoa( client_addr_in );
    	    printf("gather link _ipaddr=[%s]\n",_ipaddr.c_str());
			s = new Socket( accept_socket );
    	
			return s;
    }
    
    return NULL;
}

/**
 * 從socket中接收數據
 */
int Socket::receive( void* in, size_t count,int timeout )
{
	int flags=0;
	flags=MSG_DONTWAIT;
	
	if( timeout>0 )
	{
		if( !LimitTimeOut(timeout) )
			return -1;
	}
	int nRecv=recv( _s,in,count,flags);
	if( nRecv<=0 )
		return -1;
	return nRecv;
}

int Socket::exactrecv( void* in, size_t count,int timeout )
{
	int flags=0;
	flags=MSG_DONTWAIT;
	
	if( timeout>0 )
	{
		if( !LimitTimeOut(timeout) )
			return -1;
	}
	
	int increase=0,tmpCount=count;
	for(;increase<count;)
	{
		int nRecv=recv( _s,(char *)in+increase,tmpCount,flags);
		if( nRecv<=0 )
			return -1;
		increase+=nRecv;
		tmpCount-=nRecv;
	}
	return increase;
}

bool Socket::LimitTimeOut( int time )
{
	struct timeval tival;
	struct timeval *pTival=NULL;
  fd_set readfds;
  int maxfds = 0;

  tival.tv_sec = time;
  tival.tv_usec = 0;
  
  if(time>=0)
  	pTival=&tival;
  
  FD_ZERO(&readfds);
  
  FD_SET( _s, &readfds);
  maxfds=(( _s > maxfds)?_s:maxfds );
  
 if( select(maxfds + 1, &readfds, NULL, NULL, pTival) <= 0)
 	return false;
 if(!(FD_ISSET(_s, &readfds)))
 	return false;
 	
 return true; 
}

/**
 * 向socket發送數據
 */
int Socket::Send( void *out, size_t count )
{
	int this_write;
	int flags=	MSG_DONTWAIT;
	this_write = send( _s, out, count, flags);	
	if(this_write<=0)
	{
		perror("---send-----write error!");	
	}
	return this_write;
};

void Socket::close2( )
{ 
	close( _s ); 
};

/**
 * 以字符串常量為參數的ClientSocket構造函數
 */
ClientSocket::ClientSocket( const char* ipaddr, const char* port, const char* proto )
{

	
	memset( _ipaddr, 0, sizeof( _ipaddr ) );
	strcpy( _ipaddr, ipaddr );
	
	memset( _proto, 0, sizeof( _proto ) );
	strcpy( _proto, proto );

	memset( _port, 0, sizeof( _port ) );
	strcpy( _port, port );
	ignore_pipe( );
};

/**
 * 以char* 類型變量為參數的構造函數
 */
ClientSocket::ClientSocket( char* ipaddr, char* port, char* proto )
{
	
	memset( _ipaddr, 0, sizeof( _ipaddr ) );
	strcpy( _ipaddr, ipaddr );
	
	memset( _proto, 0, sizeof( _proto ) );
	strcpy( _proto, proto );

	memset( _port, 0, sizeof( _port ) );
	strcpy( _port, port );
	ignore_pipe( );
};

/**
 * 以string 類型變量為參數的構造函數
 */
ClientSocket::ClientSocket( string& ipaddr, string& port, string& proto )
{
	
	memset( _ipaddr, 0, sizeof( _ipaddr ) );
	strcpy( _ipaddr, ipaddr.c_str( ) );
	
	memset( _proto, 0, sizeof( _proto ) );
	strcpy( _proto, proto.c_str( ) );

	memset( _port, 0, sizeof( _port ) );
	strcpy( _port, port.c_str( ) );
	ignore_pipe( );
};

/**
 * ipaddr和proto是char* 類型,端口是int類型的構造函數
 */
ClientSocket::ClientSocket( char* ipaddr, int& port, char* proto )
{

	
	memset( _ipaddr, 0, sizeof( _ipaddr ) );
	strcpy( _ipaddr, ipaddr );
	
	memset( _proto, 0, sizeof( _proto ) );
	strcpy( _proto, proto );

	memset( _port, 0, sizeof( _port ) );
	sprintf( _port, "%d", port );
	printf("_ipaddr=[%s],_proto=[%s],_port=[%s]\n",_ipaddr,_proto,_port);
	ignore_pipe( );
};

/**
 * ipaddr和proto是string類型,端口是int類型的構造函數
 */
ClientSocket::ClientSocket( string& ipaddr, int& port, string& proto )
{

	
	memset( _ipaddr, 0, sizeof( _ipaddr ) );
	strcpy( _ipaddr, ipaddr.c_str( ) );
	
	memset( _proto, 0, sizeof( _proto ) );
	strcpy( _proto, proto.c_str( ) );

	memset( _port, 0, sizeof( _port ) );
	sprintf( _port, "%d", port );

	ignore_pipe( );
}

// This is a generic function to make a connection to a given server/port.
// service is the port name/number,
// type is either SOCK_STREAM or SOCK_DGRAM, and
// netaddress is the host name to connect to.
// The function returns the socket, ready for action.
Socket* ClientSocket::make_connect(  )
{
	Socket *s;
	int port = -1;
	struct in_addr *addr;
	int sock, connected;
	struct sockaddr_in address;

	
	/* First convert service from a string, to a number... */
	port = atoport( );
		
	if (port == -1) {
		fprintf(stderr,"make_connection:  Invalid socket number.\n");
		return NULL;
	}

	/* Next convert address from ascii text to in_addr struct */
	addr = atoaddr( );
	if (addr == NULL) {
		fprintf(stderr,"make_connection:  Invalid network address.\n");
		return NULL;
	}
	
	/* Step1: create a socket */
	if( strcmp( _proto, "tcp" ) == 0 ) sock = socket(AF_INET, SOCK_STREAM, 0);
	else sock = socket(AF_INET, SOCK_DGRAM, 0);

	if(sock == -1) {
		fprintf(stderr,"make_connection:  Create socket error.\n");
		return NULL;
	}
//	printf("Connecting to %s on port %d.\n",inet_ntoa(*addr),htons(port));

	/* Step2: bind to an arbitrary return address */
	/*  Here bind is not required in TCP mode */
	memset((char *) &address, 0, sizeof(address));
	address.sin_family = AF_INET;
	address.sin_port = (port);
	address.sin_addr.s_addr = addr->s_addr;


	
	if (strcmp( _proto, "tcp" ) == 0) {
		/* Step3: connect to server */
		connected = connect(sock, (struct sockaddr *) &address, sizeof(address));
		if (connected < 0) {
			perror("connect");
			return NULL;
		}
		s = new Socket( sock );
		return s;
	}

	/* Otherwise, must be for udp, so bind to address. */
	/* Here connect is not required in this UPD mode */
	if (bind(sock, (struct sockaddr *) &address, sizeof(address)) < 0) {
		perror("bind");
		return NULL;
	}
	s = new Socket( sock );
	return s;
};

// Take a service name, and a service type, and return a port number.  If the
// service name is not found, it tries it as a decimal number.  The number
// returned is byte ordered for the network.
//
int ClientSocket::atoport( )
{
	int port;
	long int lport;
	char *errpos;
	
	lport = strtol(_port,&errpos,0);
	if ( (errpos[0] != 0) || (lport < 1) || (lport > 65535) )
		return -1; /* Invalid port address */

	port = htons(lport);

	return port;
};

// Converts ascii text to in_addr struct.  NULL is returned if the address
// can not be found.
//
//
struct in_addr* ClientSocket::atoaddr( )
{
	struct hostent *host;
	static struct in_addr saddr;
	
	/* First try it as aaa.bbb.ccc.ddd. */
	if( ( saddr.s_addr = inet_addr(_ipaddr)) != -1 )
	    return &saddr;

	host = gethostbyname(_ipaddr);
	if (host != NULL) return (struct in_addr *) *host->h_addr_list;

	return NULL;
};

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
精品人伦一区二区色婷婷| 91香蕉视频污在线| 日韩精品一区二区三区视频| 青椒成人免费视频| 日韩欧美成人激情| 风间由美一区二区三区在线观看| 国产欧美日韩一区二区三区在线观看| 丰满少妇在线播放bd日韩电影| 国产精品久久久久久久久免费桃花| 国产69精品久久久久毛片| 亚洲色欲色欲www在线观看| 日本精品一区二区三区四区的功能| 亚洲影院理伦片| 日韩视频在线一区二区| 国产精品性做久久久久久| 国产精品传媒入口麻豆| 欧洲亚洲国产日韩| 激情欧美一区二区| 亚洲人成人一区二区在线观看| 欧美系列在线观看| 经典三级视频一区| 一区二区三区中文字幕电影| 日韩午夜激情视频| 成人性生交大片免费看视频在线 | 欧美成人精精品一区二区频| 国产乱码字幕精品高清av| 亚洲精品国产无天堂网2021| 91精品国产综合久久婷婷香蕉| 国产精品正在播放| 亚洲午夜日本在线观看| 久久嫩草精品久久久精品 | 91在线观看下载| 日韩精品一二三四| 国产精品久久久久久亚洲伦| 欧美一区午夜视频在线观看| 大陆成人av片| 美女任你摸久久| 亚洲人成7777| 国产欧美视频一区二区三区| 欧美日韩大陆在线| 99vv1com这只有精品| 精品一区二区在线免费观看| 亚洲精品大片www| 久久久久亚洲蜜桃| 欧美高清你懂得| 91同城在线观看| 福利一区在线观看| 美腿丝袜在线亚洲一区| 亚洲国产日韩在线一区模特| 国产精品久久久久久福利一牛影视| 在线不卡一区二区| 91高清视频免费看| 波多野结衣在线一区| 久久国产视频网| 天使萌一区二区三区免费观看| 中文字幕在线视频一区| 欧美va亚洲va| 欧美日高清视频| 色综合久久精品| 成人在线视频一区| 国产suv精品一区二区三区| 美日韩黄色大片| 日韩二区在线观看| 日本va欧美va欧美va精品| 天堂成人免费av电影一区| 亚洲线精品一区二区三区八戒| 亚洲视频小说图片| 最新久久zyz资源站| 久久久久久久性| 精品国产乱子伦一区| 91精品国产综合久久精品| 欧美久久婷婷综合色| 欧美三级欧美一级| 欧美精品一二三| 欧美日韩国产精品自在自线| 欧美日韩一区二区电影| 欧美三级日韩三级国产三级| 欧美无人高清视频在线观看| 91国模大尺度私拍在线视频| 91国偷自产一区二区三区成为亚洲经典 | 精品99一区二区| 51久久夜色精品国产麻豆| 51精品视频一区二区三区| 91精品国产综合久久久久久 | 蜜臀av亚洲一区中文字幕| 日韩国产高清在线| 热久久国产精品| 久久精品国产色蜜蜜麻豆| 国产综合久久久久影院| 国产精品主播直播| av在线综合网| 欧美三级一区二区| 欧美α欧美αv大片| 久久影院午夜论| 国产精品九色蝌蚪自拍| 亚洲狼人国产精品| 肉色丝袜一区二区| 精品一区二区三区日韩| 成人小视频在线| 欧美在线免费视屏| 欧美一区二区三级| 国产亚洲自拍一区| 伊人婷婷欧美激情| 奇米精品一区二区三区在线观看 | 在线观看一区二区精品视频| 欧美人与禽zozo性伦| 久久蜜桃av一区二区天堂 | 亚洲国产精品ⅴa在线观看| 亚洲理论在线观看| 毛片av中文字幕一区二区| 不卡一区在线观看| 91精品国产91久久久久久最新毛片| 久久久久久一二三区| 亚洲五月六月丁香激情| 国产一区二区三区蝌蚪| 色屁屁一区二区| 日韩欧美色电影| 亚洲欧美激情视频在线观看一区二区三区 | 日本韩国一区二区三区| 欧美高清激情brazzers| 亚洲国产经典视频| 三级在线观看一区二区| www.亚洲精品| 欧美成人伊人久久综合网| 亚洲精品一二三| 国产毛片一区二区| 欧美丰满嫩嫩电影| 亚洲午夜av在线| 国产69精品一区二区亚洲孕妇| 欧美日韩精品欧美日韩精品一 | 椎名由奈av一区二区三区| 秋霞电影一区二区| 欧洲视频一区二区| 国产视频不卡一区| 九九精品视频在线看| 欧美精品一卡二卡| 亚洲综合色视频| 99久久精品久久久久久清纯| 精品成人免费观看| 全部av―极品视觉盛宴亚洲| 色婷婷精品大在线视频| 国产精品美女久久久久久久| 久久99国内精品| 69成人精品免费视频| 亚洲小少妇裸体bbw| 一本一道久久a久久精品| 国产精品你懂的在线| 国产乱国产乱300精品| 日韩视频在线你懂得| 午夜在线成人av| 91久久精品日日躁夜夜躁欧美| 18欧美亚洲精品| 菠萝蜜视频在线观看一区| 国产亚洲欧美在线| 国产在线视频一区二区三区| 欧美一区二区国产| 麻豆精品视频在线观看视频| 欧美老肥妇做.爰bbww视频| 亚洲成a人片在线不卡一二三区| 欧洲一区在线电影| 亚洲综合男人的天堂| 欧美午夜精品电影| 亚洲二区视频在线| 欧美片在线播放| 日韩影院在线观看| 日韩一区二区视频| 激情五月婷婷综合| 久久久精品tv| 成人一级片在线观看| 自拍偷拍国产亚洲| 在线观看欧美精品| 午夜一区二区三区视频| 欧美四级电影网| 日韩国产精品91| 精品国产三级电影在线观看| 国产精品资源网| 亚洲视频在线观看三级| 欧美专区在线观看一区| 亚洲成人资源在线| 在线电影一区二区三区| 蜜臀av一区二区在线免费观看| 日韩免费电影一区| 国产成人自拍网| 亚洲人成网站影音先锋播放| 欧美日韩视频在线一区二区| 日本伊人色综合网| 亚洲男同1069视频| 欧美日韩国产高清一区二区三区 | 日韩理论在线观看| 欧美图区在线视频| 麻豆一区二区三区| 中文字幕免费不卡在线| 色狠狠av一区二区三区| 美女一区二区久久| 国产精品久久久久7777按摩 | 欧美大黄免费观看| 国产成人精品亚洲777人妖| 亚洲免费色视频| 日韩精品一区二区三区swag| 99免费精品视频|