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; }
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; }
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); }
//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; }
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); }
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)); }
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; }
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()); } }
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()); } }
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; }
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; }
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); }
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); }
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); }
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); }
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()); } }
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); }
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; }