|
|
|
|
/*****************************************************************************
|
|
|
|
|
* 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>
|
|
|
|
|
}
|