亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關(guān)于我們
? 蟲蟲下載站

?? wsckcomm.c

?? MUD服務(wù)器程序
?? C
?? 第 1 頁 / 共 5 頁
字號:
/***************************************************************************
 *  Original Diku Mud copyright (C) 1990, 1991 by Sebastian Hammer,        *
 *  Michael Seifert, Hans Henrik St{rfeldt, Tom Madsen, and Katja Nyboe.   *
 *                                                                         *
 *  Merc Diku Mud improvments copyright (C) 1992, 1993 by Michael          *
 *  Chastain, Michael Quan, and Mitchell Tse.                              *
 *                                                                         *
 *  Envy Diku Mud improvements copyright (C) 1994 by Michael Quan, David   *
 *  Love, Guilherme 'Willie' Arnold, and Mitchell Tse.                     *
 *                                                                         *
 *  Windows sockets port by Slash.                                         *
 *                                                                         *
 *  In order to use any part of this Envy Diku Mud, you must comply with   *
 *  the original Diku license in 'license.doc', the Merc license in        *
 *  'license.txt', as well as the Envy license in 'license.nvy'.           *
 *  In particular, you may not remove either of these copyright notices.   *
 *                                                                         *
 *  Thanks to abaddon for proof-reading our comm.c and pointing out bugs.  *
 *  Any remaining bugs are, of course, our work, not his.  :)              *
 *                                                                         *
 *  Much time and thought has gone into this software and you are          *
 *  benefitting.  We hope that you share your changes too.  What goes      *
 *  around, comes around.                                                  *
 ***************************************************************************/
#include <time.h>
#include <stdio.h>
#include <stdlib.h>

//#include "telnet.h"

#include "merc.h"
#include "merc-win.rh"

#include <windows.h>

// Yes, we want mobprogram support
#define MOBPROGS

// Yes, we want support for Merc 2.2 for Windows additions
#define MERCW32

#define STDERR_FILE	"stderr.txt" /* For what Unix writes to standard error */

/*
 * Definitions for the TELNET protocol.
 */
#define	IAC	255		/* interpret as command: */
#define	WONT	252		/* I won't use option */
#define	WILL	251		/* I will use option */
#define	GA	249		   /* you may reverse the line */

/* telnet options */
#define	TELOPT_ECHO	1	/* echo */

struct host_and_name_lookup {
    // These are used by WSAAsyncGetHostByAddr()
    char       hostdata[MAXGETHOSTSTRUCT];
    HANDLE     hRequestHandle;
    struct     in_addr sin_addr;

    // These are used by the identd stuff
    char       username[64];
    SOCKET     sAuth;
    struct sockaddr_in authsock;    // Address of the authentication
    struct sockaddr_in us;          // Address of our socket to this player
    struct sockaddr_in them;        // Address of our socket to this player
};

/* Local #defines for Win32 */
//#define MAKEWORD(a, b)      ((WORD)(((BYTE)(a)) | (((WORD)((BYTE)(b))) << 8)))

#define WM_NET_ACCEPT      (WM_USER+500)
#define WM_NET_READWRITE   (WM_USER+501)
#define WM_NET_GETHOST     (WM_USER+502)
#define WM_NET_AUTHCONNECT (WM_USER+503)

/*
 * Global variables.
 */
DESCRIPTOR_DATA *   descriptor_free;	/* Free list for descriptors	*/
DESCRIPTOR_DATA *   descriptor_list;	/* All open descriptors		*/
DESCRIPTOR_DATA *   d_next;		/* Next descriptor in loop	*/
FILE *		    fpReserve;		/* Reserved file handle		*/
bool		    god;		/* All new chars are gods!	*/
bool		    merc_down;		/* Shutdown			*/
bool		    wizlock;		/* Game is wizlocked		*/
int                 numlock = 0;        /* Game is numlocked at <level> (ENVY) */
char		    str_boot_time[MAX_INPUT_LENGTH];
time_t		    current_time;	/* Time of this pulse		*/

/* Windows version variables */
SOCKET control;
int nPlayers = 0;
int nOldPlayers = 0;
FILE *fpStderr;
BOOL fWantsMessageBox = TRUE; // if TRUE, bring up message box on bugs, else log

/*
 * Other local functions (OS-independent).
 */
bool	check_parse_name	args( ( char *name ) );
bool	check_reconnect		args( ( DESCRIPTOR_DATA *d, char *name,
				    bool fConn ) );
bool	check_playing		args( ( DESCRIPTOR_DATA *d, char *name ) );
int	main			args( ( int argc, char **argv ) );
void	nanny			args( ( DESCRIPTOR_DATA *d, char *argument ) );
bool	process_output		args( ( DESCRIPTOR_DATA *d, bool fPrompt ) );
void	read_from_buffer	args( ( DESCRIPTOR_DATA *d ) );
void	stop_idling		args( ( CHAR_DATA *ch ) );
//void    bust_a_prompt           args( ( CHAR_DATA *ch ) );
void    bust_a_prompt           args( ( DESCRIPTOR_DATA *d ) );

// @@@ My junk
//char      UserMessage[512];
//BOOL      fUserReady;
const	char	echo_off_str	[] = { IAC, WILL, TELOPT_ECHO, '\0' };
const	char	echo_on_str	[] = { IAC, WONT, TELOPT_ECHO, '\0' };
const	char 	go_ahead_str	[] = { IAC, GA, '\0' };
bool	write_to_descriptor	args( ( int desc, char *txt, int length ) );
bool BlastedTrumpet(SOCKET sSocket);
LRESULT SocketAccept (WPARAM /*wParam*/, LPARAM lParam);
LRESULT SocketReadWrite (WPARAM wParam, LPARAM lParam);
LRESULT SocketGetHost(WPARAM wParam, LPARAM lParam);
LRESULT SocketAuthConnect(WPARAM wParam, LPARAM lParam);
SOCKET init_socket( int port );
bool read_from_descriptor( DESCRIPTOR_DATA *d );

void	send_to_char	args( ( const char *txt, CHAR_DATA *ch ) )
{
    if ( txt == NULL || ch->desc == NULL )
        return;
    free_string( ch->desc->showstr_head );
#if 0 // @@@ The next line is from sands, it seems wrong
    ch->desc->showstr_head = str_dup( txt );
#else
    ch->desc->showstr_head = alloc_mem( strlen( txt ) + 1 );
    strcpy( ch->desc->showstr_head, txt );
#endif
    ch->desc->showstr_point = ch->desc->showstr_head;
    show_string( ch->desc, "" );
}

void gettimeofday( struct timeval *tp, void *tzp )
{
    tp->tv_sec  = time( NULL );
    tp->tv_usec = 0;
}

#if 0 // @@@
bool read_from_descriptor( DESCRIPTOR_DATA *d )
{
    int iStart;

    /* Hold horses if pending command already. */
    if ( d->incomm[0] != '\0' )
	return TRUE;

    /* Check for overflow. */
    iStart = strlen(d->inbuf);
    if ( iStart >= sizeof(d->inbuf) - 10 )
    {
	sprintf( log_buf, "%s input overflow!", d->host );
	log_string( log_buf );
	write_to_descriptor( d->descriptor,
	    "\n\r*** PUT A LID ON IT!!! ***\n\r", 0 );
	return FALSE;
    }

#if 0
    /* Snarf input. */
    for ( ; ; )
    {
	int c;
	c = getc( stdin );
	if ( c == '\0' || c == EOF )
	    break;
	putc( c, stdout );
	if ( c == '\r' )
	    putc( '\n', stdout );
	d->inbuf[iStart++] = c;
	if ( iStart > sizeof(d->inbuf) - 10 )
	    break;
    }
#else
    if (fUserReady)
       {
       int nLen = strlen(UserMessage);
       fUserReady = FALSE;
       if (iStart + nLen <= sizeof d->inbuf - 10)
          {
          memcpy(d->inbuf + iStart, UserMessage, nLen);
          iStart += nLen;
          d->inbuf[iStart++] = '\r';
          }
       }
#endif

    d->inbuf[iStart] = '\0';
    return TRUE;
}
#endif


/*
 * Transfer one line from input buffer to input line.
 */
void read_from_buffer( DESCRIPTOR_DATA *d )
{
    int i, j, k;

    /*
     * Hold horses if pending command already.
     */
    if ( d->incomm[0] != '\0' )
	return;

    /*
     * Look for at least one new line.
     */
    for ( i = 0; d->inbuf[i] != '\n' && d->inbuf[i] != '\r'; i++ )
    {
	if ( d->inbuf[i] == '\0' )
	    return;
    }

    /*
     * Canonical input processing.
     */
    for ( i = 0, k = 0; d->inbuf[i] != '\n' && d->inbuf[i] != '\r'; i++ )
    {
	if ( k >= MAX_INPUT_LENGTH - 2 )
	{
	    write_to_descriptor( d->descriptor, "Line too long.\n\r", 0 );

	    /* skip the rest of the line */
	    for ( ; d->inbuf[i] != '\0'; i++ )
	    {
		if ( d->inbuf[i] == '\n' || d->inbuf[i] == '\r' )
		    break;
	    }
	    d->inbuf[i]   = '\n';
	    d->inbuf[i+1] = '\0';
	    break;
	}

	if ( d->inbuf[i] == '\b' && k > 0 )
	    --k;
	else if ( isascii(d->inbuf[i]) && isprint(d->inbuf[i]) )
	    d->incomm[k++] = d->inbuf[i];
    }

    /*
     * Finish off the line.
     */
    if ( k == 0 )
	d->incomm[k++] = ' ';
    d->incomm[k] = '\0';

    /*
     * Deal with bozos with #repeat 1000 ...
     */
    if ( k > 1 || d->incomm[0] == '!' )
    {
    	if ( d->incomm[0] != '!' && strcmp( d->incomm, d->inlast ) )
	{
	    d->repeat = 0;
	}
	else
	{
	    if ( ++d->repeat >= 20 )
	    {
		sprintf( log_buf, "%s input spamming!", d->host );
		log_string( log_buf );
		write_to_descriptor( d->descriptor,
		    "\n\r*** PUT A LID ON IT!!! ***\n\r", 0 );
		strcpy( d->incomm, "quit" );
	    }
	}
    }

    /*
     * Do '!' substitution.
     */
    if ( d->incomm[0] == '!' )
	strcpy( d->incomm, d->inlast );
    else
	strcpy( d->inlast, d->incomm );

    /*
     * Shift the input buffer.
     */
    while ( d->inbuf[i] == '\n' || d->inbuf[i] == '\r' )
	i++;
    for ( j = 0; ( d->inbuf[j] = d->inbuf[i+j] ) != '\0'; j++ )
	;
    return;
}

void CloseMerc(void)
{
}

HINSTANCE hInst;
HWND      hQryDlgBox;                         // handle of modeless dialog box
HWND      hWndMain;
HWND      hWndOutput;
//char      UserMessage[512];
//bool      fUserReady;

LRESULT CALLBACK _export MercWndProc(HWND hWnd, UINT message,
                             WPARAM wParam, LPARAM lParam)
{
    switch (message)
    {
        case WM_MOVE:
            // Move the dialog box on top of our main window every
            // time the main window moves.
            if (IsWindow(hQryDlgBox))
                SendMessage(hQryDlgBox, message, wParam, lParam);
            break;

        case WM_SETFOCUS:
            // Always set the input focus to the dialog box.
            if (IsWindow(hQryDlgBox))
                SendMessage(hQryDlgBox, message, wParam, lParam);
            break;

        case WM_CLOSE:
            // Tell windows to destroy our window.
            DestroyWindow(hWnd);
            break;

        case WM_QUERYENDSESSION:
            // If we return TRUE we are saying it's ok with us to end the
				// windows session.
            return((long) TRUE);  // we agree to end session.

        case WM_ENDSESSION:
            // If wParam is not zero, it meany every application said ok
            // to WM_QUERYENDSESSION messages, so we are really ending.
            if (wParam)           // if all apps aggreed to end session.
                CloseMerc();     // This is the end. We will not get a
                                   // WM_DESTROY message on end session.
            break;

        case WM_DESTROY:
            // This is the end if we were closed by a DestroyWindow call.

            CloseMerc();
				PostQuitMessage(0);
            break;

        default:
            return(DefWindowProc(hWnd, message, wParam, lParam));
    }

    return(0L);
}

BOOL CALLBACK _export MercDlgProc(HWND hDlg, UINT message,
                           WPARAM wParam, LPARAM lParam)
{
    static RECT   wrect;

    int           x, y, w, h, i;
    long          rc;
//    char         *cp, *cpd, tmp[30], sdrives[30];
//    HANDLE        hCursor;
    HWND hWndInput;

    switch (message)
    {
        case WM_INITDIALOG:
            // Save the handle of this proc for use by main window proc.
            hQryDlgBox = hDlg;

            // Save the handle to the output window
            hWndOutput = GetDlgItem(hDlg, 102);
//            SendMessage(hWndOutput, WM_SETFONT,
//               (WPARAM) GetStockObject(SYSTEM_FIXED_FONT), 0);
            SetFocus(GetDlgItem(hDlg, 101));

            // Get position of dialog box window.
            GetWindowRect(hDlg, (LPRECT) &wrect);
            w = wrect.right - wrect.left;
            h = wrect.bottom - wrect.top;

            // Move main application window to same position.
            SetWindowPos(hWndMain, hDlg,
                         wrect.left, wrect.top, w, h,
                         0);

            // Tell Winsock we are listening for accepted sockets
            WSAAsyncSelect(control, hDlg, WM_NET_ACCEPT, FD_ACCEPT);
            break;

        case WM_MOVE:
            // Always keep this dialog box on top of main window.
            GetWindowRect(hWndMain, (LPRECT) &wrect);
            x = wrect.left;
            y = wrect.top;
            w = wrect.right - wrect.left;
            h = wrect.bottom - wrect.top;
            MoveWindow(hDlg, x, y, w, h, 1);
            break;

        case WM_SYSCOMMAND:
            // Pass WM_SYSCOMMAND messages on to main window so both
            // main window and dialog box get iconized, minimized etc.
            // in parallel.
            SendMessage(hWndMain, message, wParam, lParam);
            break;

        case WM_COMMAND:
            switch (LOWORD(wParam))
            {
#if 0 // @@@
                case IDOK:
                    hWndInput = GetDlgItem(hDlg, 101);
                    SendMessage(hWndInput, WM_GETTEXT, sizeof UserMessage, (LPARAM) UserMessage);
                    SendMessage(hWndInput, WM_SETTEXT, 0, (LPARAM) "");
                    SetFocus(hWndInput);
                    fUserReady = TRUE;
                    break;
#endif
                case IDCANCEL:                  // Cancel button
                    // Tell main application window we want to quit.
                    SendMessage(hWndMain, WM_CLOSE, 0, 0L);
                    break;

                default:
                    break;
            }
            break;

        case WM_CLOSE:
            // Unlock dialog resource we locked above.

            // Zero handle to this dialog window.
            hQryDlgBox = 0;

            // Tell main window to close.
            PostMessage(hWndMain, WM_CLOSE, 0, 0L);

            // Destroy ourseleves.
            DestroyWindow(hDlg);
            break;

        case WM_NET_ACCEPT:
           SocketAccept(wParam, lParam);
           break;

        case WM_NET_READWRITE:
           SocketReadWrite(wParam, lParam);
           break;

        case WM_NET_GETHOST:
           SocketGetHost(wParam, lParam);
           break;

        case WM_NET_AUTHCONNECT:
           SocketAuthConnect(wParam, lParam);
           break;

        default:
            return FALSE;
    }

    return(TRUE);
}

void InitMerc22(HINSTANCE hInstance, int cmdShow)
{
    WNDCLASS wcMercClass;

    // Define the window class for this application.
    wcMercClass.lpszClassName = "Merc22";
    wcMercClass.hInstance     = hInstance;
    wcMercClass.lpfnWndProc   = MercWndProc;
    wcMercClass.hCursor       = LoadCursor(NULL, IDC_ARROW);

?? 快捷鍵說明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
欧美无乱码久久久免费午夜一区| 亚洲一区二区精品久久av| 欧美探花视频资源| 日本二三区不卡| 91久久一区二区| 欧美亚洲综合网| 欧美日韩视频不卡| 欧美一区二区高清| 精品国产亚洲在线| 久久久99精品久久| 成人欧美一区二区三区小说 | 国精品**一区二区三区在线蜜桃 | 欧美一区二区三区精品| 在线不卡一区二区| www欧美成人18+| 国产精品色在线| 亚洲自拍偷拍九九九| 日本不卡视频一二三区| 国产一区二区三区四区五区美女 | 欧美成人综合网站| 国产人久久人人人人爽| 亚洲欧美国产毛片在线| 三级亚洲高清视频| 国产麻豆精品一区二区| 色欧美片视频在线观看| 这里只有精品视频在线观看| 久久女同互慰一区二区三区| 亚洲欧洲制服丝袜| 日本va欧美va欧美va精品| 成人激情免费电影网址| 欧美无人高清视频在线观看| 久久精品亚洲麻豆av一区二区| 亚洲视频 欧洲视频| 久久精品国产秦先生| 色噜噜狠狠成人中文综合| 日韩一区二区精品| 亚洲色欲色欲www在线观看| 青青青伊人色综合久久| 99久久99久久免费精品蜜臀| 日韩一区二区电影| 亚洲黄色录像片| 国产成人精品综合在线观看 | 欧美一二三四区在线| 国产精品久久久久久亚洲伦| 免费高清成人在线| 在线观看欧美黄色| 国产女主播一区| 看电视剧不卡顿的网站| 在线观看91精品国产入口| 中文一区一区三区高中清不卡| 蜜臀av在线播放一区二区三区| 91成人在线精品| 亚洲欧洲精品一区二区三区| 极品少妇xxxx偷拍精品少妇| 欧美视频精品在线| 亚洲欧美综合网| 粉嫩av亚洲一区二区图片| 欧美成人福利视频| 丝袜诱惑亚洲看片| 欧美日韩一区二区三区高清 | 亚洲精品在线观看视频| 无吗不卡中文字幕| 精品视频在线视频| 亚洲激情男女视频| 日本高清成人免费播放| 亚洲色图在线播放| 国产不卡视频在线播放| 久久久久免费观看| 国产一区二区不卡老阿姨| 欧美一区二区三区男人的天堂| 亚洲一本大道在线| 在线观看免费视频综合| 亚洲自拍偷拍九九九| 欧美亚洲国产一区二区三区 | 国产精品亚洲а∨天堂免在线| 欧美一区二区三区啪啪| 美国十次综合导航| 欧美大胆人体bbbb| 国产自产高清不卡| 久久久精品欧美丰满| 丁香婷婷综合五月| 国产精品久久久久影院亚瑟 | 风间由美性色一区二区三区| 久久久亚洲午夜电影| 国产福利精品导航| 自拍偷拍亚洲欧美日韩| 欧美性生活影院| 日韩和欧美一区二区| 欧美精品一区二区三区很污很色的 | 日韩制服丝袜av| 日韩免费观看高清完整版 | 一个色妞综合视频在线观看| 欧美少妇一区二区| 久久99精品国产麻豆婷婷| 日本一区二区三级电影在线观看| 成人av在线资源网站| 亚洲小说欧美激情另类| 欧美大片拔萝卜| 91在线国内视频| 日韩av电影免费观看高清完整版 | 国v精品久久久网| 一二三区精品福利视频| 欧美一区二区播放| 成人一区在线看| 亚洲激情在线激情| 精品国产乱码久久久久久牛牛| 国产成人在线看| 亚洲国产欧美一区二区三区丁香婷| 91精品国产福利| va亚洲va日韩不卡在线观看| 在线日韩一区二区| 亚洲v中文字幕| 精品国产一区二区精华| 国产福利一区二区三区视频在线| 一区二区在线免费观看| 日韩欧美国产精品| 色综合久久88色综合天天| 日本aⅴ亚洲精品中文乱码| 国产欧美综合在线| 欧美色电影在线| 成人动漫视频在线| 欧美96一区二区免费视频| 自拍偷拍亚洲综合| 久久久99免费| 欧美理论在线播放| 91免费看`日韩一区二区| 久久超碰97人人做人人爱| 亚洲精品视频观看| 欧美经典一区二区| 精品国产成人在线影院| 日本大香伊一区二区三区| 成人黄页毛片网站| 久久99精品久久久久久| 欧美视频一区二| 国产99精品在线观看| 久久成人免费电影| 日韩激情中文字幕| 亚洲在线免费播放| 亚洲乱码日产精品bd| 国产精品欧美一区喷水| 日韩免费观看高清完整版| 欧美裸体一区二区三区| 在线国产亚洲欧美| 色婷婷久久久亚洲一区二区三区| 成人综合激情网| 成人在线一区二区三区| 风流少妇一区二区| 国产高清在线观看免费不卡| 国产乱对白刺激视频不卡| 久久精品国产第一区二区三区| 免费一区二区视频| 久久精品国产亚洲5555| 国产又黄又大久久| 国产精品亚洲午夜一区二区三区| 国产一区二区免费看| 成人自拍视频在线观看| 91天堂素人约啪| 在线观看一区二区视频| 欧美日韩一区不卡| 3d成人h动漫网站入口| 欧美一级高清片在线观看| 欧美tickle裸体挠脚心vk| 精品乱人伦小说| 国产欧美精品一区| 亚洲欧美视频在线观看视频| 亚洲精品免费看| 亚洲高清三级视频| 极品美女销魂一区二区三区免费| 国产尤物一区二区| 99久免费精品视频在线观看| 日本久久一区二区| 欧美一区二区三区免费| 国产校园另类小说区| 国产精品国产三级国产aⅴ中文| 亚洲精品少妇30p| 久久精品国产秦先生| 丁香桃色午夜亚洲一区二区三区| 色婷婷综合久色| 91精品国产手机| 国产精品成人一区二区艾草| 亚洲成人综合在线| 国产一区福利在线| 在线观看日韩高清av| 精品欧美黑人一区二区三区| 欧美国产精品一区二区三区| 亚洲国产另类av| 成人亚洲一区二区一| 不卡视频一二三| 欧美一区二区三区人| 亚洲丝袜另类动漫二区| 五月综合激情网| 成人性生交大合| 日韩一级黄色片| 欧美一二三在线| 日韩午夜三级在线| 亚洲激情欧美激情| 国产一区在线精品| 99精品一区二区三区| 69堂成人精品免费视频| 中文字幕一区二区日韩精品绯色|