⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 bpalogin.c

📁 big pond WAN connect function
💻 C
字号:
/*
**	BPALogin v2.0 - lightweight portable BIDS2 login client
**	Copyright (c) 1999  Shane Hyde (shyde@trontech.com.au)
** 
**  This program is free software; you can redistribute it and/or modify
**  it under the terms of the GNU General Public License as published by
**  the Free Software Foundation; either version 2 of the License, or
**  (at your option) any later version.
** 
**  This program is distributed in the hope that it will be useful,
**  but WITHOUT ANY WARRANTY; without even the implied warranty of
**  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
**  GNU General Public License for more details.
** 
**  You should have received a copy of the GNU General Public License
**  along with this program; if not, write to the Free Software
**  Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
**
*/ 

#include "bpalogin.h"

/*
**  Main processing loop.  Logs in, handles heartbeats, and logs out on request
**
**  Returns - 0 - We are no longer connected, and should not retry.
**            1 - We are no longer connnected and should retry.
*/
int bpa_mainloop(struct session *s)
{
    int i;
	int err;
	struct hostent * he;

	s->lastheartbeat = 0;
	s->sequence = 0;
	s->listensock = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
    if (s->listensock < 0)
    {
	    s->debug (0, "Create UDP socket fail");
        return 0;
    }

	s->localaddr.sin_family = AF_INET;
	s->localaddr.sin_port = htons(s->localport);
	if (strcmp(s->localaddress, ""))
	{
		s->debug(0,"Using local address %s\n",s->localaddress);

		he = (struct hostent *) gethostbyname(s->localaddress);
		if(he)
		{
			s->localaddr.sin_addr.s_addr = *((int*)(he->h_addr_list[0]));
		}
		else
		{
			s->localaddr.sin_addr.s_addr = inet_addr(s->localaddress);
		}
	}
	else
	{
		s->localaddr.sin_addr.s_addr = INADDR_ANY;
	}

	err = bind(s->listensock, (struct sockaddr *)&s->localaddr, sizeof(s->localaddr));
    if (err)
    {
		closesocket(s->listensock);
		return 0;
    }

	s->sessionid = time(NULL);
	s->listenport = s->localport;

	strcpy(s->osname, "whocares");
	strcpy(s->osrelease,"notme");

	he = (struct hostent *)gethostbyname(s->authserver);
	if (he)
	{
		s->authhost.sin_addr.s_addr = *((int*)(he->h_addr_list[0]));
	}
	else
	{
		s->authhost.sin_addr.s_addr = inet_addr(s->authserver);
	}
	
	s->authhost.sin_port = htons(s->authport);
	s->authhost.sin_family = AF_INET;

    s->debug(0, "Auth host = %s:%d\n", s->authserver, s->authport);
    s->debug(0, "Listening on port %d\n", s->listenport);

    if (bpa_login(s))
	{
		s->onconnected(s->listenport);

		if (!handle_heartbeats(s))
		{
			s->ondisconnected(1);
			s->noncritical("\nnon fatal heartbeat error!");

            // We want to continue login in this case!!
		}
		else
		{
            // Shutdown for critical error
            s->shutdown = 1;

            // Shutdown road runner
		}

        // logout anyway!!
        bpa_logout(0, s);
	}

    //
    // Sleep 6 seconds and retry again, if not shutdown by user
    //
    if (!s->shutdown)
    {
        s->noncritical("\nSleeping for 6 seconds");
        for (i=0; i<60; i++)
	    {
            if (bpa_isshutdown(s))
                break;
            else
                KNL_SLEEP(10);
        }
    }

    closesocket(s->listensock);
	s->debug(0, "Closed listen socket (UDP) %d", s->listensock);

    return !s->shutdown;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -