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

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? echosrv.c

?? 利用完成端口(IOCP)實現的網絡在線考試系統的服務器程序。
?? C
?? 第 1 頁 / 共 3 頁
字號:
/*
 * 服務器程序只能運行在 Windows NT,
 * version 3.51 或更高的版本上.  
 * 不能運行在 Windows 95 上.
 */

#define WIN32_LEAN_AND_MEAN
#include <stdio.h>
#include <stdlib.h>
#include <windows.h>
#include <tchar.h>
#include <string.h>
#include <winsock.h>
#include <io.h>
#include <ODBCINST.H>
#include <SQLEXT.H>
#include <time.h>
#include <winbase.h>
#include "MtVerify.h"
#pragma comment (lib,"WS2_32.lib")
#pragma comment (lib,"ODBC32.lib")

#define SERV_TCP_PORT 5554
#define MAXLINE 1024

// 用 key 追蹤 每一個單獨的文件句柄
// 的I/O 端口的狀態.
struct ContextKey
{
    SOCKET  sock;                    
    char        InBuffer[4];         // 輸入
    OVERLAPPED  ovIn;         
    int         nOutBufIndex;       
    char        OutBuffer[MAXLINE];  // 輸出
    OVERLAPPED  ovOut;
    DWORD       dwWritten;
};

struct User
{
	char Subject[50];
    char Name[50];
	char PassWord[50];
};

/*結構體定義*/
//試卷每道題的結構
struct TestRubric{
	char Questions[512];
	char SelectObject[4][256];
};

//時間結構

//生成的試卷
//
// 全局變量
//

HANDLE ghCompletionPort;

//數據庫全局變量
SQLHANDLE hEnv;                   //ODBC環境句柄
SQLHANDLE hConn;                  //ODBC連接句柄
SCHAR * strConnect ="DRIVER={Microsoft Access Driver (*.mdb)};DBQ=";   
SCHAR * DBName="exam.mdb";
SCHAR ProgPath[256];
char Conn[256];                   //ODBC驅動連接返完整字符返回緩沖區
SCHAR ConnectString[1024];
char   UserAttrib[50];

//
// 函數申明
//

void CreateWorkerThreads();
DWORD WINAPI ThreadFunc(LPVOID pvoid);
void IssueRead(struct ContextKey *pCntx);
void CheckOsVersion();
void FatalError(char *s);
void SendString(char *p,struct ContextKey *pCntx);

//數據庫操作函數
void ODBCConnect(SCHAR *strConnect,SCHAR *ProgPath,SCHAR *DBName);      //ODBC數據連接子程序
BOOL LoginSever(char * LpText,struct User *login,char *p);              //登陸操作函數
BOOL GetState(struct User US,char *p);                                  //獲取試卷狀態子函數
int GetNumbers(struct User US,char *P);                                  //獲取試卷狀態子函數
BOOL initTestPapers(struct User US,int Num,struct TestRubric * TestPapers); //初始化試卷
void GetQuestions(struct TestRubric * TestPapers,char * buffers);       //發送緩沖區格式化試題子函數;
BOOL ScanTime(struct User US,char * P,struct ContextKey *pCntx);         //設置試卷狀態子函數
void ChangeState(struct User US,char State[5]);                          
void SaveResult(struct User US,char Result[1024]);
BOOL GetResult(struct User US,char *p);                                   //獲得試卷做答子函數
void ChangeState2(struct User US,char State[5],char Result[1024]);
///////////////////////////////////////////////////////

int main(int argc, char *argv[])
{
    SOCKET  listener;
    SOCKET  newsocket;
    WSADATA WsaData;
    struct sockaddr_in serverAddress;
    struct sockaddr_in clientAddress;
    int     clientAddressLength;
    int     err;

	printf("-----------------------------------------------------------------------\n");
    printf("*                    考試系統服務端程序                               *\n");
	printf("* 服務器程序只能運行在 Windows NT,version 3.51 或更高的版本上.        *\n");
	printf("*                                                -------- 2003.12.25  *\n");
	printf("*                                                yaomingmail@sina.com *\n");
	printf("-----------------------------------------------------------------------\n");
	GetCurrentDirectory(256,ProgPath);                           //獲得程序路徑
	ProgPath[strlen(ProgPath)]='\\';
	ODBCConnect(strConnect,ProgPath,DBName);                     //建立數據庫聯接

    CheckOsVersion();

    err = WSAStartup (0x0101, &WsaData);
    if (err == SOCKET_ERROR)
    {
        FatalError("網絡初始化失敗.");
        return EXIT_FAILURE;
    }

    listener = socket(AF_INET, SOCK_STREAM, 0);      //開啟一個socket 套節字
    if (listener < 0)
    {
        FatalError("socket() 錯誤-請檢查 TCP/IP 是否正確安裝?");
        return EXIT_FAILURE;
    }

    memset(&serverAddress, 0, sizeof(serverAddress));     
    serverAddress.sin_family      = AF_INET;
    serverAddress.sin_addr.s_addr = htonl(INADDR_ANY);   
    serverAddress.sin_port        = htons(SERV_TCP_PORT);  

    err = bind(listener,                                   // 綁定我們的局域地址
            (struct sockaddr *)&serverAddress,
            sizeof(serverAddress));
    if (err < 0)
        FatalError("bind() 錯誤-請檢查 TCP/IP 是否正確安裝?");

    ghCompletionPort = CreateIoCompletionPort(
            INVALID_HANDLE_VALUE,
            NULL,0,0);
    if (ghCompletionPort == NULL)
        FatalError("CreateIoCompletionPort() 錯誤-請檢查系統是否是Windows NT version 3.51 或更高版本.");

    CreateWorkerThreads(ghCompletionPort);

    listen(listener, 5);

    fprintf(stderr, "服務器啟用 I/O Completion Ports 模式:端口 %d\n", SERV_TCP_PORT);
    fprintf(stderr, "\nCtrl+C 停止服務器程序\n");
	printf("\n-----------------------------------------------------------------------\n");
	fprintf(stderr, "開始監聽客戶端:\n");

    //
    // 無限循環,接受并處理新的連接
    //
    for (;;)
    {
        struct ContextKey *pKey;

        clientAddressLength = sizeof(clientAddress);
        newsocket = accept(listener,
                            (struct sockaddr *)&clientAddress,
                            &clientAddressLength);
        if (newsocket < 0)
        {
            FatalError("accept() 錯誤.");
            return EXIT_FAILURE;
        }
        /* 
		*建立一個 key 并初始化它.
		*/
        pKey = calloc(1, sizeof(struct ContextKey));              // calloc 將使 buffer 區域清零.
        pKey->sock = newsocket;
        pKey->ovOut.hEvent = CreateEvent(NULL, TRUE, FALSE, NULL);//為寫信息包過程設置(事件對象) event .
        pKey->ovOut.hEvent = (HANDLE)((DWORD)pKey->ovOut.hEvent | 0x1); 
    
        CreateIoCompletionPort(                                   //為請求綁定端口
                (HANDLE)newsocket,
                ghCompletionPort,
                (DWORD)pKey,   
                0             
            );
        IssueRead(pKey);                                          // 完成第一次讀操作
    }
	SQLDisconnect(hConn);
	SQLFreeHandle(SQL_HANDLE_DBC,hConn);
    SQLFreeHandle(SQL_HANDLE_ENV, hEnv);
    return 0;
}

void CreateWorkerThreads()
{
    SYSTEM_INFO  sysinfo;
    DWORD        dwThreadId;
    DWORD        dwThreads;
    DWORD        i;

    GetSystemInfo(&sysinfo);
    dwThreads = sysinfo.dwNumberOfProcessors * 2 + 2;
    for (i=0; i<dwThreads; i++)
    {
        HANDLE hThread;
        hThread = CreateThread(
            NULL, 0, ThreadFunc, NULL, 0, &dwThreadId
            );
        CloseHandle(hThread);
    }
}

//
// 每一個工作線程從這里開始.
//
DWORD WINAPI ThreadFunc(LPVOID pVoid)
{
	struct User users;
    struct TestRubric * TestPapers;
    BOOL    bResult;
    DWORD   dwNumRead;
    struct ContextKey *pCntx;
    LPOVERLAPPED lpOverlapped;
	char Temp[50];
	int i,QueNums;
	char buffers[1024];

    UNREFERENCED_PARAMETER(pVoid);

    // 無限循環從 I/O completion port 獲取信息.
    for (;;)
    {
        bResult = GetQueuedCompletionStatus(
               ghCompletionPort,
               &dwNumRead,
               &(DWORD)pCntx,
               &lpOverlapped,
               INFINITE
            );

        if (bResult == FALSE
            && lpOverlapped == NULL)
        {
            FatalError(
                "ThreadFunc - GetQueuedCompletionStatus()錯誤.\n");
        }

        else if (bResult == FALSE
            && lpOverlapped != NULL)
        {
            // This happens occasionally instead of
            // end-of-file. Not sure why.
            closesocket(pCntx->sock);
            free(pCntx);
            fprintf(stderr,"用戶非正常退出.\n");
        }

        else if (dwNumRead == 0)
        {
            closesocket(pCntx->sock);
            free(pCntx);
            fprintf(stderr, "用戶已經關閉端口.\n");
            fprintf(stderr, "------------------.\n");
        }

        else
        {
            char *pch = &pCntx->OutBuffer[pCntx->nOutBufIndex++];
            *pch++ = pCntx->InBuffer[0];
            *pch = '\0';  
            if (pCntx->InBuffer[0] == '\n')
			{
				for(i=0;i<6;i++)
				Temp[i]=pCntx->OutBuffer[i];
				Temp[i]='\0';
				if(!strcmp(Temp,"login:"))
				{
                if(LoginSever(pCntx->OutBuffer,&users,Temp))
				SendString(Temp,pCntx);
                else
				SendString("無法識別的用戶.",pCntx);
				}
			    else if(!strcmp(Temp,"Srecv:"))
				{
				for(i=0;i<7;i++)
				Temp[i]=pCntx->OutBuffer[i+6];
				Temp[i]='\0';
				if (!strcmp(Temp,"ScanTm:"))
                    if(ScanTime(users,buffers,pCntx))
					    fprintf(stderr,"%s  %s試卷狀態設置成功.\n",users.Name,users.Subject);
					else
					{
                        fprintf(stderr,"設置 %s 的 %s 試卷狀態失敗.\n",users.Name,users.Subject);
						SendString("服務器設置試卷狀態失敗.",pCntx);
					}
				else if(!strcmp(Temp,"GetSta:"))
				{
					if(GetState(users,Temp))
                     SendString(Temp,pCntx);
				}
				else if(!strcmp(Temp,"GetRlt:"))
				{
                 if (GetResult(users,buffers))
					 SendString(buffers,pCntx);
				 else SendString("Erro",pCntx);
				}
				else if(!strcmp(Temp,"GetNum:"))
				{
					if(QueNums=GetNumbers(users,buffers))
					{
                    SendString(buffers,pCntx);
					fprintf(stderr,"用戶獲取 %s 試卷總題數 %d 成功.\n",users.Subject,QueNums);
					TestPapers=(struct TestRubric *)malloc(sizeof(struct TestRubric)*QueNums);
					if(TestPapers==NULL)
						fprintf(stderr,"申請動態內存失敗.");
					 else if(!initTestPapers(users,QueNums,TestPapers))
					   {
						   fprintf(stderr,"初始化試卷失敗.\n");
						   free(TestPapers);
						}
						else fprintf(stderr,"初始化試卷成功.\n");
					}
					else fprintf(stderr,"用戶獲取 %s 試卷總題數失敗.\n",users.Subject);
				}
				else if(!strcmp(Temp,"GetQue:"))
				{
                    for(i=0;pCntx->OutBuffer[i]!='\n';i++);
                    pCntx->OutBuffer[i]='\0';
					i=0;
                    i=atoi(&pCntx->OutBuffer[13]);
                    GetQuestions(TestPapers+i,buffers);
					SendString(buffers,pCntx);
					fprintf(stderr,"成功發送 %s : %s 試卷的第 %d 題.\n",users.Name,users.Subject,i+1);
				}
				else if(!strcmp(Temp,"SaveDt:"))
				{
					SaveResult(users,&(pCntx->OutBuffer[13]));
				}
				else if(!strcmp(Temp,"ChanST:"))
                    ChangeState2(users,"3",&(pCntx->OutBuffer[13]));
				}
			    else if(!strcmp(Temp,"trecv:")){}
			    else if(!strcmp(Temp,"arecv:")){}
			    else if(!strcmp(Temp,"ssave:")){}
			    else if(!strcmp(Temp,"tsave:")){}
			    else if(!strcmp(Temp,"asave:")){}

                pCntx->nOutBufIndex = 0;
                fprintf(stderr, " Echo on socket %x.\n", pCntx->sock);

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
国产精品久久久久久福利一牛影视| 91尤物视频在线观看| 欧洲一区二区三区在线| 国产日韩综合av| 国产精品原创巨作av| 欧美日韩精品是欧美日韩精品| 亚洲一区二区三区不卡国产欧美 | 亚洲精品一区二区三区四区高清| 欧美一级欧美三级| 91精品黄色片免费大全| 国产精品天干天干在观线| 国产精品资源网| 国产欧美一区在线| 成人精品鲁一区一区二区| 欧美国产欧美综合| 97久久精品人人做人人爽50路| 国产精品久久夜| 色综合天天综合网国产成人综合天 | 欧洲精品视频在线观看| 亚洲激情男女视频| 欧美在线免费观看亚洲| 首页国产欧美久久| 精品国产成人在线影院| 成人美女视频在线观看18| 国产精品另类一区| 一本色道久久综合亚洲aⅴ蜜桃| 一区二区在线免费| 91蝌蚪porny九色| 视频一区中文字幕国产| 精品国产91亚洲一区二区三区婷婷| 蜜桃免费网站一区二区三区| 欧美二区三区的天堂| 久久精品久久99精品久久| 国产性天天综合网| 色老头久久综合| 蜜臀av一级做a爰片久久| 精品对白一区国产伦| 成人app在线| 亚洲国产精品久久久久婷婷884| 欧美一卡2卡3卡4卡| 国产成人免费网站| 夜夜亚洲天天久久| 欧美电影免费观看高清完整版| 丰满岳乱妇一区二区三区| 亚洲精品日韩专区silk| 日韩一区二区三区视频| 成人动漫一区二区在线| 日韩精品福利网| 日韩理论片网站| 欧美一级理论性理论a| 91热门视频在线观看| 久久精品国产秦先生| 最新中文字幕一区二区三区| 欧美日韩aaaaaa| 国产精品亚洲一区二区三区妖精| 国产精品国产三级国产专播品爱网| 欧美日韩另类一区| 成人福利视频在线看| 免费看欧美美女黄的网站| 国产精品美女视频| 欧美一区二区三区公司| 一本色道亚洲精品aⅴ| 国产精品亚洲一区二区三区在线 | 久久婷婷综合激情| 一本大道久久a久久综合婷婷| 美腿丝袜在线亚洲一区 | 国产色综合久久| 7777精品伊人久久久大香线蕉 | 亚洲高清在线精品| 亚洲欧洲99久久| 精品国产3级a| 4438x成人网最大色成网站| 97久久精品人人做人人爽| 麻豆久久久久久久| 亚洲精品成人精品456| 国产女人水真多18毛片18精品视频| 欧美日韩黄视频| 色婷婷综合久久久久中文| 国产酒店精品激情| 麻豆freexxxx性91精品| 亚洲成人av一区| 一区二区成人在线视频| 亚洲欧美乱综合| 中文字幕av一区二区三区| 精品美女在线播放| 日韩免费观看高清完整版| 一本色道久久综合精品竹菊| 岛国一区二区三区| 国产一区二区久久| 久久成人久久爱| 免费在线视频一区| 日韩国产欧美一区二区三区| 精品国产制服丝袜高跟| 欧美日韩久久久一区| 99精品欧美一区二区三区小说| 久草这里只有精品视频| 午夜私人影院久久久久| 国产精品热久久久久夜色精品三区 | 精品国产乱码久久久久久免费 | 日韩1区2区3区| 亚洲成a人v欧美综合天堂| 亚洲国产精品久久一线不卡| 亚洲综合av网| 天天亚洲美女在线视频| 午夜国产精品影院在线观看| 亚洲午夜精品久久久久久久久| 一区二区视频在线| 亚洲bdsm女犯bdsm网站| 亚洲.国产.中文慕字在线| 午夜日韩在线电影| 久久精品国产久精国产| 国产美女精品人人做人人爽| 国产美女主播视频一区| 波多野结衣视频一区| 91麻豆精品在线观看| 欧美日韩国产成人在线免费| 7777精品伊人久久久大香线蕉最新版| 欧美一区二区三区免费观看视频| 欧美成人高清电影在线| 国产欧美日韩精品在线| 亚洲同性gay激情无套| 视频精品一区二区| 国产一本一道久久香蕉| 91社区在线播放| 51精品秘密在线观看| 欧美r级在线观看| 中文字幕乱码久久午夜不卡| 亚洲精品videosex极品| 日本欧美肥老太交大片| 国产伦精品一区二区三区在线观看| av在线不卡网| 欧美视频在线一区二区三区 | 亚洲第一会所有码转帖| 狠狠色2019综合网| 94色蜜桃网一区二区三区| 欧美一区二区三区视频免费| 久久精品欧美日韩| 一区二区三区四区亚洲| 美女一区二区久久| 99国产精品久| 欧美成人性福生活免费看| 国产精品久久久久婷婷二区次| 亚洲福利视频三区| 国产一区二区三区免费观看| 色94色欧美sute亚洲线路二| 精品久久久久久久久久久久包黑料| 中文字幕在线视频一区| 五月激情综合色| 日本色综合中文字幕| 成人一级黄色片| 欧美亚洲丝袜传媒另类| 国产欧美日韩综合精品一区二区| 亚洲专区一二三| 成人小视频免费在线观看| 欧美日韩成人在线一区| 亚洲欧洲色图综合| 另类小说色综合网站| 国产精品私房写真福利视频| 日韩国产欧美在线播放| 一本色道久久综合亚洲aⅴ蜜桃| 精品成人一区二区三区| 亚洲综合色噜噜狠狠| 日本v片在线高清不卡在线观看| 丁香天五香天堂综合| 91精品国产欧美一区二区18| 亚洲欧美国产高清| 丁香婷婷深情五月亚洲| 精品国产免费久久| 日产国产欧美视频一区精品| 欧美视频在线一区二区三区| 亚洲欧美区自拍先锋| 成人福利视频网站| 欧美激情综合在线| 国产乱码精品一区二区三区五月婷| 69堂精品视频| 7777精品久久久大香线蕉| 久久夜色精品一区| 国产久卡久卡久卡久卡视频精品| 精品99999| 成人免费福利片| 亚洲人精品一区| 91视视频在线直接观看在线看网页在线看| 国产精品久久久久精k8| 色欧美片视频在线观看在线视频| 亚洲精品欧美激情| 欧美久久一区二区| 久久成人18免费观看| 国产精品水嫩水嫩| 色综合久久66| 午夜激情一区二区| wwwwxxxxx欧美| 99久久99久久精品免费观看 | 51精品久久久久久久蜜臀| 精品一二三四区| 国产精品久久久久影院亚瑟 | 亚洲成av人综合在线观看| 日韩视频国产视频| 国产成人一级电影| 亚洲图片欧美色图| 亚洲精品在线观看网站|