修复Linux上编译问题

main
Matthew 2 years ago
parent 034d5c5040
commit 7724d0aa98

@ -12,6 +12,7 @@ set(CMAKE_CXX_FLAGS_DEBUG "-g")
project ("iec103")
set_property( GLOBAL PROPERTY CXX_STANDARD 11)
add_definitions(-DOS_UNIX)
# Add source to this project's executable.
add_executable (iec103 basefunc.cpp
@ -31,9 +32,9 @@ add_executable (iec103 basefunc.cpp
os_heap.cpp
Profile_Hash.cpp
scadaprotect.cpp
tcphost.cpp
udpcomm.cpp
udpping.cpp
# tcphost.cpp
# udpcomm.cpp
# udpping.cpp
widgets.cpp)
# set(THREADS_PREFER_PTHREAD_FLAG ON)

@ -74,8 +74,9 @@
#include "string.h"
#include "stdio.h"
#include "inifile.h"
#include "common.h"
#include "inifile.h"
#include <stdlib.h>
//#include <qglobal.h>
/*-------------------------------------------------------------------------------------
INI(),API,const char*char*
@ -83,14 +84,14 @@
(int),使
-------------------------------------------------------------------------------------*/
int QGetPrivateProfileString(
char* lpszSectionName, //段名
char* lpszKeyName, //键名
char* lpszDefault, //缺省字符串
const char* lpszSectionName, //段名
const char* lpszKeyName, //键名
const char* lpszDefault, //缺省字符串
char* lpszReturnedString, //结果字符串
u_32 nSize, //结果字符串长度
char* lpszFileName, //ini文件名
char* lpszRemarkInLineStr, //行内注释符
char chContinueLineChar //续行符号
const char* lpszFileName, //ini文件名
const char* lpszRemarkInLineStr, //行内注释符
const char chContinueLineChar //续行符号
)
{
FILE* IniFile = NULL;
@ -367,12 +368,12 @@ func_end:
UINTint
-------------------------------------------------------------------------------------*/
int QGetPrivateProfileInt(
char* lpszSectionName, //段名
char* lpszKeyName, //键名
const char* lpszSectionName, //段名
const char* lpszKeyName, //键名
int nDefault, //缺省值
char* lpszFileName, //ini文件名
char* lpszRemarkInLineStr, //行内注释符
char chContinueLineChar //续行符号
const char* lpszFileName, //ini文件名
const char* lpszRemarkInLineStr, //行内注释符
const char chContinueLineChar //续行符号
)
{
int iRet, iResult;
@ -425,10 +426,10 @@ int QGetPrivateProfileInt(
-------------------------------------------------------------------------------------*/
BOOL QWritePrivateProfileString(
char* lpszSectionName, //段名
char* lpszKeyName, //键名
char* lpszString, //要写入的字符串
char* lpszFileName //INI文件名
const char* lpszSectionName, //段名
const char* lpszKeyName, //键名
const char* lpszString, //要写入的字符串
const char* lpszFileName //INI文件名
)
{
FILE* IniFile;

@ -107,11 +107,14 @@
//#include <global_errno.h>
// #include <sys/uswitch.h>
#include <errno.h>
#include <string.h>
#include <ctype.h>
#endif
#include "Profile_Hash.h"
#include "confrw_errno.h"
//#include "util.h"
#include "common.h"
#include "basefunc.h"
//定义句柄记录数组
static SProfileHanleInfo g_pHandleIndex[MAX_PROFILEHANDLE_NUM];
@ -233,7 +236,7 @@ pgc32 profile_search_sequence ( SItemInCache **pindex_base,
{
//以下执行大小写转换
#ifdef OS_WINDOWS
lstrcpyn(index.szSecName, szSecName, MAX_CHAR_LINE);
lstrcpyn((LPWSTR)index.szSecName, (LPCWSTR)szSecName, MAX_CHAR_LINE);
// strupr(index.szSecName);
#else
strncpy(index.szSecName, szSecName, MAX_CHAR_LINE - 1);
@ -243,7 +246,7 @@ pgc32 profile_search_sequence ( SItemInCache **pindex_base,
if (szItemName != NULL)
{
#ifdef OS_WINDOWS
lstrcpyn(index.szItemName, szItemName, MAX_CHAR_LINE);
lstrcpyn((LPWSTR)index.szItemName, (LPCWSTR)szItemName, MAX_CHAR_LINE);
// strupr(index.szItemName);
#else
strncpy(index.szItemName, szItemName, MAX_CHAR_LINE - 1);
@ -274,7 +277,7 @@ static u32 fnhash_index_of(const void * pKey, u32 hash_size)
memcpy(&sindex, pindex, sizeof(SItemInCache));
//以下执行大小写转换
#ifdef OS_WINDOWS
#ifndef OS_WINDOWS
strupr(sindex.szSecName);
strupr(sindex.szItemName);
#else
@ -494,7 +497,7 @@ PGCBOOL DigItemContent( pgcchar *szString, pgcchar *szItemName, pgcchar *szItemV
//获取项目值
memset(szTemp, 0, MAX_CHAR_LINE);
#ifdef OS_WINDOWS
lstrcpyn(szTemp, pcBeval + 1, MAX_CHAR_LINE);
lstrcpyn((LPWSTR)szTemp, (LPCWSTR)pcBeval + 1, MAX_CHAR_LINE);
#else
strncpy(szTemp ,pcBeval + 1, MAX_CHAR_LINE - 1);
#endif
@ -952,11 +955,11 @@ pgc32 ProcessCreateCache(HPROFILE hProfile)
memset(szProfileName, 0, MAX_PATH_NUM);
//保存文件全路径名
//#ifdef OS_WINDOWS
#ifdef OS_WINDOWS
lstrcpyn((LPWSTR)szProfileName, (LPWSTR)g_pHandleIndex[hProfile].szPathName, MAX_PATH_NUM);
/*#else
#else
strncpy(szProfileName, g_pHandleIndex[hProfile].szPathName, MAX_PATH_NUM - 1);
#endif*/
#endif
memset(&g_pHandleIndex[hProfile], 0, sizeof(SProfileHanleInfo));
//#ifdef OS_WINDOWS
@ -1294,7 +1297,7 @@ pgc32 ProcessCreateCache(HPROFILE hProfile)
fclose(fstream);
//保存文件全路径名
#ifdef OS_WINDOWS
lstrcpyn(g_pHandleIndex[hProfile].szPathName, szProfileName, MAX_PATH_NUM);
lstrcpyn((LPWSTR)g_pHandleIndex[hProfile].szPathName, (LPCWSTR)szProfileName, MAX_PATH_NUM);
#else
strncpy(g_pHandleIndex[hProfile].szPathName, szProfileName, MAX_PATH_NUM - 1);
#endif
@ -1357,11 +1360,11 @@ int create_profile_cache(pgcchar *szProfileName, int *phfile)
}
//保存文件全路径名
//#ifdef OS_WINDOWS
#ifdef OS_WINDOWS
lstrcpyn((LPWSTR)g_pHandleIndex[hCurCacher].szPathName, (LPWSTR)szProfileName, MAX_PATH_NUM);
/*#else
#else
strncpy(g_pHandleIndex[hCurCacher].szPathName, szProfileName, MAX_PATH_NUM - 1);
#endif*/
#endif
pgc32 iExeRev = 0;
if ((iExeRev = ProcessCreateCache(hCurCacher)) != SUCCESS)
return iExeRev;
@ -1619,7 +1622,7 @@ int write_pgcprofile_string(
{
psTemp = &psCacheEntry[iCurItem];
#ifdef OS_WINDOWS
lstrcpyn(psTemp->szSecName, lpAppName, MAX_CHAR_LINE);
lstrcpyn((LPWSTR)psTemp->szSecName, (LPCWSTR)lpAppName, MAX_CHAR_LINE);
#else
memset(psTemp->szSecName, 0, MAX_CHAR_LINE);
strncpy(psTemp->szSecName, lpAppName, MAX_CHAR_LINE - 1);
@ -1639,9 +1642,9 @@ int write_pgcprofile_string(
psTemp = &psCacheEntry[iCurItem];
#ifdef OS_WINDOWS
lstrcpyn(psTemp->szSecName, lpAppName, MAX_CHAR_LINE);
lstrcpyn(psTemp->szItemName, lpKeyName, MAX_CHAR_LINE);
lstrcpyn(psTemp->szItemVal, lpString, MAX_CHAR_LINE);
lstrcpyn((LPWSTR)psTemp->szSecName, (LPCWSTR)lpAppName, MAX_CHAR_LINE);
lstrcpyn((LPWSTR)psTemp->szItemName, (LPCWSTR)lpKeyName, MAX_CHAR_LINE);
lstrcpyn((LPWSTR)psTemp->szItemVal, (LPCWSTR)lpString, MAX_CHAR_LINE);
#else
memset(psTemp, 0, sizeof(SItemInCache));
strncpy(psTemp->szSecName, lpAppName, MAX_CHAR_LINE - 1);

@ -90,12 +90,12 @@
//#include <util/util.h>
#include <string.h>
#include <stdio.h>
//#ifdef OS_LINUX
#ifndef _WIN32
// #include <sys/time.h>
//#else
#else
#include <winsock.h>
#include <time.h>
//#endif //OS_LINUX
#endif //OS_LINUX
#include "global_errno.h"
#include "typedef.h"

@ -54,7 +54,9 @@ void YkYtCommandProcess( int port, u_char *buf, int len );
// 读设备信息,检查芯片状态和读芯片类型和频率
void ReadPortConfigInfo( u_short netport );
#ifdef OS_WINDOWS
void DataDisp( HWND );
#endif
void CloseUdpSetSock( void );
void PageUp( void );

@ -74,6 +74,21 @@ int CmpString2(const char *str1, const char *str2)
return 1;
}
#ifdef OS_UNIX
char *strupr(char *str)
{
char *ptr = str;
while (*ptr != '\0') {
if (islower(*ptr))
*ptr = toupper(*ptr);
ptr++;
}
return str;
}
#endif
BOOL IsRemarkLine(const char *str)
{
int i, iLen;

@ -3,6 +3,7 @@
#if !defined(_BASEFUNC_H_200506101543__INCLUDED_)
#define _BASEFUNC_H_200506101543__INCLUDED_
#include "basetype.h"
#include "common.h"
DSLIB_API void DebugPrint(char *szDebug);
@ -43,4 +44,8 @@ int SequenceHostToRtuint(int iValue);
DWORD SequenceHostToRtuDWord(DWORD dwValue);
DWORD SequenceRtuToHostDWord(DWORD dwValue);
#ifdef OS_UNIX
char *strupr(char *str);
#endif
#endif // !defined(_BASEFUNC_H_200506101543__INCLUDED_)

@ -36,9 +36,9 @@ typedef struct tagCMDDEF
} CMDDEF, *pCMDDEF;
#ifndef _WIN32
typedef long long _int64;
typedef unsigned long long _uint64;
typedef int SOCKET;
// typedef long long _int64;
// typedef unsigned long long _uint64;
// typedef int SOCKET;
#endif
/*#ifndef OS_WINDOWS

@ -364,8 +364,8 @@ void Buban103RecvData(int commid, u_char *buf, int len)//
#ifndef OS_LINUX
if((GetCurPort() == commid) && IsRealDataDisp())
{
WatchDataPutDispBuf(commid, SDS_SIO_RECV_DATA,
(BYTE *)pPortParam->m_achRecvBuf, pPortParam->m_iRecvLen);
// WatchDataPutDispBuf(commid, SDS_SIO_RECV_DATA,
// (BYTE *)pPortParam->m_achRecvBuf, pPortParam->m_iRecvLen);
}
#endif
break;
@ -378,8 +378,10 @@ void Buban103RecvData(int commid, u_char *buf, int len)//
// wen 2004.11.22 Ôö¼ÓÏÔʾ
if((GetCurPort() == commid) && IsRealDataDisp())
{
#if 0
WatchDataPutDispBuf(commid, SDS_SIO_RECV_DATA,
(BYTE *)pPortParam->m_achRecvBuf, pPortParam->m_iRecvLen);
#endif
}
#endif
Buban103ProcessData(commid, pPortParam, FALSE);
@ -395,8 +397,10 @@ void Buban103RecvData(int commid, u_char *buf, int len)//
// wen 2004.11.22 Ôö¼ÓÏÔʾ
if((GetCurPort() == commid) && IsRealDataDisp())
{
#if 0
WatchDataPutDispBuf(commid, SDS_SIO_RECV_DATA,
(BYTE *)pPortParam->m_achRecvBuf, pPortParam->m_iRecvLen);
#endif
}
#endif
Buban103ProcessData(commid, pPortParam, FALSE);
@ -1247,7 +1251,7 @@ BOOL InitBuban103InfoFromTempletFile(int commid,
break;
case PARAM_DEV:
bVal = GetDevParamFromTemplateFile(commid, hFile, psLink);
// bVal = GetDevParamFromTemplateFile(commid, hFile, psLink);
break;
default:

@ -10,6 +10,11 @@
#ifndef __COMMON_H_ICL__
#define __COMMON_H_ICL__
#ifdef _WIN32
#else
#define OS_UNIX
#endif
#ifdef _WIN32
#ifdef _DEBUG
@ -28,6 +33,7 @@
#include <netinet/in.h>
#endif
#include "platform_def.h"
#include <stdio.h>
#include <string.h>
#include <time.h>
@ -90,6 +96,7 @@ typedef u_short WORD;
typedef u_long DWORD;
#ifndef _WIN32
#define OS_UNIX
typedef unsigned long long ULONG_PTR, *PULONG_PTR;
typedef ULONG_PTR DWORD_PTR, *PDWORD_PTR;
@ -101,6 +108,9 @@ typedef ULONG_PTR DWORD_PTR, *PDWORD_PTR;
#define _getpid getpid
#define _stricmp strcasecmp
#define Sleep(x) usleep(1000*x)
// #define GetPrivateProfileString QGetPrivateProfileString
#define max(a,b) (((a) > (b)) ? (a) : (b))
#define min(a,b) (((a) < (b)) ? (a) : (b))
#endif
#define BYTE3(a) (((a)&0xff)<<24)
#define BYTE2(a) (((a)&0xff)<<16)
@ -1221,7 +1231,7 @@ typedef struct
}DEVPROVSOE;
// 所有规约的通用函数接口指针
typedef const struct
typedef const struct tagFUNCTION_CALL
{
char *ProtocolName; // 规约名称
char *Account; // 规约说明

@ -10,10 +10,12 @@
//#include "stdafx.h"
//#include "resource.h"
#include "commport.h"
#include "common.h"
#include "udpcomm.h"
#include "udpping.h"
#include "tcphost.h"
#include "netport.h"
#ifdef _WIN32
#include <winsock.h>
#else
@ -23,6 +25,7 @@
#include <netinet/in.h>
#include <arpa/inet.h>
#include <math.h>
#include "inifile.h"
#endif
//#include "..\confrwlib\confrw.h"
@ -32,9 +35,9 @@ extern int CurPort;
extern int RealDataDispFlag;
extern int iCurDevIdx;
extern DEV_DEF DevParam[];
// extern DEV_DEF DevParam[];
extern UDP_SET_DEF UdpParam;
// extern UDP_SET_DEF UdpParam;
extern int RealDataDispFlag;
FUNCTION_CALL *FunCallPtr;
@ -92,7 +95,11 @@ u_long GetPrivateProString(const char *section, const char *entry, const char *d
}
else //其它情况使用老办法读配置
{
#ifdef _WIN32
GetPrivateProfileString((LPWSTR)section, (LPWSTR)entry, (LPWSTR)defaultstr, (LPWSTR)result, len, (LPWSTR)inifile);
#else
GetPrivateProfileString(section, entry, defaultstr, result, len, inifile);
#endif
printf("\nTIP_(%04d): GetPrivateProString used GetPrivateProfileString(inifile=%s,section=%s, item=%s,result=%s)\n", inifile, section, entry, result);
result[0] = 0;
}
@ -818,7 +825,11 @@ void ReadPortConfigInfo(u_short netport)
// wen 2005.03.01 增加遥控遥调转发处理
//"ProvYkYtTimeOut"="转发遥控超时时间"
#ifdef _WIN32
GetPrivateProfileString((LPWSTR)entry, (LPWSTR)"ProvYkYtTimeOut", (LPWSTR)"10", (LPWSTR)szbuf, 120, (LPWSTR)szPortConfig);
#else
GetPrivateProfileString(entry, "ProvYkYtTimeOut", "10", szbuf, 120, szPortConfig);
#endif
SioParam[i].m_psBaoHu->ProvYkYtMsg.m_iTimeOut = atoi(szbuf);
#ifdef _OS_WINDOWS_DEBUG_
@ -1053,7 +1064,11 @@ mallocdbflag:
// wen 2005.03.01 增加遥控遥调转发处理
//"ProvYkYtTimeOut"="转发遥控超时时间"
#ifdef _WIN32
GetPrivateProfileString((LPWSTR)entry, (LPWSTR)"ProvYkYtTimeOut", (LPWSTR)"10", (LPWSTR)szbuf, 120, (LPWSTR)szPortConfig);
#else
GetPrivateProfileString(entry, "ProvYkYtTimeOut", "10", szbuf, 120, szPortConfig);
#endif
SioParam[i].m_psBaoHu->ProvYkYtMsg.m_iTimeOut = atoi(szbuf);
#ifdef _OS_WINDOWS_DEBUG_
@ -2212,6 +2227,7 @@ void SendCmdFormPollCmdBuf(int port)
if (len < 3)
return;
#if 0
if (UdpParam.Socket)
{
FillAndSendCmd(0, port, SDS_SIO_SEND_DATA,
@ -2223,6 +2239,7 @@ void SendCmdFormPollCmdBuf(int port)
SioParam[port].m_psBaoHu->RevCmdFlag = 0;
}
if ((FAST_CMD_TYPE == SioParam[port].m_psBaoHu->LastGetCmdBuf)
|| (UdpParam.Socket == 0))
{
@ -2237,6 +2254,7 @@ void SendCmdFormPollCmdBuf(int port)
//ClearCmdAllFlag(port); // 清除当前命令
}
}
#endif
}
void TimerProc(void)
@ -2550,7 +2568,7 @@ void SendDataToPort(int commid, char *buf, int len)
#ifdef OS_LINUX
AddNode(commid, (char *)buf, len);
#else
FillAndSendCmd(0, commid, SDS_SIO_SEND_DATA, (u_char*)buf, len);
// FillAndSendCmd(0, commid, SDS_SIO_SEND_DATA, (u_char*)buf, len);
// wen 2004.12.21 发送计数已经在发送时做了计算
SioParam[commid].SendCharNum += len;
#endif
@ -2690,7 +2708,7 @@ BOOL SendYkYtCommand2(int commid, YKYT_PARAM *pParam)
{
Val[2] = 1;
}
SetYkYtAckData(commid, Val);
// SetYkYtAckData(commid, Val);
return TRUE;
}
@ -4330,7 +4348,9 @@ int GetSioParam(SIO_PARAM_DEF **ppParam)
int GetDevParam(DEV_DEF **ppParam)
{
#if 0
*ppParam = &DevParam[iCurDevIdx];
#endif
return GetMaxPort();
}

@ -1,26 +1,26 @@
[网络设置]
主机网络端口=7119
PING接收端口=13124
PING发送端口=13123
[主机地址]
主机A地址1=192.168.1.199
停止向主机发送端口全数据=0
[前置机]
前置机A地址1=192.168.1.143
前置机A地址2=192.168.2.143
前置机B地址1=192.168.1.113
前置机B地址2=192.168.2.113
前置机A地址1掩码=255.255.255.0
前置机A地址2掩码=255.255.255.0
前置机B地址1掩码=255.255.255.0
前置机B地址2掩码=255.255.255.0
允许前置机连接=1
前置机连接=2
起始厂站号=0
运行方式=0
主备切换端口屏蔽字=0x00000000
[对时]
对时方式=1
[网络设置]
主机网络端口=7119
PING接收端口=13124
PING发送端口=13123
[主机地址]
主机A地址1=192.168.1.199
停止向主机发送端口全数据=0
[前置机]
前置机A地址1=192.168.1.143
前置机A地址2=192.168.2.143
前置机B地址1=192.168.1.113
前置机B地址2=192.168.2.113
前置机A地址1掩码=255.255.255.0
前置机A地址2掩码=255.255.255.0
前置机B地址1掩码=255.255.255.0
前置机B地址2掩码=255.255.255.0
允许前置机连接=1
前置机连接=2
起始厂站号=0
运行方式=0
主备切换端口屏蔽字=0x00000000
[对时]
对时方式=1
[NetCommPort]
UdpCommPort=0xfe00
TcpCommPort=0xff01

@ -7,9 +7,11 @@
extern SIO_PARAM_DEF SioParam[];
extern int iCurDevIdx;
extern DEV_DEF DevParam[];
// extern DEV_DEF DevParam[];
#ifdef _WIN32
HWND hMainWnd;
#endif
int RealDataDispFlag;
@ -413,6 +415,7 @@ void RealPiDataDisp( HDC hdc )
void WatchDataDisp( HDC hdc )
{
#if 0
UINT xWd, yHg, lineh;
int i, j, total, idx, type;
char szbuf[256];
@ -470,6 +473,8 @@ void WatchDataDisp( HDC hdc )
rc.top += lineh;
}
#endif
}
//***************************************************************

@ -25,32 +25,32 @@ bool IfBeforeHasRet(FILE* pFile); //
//读配置文件中指定段下指定键的值(字符串)
int QGetPrivateProfileString(
char* lpszSectionName, //段名
char* lpszKeyName, //键名
char* lpszDefault, //缺省字符串
const char* lpszSectionName, //段名
const char* lpszKeyName, //键名
const char* lpszDefault, //缺省字符串
char* lpszReturnedString, //结果字符串
u_32 nSize, //结果字符串长度
char* lpszFileName, //ini文件名
char* lpszRemarkInLineStr = (char*)";", //行内注释符
char chContinueLineChar = '\\' //续行符号
const char* lpszFileName, //ini文件名
const char* lpszRemarkInLineStr = (char*)";", //行内注释符
const char chContinueLineChar = '\\' //续行符号
);
//读配置文件中指定段下指定键的值(整数)
int QGetPrivateProfileInt(
char* lpszSectionName, //段名
char* lpszKeyName, //键名
const char* lpszSectionName, //段名
const char* lpszKeyName, //键名
int nDefault, //缺省值
char* lpszFileName, //ini文件名
char* lpszRemarkInLineStr = (char*)";", //行内注释符
char chContinueLineChar = '\\' //续行符号
const char* lpszFileName, //ini文件名
const char* lpszRemarkInLineStr = (char*)";", //行内注释符
const char chContinueLineChar = '\\' //续行符号
);
//向配置文件写入指定段下指定键的值(字符串)
int QWritePrivateProfileString(
char* lpszSectionName, //段名
char* lpszKeyName, //键名
char* lpszString, //要写入的字符串
char* lpszFileName //INI文件名
const char* lpszSectionName, //段名
const char* lpszKeyName, //键名
const char* lpszString, //要写入的字符串
const char* lpszFileName //INI文件名
);
#endif

@ -10,6 +10,11 @@
//#include "serialport.h"
#include "netport.h"
#include "commport.h"
#include "common.h"
#ifndef _WIN32
#include <sys/ioctl.h>
#endif
int netWSAStartupErr = FALSE;
@ -19,12 +24,12 @@ extern u_short MaxSerialPortNum;
extern u_short MaxNetPortNum;
extern u_short MaxPortNum;
//创建 UDP 通讯 socket
//创建 UDP 通讯 socket
BYTE CreateUdpSock(int *CommSock, DWORD NetPort, DWORD NetCommIpAddr)
{
int tmp, retval;
struct sockaddr_in addr;
u_long largp = 1L; //非阻塞模式
u_long largp = 1L; //非阻塞模式
char tmp_buf[256];
if(*CommSock > -1)
@ -40,22 +45,25 @@ BYTE CreateUdpSock(int *CommSock, DWORD NetPort, DWORD NetCommIpAddr)
return FAIL_GREATE;
}
// 将socket设置为非阻塞模式
//tmp = fcntl(*CommSock, F_GETFL, 0);
//fcntl(*CommSock, F_SETFL, tmp|O_NONBLOCK);
// 将socket设置为非阻塞模式
#ifdef OS_UNIX
tmp = fcntl(*CommSock, F_GETFL, 0);
fcntl(*CommSock, F_SETFL, tmp|O_NONBLOCK);
#else
retval = ioctlsocket(*CommSock, FIONBIO, (u_long FAR *)&largp);
#endif
if (SOCKET_ERROR == retval)
{
retval = WSAGetLastError();
sprintf(tmp_buf, "ioctlsocket设置非阻塞模式错误, SocketError=%d, SocketId = %d", retval, *CommSock);
DebugPrint(tmp_buf);
// retval = WSAGetLastError();
// sprintf(tmp_buf, "ioctlsocket设置非阻塞模式错误, SocketError=%d, SocketId = %d", retval, *CommSock);
// DebugPrint(tmp_buf);
closesocket(*CommSock);
*CommSock = -1;
return FAIL_GREATE;
}
//设置socket输入输出缓冲
//设置socket输入输出缓冲
tmp = MAX_NET_BUF_SIZE;
setsockopt(*CommSock, SOL_SOCKET, SO_RCVBUF, (char*)&tmp, sizeof(tmp));
tmp = MAX_NET_BUF_SIZE;
@ -65,13 +73,13 @@ BYTE CreateUdpSock(int *CommSock, DWORD NetPort, DWORD NetCommIpAddr)
setsockopt(*CommSock, SOL_SOCKET, SO_KEEPALIVE, (char*)&tmp, sizeof(tmp));
setsockopt(*CommSock, SOL_SOCKET, SO_REUSEADDR, (char*)&tmp, sizeof(tmp));
// 增加udp广播通讯(广播地址)
// 增加udp广播通讯(广播地址)
if((NetCommIpAddr & 0x000000FF) == 0x000000FF)
{
setsockopt(*CommSock, SOL_SOCKET, SO_BROADCAST, (char*)&tmp, sizeof(tmp));
}
//让配置socket 能收不同网段的配置命令
//让配置socket 能收不同网段的配置命令
//bzero(&addr, sizeof(addr));
memset((char*)&addr, 0, sizeof(addr));
addr.sin_family = AF_INET;
@ -87,16 +95,21 @@ BYTE CreateUdpSock(int *CommSock, DWORD NetPort, DWORD NetCommIpAddr)
return SUCCEED_GREATE;
}
//创建 TCP Server socket
//创建 TCP Server socket
BYTE CreateTcpServerSock(int *LiSock, DWORD NetPort)
{
int i, tmp, ret, retval, len;
int keep_alive = 1; // 设定KeepAlive
int keep_idle = 5; // 开始首次KeepAlive探测前的TCP空闭时间(s)
int keep_interval = 3; // 两次KeepAlive探测间的时间间隔(s)
int keep_count = 3; // 判定断开前的KeepAlive探测次数
int i, tmp, ret, retval;
#ifdef _WIN32
int len;
#else
socklen_t len;
#endif
int keep_alive = 1; // 设定KeepAlive
int keep_idle = 5; // 开始首次KeepAlive探测前的TCP空闭时间(s)
int keep_interval = 3; // 两次KeepAlive探测间的时间间隔(s)
int keep_count = 3; // 判定断开前的KeepAlive探测次数
struct sockaddr_in addr;
u_long largp = 1L; //非阻塞模式
u_long largp = 1L; //非阻塞模式
char tmp_buf[256];
if(-1 < *LiSock)
@ -111,26 +124,29 @@ BYTE CreateTcpServerSock(int *LiSock, DWORD NetPort)
if(*LiSock < 0)
{
retval = WSAGetLastError();
sprintf(tmp_buf, "ioctlsocket设置非阻塞模式错误, SocketError=%d, SocketId = %d", retval, *LiSock);
// retval = WSAGetLastError();
// sprintf(tmp_buf, "ioctlsocket设置非阻塞模式错误, SocketError=%d, SocketId = %d", retval, *LiSock);
*LiSock = -1;
return FAIL_GREATE;
}
// 将socket设置为非阻塞模式
//tmp = fcntl(*LiSock, F_GETFL, 0);
//fcntl(*LiSock, F_SETFL, tmp|O_NONBLOCK);
retval = ioctlsocket(*LiSock, FIONBIO, (u_long FAR *)&largp);
// 将socket设置为非阻塞模式
#ifdef OS_UNIX
tmp = fcntl(*LiSock, F_GETFL, 0);
fcntl(*LiSock, F_SETFL, tmp|O_NONBLOCK);
#else
retval = ioctlsocket(*LiSock, FIONBIO, (u_long FAR*)&largp);
#endif
if (SOCKET_ERROR == retval)
{
retval = WSAGetLastError();
sprintf(tmp_buf, "ioctlsocket设置非阻塞模式错误, SocketError=%d, SocketId = %d", retval, *LiSock);
DebugPrint(tmp_buf);
// retval = WSAGetLastError();
// sprintf(tmp_buf, "ioctlsocket设置非阻塞模式错误, SocketError=%d, SocketId = %d", retval, *LiSock);
// DebugPrint(tmp_buf);
closesocket(*LiSock);
*LiSock = -1;
return FAIL_GREATE;
}
///设置socket的输入输出缓冲区大小
///设置socket的输入输出缓冲区大小
tmp = MAX_NET_BUF_SIZE;
setsockopt(*LiSock, SOL_SOCKET, SO_RCVBUF, (char*)&tmp, sizeof(tmp));
tmp = MAX_NET_BUF_SIZE;
@ -146,7 +162,7 @@ BYTE CreateTcpServerSock(int *LiSock, DWORD NetPort)
setsockopt(*LiSock, SOL_SOCKET, SO_REUSEADDR, (char*)&tmp, sizeof(tmp));
//set_keepalive(*LiSock, keep_alive, keep_idle, keep_interval, keep_count);
//让TCP接收所有连线
//让TCP接收所有连线
memset((char*)&addr,0, sizeof(addr));
addr.sin_family = AF_INET;
addr.sin_port = htons(NetPort);
@ -174,16 +190,21 @@ BYTE CreateTcpServerSock(int *LiSock, DWORD NetPort)
return SUCCEED_GREATE;
}
//创建 TCP Client socket
//创建 TCP Client socket
BYTE CreateTcpClientSock(int *CommSock, DWORD NetPort, DWORD NetCommIpAddr)
{
int tmp,len;
int keep_alive = 1; // 设定KeepAlive
int keep_idle = 5; // 开始首次KeepAlive探测前的TCP空闭时间
int keep_interval = 3; // 两次KeepAlive探测间的时间间隔
int keep_count = 3; // 判定断开前的KeepAlive探测次数
int tmp;
#ifdef _WIN32
int len;
#else
socklen_t len;
#endif
int keep_alive = 1; // 设定KeepAlive
int keep_idle = 5; // 开始首次KeepAlive探测前的TCP空闭时间
int keep_interval = 3; // 两次KeepAlive探测间的时间间隔
int keep_count = 3; // 判定断开前的KeepAlive探测次数
struct sockaddr_in addr;
u_long largp = 1L; //非阻塞模式
u_long largp = 1L; //非阻塞模式
char tmp_buf[256];
if(-1 < *CommSock)
@ -199,21 +220,24 @@ BYTE CreateTcpClientSock(int *CommSock, DWORD NetPort, DWORD NetCommIpAddr)
return FAIL_GREATE;
}
// 将socket设置为非阻塞模式
//tmp = fcntl(*CommSock, F_GETFL, 0);
//fcntl(*CommSock, F_SETFL, tmp|O_NONBLOCK);
tmp = ioctlsocket(*CommSock, FIONBIO, (u_long FAR *)&largp);
// 将socket设置为非阻塞模式
#ifdef OS_UNIX
tmp = fcntl(*CommSock, F_GETFL, 0);
fcntl(*CommSock, F_SETFL, tmp|O_NONBLOCK);
#else
tmp = ioctlsocket(*CommSock, FIONBIO, (u_long *)&largp);
#endif
if (SOCKET_ERROR == tmp)
{
tmp = WSAGetLastError();
sprintf(tmp_buf, "ioctlsocket设置非阻塞模式错误, SocketError=%d, SocketId = %d", tmp, *CommSock);
DebugPrint(tmp_buf);
// tmp = WSAGetLastError();
// sprintf(tmp_buf, "ioctlsocket设置非阻塞模式错误, SocketError=%d, SocketId = %d", tmp, *CommSock);
// DebugPrint(tmp_buf);
closesocket(*CommSock);
*CommSock = -1;
return FAIL_GREATE;
}
///设置socket的输入输出缓冲区大小
///设置socket的输入输出缓冲区大小
tmp = MAX_NET_BUF_SIZE;
setsockopt(*CommSock, SOL_SOCKET, SO_RCVBUF, (char*)&tmp, sizeof(tmp));
tmp = MAX_NET_BUF_SIZE;
@ -247,7 +271,7 @@ BYTE CreateTcpClientSock(int *CommSock, DWORD NetPort, DWORD NetCommIpAddr)
*CommSock = -1;
return FAIL_GREATE;
}
// 非阻塞的情况下不能这样使用
// 非阻塞的情况下不能这样使用
// else
// {
// if(connect(*CommSock, (struct sockaddr *)&addr, sizeof(addr)) < 0)
@ -267,10 +291,10 @@ BYTE CreateTcpClientSock(int *CommSock, DWORD NetPort, DWORD NetCommIpAddr)
return SUCCEED_GREATE;
}
//int keep_alive = 1;//设定KeepAlive
//int keep_idle = 1;//开始首次KeepAlive探测前的TCP空闭时间
//int keep_interval = 1;//两次KeepAlive探测间的时间间隔
//int keep_count = 3;//判定断开前的KeepAlive探测次数
//int keep_alive = 1;//设定KeepAlive
//int keep_idle = 1;//开始首次KeepAlive探测前的TCP空闭时间
//int keep_interval = 1;//两次KeepAlive探测间的时间间隔
//int keep_count = 3;//判定断开前的KeepAlive探测次数
/*void set_keepalive(int fd, int keep_alive, int keep_idle, int keep_interval, int keep_count)
{
if(keep_alive)
@ -305,7 +329,7 @@ void OpenNetPort(int commid)
netcommipaddr = SioParam[commid].NetCommIpAddr;
switch(SioParam[commid].NetType)
{
case UDP_COMM: // UDP 通讯
case UDP_COMM: // UDP 通讯
if(OPEN_PORT == SioParam[commid].OpenFlag)
return;
succeedflag = CreateUdpSock(&commsock, netport, netcommipaddr);
@ -316,7 +340,7 @@ void OpenNetPort(int commid)
}
break;
case TCP_S_COMM: // TCP 服务器通讯
case TCP_S_COMM: // TCP 服务器通讯
commsock = SioParam[commid].LiSock;
succeedflag = CreateTcpServerSock(&commsock, netport);
if(SUCCEED_GREATE == succeedflag)
@ -327,7 +351,7 @@ void OpenNetPort(int commid)
{
if(SioParam[i].NetPort == netport)
{
printf("端口%d netport=%d lisock=%d\n", i+1, netport, commsock);
printf("端口%d netport=%d lisock=%d\n", i+1, netport, commsock);
SioParam[i].LiSock = commsock;
}
}
@ -335,7 +359,7 @@ void OpenNetPort(int commid)
}
break;
case TCP_C_COMM: // TCP 客户通讯
case TCP_C_COMM: // TCP 客户通讯
if(OPEN_PORT == SioParam[commid].OpenFlag)
return;
succeedflag = CreateTcpClientSock(&commsock, netport, netcommipaddr);
@ -343,7 +367,7 @@ void OpenNetPort(int commid)
{
SioParam[commid].CommSock = commsock;
//if(commid == 8)
//printf("端口%d 创建TCP 客户端成功socket=%d\n", commid+1, SioParam[commid].CommSock);
//printf("端口%d 创建TCP 客户端成功socket=%d\n", commid+1, SioParam[commid].CommSock);
}
break;
}
@ -353,7 +377,7 @@ void CloseNetPort(int commid)
{
switch(SioParam[commid].NetType)
{
case UDP_COMM: // UDP 通讯
case UDP_COMM: // UDP 通讯
if(SioParam[commid].CommSock > -1)
closesocket(SioParam[commid].CommSock);
@ -364,10 +388,10 @@ void CloseNetPort(int commid)
}
break;
case TCP_S_COMM: // TCP 服务器通讯
case TCP_S_COMM: // TCP 服务器通讯
if(SioParam[commid].CommSock > -1)
closesocket(SioParam[commid].CommSock);
//printf("关闭端口%d TCP客户端Socket=%d\n", commid+1, SioParam[commid].CommSock);
//printf("关闭端口%d TCP客户端Socket=%d\n", commid+1, SioParam[commid].CommSock);
SioParam[commid].CommSock = -1;
if(CLOSE_PORT != SioParam[commid].OpenFlag)
{
@ -375,57 +399,61 @@ void CloseNetPort(int commid)
}
break;
case TCP_C_COMM: // TCP 客户端通讯
case TCP_C_COMM: // TCP 客户端通讯
if(SioParam[commid].CommSock > -1)
closesocket(SioParam[commid].CommSock);
SioParam[commid].CommSock = -1;
//printf("关闭端口%d TCP客户端Socket=%d\n", commid+1, SioParam[commid].CommSock);
//printf("关闭端口%d TCP客户端Socket=%d\n", commid+1, SioParam[commid].CommSock);
if(CLOSE_PORT != SioParam[commid].OpenFlag)
{
SioParam[commid].OpenFlag = CLOSE_PORT;
}
break;
}
// 删除所有的发送缓冲区wen 2005.07.27
// 删除所有的发送缓冲区wen 2005.07.27
PortWriteDataFree(commid);
}
// TCP服务器端的侦听socket关闭与打开与端口是否打开的标识(SioParam[commid].OpenFlag)无关
// TCP服务器端的侦听socket关闭与打开与端口是否打开的标识(SioParam[commid].OpenFlag)无关
void CloseNetListenPort(int commid)
{
int i;
switch(SioParam[commid].NetType)
{
case TCP_S_COMM: // TCP 服务器通讯
case TCP_S_COMM: // TCP 服务器通讯
if(SioParam[commid].LiSock > -1)
//close(SioParam[commid].LiSock);
closesocket(SioParam[commid].LiSock);
SioParam[commid].LiSock = -1;
// 使用相同TCP服务端口的端口的listen套接字全部标识为1(关闭)
// 使用相同TCP服务端口的端口的listen套接字全部标识为1(关闭)
for(i=MaxSerialPortNum; i<MaxPortNum; i++)
{
if(SioParam[i].LiSock == SioParam[commid].LiSock)
SioParam[i].LiSock = -1;
}
break;
case UDP_COMM: // UDP 通讯
case UDP_COMM: // UDP 通讯
break;
case TCP_C_COMM: // TCP 客户端通讯
case TCP_C_COMM: // TCP 客户端通讯
break;
}
}
// UDP网络通讯接收数据
// UDP网络通讯接收数据
void UdpRecv(int commid, int fds, u_long ipaddr)
{
int len;
char revbuf[MAX_MSG_BUF_SIZE];
struct sockaddr_in addr;
#ifdef _WIN32
int addr_len = sizeof(struct sockaddr_in);
#else
socklen_t addr_len = sizeof(struct sockaddr_in);
#endif
// 将该socket中的数据读完
// 将该socket中的数据读完
do
{
len = recvfrom(fds, revbuf, MAX_MSG_BUF_SIZE, 0, (struct sockaddr *)&addr, &addr_len);
@ -440,7 +468,7 @@ void UdpRecv(int commid, int fds, u_long ipaddr)
}while(len >= MAX_MSG_BUF_SIZE);
}
//从头结点往后删
//从头结点往后删
void DelNode(int commid)
{
struct WR_DATA *next;
@ -472,7 +500,7 @@ void UdpSend(int commid)
addr.sin_port = htons(SioParam[commid].NetPort);
addr.sin_addr.s_addr = SioParam[commid].NetCommIpAddr;
// 错误判断和断点续传
// 错误判断和断点续传
plen = SioParam[commid].WriteData->PLen;
slen = SioParam[commid].WriteData->MsgLen - plen;
if(slen <= 0)
@ -516,7 +544,7 @@ BOOL TcpRecv(int commid, int fds, u_long ipaddr)
// if(OPEN_PORT != SioParam[commid].OpenFlag)
// return FALSE;
bRetVal = TRUE;
//删除已断开的子socket
//删除已断开的子socket
//ioctl(fds, FIONREAD, &nread);
/*if(nread == 0)
{
@ -530,7 +558,7 @@ BOOL TcpRecv(int commid, int fds, u_long ipaddr)
do
{
len = recv(fds, revbuf, MAX_MSG_BUF_SIZE, 0);
// 错误判断 len = 0 有可能是对方已经关闭socket
// 错误判断 len = 0 有可能是对方已经关闭socket
if(len <= 0)
{
printf("port%d read error len=%d\n", commid+1, len);
@ -560,7 +588,7 @@ void TcpSend(int commid)
if(OPEN_PORT != SioParam[commid].OpenFlag)
{
SioParam[commid].OpenFlag = OPEN_PORT;
//printf("设置Tcp端口%d 端口状态为OPEN_PORT\n", commid+1);
//printf("设置Tcp端口%d 端口状态为OPEN_PORT\n", commid+1);
}
else
{
@ -574,7 +602,7 @@ void TcpSend(int commid)
return;
}
// 增加错误判断和断点续传
// 增加错误判断和断点续传
plen = SioParam[commid].WriteData->PLen;
slen = SioParam[commid].WriteData->MsgLen - plen;
if(slen <= 0)
@ -590,7 +618,7 @@ void TcpSend(int commid)
{
if(EINPROGRESS != errno)
{
//printf("端口%d 发送错误关闭Tcp通讯\n", commid+1);
//printf("端口%d 发送错误关闭Tcp通讯\n", commid+1);
CloseNetPort(commid);
}
else
@ -607,7 +635,7 @@ void TcpSend(int commid)
}
else if(EINPROGRESS != errno)
{
//printf("端口%d 不能发送数据关闭Tcp通讯\n", commid+1);
//printf("端口%d 不能发送数据关闭Tcp通讯\n", commid+1);
CloseNetPort(commid);
}
}
@ -615,25 +643,30 @@ void TcpSend(int commid)
void TcpAccept(int commid, int lisfds)
{
int sock, result, i, addr_len, tmp;
int sock, i, tmp;
#ifdef _WIN32
int result, addr_len;
#else
socklen_t result, addr_len;
#endif
struct sockaddr_in addr;
int keep_alive = 1; // 设定KeepAlive
int keep_idle = 5; // 开始首次KeepAlive探测前的TCP空闭时间
int keep_interval = 3; // 两次KeepAlive探测间的时间间隔
int keep_count = 3; // 判定断开前的KeepAlive探测次数
int keep_alive = 1; // 设定KeepAlive
int keep_idle = 5; // 开始首次KeepAlive探测前的TCP空闭时间
int keep_interval = 3; // 两次KeepAlive探测间的时间间隔
int keep_count = 3; // 判定断开前的KeepAlive探测次数
fd_set set;
u_long largp = 1L; //非阻塞模式
u_long largp = 1L; //非阻塞模式
char tmp_buf[256];
addr_len = sizeof(struct sockaddr_in);
//printf("端口%d 检查是否有客户端过来连接\n", commid+1);
//printf("端口%d 检查是否有客户端过来连接\n", commid+1);
sock = accept(lisfds, (struct sockaddr *)&addr, &addr_len);
if(sock < 0)
{
return;
}
printf("TIP_(%04d): Port = %d, addr.sin_addr.s_addr(%08x), sock = %d\n", _getpid(), commid+1, addr.sin_addr.s_addr, sock);
// 多客户端向服务端连接时判断客户端来自的端口号 yizhonghu 20070704
// 多客户端向服务端连接时判断客户端来自的端口号 yizhonghu 20070704
for(i=MaxSerialPortNum; i<MaxPortNum; i++)
{
if((SioParam[i].NetCommIpAddr == addr.sin_addr.s_addr)
@ -650,21 +683,24 @@ void TcpAccept(int commid, int lisfds)
return;
}
// 如果socket已经存在则关掉原来的连接建立新的连接 yizhonghu 20070705
// 如果socket已经存在则关掉原来的连接建立新的连接 yizhonghu 20070705
if(SioParam[commid].CommSock < 0)
{
closesocket(SioParam[commid].CommSock);
}
SioParam[commid].CommSock = sock;
//result = fcntl(sock, F_GETFL, 0);
//fcntl(sock, F_SETFL, result|O_NONBLOCK);
result = ioctlsocket(sock, FIONBIO, (u_long FAR *)&largp);
#ifdef OS_UNIX
result = fcntl(sock, F_GETFL, 0);
fcntl(sock, F_SETFL, result|O_NONBLOCK);
#else
result = ioctlsocket(sock, FIONBIO, (u_long *)&largp);
#endif
if (SOCKET_ERROR == result)
{
result = WSAGetLastError();
sprintf(tmp_buf, "ioctlsocket设置非阻塞模式错误, SocketError=%d, SocketId = %d", result, sock);
DebugPrint(tmp_buf);
// result = WSAGetLastError();
// sprintf(tmp_buf, "ioctlsocket设置非阻塞模式错误, SocketError=%d, SocketId = %d", result, sock);
// DebugPrint(tmp_buf);
return;
}
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
@ -680,7 +716,7 @@ void TcpAccept(int commid, int lisfds)
result = 1;
setsockopt(sock, SOL_SOCKET, SO_REUSEADDR, (char*)&result, sizeof(result));
//set_keepalive(sock, keep_alive, keep_idle, keep_interval, keep_count);
// 这里应该等到确定端口可以写再设置为完全打开状态
// 这里应该等到确定端口可以写再设置为完全打开状态
//SioParam[commid].OpenFlag = OPEN_PORT;
}
@ -689,12 +725,12 @@ int AddFdToSet(int commid, int *fd_max, fd_set *fdset_ro, fd_set *fdset_wr, fd_s
int setflag, fds, inum;
inum = 0;
setflag = 0;// (=0: 无操作; =1:没有后续操作; =2:当前无操作,但有后续操作;=3:有操作并有后续操作)
setflag = 0;// (=0: 无操作; =1:没有后续操作; =2:当前无操作,但有后续操作;=3:有操作并有后续操作)
switch (SioParam[commid].NetType)
{
case NO_COMM:
break;
case UDP_COMM: // 检查UDP端口套接字是否建立
case UDP_COMM: // 检查UDP端口套接字是否建立
if (-1 < SioParam[commid].CommSock)
{
fds = SioParam[commid].CommSock;
@ -703,7 +739,7 @@ int AddFdToSet(int commid, int *fd_max, fd_set *fdset_ro, fd_set *fdset_wr, fd_s
}
setflag = 2;
break;
case TCP_S_COMM: // 检查TCP服务器端口套接字是否建立(包括listen套接字)
case TCP_S_COMM: // 检查TCP服务器端口套接字是否建立(包括listen套接字)
if ((0 > SioParam[commid].CommSock) && (-1 < SioParam[commid].LiSock))
{
fds = SioParam[commid].LiSock;
@ -718,7 +754,7 @@ int AddFdToSet(int commid, int *fd_max, fd_set *fdset_ro, fd_set *fdset_wr, fd_s
}
setflag = 2;
break;
case TCP_C_COMM: // 检查TCP客户端套接字是否建立
case TCP_C_COMM: // 检查TCP客户端套接字是否建立
if (-1 < SioParam[commid].CommSock)
{
fds = SioParam[commid].CommSock;
@ -741,7 +777,7 @@ int AddFdToSet(int commid, int *fd_max, fd_set *fdset_ro, fd_set *fdset_wr, fd_s
}
if (1 == setflag)
return inum;
// if(2 == setflag) 无需处理
// if(2 == setflag) 无需处理
return inum;
}
@ -749,7 +785,12 @@ int AddFdToSet(int commid, int *fd_max, fd_set *fdset_ro, fd_set *fdset_wr, fd_s
void PollAllPort(void)
{
struct timeval timeout;
int i, inum, nfds, commid, fds, lisfds, ret, ierr, ierrlen;
int i, inum, nfds, commid, fds, lisfds, ret, ierr;
#ifdef _WIN32
int ierrlen;
#else
socklen_t ierrlen;
#endif
u_long ipaddr;
fd_set fdset_ro, fdset_wr, fdset_ex;
/*static int ok=0;*/
@ -766,7 +807,7 @@ void PollAllPort(void)
}
if(inum < 1)
return;
// 设置超时等待时间为0
// 设置超时等待时间为0
memset((char*)&timeout, 0, sizeof(struct timeval));
if(select(nfds+1, &fdset_ro, &fdset_wr, &fdset_ex, &timeout) < 1)
{
@ -785,35 +826,35 @@ void PollAllPort(void)
case UDP_COMM:
if(SioParam[commid].CommSock < 0)
break;
// 判断socket是否异常
// 判断socket是否异常
if(FD_ISSET(fds, &fdset_ex))
{
CloseNetPort(commid);
break;
}
// socket可读
// socket可读
if(FD_ISSET(fds, &fdset_ro))
UdpRecv(commid, fds, ipaddr);// 将该socket中的数据读完
// socket可写
UdpRecv(commid, fds, ipaddr);// 将该socket中的数据读完
// socket可写
if(FD_ISSET(fds, &fdset_wr))
UdpSend(commid);
break;
case TCP_C_COMM:
if(SioParam[commid].CommSock < 0)
break;
// 判断socket是否异常
// 判断socket是否异常
if(FD_ISSET(fds, &fdset_ex))
{
CloseNetPort(commid);
break;
}
// socket可读
// socket可读
if(FD_ISSET(fds, &fdset_ro))
{
if(TcpRecv(commid, fds, ipaddr) == FALSE) // 将该socket中的数据读完
break; // 端口可能已经关闭
if(TcpRecv(commid, fds, ipaddr) == FALSE) // 将该socket中的数据读完
break; // 端口可能已经关闭
}
// socket可写
// socket可写
if(FD_ISSET(fds, &fdset_wr))
{
ierrlen = sizeof(ierr);
@ -830,7 +871,7 @@ void PollAllPort(void)
lisfds = SioParam[commid].LiSock;
/*if(ok < 1000)
{
printf("端口%d lisock=%d fds = %d\n", commid+1, lisfds, fds);
printf("端口%d lisock=%d fds = %d\n", commid+1, lisfds, fds);
ok++;
}*/
if(fds < 0)
@ -839,7 +880,7 @@ void PollAllPort(void)
break;
if(FD_ISSET(lisfds, &fdset_ex))
{
//printf("端口%d 关闭服务器端口\n", commid+1);
//printf("端口%d 关闭服务器端口\n", commid+1);
CloseNetListenPort(commid);
}
else if(FD_ISSET(lisfds, &fdset_ro))
@ -848,24 +889,24 @@ void PollAllPort(void)
}
break;
}
// 判断socket是否异常
// 判断socket是否异常
if(FD_ISSET(fds, &fdset_ex))
{
//printf("端口%d socket异常关闭Tcp通讯\n", commid+1);
//printf("端口%d socket异常关闭Tcp通讯\n", commid+1);
CloseNetPort(commid);
break;
}
// socket可读
// socket可读
if(FD_ISSET(fds, &fdset_ro))
{
if(TcpRecv(commid, fds, ipaddr) == FALSE) // 将该socket中的数据读完
break; // 端口可能已经关闭
if(TcpRecv(commid, fds, ipaddr) == FALSE) // 将该socket中的数据读完
break; // 端口可能已经关闭
}
// socket可写
// socket可写
if(FD_ISSET(fds, &fdset_wr))
TcpSend(commid);
break;
}
}
// 服务器端口读写数据
// 服务器端口读写数据
}

@ -24,11 +24,11 @@
#include "list_entry.h"
#include "os_heap.h"
//#if defined(WIN32)
#if defined(_WIN32)
#include <winsock2.h>
#include <direct.h>
#include <process.h>
//#endif
#endif
#ifdef _fclose
#undef _fclose

@ -59,7 +59,7 @@ c. Unix
#include <arpa/inet.h> //inet地址族的所有结构和常量定义都在这里
#include <netinet/in.h>
#include <errno.h>
#include <stropts.h>
// #include <stropts.h>
#include <stddef.h>
#include <stdlib.h>
#include <stdio.h>
@ -86,6 +86,9 @@ c. Unix
#define WritePrivateProfileString QWritePrivateProfileString
#define closesocket close //winsock中关闭socket用closesocket(),而bsd socket中用close()
#define _strdup strdup
#define lstrcpyn strncpy
#define _getcwd getcwd
#endif
/*-------------------------------- 类型定义 ------------------------------------*/

@ -2839,6 +2839,7 @@ HOSTMSG *GetRtuChangeMsgPtr()
return gRtuChangeMsg;
}
#if 0
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
// 增加字节顺序转换函数
BOOL AllDataHostToRtuByteSequence(HOSTMSG *hmsg, ORTUMSG *pSendMsg)
@ -3216,3 +3217,4 @@ void SendSystemTimeToHost(void)
SendDataToAllHostSendBuf( (u_char*)&rtumsg, rtumsg.MsgLen + sizeof(HOSTMSGHEAD));
}
#endif

@ -21,8 +21,14 @@ int FillAndSendCmd( u_long ipaddr, u_char port, WORD cmd, u_char *retbuf, int le
void ValueToBuf( u_char *buf, u_long val, int len );
u_long BufToValue( u_char *buf, int len );
void WatchDataPutDispBuf( int port, WORD type, u_char *buf, int len );
void WatchDataPutDispBufToFile(int port, WORD type, u_char *buf, int len);
inline void WatchDataPutDispBuf(int port, WORD type, u_char *buf, int len)
{
}
inline void WatchDataPutDispBufToFile(int port, WORD type, u_char *buf, int len)
{
}
void SetUdpRecvDataProcess( u_long ipaddr, u_char *buf, int len );
@ -33,6 +39,9 @@ void SetDevTime();
void ResetDev(int iDevNo);
BOOL isUdpSocketExist();
inline BOOL isUdpSocketExist()
{
return 1;
}
#endif

@ -1,6 +1,5 @@
// widgets.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//
#define OS_WINDOWS 0
#include <iostream>
#include "baohua.h"
#include "buban103.h"
@ -57,7 +56,9 @@ int main(void)
int ret = SUCCESS;
char filename[256];
#ifdef OS_WINDOWS
WSADATA WSAData;
#endif
//定时器指针置空
//m_pMainTimer = NULL;
@ -105,12 +106,14 @@ int main(void)
strcpy(Manufacturer, MANUFACTURER);
InitBaohuMainFlag = 1;
#ifdef OS_WINDOWS
if (WSAStartup(MAKEWORD(2, 1), (LPWSADATA)&WSAData) != 0)
{
ret = WSAGetLastError();
//HostWSAStartupErr = TRUE;
//return FALSE;
}
#endif
}

@ -104,7 +104,7 @@
<WarningLevel>Level3</WarningLevel>
<Optimization>Disabled</Optimization>
<SDLCheck>true</SDLCheck>
<PreprocessorDefinitions>_DEBUG;_CONSOLE;%(PreprocessorDefinitions);_CRT_SECURE_NO_WARNINGS;DISABLE_OS_HEAP</PreprocessorDefinitions>
<PreprocessorDefinitions>_DEBUG;_CONSOLE;OS_WINDOWS;%(PreprocessorDefinitions);_CRT_SECURE_NO_WARNINGS;DISABLE_OS_HEAP</PreprocessorDefinitions>
<ConformanceMode>true</ConformanceMode>
<AdditionalOptions>/UTF-8 %(AdditionalOptions)</AdditionalOptions>
</ClCompile>
@ -170,9 +170,6 @@
<ClCompile Include="os_heap.cpp" />
<ClCompile Include="Profile_Hash.cpp" />
<ClCompile Include="scadaprotect.cpp" />
<ClCompile Include="tcphost.cpp" />
<ClCompile Include="udpcomm.cpp" />
<ClCompile Include="udpping.cpp" />
<ClCompile Include="widgets.cpp" />
</ItemGroup>
<ItemGroup>

@ -36,15 +36,6 @@
<ClCompile Include="scadaprotect.cpp">
<Filter>源文件</Filter>
</ClCompile>
<ClCompile Include="tcphost.cpp">
<Filter>源文件</Filter>
</ClCompile>
<ClCompile Include="udpcomm.cpp">
<Filter>源文件</Filter>
</ClCompile>
<ClCompile Include="udpping.cpp">
<Filter>源文件</Filter>
</ClCompile>
<ClCompile Include="basefunc.cpp">
<Filter>源文件</Filter>
</ClCompile>

Loading…
Cancel
Save