You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

871 lines
22 KiB
C++

2 years ago
/*****************************************************************************
* FileName : netport.c *
* Programmer : Li Liangchu *
* Writen at : 2004.07.21 *
* Version : *
* Description: base on net comm sports driver *
* Last modify: 2004.07.21 *
*****************************************************************************/
//#include "serialport.h"
#include "netport.h"
#include "commport.h"
int netWSAStartupErr = FALSE;
extern SIO_PARAM_DEF SioParam[];
extern u_short MaxSerialPortNum;
extern u_short MaxNetPortNum;
extern u_short MaxPortNum;
//<2F><><EFBFBD><EFBFBD> UDP ͨѶ socket
BYTE CreateUdpSock(int *CommSock, DWORD NetPort, DWORD NetCommIpAddr)
{
int tmp, retval;
struct sockaddr_in addr;
u_long largp = 1L; //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ģʽ
char tmp_buf[256];
if(*CommSock > -1)
return SOCKET_BEING;
if((NetPort == 0) && (NetCommIpAddr == 0))
return FAIL_GREATE;
*CommSock = socket(AF_INET, SOCK_DGRAM, 0);
if(*CommSock < 0)
{
*CommSock = -1;
return FAIL_GREATE;
}
// <20><>socket<65><74><EFBFBD><EFBFBD>Ϊ<EFBFBD><CEAA><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ģʽ
//tmp = fcntl(*CommSock, F_GETFL, 0);
//fcntl(*CommSock, F_SETFL, tmp|O_NONBLOCK);
retval = ioctlsocket(*CommSock, FIONBIO, (u_long FAR *)&largp);
if (SOCKET_ERROR == retval)
{
retval = WSAGetLastError();
sprintf(tmp_buf, "ioctlsocket<EFBFBD><EFBFBD><EFBFBD>÷<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ģʽ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>, SocketError=%d, SocketId = %d", retval, *CommSock);
DebugPrint(tmp_buf);
closesocket(*CommSock);
*CommSock = -1;
return FAIL_GREATE;
}
//<2F><><EFBFBD><EFBFBD>socket<65><74><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
tmp = MAX_NET_BUF_SIZE;
setsockopt(*CommSock, SOL_SOCKET, SO_RCVBUF, (char*)&tmp, sizeof(tmp));
tmp = MAX_NET_BUF_SIZE;
setsockopt(*CommSock, SOL_SOCKET, SO_SNDBUF, (char*)&tmp, sizeof(tmp));
tmp = 1;
setsockopt(*CommSock, SOL_SOCKET, SO_KEEPALIVE, (char*)&tmp, sizeof(tmp));
setsockopt(*CommSock, SOL_SOCKET, SO_REUSEADDR, (char*)&tmp, sizeof(tmp));
// <20><><EFBFBD><EFBFBD>udp<64>㲥ͨѶ(<28><EFBFBD><E3B2A5>ַ)
if((NetCommIpAddr & 0x000000FF) == 0x000000FF)
{
setsockopt(*CommSock, SOL_SOCKET, SO_BROADCAST, (char*)&tmp, sizeof(tmp));
}
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>socket <20><><EFBFBD>ղ<EFBFBD>ͬ<EFBFBD><CDAC><EFBFBD>ε<EFBFBD><CEB5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
//bzero(&addr, sizeof(addr));
memset((char*)&addr, 0, sizeof(addr));
addr.sin_family = AF_INET;
addr.sin_port = htons(NetPort);
addr.sin_addr.s_addr = htonl(INADDR_ANY);
if(bind(*CommSock, (struct sockaddr *)&addr, sizeof(addr)) < 0)
{
closesocket(*CommSock);
*CommSock = -1;
return FAIL_GREATE;
}
return SUCCEED_GREATE;
}
//<2F><><EFBFBD><EFBFBD> TCP Server socket
BYTE CreateTcpServerSock(int *LiSock, DWORD NetPort)
{
int i, tmp, ret, retval, len;
int keep_alive = 1; // <20>趨KeepAlive
int keep_idle = 5; // <20><>ʼ<EFBFBD>״<EFBFBD>KeepAlive̽<65><CCBD>ǰ<EFBFBD><C7B0>TCP<43>ձ<EFBFBD>ʱ<EFBFBD><CAB1>(s)
int keep_interval = 3; // <20><><EFBFBD><EFBFBD>KeepAlive̽<65><CCBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD>(s)
int keep_count = 3; // <20>ж<EFBFBD><D0B6>Ͽ<EFBFBD>ǰ<EFBFBD><C7B0>KeepAlive̽<65><CCBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
struct sockaddr_in addr;
u_long largp = 1L; //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ģʽ
char tmp_buf[256];
if(-1 < *LiSock)
return SOCKET_BEING;
if(NetPort == 0)
return FAIL_GREATE;
*LiSock = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP);
//len = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP);
//*LiSock = len;
if(*LiSock < 0)
{
retval = WSAGetLastError();
sprintf(tmp_buf, "ioctlsocket<EFBFBD><EFBFBD><EFBFBD>÷<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ģʽ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>, SocketError=%d, SocketId = %d", retval, *LiSock);
*LiSock = -1;
return FAIL_GREATE;
}
// <20><>socket<65><74><EFBFBD><EFBFBD>Ϊ<EFBFBD><CEAA><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ģʽ
//tmp = fcntl(*LiSock, F_GETFL, 0);
//fcntl(*LiSock, F_SETFL, tmp|O_NONBLOCK);
retval = ioctlsocket(*LiSock, FIONBIO, (u_long FAR *)&largp);
if (SOCKET_ERROR == retval)
{
retval = WSAGetLastError();
sprintf(tmp_buf, "ioctlsocket<EFBFBD><EFBFBD><EFBFBD>÷<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ģʽ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>, SocketError=%d, SocketId = %d", retval, *LiSock);
DebugPrint(tmp_buf);
closesocket(*LiSock);
*LiSock = -1;
return FAIL_GREATE;
}
///<2F><><EFBFBD><EFBFBD>socket<65><74><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>С
tmp = MAX_NET_BUF_SIZE;
setsockopt(*LiSock, SOL_SOCKET, SO_RCVBUF, (char*)&tmp, sizeof(tmp));
tmp = MAX_NET_BUF_SIZE;
setsockopt(*LiSock, SOL_SOCKET, SO_SNDBUF, (char*)&tmp, sizeof(tmp));
len = 4;
tmp_buf[0] = 1;
tmp = setsockopt(*LiSock, SOL_SOCKET, SO_KEEPALIVE, tmp_buf, len);
tmp = getsockopt(*LiSock, SOL_SOCKET, SO_KEEPALIVE, tmp_buf, &len);
tmp = 1;
// setsockopt(*LiSock, SOL_SOCKET, SO_KEEPALIVE, (char*)&tmp, sizeof(tmp));
setsockopt(*LiSock, SOL_SOCKET, SO_REUSEADDR, (char*)&tmp, sizeof(tmp));
//set_keepalive(*LiSock, keep_alive, keep_idle, keep_interval, keep_count);
//<2F><>TCP<43><50><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
memset((char*)&addr,0, sizeof(addr));
addr.sin_family = AF_INET;
addr.sin_port = htons(NetPort);
addr.sin_addr.s_addr = htonl(INADDR_ANY);
//printf("TIP_(%04d): Port = %d, NetCommIpAddr(%08x), addr.sin_addr.s_addr(%08x)\n", getpid(), commid+1, *NetCommIpAddr, addr.sin_addr.s_addr);
if(bind(*LiSock, (struct sockaddr *)&addr, sizeof(addr)) < 0)
{
//printf("errno = %d\n", errno);
//close(*LiSock);
closesocket(*LiSock);
*LiSock = -1;
return FAIL_GREATE;
}
//printf("succeed!\n");
ret = listen(*LiSock, 4);
if(ret < 0)
{
//close(*LiSock);
closesocket(*LiSock);
*LiSock = -1;
return FAIL_GREATE;
}
return SUCCEED_GREATE;
}
//<2F><><EFBFBD><EFBFBD> TCP Client socket
BYTE CreateTcpClientSock(int *CommSock, DWORD NetPort, DWORD NetCommIpAddr)
{
int tmp,len;
int keep_alive = 1; // <20>趨KeepAlive
int keep_idle = 5; // <20><>ʼ<EFBFBD>״<EFBFBD>KeepAlive̽<65><CCBD>ǰ<EFBFBD><C7B0>TCP<43>ձ<EFBFBD>ʱ<EFBFBD><CAB1>
int keep_interval = 3; // <20><><EFBFBD><EFBFBD>KeepAlive̽<65><CCBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
int keep_count = 3; // <20>ж<EFBFBD><D0B6>Ͽ<EFBFBD>ǰ<EFBFBD><C7B0>KeepAlive̽<65><CCBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
struct sockaddr_in addr;
u_long largp = 1L; //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ģʽ
char tmp_buf[256];
if(-1 < *CommSock)
return SOCKET_BEING;
if((NetPort == 0) && (NetCommIpAddr == 0))
return FAIL_GREATE;
*CommSock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
if(*CommSock < 0)
{
*CommSock = -1;
return FAIL_GREATE;
}
// <20><>socket<65><74><EFBFBD><EFBFBD>Ϊ<EFBFBD><CEAA><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ģʽ
//tmp = fcntl(*CommSock, F_GETFL, 0);
//fcntl(*CommSock, F_SETFL, tmp|O_NONBLOCK);
tmp = ioctlsocket(*CommSock, FIONBIO, (u_long FAR *)&largp);
if (SOCKET_ERROR == tmp)
{
tmp = WSAGetLastError();
sprintf(tmp_buf, "ioctlsocket<EFBFBD><EFBFBD><EFBFBD>÷<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ģʽ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>, SocketError=%d, SocketId = %d", tmp, *CommSock);
DebugPrint(tmp_buf);
closesocket(*CommSock);
*CommSock = -1;
return FAIL_GREATE;
}
///<2F><><EFBFBD><EFBFBD>socket<65><74><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>С
tmp = MAX_NET_BUF_SIZE;
setsockopt(*CommSock, SOL_SOCKET, SO_RCVBUF, (char*)&tmp, sizeof(tmp));
tmp = MAX_NET_BUF_SIZE;
setsockopt(*CommSock, SOL_SOCKET, SO_SNDBUF, (char*)&tmp, sizeof(tmp));
len = 4;
tmp_buf[0] = 1;
tmp = setsockopt(*CommSock, SOL_SOCKET, SO_KEEPALIVE, tmp_buf, len);
tmp = getsockopt(*CommSock, SOL_SOCKET, SO_KEEPALIVE, tmp_buf, &len);
tmp = 1;
// setsockopt(*CommSock, SOL_SOCKET, SO_KEEPALIVE, (char*)&tmp, sizeof(tmp));
setsockopt(*CommSock, SOL_SOCKET, SO_REUSEADDR, (char*)&tmp, sizeof(tmp));
// set_keepalive(*CommSock, keep_alive, keep_idle, keep_interval, keep_count);
//bzero(&addr, sizeof(addr));
memset((char*)&addr, 0, sizeof(addr));
addr.sin_family = AF_INET;
addr.sin_port = htons(NetPort);
addr.sin_addr.s_addr = htonl(NetCommIpAddr);
//printf("TIP_(%04d): Port = %d, connect(%08x)\n", getpid(), commid+1, *NetCommIpAddr);
if(connect(*CommSock, (struct sockaddr *)&addr, sizeof(addr)) != 0)
{
//printf(" connect error errno= %d, EINPROGRESS=%d\n", errno,EINPROGRESS);
if(EINPROGRESS != errno)
{
closesocket(*CommSock);
//printf(" connect error errno= %d, EINPROGRESS=%d\n", errno,EINPROGRESS);
*CommSock = -1;
return FAIL_GREATE;
}
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>²<EFBFBD><C2B2><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʹ<EFBFBD><CAB9>
// else
// {
// if(connect(*CommSock, (struct sockaddr *)&addr, sizeof(addr)) < 0)
// {
// //printf(" connect error errno= %d, EISCONN=%d\n", errno,EISCONN);
// if(EISCONN != errno)
// {
// printf(" connect error errno= %d, EISCONN=%d\n", errno,EISCONN);
// close(*CommSock);
// *CommSock = -1;
// return FAIL_GREATE;
// }
// }
// //printf(" connect succeed errno= %d EISCONN=%d\n", errno, EISCONN);
// }
}
return SUCCEED_GREATE;
}
//int keep_alive = 1;//<2F>趨KeepAlive
//int keep_idle = 1;//<2F><>ʼ<EFBFBD>״<EFBFBD>KeepAlive̽<65><CCBD>ǰ<EFBFBD><C7B0>TCP<43>ձ<EFBFBD>ʱ<EFBFBD><CAB1>
//int keep_interval = 1;//<2F><><EFBFBD><EFBFBD>KeepAlive̽<65><CCBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
//int keep_count = 3;//<2F>ж<EFBFBD><D0B6>Ͽ<EFBFBD>ǰ<EFBFBD><C7B0>KeepAlive̽<65><CCBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
/*void set_keepalive(int fd, int keep_alive, int keep_idle, int keep_interval, int keep_count)
{
if(keep_alive)
{
if(setsockopt(fd, SOL_SOCKET, SO_KEEPALIVE, (void*)&keep_alive, sizeof(keep_alive)) == -1)
{
fprintf(stderr, "setsockopt SOL_SOCKET::SO_KEEPALIVE failed, %s\n",strerror(errno));
}
if(setsockopt(fd, SOL_TCP, TCP_KEEPIDLE, (void *)&keep_idle,sizeof(keep_idle)) == -1)
{
fprintf(stderr, "setsockopt SOL_TCP::TCP_KEEPIDLE failed, %s\n", strerror(errno));
}
if(setsockopt(fd,SOL_TCP,TCP_KEEPINTVL, (void *)&keep_interval, sizeof(keep_interval)) == -1)
{
fprintf(stderr, "setsockopt SOL_tcp::TCP_KEEPINTVL failed, %s\n", strerror(errno));
}
if(setsockopt(fd,SOL_TCP,TCP_KEEPCNT, (void *)&keep_count,sizeof(keep_count)) == -1)
{
fprintf(stderr, "setsockopt SOL_TCP::TCP_KEEPCNT failed, %s\n", strerror(errno));
}
}
}*/
void OpenNetPort(int commid)
{
BYTE succeedflag;
int i, commsock;
DWORD netport, netcommipaddr;
commsock = SioParam[commid].CommSock;
netport = SioParam[commid].NetPort;
netcommipaddr = SioParam[commid].NetCommIpAddr;
switch(SioParam[commid].NetType)
{
case UDP_COMM: // UDP ͨѶ
if(OPEN_PORT == SioParam[commid].OpenFlag)
return;
succeedflag = CreateUdpSock(&commsock, netport, netcommipaddr);
if(SUCCEED_GREATE == succeedflag)
{
SioParam[commid].OpenFlag = OPEN_PORT;
SioParam[commid].CommSock = commsock;
}
break;
case TCP_S_COMM: // TCP <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͨѶ
commsock = SioParam[commid].LiSock;
succeedflag = CreateTcpServerSock(&commsock, netport);
if(SUCCEED_GREATE == succeedflag)
{
for(i=MaxSerialPortNum; i<MaxPortNum; i++)
{
if(TCP_S_COMM == SioParam[i].NetType)
{
if(SioParam[i].NetPort == netport)
{
printf("<EFBFBD>˿<EFBFBD>%d netport=%d lisock=%d\n", i+1, netport, commsock);
SioParam[i].LiSock = commsock;
}
}
}
}
break;
case TCP_C_COMM: // TCP <20>ͻ<EFBFBD>ͨѶ
if(OPEN_PORT == SioParam[commid].OpenFlag)
return;
succeedflag = CreateTcpClientSock(&commsock, netport, netcommipaddr);
if(SUCCEED_GREATE == succeedflag)
{
SioParam[commid].CommSock = commsock;
//if(commid == 8)
//printf("<22>˿<EFBFBD>%d <20><><EFBFBD><EFBFBD>TCP <20>ͻ<EFBFBD><CDBB>˳ɹ<CBB3><C9B9><EFBFBD>socket=%d\n", commid+1, SioParam[commid].CommSock);
}
break;
}
}
void CloseNetPort(int commid)
{
switch(SioParam[commid].NetType)
{
case UDP_COMM: // UDP ͨѶ
if(SioParam[commid].CommSock > -1)
closesocket(SioParam[commid].CommSock);
SioParam[commid].CommSock = -1;
if(CLOSE_PORT != SioParam[commid].OpenFlag)
{
SioParam[commid].OpenFlag = CLOSE_PORT;
}
break;
case TCP_S_COMM: // TCP <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͨѶ
if(SioParam[commid].CommSock > -1)
closesocket(SioParam[commid].CommSock);
//printf("<22>رն˿<D5B6>%d TCP<43>ͻ<EFBFBD><CDBB><EFBFBD>Socket=%d\n", commid+1, SioParam[commid].CommSock);
SioParam[commid].CommSock = -1;
if(CLOSE_PORT != SioParam[commid].OpenFlag)
{
SioParam[commid].OpenFlag = CLOSE_PORT;
}
break;
case TCP_C_COMM: // TCP <20>ͻ<EFBFBD><CDBB><EFBFBD>ͨѶ
if(SioParam[commid].CommSock > -1)
closesocket(SioParam[commid].CommSock);
SioParam[commid].CommSock = -1;
//printf("<22>رն˿<D5B6>%d TCP<43>ͻ<EFBFBD><CDBB><EFBFBD>Socket=%d\n", commid+1, SioParam[commid].CommSock);
if(CLOSE_PORT != SioParam[commid].OpenFlag)
{
SioParam[commid].OpenFlag = CLOSE_PORT;
}
break;
}
// ɾ<><C9BE><EFBFBD><EFBFBD><EFBFBD>еķ<D0B5><C4B7>ͻ<EFBFBD><CDBB><EFBFBD><EFBFBD><EFBFBD>wen 2005.07.27
PortWriteDataFree(commid);
}
// TCP<43><50><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>˵<EFBFBD><CBB5><EFBFBD><EFBFBD><EFBFBD>socket<65>ر<EFBFBD><D8B1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>˿<EFBFBD><CBBF>Ƿ<EFBFBD><C7B7>򿪵ı<F2BFAAB5>ʶ(SioParam[commid].OpenFlag)<29>޹<EFBFBD>
void CloseNetListenPort(int commid)
{
int i;
switch(SioParam[commid].NetType)
{
case TCP_S_COMM: // TCP <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͨѶ
if(SioParam[commid].LiSock > -1)
//close(SioParam[commid].LiSock);
closesocket(SioParam[commid].LiSock);
SioParam[commid].LiSock = -1;
// ʹ<><CAB9><EFBFBD><EFBFBD>ͬTCP<43><50><EFBFBD><EFBFBD><EFBFBD>˿ڵĶ˿ڵ<CBBF>listen<65>׽<EFBFBD><D7BD><EFBFBD>ȫ<EFBFBD><C8AB><EFBFBD><EFBFBD>ʶΪ<CAB6><CEAA>1(<28>ر<EFBFBD>)
for(i=MaxSerialPortNum; i<MaxPortNum; i++)
{
if(SioParam[i].LiSock == SioParam[commid].LiSock)
SioParam[i].LiSock = -1;
}
break;
case UDP_COMM: // UDP ͨѶ
break;
case TCP_C_COMM: // TCP <20>ͻ<EFBFBD><CDBB><EFBFBD>ͨѶ
break;
}
}
// UDP<44><50><EFBFBD><EFBFBD>ͨѶ<CDA8><D1B6><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
void UdpRecv(int commid, int fds, u_long ipaddr)
{
int len;
char revbuf[MAX_MSG_BUF_SIZE];
struct sockaddr_in addr;
int addr_len = sizeof(struct sockaddr_in);
// <20><><EFBFBD><EFBFBD>socket<65>е<EFBFBD><D0B5><EFBFBD><EFBFBD>ݶ<EFBFBD><DDB6><EFBFBD>
do
{
len = recvfrom(fds, revbuf, MAX_MSG_BUF_SIZE, 0, (struct sockaddr *)&addr, &addr_len);
if(addr.sin_addr.s_addr == ipaddr)
{
if(IsBaoHuPtr(commid))
{
PutDataToBuf(&SioParam[commid].RecvBuf, (u_char*)revbuf, len);
}
}
}while(len >= MAX_MSG_BUF_SIZE);
}
//<2F><>ͷ<EFBFBD><CDB7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ɾ
void DelNode(int commid)
{
struct WR_DATA *next;
if (!SioParam[commid].WriteData)
{
return;
}
//SioParam[commid].iWriteDataNo--;
next = SioParam[commid].WriteData->Next;
HEAP_FREE(SioParam[commid].WriteData);
SioParam[commid].WriteData = next;
}
void UdpSend(int commid)
{
int len, plen, slen;
struct sockaddr_in addr;
if(!IsBaoHuPtr(commid))
return;
if(NULL == SioParam[commid].WriteData)
return;
//bzero(&addr, sizeof(addr));
memset((char*)&addr, 0, sizeof(addr));
addr.sin_family = AF_INET;
addr.sin_port = htons(SioParam[commid].NetPort);
addr.sin_addr.s_addr = SioParam[commid].NetCommIpAddr;
// <20><><EFBFBD><EFBFBD><EFBFBD>жϺͶϵ<CDB6><CFB5><EFBFBD><EFBFBD><EFBFBD>
plen = SioParam[commid].WriteData->PLen;
slen = SioParam[commid].WriteData->MsgLen - plen;
if(slen <= 0)
{
DelNode(commid);
return;
}
len = sendto(SioParam[commid].CommSock,(const char*)&SioParam[commid].WriteData->MsgData[plen], slen,
0, (struct sockaddr *)&addr, sizeof(struct sockaddr_in));
if(len > 0)
{
if(len < slen)
{
if(EINPROGRESS != errno)
{
CloseNetPort(commid);
}
else
{
SioParam[commid].WriteData->PLen += len;
}
}
else
{
DelNode(commid);
}
//ShmAddSendCount(commid, len);
}
else if(EINPROGRESS != errno)
{
CloseNetPort(commid);
}
}
BOOL TcpRecv(int commid, int fds, u_long ipaddr)
{
BOOL bRetVal;
int len, nread;
char revbuf[MAX_MSG_BUF_SIZE];
// if(OPEN_PORT != SioParam[commid].OpenFlag)
// return FALSE;
bRetVal = TRUE;
//ɾ<><C9BE><EFBFBD>ѶϿ<D1B6><CFBF><EFBFBD><EFBFBD><EFBFBD>socket
//ioctl(fds, FIONREAD, &nread);
/*if(nread == 0)
{
//if(commid == 8)
// printf("TIP_(%04d): Port=%d Peer Socket is closed already.\n", getpid(), commid+1);
CloseNetPort(commid);
bRetVal = FALSE;
}
else*/
{
do
{
len = recv(fds, revbuf, MAX_MSG_BUF_SIZE, 0);
// <20><><EFBFBD><EFBFBD><EFBFBD>ж<EFBFBD> len = 0 <20>п<EFBFBD><D0BF><EFBFBD><EFBFBD>ǶԷ<C7B6><D4B7>Ѿ<EFBFBD><D1BE>ر<EFBFBD>socket
if(len <= 0)
{
printf("port%d read error len=%d\n", commid+1, len);
if(EINPROGRESS != errno)
{
//printf("port%d read error\n", commid+1);
CloseNetPort(commid);
bRetVal = FALSE;
break;
}
}
if(IsBaoHuPtr(commid))
{
PutDataToBuf(&SioParam[commid].RecvBuf, (u_char*)revbuf, len);
}
}while(len >= MAX_MSG_BUF_SIZE);
}
return bRetVal;
}
void TcpSend(int commid)
{
int len, plen, slen;
if(OPEN_PORT != SioParam[commid].OpenFlag)
{
SioParam[commid].OpenFlag = OPEN_PORT;
//printf("<22><><EFBFBD><EFBFBD>Tcp<63>˿<EFBFBD>%d <20>˿<EFBFBD>״̬ΪOPEN_PORT<52><54>\n", commid+1);
}
else
{
if(!IsBaoHuPtr(commid))
{
return;
}
if(NULL == SioParam[commid].WriteData)
{
return;
}
// <20><><EFBFBD>Ӵ<EFBFBD><D3B4><EFBFBD><EFBFBD>жϺͶϵ<CDB6><CFB5><EFBFBD><EFBFBD><EFBFBD>
plen = SioParam[commid].WriteData->PLen;
slen = SioParam[commid].WriteData->MsgLen - plen;
if(slen <= 0)
{
DelNode(commid);
return;
}
len = send(SioParam[commid].CommSock,(const char*)&SioParam[commid].WriteData->MsgData[plen], slen, 0);
if(len > 0)
{
if(len < slen)
{
if(EINPROGRESS != errno)
{
//printf("<22>˿<EFBFBD>%d <20><><EFBFBD>ʹ<EFBFBD><CDB4>󣬹ر<F3A3ACB9>TcpͨѶ\n", commid+1);
CloseNetPort(commid);
}
else
{
SioParam[commid].WriteData->PLen += len;
}
}
else
{
DelNode(commid);
}
//ShmAddSendCount(commid, len);
}
else if(EINPROGRESS != errno)
{
//printf("<22>˿<EFBFBD>%d <20><><EFBFBD>ܷ<EFBFBD><DCB7><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݣ<EFBFBD><DDA3>ر<EFBFBD>TcpͨѶ\n", commid+1);
CloseNetPort(commid);
}
}
}
void TcpAccept(int commid, int lisfds)
{
int sock, result, i, addr_len, tmp;
struct sockaddr_in addr;
int keep_alive = 1; // <20>趨KeepAlive
int keep_idle = 5; // <20><>ʼ<EFBFBD>״<EFBFBD>KeepAlive̽<65><CCBD>ǰ<EFBFBD><C7B0>TCP<43>ձ<EFBFBD>ʱ<EFBFBD><CAB1>
int keep_interval = 3; // <20><><EFBFBD><EFBFBD>KeepAlive̽<65><CCBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
int keep_count = 3; // <20>ж<EFBFBD><D0B6>Ͽ<EFBFBD>ǰ<EFBFBD><C7B0>KeepAlive̽<65><CCBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
fd_set set;
u_long largp = 1L; //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ģʽ
char tmp_buf[256];
addr_len = sizeof(struct sockaddr_in);
//printf("<22>˿<EFBFBD>%d <20><><EFBFBD><EFBFBD><EFBFBD>Ƿ<EFBFBD><C7B7>пͻ<D0BF><CDBB>˹<EFBFBD><CBB9><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>\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);
// <20><><EFBFBD>ͻ<EFBFBD><CDBB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD>жϿͻ<CFBF><CDBB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ԵĶ˿ں<CBBF> yizhonghu 20070704
for(i=MaxSerialPortNum; i<MaxPortNum; i++)
{
if((SioParam[i].NetCommIpAddr == addr.sin_addr.s_addr)
&& (SioParam[i].LiSock == lisfds))
{
printf("sockport = %d\n", i+1);
commid = i;
break;
}
}
if(i == MaxPortNum)
{
closesocket(sock);
return;
}
// <20><><EFBFBD><EFBFBD>socket<65>Ѿ<EFBFBD><D1BE><EFBFBD><EFBFBD>ڣ<EFBFBD><DAA3><EFBFBD><EFBFBD>ص<EFBFBD>ԭ<EFBFBD><D4AD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ӽ<EFBFBD><D3BD><EFBFBD><EFBFBD>µ<EFBFBD><C2B5><EFBFBD><EFBFBD><EFBFBD> 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);
if (SOCKET_ERROR == result)
{
result = WSAGetLastError();
sprintf(tmp_buf, "ioctlsocket<EFBFBD><EFBFBD><EFBFBD>÷<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ģʽ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>, SocketError=%d, SocketId = %d", result, sock);
DebugPrint(tmp_buf);
return;
}
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
result = MAX_NET_BUF_SIZE;
setsockopt(sock, SOL_SOCKET, SO_RCVBUF, (char*)&result, sizeof(result));
result = MAX_NET_BUF_SIZE;
setsockopt(sock, SOL_SOCKET, SO_SNDBUF, (char*)&result, sizeof(result));
result = 4;
tmp_buf[0] = 1;
tmp = setsockopt(sock, SOL_SOCKET, SO_KEEPALIVE, tmp_buf, result);
tmp = getsockopt(sock, SOL_SOCKET, SO_KEEPALIVE, tmp_buf, &result);
result = 1;
setsockopt(sock, SOL_SOCKET, SO_REUSEADDR, (char*)&result, sizeof(result));
//set_keepalive(sock, keep_alive, keep_idle, keep_interval, keep_count);
// <20><><EFBFBD><EFBFBD>Ӧ<EFBFBD>õȵ<C3B5>ȷ<EFBFBD><C8B7><EFBFBD>˿ڿ<CBBF><DABF><EFBFBD>д<EFBFBD><D0B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϊ<EFBFBD><CEAA>ȫ<EFBFBD><C8AB><EFBFBD><EFBFBD>״̬
//SioParam[commid].OpenFlag = OPEN_PORT;
}
int AddFdToSet(int commid, int *fd_max, fd_set *fdset_ro, fd_set *fdset_wr, fd_set *fdset_ex)
{
int setflag, fds, inum;
inum = 0;
setflag = 0;// (=0: <20>޲<EFBFBD><DEB2><EFBFBD>; =1:û<>к<EFBFBD><D0BA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>; =2:<3A><>ǰ<EFBFBD>޲<EFBFBD><DEB2><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>к<EFBFBD><D0BA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>;=3:<3A>в<EFBFBD><D0B2><EFBFBD><EFBFBD><EFBFBD><EFBFBD>к<EFBFBD><D0BA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>)
switch (SioParam[commid].NetType)
{
case NO_COMM:
break;
case UDP_COMM: // <20><><EFBFBD><EFBFBD>UDP<44>˿<EFBFBD><CBBF>׽<EFBFBD><D7BD><EFBFBD><EFBFBD>Ƿ<EFBFBD><C7B7><EFBFBD><EFBFBD><EFBFBD>
if (-1 < SioParam[commid].CommSock)
{
fds = SioParam[commid].CommSock;
setflag = 3;
break;
}
setflag = 2;
break;
case TCP_S_COMM: // <20><><EFBFBD><EFBFBD>TCP<43><50><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>˿<EFBFBD><CBBF>׽<EFBFBD><D7BD><EFBFBD><EFBFBD>Ƿ<EFBFBD><C7B7><EFBFBD><EFBFBD><EFBFBD>(<28><><EFBFBD><EFBFBD>listen<65>׽<EFBFBD><D7BD><EFBFBD>)
if ((0 > SioParam[commid].CommSock) && (-1 < SioParam[commid].LiSock))
{
fds = SioParam[commid].LiSock;
setflag = 3;
break;
}
if (-1 < SioParam[commid].CommSock)
{
fds = SioParam[commid].CommSock;
setflag = 3;
break;
}
setflag = 2;
break;
case TCP_C_COMM: // <20><><EFBFBD><EFBFBD>TCP<43>ͻ<EFBFBD><CDBB><EFBFBD><EFBFBD>׽<EFBFBD><D7BD><EFBFBD><EFBFBD>Ƿ<EFBFBD><C7B7><EFBFBD><EFBFBD><EFBFBD>
if (-1 < SioParam[commid].CommSock)
{
fds = SioParam[commid].CommSock;
setflag = 3;
break;
}
setflag = 2;
break;
}
if (0 == setflag)
return inum;
if ((1 == setflag) || (3 == setflag))
{
inum++;
FD_SET(fds, fdset_ro);
FD_SET(fds, fdset_wr);
FD_SET(fds, fdset_ex);
*fd_max = max(*fd_max, fds);
}
if (1 == setflag)
return inum;
// if(2 == setflag) <20><><EFBFBD><EFBFBD><E8B4A6>
return inum;
}
void PollAllPort(void)
{
struct timeval timeout;
int i, inum, nfds, commid, fds, lisfds, ret, ierr, ierrlen;
u_long ipaddr;
fd_set fdset_ro, fdset_wr, fdset_ex;
/*static int ok=0;*/
inum = 0;
nfds = 0;
FD_ZERO(&fdset_ro);
FD_ZERO(&fdset_wr);
FD_ZERO(&fdset_ex);
for(i=0; i<MaxPortNum; i++)
{
commid = i;
inum += AddFdToSet(commid, &nfds, &fdset_ro, &fdset_wr, &fdset_ex);
}
if(inum < 1)
return;
// <20><><EFBFBD>ó<EFBFBD>ʱ<EFBFBD>ȴ<EFBFBD>ʱ<EFBFBD><CAB1>Ϊ0
memset((char*)&timeout, 0, sizeof(struct timeval));
if(select(nfds+1, &fdset_ro, &fdset_wr, &fdset_ex, &timeout) < 1)
{
return;
}
for(i=0; i< MaxPortNum; i++)
{
commid = i;
fds = SioParam[commid].CommSock;
ipaddr = SioParam[commid].NetCommIpAddr;
switch(SioParam[commid].NetType)
{
case NO_COMM:
break;
case UDP_COMM:
if(SioParam[commid].CommSock < 0)
break;
// <20>ж<EFBFBD>socket<65>Ƿ<EFBFBD><C7B7>
if(FD_ISSET(fds, &fdset_ex))
{
CloseNetPort(commid);
break;
}
// socket<65>ɶ<EFBFBD>
if(FD_ISSET(fds, &fdset_ro))
UdpRecv(commid, fds, ipaddr);// <20><><EFBFBD><EFBFBD>socket<65>е<EFBFBD><D0B5><EFBFBD><EFBFBD>ݶ<EFBFBD><DDB6><EFBFBD>
// socket<65><74>д
if(FD_ISSET(fds, &fdset_wr))
UdpSend(commid);
break;
case TCP_C_COMM:
if(SioParam[commid].CommSock < 0)
break;
// <20>ж<EFBFBD>socket<65>Ƿ<EFBFBD><C7B7>
if(FD_ISSET(fds, &fdset_ex))
{
CloseNetPort(commid);
break;
}
// socket<65>ɶ<EFBFBD>
if(FD_ISSET(fds, &fdset_ro))
{
if(TcpRecv(commid, fds, ipaddr) == FALSE) // <20><><EFBFBD><EFBFBD>socket<65>е<EFBFBD><D0B5><EFBFBD><EFBFBD>ݶ<EFBFBD><DDB6><EFBFBD>
break; // <20>˿ڿ<CBBF><DABF><EFBFBD><EFBFBD>Ѿ<EFBFBD><D1BE>ر<EFBFBD>
}
// socket<65><74>д
if(FD_ISSET(fds, &fdset_wr))
{
ierrlen = sizeof(ierr);
ret = getsockopt (fds, SOL_SOCKET, SO_ERROR, (char *)&ierr, &ierrlen);
if (SOCKET_ERROR == ret)
{
CloseNetPort(commid);
break;
}
TcpSend(commid);
}
break;
case TCP_S_COMM:
lisfds = SioParam[commid].LiSock;
/*if(ok < 1000)
{
printf("<EFBFBD>˿<EFBFBD>%d lisock=%d fds = %d\n", commid+1, lisfds, fds);
ok++;
}*/
if(fds < 0)
{
if(lisfds < 0)
break;
if(FD_ISSET(lisfds, &fdset_ex))
{
//printf("<22>˿<EFBFBD>%d <20>رշ<D8B1><D5B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD>˿<EFBFBD>\n", commid+1);
CloseNetListenPort(commid);
}
else if(FD_ISSET(lisfds, &fdset_ro))
{
TcpAccept(commid, lisfds);
}
break;
}
// <20>ж<EFBFBD>socket<65>Ƿ<EFBFBD><C7B7>
if(FD_ISSET(fds, &fdset_ex))
{
//printf("<22>˿<EFBFBD>%d socket<65><EFBFBD><ECB3A3><EFBFBD>ر<EFBFBD>TcpͨѶ\n", commid+1);
CloseNetPort(commid);
break;
}
// socket<65>ɶ<EFBFBD>
if(FD_ISSET(fds, &fdset_ro))
{
if(TcpRecv(commid, fds, ipaddr) == FALSE) // <20><><EFBFBD><EFBFBD>socket<65>е<EFBFBD><D0B5><EFBFBD><EFBFBD>ݶ<EFBFBD><DDB6><EFBFBD>
break; // <20>˿ڿ<CBBF><DABF><EFBFBD><EFBFBD>Ѿ<EFBFBD><D1BE>ر<EFBFBD>
}
// socket<65><74>д
if(FD_ISSET(fds, &fdset_wr))
TcpSend(commid);
break;
}
}
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>˿ڶ<CBBF>д<EFBFBD><D0B4><EFBFBD><EFBFBD>
}