- 论坛徽章:
- 0
|
int Service(int port, int sec, int usec)
{
int SockFd; /* 本地监听端口 */
int NewSck; /* 远程连接端口 */
int addr_len; /* 网络地址长度 */
int ret; /* 函数返回值 */
int i; /* 循环变量 */
int idx; /* 端口表中序号 */
int flag;
struct sockaddr_in my_addr;
struct sockaddr_in their_addr;
struct timeval TOut;/* 超时变量 */
fd_set ReadFds; /* 读监听端口 */
fd_set ErrFds; /* 错误监听端口 */
char msg[1024];
/* 初始化 */
SockFd = -1;
NewSck = -1;
addr_len = sizeof(struct sockaddr_in);
ret = 0;
i = 0;
memset(&my_addr, 0x00, sizeof(struct sockaddr_in));
memset(&their_addr, 0x00, sizeof(struct sockaddr_in));
memset(&TOut, 0x00, sizeof(struct timeval));
FD_ZERO(&ReadFds);
FD_ZERO(&ErrFds);
/* 建立网络端口 */
SockFd = socket(AF_INET, SOCK_STREAM, 0);
if(-1 == SockFd)
{
return -1;
}
/* 设置端口属性 */
my_addr.sin_family = PF_INET;
my_addr.sin_port = htons(port);
bzero(&my_addr.sin_zero, sizeof(my_addr.sin_zero));
my_addr.sin_addr.s_addr = INADDR_ANY;
/* 12 add by tch */
/* 使地址马上可以重用 */
ret = 1;
ret = setsockopt(SockFd, SOL_SOCKET, SO_REUSEADDR, &ret, sizeof(ret));
/* 绑定端口 */
if(bind(SockFd, (struct sockaddr *)&my_addr, sizeof(struct sockaddr)) == -1)
{
close(SockFd);
return -1;
}
/* 监听该端口 */
if(listen(SockFd, MAX_PORT + 1) == -1)
{
return -1;
}
printf("Listen Begin Port = %dn", port);
setjmp(NetError); /* SIGPIPE信号回复点,网络错误 */
NowPortIdx = -1;
signal(SIGPIPE, NetErrProc);
memset(msg, 0x00, sizeof(msg));
sprintf(msg, "Begin Service ---------nn");
LogMsg(msg);
while(1)
{
ret = 0;
/* 检查所有连接是否超时 */
IsDisConn();
NowPortIdx = 0;
/* 设置超时时间 */
TOut.tv_sec = sec;
TOut.tv_usec = usec;
/* 设置监听端口 */
MaxFd = GetMaxFd(SockFd);
FD_ZERO(&ErrFds);
FD_ZERO(&ReadFds);
ReadFds = AllFds;
ErrFds = AllFds;
//printf("Select Time = %dn", time(NULL));
ret = select(MaxFd + 1, &ReadFds, 0x00, &ErrFds, &TOut);
if(ret <= 0) /* 监听超时 */
{
continue;
}
/* 判断是否有新的连接 */
if(FD_ISSET(SockFd, &ReadFds))
{
NowPortIdx = -2;
flag = 0;
sock_accept:
NewSck = accept(SockFd, (struct sockaddr *)&their_addr, &addr_len);
if(-1 != NewSck)
{
printf("NewSock[%d] = %dn", idx, NewSck);
do some things
break;
}
if(idx >= MAX_PORT)
{
memset(msg, 0x00, sizeof(msg));
sprintf(msg, "No Port Tbl NowSock[%d] = %dn", idx, NewSck);
LogMsg(msg);
printf("No Port Table NowSock[%d] = %dn", idx, NewSck);
/* 关闭连接 */
close(NewSck);
}
}
else
{
memset(msg, 0x00, sizeof(msg));
sprintf(msg, "accept erro SockFd = %dn", SockFd);
LogMsg(msg);
printf("accept error SockFd = %d errorno = %dn", SockFd, errno);
if((EINTR == errno) && (flag < 3))
{
flag++;
goto sock_accept;
}
}
} |
|