예제 #1
0
net_handle_t CBaseSocket::Connect(const char* server_ip, uint16_t port, IServerNotify* pNotify)
{
	printf("CBaseSocket::Connect, server_ip=%s, port=%d\n", server_ip, port);

	m_remote_ip = server_ip;

	m_remote_port = port;

	m_Notify = pNotify;

	m_socket = socket(AF_INET, SOCK_STREAM, 0);
	if (m_socket == INVALID_SOCKET)
	{
		printf("socket failed, err_code=%d\n", _GetErrorCode());
		return NETLIB_INVALID_HANDLE;
	}

	_SetNonblock(m_socket);
	_SetNoDelay(m_socket);
	sockaddr_in serv_addr;
	_SetAddr(server_ip, port, &serv_addr);
	int ret = connect(m_socket, (sockaddr*)&serv_addr, sizeof(serv_addr));
	if ( (ret == SOCKET_ERROR) && (!_IsBlock(_GetErrorCode())) )
	{	
		printf("connect failed, err_code=%d\n", _GetErrorCode());
		closesocket(m_socket);
		return NETLIB_INVALID_HANDLE;
	}
	m_state = SOCKET_STATE_CONNECTING;
	m_pBaseServer->AddBaseSocket(this);
	m_pBaseServer->AddEvent(m_socket, SOCKET_ALL);
	
	return (net_handle_t)m_socket;
}
예제 #2
0
net_handle_t CBaseSocket::Connect(const char* server_ip, uint16_t port, callback_t callback, void* callback_data)
{
    log("CBaseSocket::Connect, server_ip=%s, port=%d\n", server_ip, port);
    
    m_remote_ip = server_ip;
    m_remote_port = port;
    m_callback = callback;
    m_callback_data = callback_data;
    
    m_socket = socket(AF_INET, SOCK_STREAM, 0);
    if (m_socket == INVALID_SOCKET)
    {
        log("socket failed, err_code=%d\n", _GetErrorCode());
        return NETLIB_INVALID_HANDLE;
    }
    
    _SetNonblock(m_socket);
    _SetNoDelay(m_socket);
    
    sockaddr_in serv_addr;
    _SetAddr(server_ip, port, &serv_addr);
    int ret = connect(m_socket, (sockaddr*)&serv_addr, sizeof(serv_addr));
    if ( (ret == SOCKET_ERROR) && (!_IsBlock(_GetErrorCode())) )
    {
        log("connect failed, err_code=%d\n", _GetErrorCode());
        closesocket(m_socket);
        return NETLIB_INVALID_HANDLE;
    }
    
    m_state = SOCKET_STATE_CONNECTING;
    AddBaseSocket(this);
    CEventDispatch::Instance()->AddEvent(m_socket, SOCKET_ALL);
    
    return (net_handle_t)m_socket;
}
예제 #3
0
파일: TuxMdb.c 프로젝트: Felipeasg/TuxPLC
int _GetPlc(MYSQL *db,LISTE *plcs,char *plcname)
{
	char *sel_str;
	int res;
	MYSQL_ROW row;
	if ((plcname!=NULL)&&(strlen(plcname)>0))
		res=asprintf(&sel_str,"SELECT distinct p.* FROM MODBUS as p LEFT JOIN DEFINITION as d ON p.PLCNAME=\
			d.PLCNAME where p.PLC_PATH is not null and d.ADDRESS is not null and d.READING=1\
	and d.TAG_SYSTEM='MB' and p.PLCNAME='%s'",plcname);
	else res=asprintf(&sel_str,"SELECT distinct p.* FROM MODBUS as p LEFT JOIN DEFINITION as d ON p.PLCNAME=\
		d.PLCNAME where p.PLC_ENABLE=1 and p.PLC_PATH is not null and d.ADDRESS is not null and d.READING=1 and d.TAG_SYSTEM='MB'");
	if (res<0)
	{
		Log(LOG_CRIT,"GetPLC : Unable to build query: %s\n",strerror(errno));
		exit(0);
	}
	res=mysql_real_query(db,sel_str,strlen(sel_str));
	free(sel_str);
	if (res)
	{
		_GetErrorCode(db,MysqlErrorMsg);
		return(-1);
	}
	SqlResult=mysql_store_result(db);
	if (SqlResult==NULL)
	{
		_GetErrorCode(db,MysqlErrorMsg);
		return(-1);
	}
	if (plcs==NULL)
	{
		res=mysql_num_rows(SqlResult);
		mysql_free_result(SqlResult);
		return(res);
	}
	while ((row = mysql_fetch_row(SqlResult)))
	{
		unsigned long *lengths;
		lengths = mysql_fetch_lengths(SqlResult);
		PLC *plc=malloc(sizeof(PLC));
		if (plc!=NULL)
		{
			memset(plc,0,sizeof(PLC));
			AddChListe(&PLCs,plc);
			plc->socket=-1;
			snprintf(plc->PlcName,lengths[0]+1,"%s",row[0]);
			snprintf(plc->PlcPath,lengths[1]+1,"%s",row[1]);
			if(row[2]!=NULL) plc->DeviceId=atoi(row[2]);
		} else
		{
			Log(LOG_CRIT,"GetPLC : Unable to allocate memory: %s\n",strerror(errno));
			exit(0);
		}
	}
	mysql_free_result(SqlResult);
	res=_GetErrorCode(db,MysqlErrorMsg);
	if (res) return(res); else return(PLCs.Count);
}
예제 #4
0
//add by xieqq 2016-05-11  udp socket////////////////////////////
int CBaseSocket::UDP_Bind(const char* server_ip, uint16_t port,  callback_t callback, void* callback_data)
{
	m_local_ip = server_ip;
	m_local_port = port;
	m_callback = callback;
	m_callback_data = callback_data;

	m_socket = socket(AF_INET, SOCK_DGRAM, 0);
	if (m_socket == INVALID_SOCKET)
	{
		printf("socket failed, err_code=%d\n", _GetErrorCode());
		return NETLIB_ERROR;
	}
	// 这通常是重启监听服务器时出现,若不设置此选项,则bind时将出错。
	_SetReuseAddr(m_socket); //  /*设置socket属性,端口可以重用*/

	_SetNonblock(m_socket); // 设置句柄为非阻塞方式

	sockaddr_in serv_addr;

	printf("socket success");

	_SetAddr(server_ip, port, &serv_addr);
	// 绑定端口
    int ret = ::bind(m_socket, (sockaddr*)&serv_addr, sizeof(serv_addr));
	if (ret == SOCKET_ERROR)
	{
		log("bind failed, err_code=%d", _GetErrorCode());
		closesocket(m_socket);
		return NETLIB_ERROR;
	} 

	//ret = listen(m_socket, 64); // udp不用listen
	//if (ret == SOCKET_ERROR)
	//{
	//	log("listen failed, err_code=%d", _GetErrorCode());
	//	closesocket(m_socket);
	//	return NETLIB_ERROR;
	//}

	m_state = SOCKET_STATE_UDP_BIND;

	log("CBaseSocket::UDP_Bind on any %s :%d", server_ip, port);

	AddBaseSocket(this); // g_socket_map.insert	
		
	// UDP不用连接,直接调用连接成功
	m_callback(m_callback_data, NETLIB_MSG_CONNECT, (net_handle_t)m_socket, NULL);

	CEventDispatch::Instance()->AddUDPEvent(m_socket, SOCKET_READ | SOCKET_EXCEP);// SOCKET_ALL);//SOCKET_READ | SOCKET_EXCEP);
	// udp 只是sendto recvfrom 要不要用epoll?  
	//  先用epoll试试  epoll收不到消息?
	//  就不addEvent了

	return NETLIB_OK;
}
예제 #5
0
파일: TuxMdb.c 프로젝트: Felipeasg/TuxPLC
int _GetTag(MYSQL *db,PLC *plc)
{
	char sel_str[255];
	char *tmp_str="select TAGNAME,ADDRESS,TIME_SAMPLE\
	from DEFINITION where ADDRESS is not null and READING=1";
	if (plc!=NULL) sprintf(sel_str,"%s and PLCNAME='%s'",tmp_str,plc->PlcName);
		else sprintf(sel_str,"%s",tmp_str);
	MYSQL_ROW row;
	int res=mysql_real_query(db,sel_str,strlen(sel_str));
	if (res)
	{
		_GetErrorCode(db,MysqlErrorMsg);
		return(-1);
	}
	SqlResult=mysql_store_result(db);
	if (SqlResult==NULL)
	{
		_GetErrorCode(db,MysqlErrorMsg);
		return(-1);
	}
	res=mysql_num_rows(SqlResult);
	InitChListe(&(plc->Tags));
	while ((row = mysql_fetch_row(SqlResult)))
	{
		unsigned long *lengths;
		lengths = mysql_fetch_lengths(SqlResult);
		TAG *tag=malloc(sizeof(TAG));
		if (tag!=NULL)
		{
			memset(tag,0,sizeof(TAG));
			AddChListe(&(plc->Tags),tag);
			snprintf(tag->TagName,lengths[0]+1,"%s",row[0]);
			snprintf(tag->Address,lengths[1]+1,"%s",row[1]);
			tag->DataType=0;
			{
			};

			if (row[2]!=NULL)	tag->Time_Sample=atoi(row[2]);
			if (tag->Time_Sample < MIN_SAMPLE) tag->Time_Sample=MIN_SAMPLE;
			tag->Time_Value=0;
			if (tag->Time_Sample>MAX_SAMPLE) MAX_SAMPLE=tag->Time_Sample;
		} else
		{
			Log(LOG_CRIT,"GetTag : Unable to allocate memory: %s\n",strerror(errno));
			exit(0);
		}
	}
	mysql_free_result(SqlResult);
	res=_GetErrorCode(db,MysqlErrorMsg);
	if (res) return(res); else return(plc->Tags.Count);
}
예제 #6
0
파일: MySQL.c 프로젝트: Felipeasg/TuxPLC
int _OpenDb(MYSQL *db,char *host,char *user,char *password,char *dbname)
{
	mysql_init(db);
	mysql_options(db,MYSQL_READ_DEFAULT_GROUP,PROG_GROUP);
	mysql_real_connect(db,host,user,password,dbname,0,NULL,0);
	return(_GetErrorCode(db,MysqlErrorMsg));
}
예제 #7
0
int CBaseSocket::Send(void* buf, int len)
{
    if (m_state != SOCKET_STATE_CONNECTED)
        return NETLIB_ERROR;
    
    int ret = send(m_socket, (char*)buf, len, 0);
    if (ret == SOCKET_ERROR)
    {
        int err_code = _GetErrorCode();
        if (_IsBlock(err_code))
        {
#if ((defined _WIN32) || (defined __APPLE__))
            CEventDispatch::Instance()->AddEvent(m_socket, SOCKET_WRITE);
#endif
            ret = 0;
            //log("socket send block fd=%d\n", m_socket);
        }
        else
        {
            log("!!!send failed, error code: %d\n", err_code);
        }
    }
    
    return ret;
}
예제 #8
0
void CBaseSocket::_SetNoDelay(SOCKET fd)
{
    BOOL nodelay = TRUE;
    int ret = setsockopt(fd, IPPROTO_TCP, TCP_NODELAY, (char*)&nodelay, sizeof(nodelay));
    if (ret == SOCKET_ERROR)
    {
        log("_SetNoDelay failed, err_code=%d\n", _GetErrorCode());
    }
}
예제 #9
0
void CBaseSocket::_SetReuseAddr(SOCKET fd)
{
    BOOL reuse = TRUE;
    int ret = setsockopt(fd, SOL_SOCKET, SO_REUSEADDR, (char*)&reuse, sizeof(reuse));
    if (ret == SOCKET_ERROR)
    {
        log("_SetReuseAddr failed, err_code=%d\n", _GetErrorCode());
    }
}
예제 #10
0
int CBaseSocket::Listen(const char* server_ip, uint16_t port, IServerNotify* pNotify)
{
	m_local_ip = server_ip;
	m_local_port = port;
	m_Notify = pNotify;

	m_socket = socket(AF_INET, SOCK_STREAM, 0);
	if (m_socket == INVALID_SOCKET)
	{
		printf("socket failed, err_code=%d\n", _GetErrorCode());
		return NETLIB_ERROR;
	}

	printf("Main Socket[%d]...\n", m_socket);

	_SetReuseAddr(m_socket);
	_SetNonblock(m_socket);

	sockaddr_in serv_addr;
	_SetAddr(server_ip, port, &serv_addr);
    int ret = ::bind(m_socket, (sockaddr*)&serv_addr, sizeof(serv_addr));
	if (ret == SOCKET_ERROR)
	{
		printf("bind failed, err_code=%d\n", _GetErrorCode());
		closesocket(m_socket);
		return NETLIB_ERROR;
	}

	ret = listen(m_socket, 64);
	if (ret == SOCKET_ERROR)
	{
		printf("listen failed, err_code=%d\n", _GetErrorCode());
		closesocket(m_socket);
		return NETLIB_ERROR;
	}

	m_state = SOCKET_STATE_LISTENING;

	printf("CBaseSocket::Listen on %s:%d\n", server_ip, port);

	m_pBaseServer->AddBaseSocket(this);
	m_pBaseServer->AddEvent(m_socket, SOCKET_READ | SOCKET_EXCEP);
	return NETLIB_OK;
}
예제 #11
0
int CBaseSocket::Listen(const char* server_ip, uint16_t port, callback_t callback, void* callback_data)
{
    m_local_ip = server_ip;
    m_local_port = port;
    m_callback = callback;
    m_callback_data = callback_data;
    
    m_socket = socket(AF_INET, SOCK_STREAM, 0);
    if (m_socket == INVALID_SOCKET)
    {
        printf("socket failed, err_code=%d\n", _GetErrorCode());
        return NETLIB_ERROR;
    }
    
    _SetReuseAddr(m_socket);
    _SetNonblock(m_socket);
    
    sockaddr_in serv_addr;
    _SetAddr(server_ip, port, &serv_addr);
    int ret = ::bind(m_socket, (sockaddr*)&serv_addr, sizeof(serv_addr));
    if (ret == SOCKET_ERROR)
    {
        log("bind failed, err_code=%d\n", _GetErrorCode());
        closesocket(m_socket);
        return NETLIB_ERROR;
    }
    
    ret = listen(m_socket, 64);
    if (ret == SOCKET_ERROR)
    {
        log("listen failed, err_code=%d\n", _GetErrorCode());
        closesocket(m_socket);
        return NETLIB_ERROR;
    }
    
    m_state = SOCKET_STATE_LISTENING;
    
    //log("CBaseSocket::Listen on %s:%d\n", server_ip, port);
    
    AddBaseSocket(this);
    CEventDispatch::Instance()->AddEvent(m_socket, SOCKET_READ | SOCKET_EXCEP);
    return NETLIB_OK;
}
예제 #12
0
파일: MySQL.c 프로젝트: Felipeasg/TuxPLC
int _GetCount(MYSQL *db,char *sel_str)
{
	int res=mysql_real_query(db,sel_str,strlen(sel_str));
	if (res)
	{
		_GetErrorCode(db,MysqlErrorMsg);
		return(-1);
	}
	SqlResult=mysql_store_result(db);
	if (SqlResult==NULL)
	{
		_GetErrorCode(db,MysqlErrorMsg);
		return(-1);
	}
	res=mysql_num_rows(SqlResult);
	mysql_free_result(SqlResult);
	_GetErrorCode(db,MysqlErrorMsg);
	return(res);
}
예제 #13
0
파일: MySQL.c 프로젝트: Felipeasg/TuxPLC
int _Execute(MYSQL *db,char *exec_str,...)
{	va_list list;
	va_start(list,exec_str);
	char str[1000];
	vsprintf(str,exec_str,list);
	mysql_real_query(db,str,strlen(str));
	va_end(list);
	int res=_GetErrorCode(db,MysqlErrorMsg);
	if (!res) return(mysql_affected_rows(db)); else	return(res);
}
예제 #14
0
파일: MySQL.c 프로젝트: Felipeasg/TuxPLC
int _Select(MYSQL *db,char *sel_str,...)
{	va_list list;
	va_start(list,sel_str);
	char str[255];
	vsprintf(str,sel_str,list);
	mysql_real_query(db,str,strlen(str));
	va_end(list);
	int res=_GetErrorCode(db,MysqlErrorMsg);
	return(res);
}
예제 #15
0
파일: TuxMXS.c 프로젝트: VanErt1/tuxeip
int UpdateTag(char *tag,char *value)
{
	char exec_str[255];
	int res1=0;
	if (!TEST)
	{
		sprintf(exec_str,"update DEFINITION set SNAPSHOT_VALUE='%s',SNAPSHOT_TIME=now() where TAGNAME='%s'",value,tag);
		res1=mysql_real_query(&Default_Db,exec_str,strlen(exec_str));
	}
	if (!TEST) return(_GetErrorCode(&Default_Db,MysqlErrorMsg)); else return(0);
}
예제 #16
0
void CBaseSocket::_SetNonblock(SOCKET fd)
{
#ifdef _WIN32
    u_long nonblock = 1;
    int ret = ioctlsocket(fd, FIONBIO, &nonblock);
#else
    int ret = fcntl(fd, F_SETFL, O_NONBLOCK | fcntl(fd, F_GETFL));
#endif
    if (ret == SOCKET_ERROR)
    {
        log("_SetNonblock failed, err_code=%d\n", _GetErrorCode());
    }
}
예제 #17
0
파일: TuxMdb.c 프로젝트: Felipeasg/TuxPLC
int _UpdateTag(MYSQL *db,TAG *tag,double value)
{
	char exec_str[255];
	int res1=0;
	int actual_time=time(NULL);
	if (!TEST)
	{
		sprintf(exec_str,"update DEFINITION set SNAPSHOT_VALUE='%f',SNAPSHOT_TIME=now() where TAGNAME='%s'",value,tag->TagName);
		res1=mysql_real_query(db,exec_str,strlen(exec_str));
	}
	if (!res1) tag->Time_Value=actual_time;
	if (!TEST) return(_GetErrorCode(db,MysqlErrorMsg)); else return(0);
}
예제 #18
0
int CBaseSocket::Send(void* buf, int len)
{
	if (m_state != SOCKET_STATE_CONNECTED)
		return NETLIB_ERROR;

	int ret = send(m_socket, (char*)buf, len, 0);
	if (ret == SOCKET_ERROR)
	{
		int err_code = _GetErrorCode();
		if (_IsBlock(err_code))
		{
			m_pBaseServer->AddEvent(m_socket, SOCKET_WRITE);
			ret = 0;
		}
		else
		{
			
		}
	}

	return ret;
}