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

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

?? echosrv.c

?? 《Win32多線程程序設計》配套代碼.集成了一般簡單的線程設計及優化的原理。
?? C
字號:
/*
 * EchoSrv.c
 *
 * Sample code for Multithreading Applications in Win32
 * This is from Chapter 6, Listing 6-4
 *
 * Demonstrates how to use I/O completion ports
 * with TCP on the Internet.  This sample
 * server can only be run on Windows NT,
 * version 3.51 or later.  The client (EchoCli)
 * can be run on 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 "MtVerify.h"

// Pick a port number that seems to be away from all others
#define SERV_TCP_PORT 5554
#define MAXLINE 512

//
// Structure definition
//

// The context key keeps track of how the I/O
// is progressing for each individual file handle.
struct ContextKey
{
    SOCKET  sock;
    // Input
    char        InBuffer[4];
    OVERLAPPED  ovIn;
    // Output
    int         nOutBufIndex;
    char        OutBuffer[MAXLINE];
    OVERLAPPED  ovOut;
    DWORD       dwWritten;
};

//
// Global variables
//

HANDLE ghCompletionPort;

//
// Function prototypes
//

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

///////////////////////////////////////////////////////

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

    CheckOsVersion();

    err = WSAStartup (0x0101, &WsaData);
    if (err == SOCKET_ERROR)
    {
        FatalError("WSAStartup Failed");
        return EXIT_FAILURE;
    }

    /*
     * Open a TCP socket connection to the server
     * By default, a socket is always opened
     * for overlapped I/O.  Do NOT attach this
     * socket (listener) to the I/O completion
     * port!
     */
    listener = socket(AF_INET, SOCK_STREAM, 0);
    if (listener < 0)
    {
        FatalError("socket() failed");
        return EXIT_FAILURE;
    }

    /*
     * Bind our local address
     */
    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() failed");

    ghCompletionPort = CreateIoCompletionPort(
            INVALID_HANDLE_VALUE,
            NULL,   // No prior port
            0,      // No key
            0       // Use default  # of threads
            );
    if (ghCompletionPort == NULL)
        FatalError("CreateIoCompletionPort() failed");

    CreateWorkerThreads(ghCompletionPort);

    listen(listener, 5);

    fprintf(stderr, "Echo Server with I/O Completion Ports\n");
    fprintf(stderr, "Running on TCP port %d\n", SERV_TCP_PORT);
    fprintf(stderr, "\nPress Ctrl+C to stop the server\n");

    //
    // Loop forever accepting requests new connections
    // and starting reading from them.
    //
    for (;;)
    {
        struct ContextKey *pKey;

        clientAddressLength = sizeof(clientAddress);
        newsocket = accept(listener,
                            (struct sockaddr *)&clientAddress,
                            &clientAddressLength);
        if (newsocket < 0)
        {
            FatalError("accept() Failed");
            return EXIT_FAILURE;
        }

        // Create a context key and initialize it.
        // calloc will zero the buffer
        pKey = calloc(1, sizeof(struct ContextKey));
        pKey->sock = newsocket;
        pKey->ovOut.hEvent = CreateEvent(NULL, TRUE, FALSE, NULL);
        // Set the event for writing so that packets
        // will not be sent to the completion port when
        // a write finishes.
        pKey->ovOut.hEvent = (HANDLE)((DWORD)pKey->ovOut.hEvent | 0x1);

        // Associate the socket with the completion port
        CreateIoCompletionPort(
                (HANDLE)newsocket,
                ghCompletionPort,
                (DWORD)pKey,   // No key
                0              // Use default # of threads
            );

        // Kick off the first read
        IssueRead(pKey);
    }
    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);
    }
}

//
// Each worker thread starts here.
DWORD WINAPI ThreadFunc(LPVOID pVoid)
{
    BOOL    bResult;
    DWORD   dwNumRead;
    struct ContextKey *pCntx;
    LPOVERLAPPED lpOverlapped;

    UNREFERENCED_PARAMETER(pVoid);

    // Loop forever on getting packets from
    // the I/O completion port.
    for (;;)
    {
        bResult = GetQueuedCompletionStatus(
               ghCompletionPort,
               &dwNumRead,
               &(DWORD)pCntx,
               &lpOverlapped,
               INFINITE
            );

        if (bResult == FALSE
            && lpOverlapped == NULL)
        {
            FatalError(
                "ThreadFunc - Illegal call to GetQueuedCompletionStatus");
        }

        else if (bResult == FALSE
            && lpOverlapped != NULL)
        {
            // This happens occasionally instead of
            // end-of-file. Not sure why.
            closesocket(pCntx->sock);
            free(pCntx);
            fprintf(stderr,
                "ThreadFunc - I/O operation failed\n");
        }

        else if (dwNumRead == 0)
        {
            closesocket(pCntx->sock);
            free(pCntx);
            fprintf(stderr, "ThreadFunc - End of file.\n");
        }

        // Got a valid data block!
        // Save the data to our buffer and write it
        // all back out (echo it) if we have see a \n
        else
        {
            // Figure out where in the buffer to save the character
            char *pch = &pCntx->OutBuffer[pCntx->nOutBufIndex++];
            *pch++ = pCntx->InBuffer[0];
            *pch = '\0';    // For debugging, WriteFile doesn't care
            if (pCntx->InBuffer[0] == '\n')
            {
                WriteFile(
                        (HANDLE)(pCntx->sock),
                        pCntx->OutBuffer,
                        pCntx->nOutBufIndex,
                        &pCntx->dwWritten,
                        &pCntx->ovOut
                    );
                pCntx->nOutBufIndex = 0;
                fprintf(stderr, "Echo on socket %x.\n", pCntx->sock);
            }

            // Start a new read
            IssueRead(pCntx);
        }
    }

    return 0;
}


/*
 * Call ReadFile to start an overlapped request
 * on a socket.  Make sure we handle errors
 * that are recoverable.
 */
void IssueRead(struct ContextKey *pCntx)
{
    int     i = 0;
    BOOL    bResult;
    int     err;
    int     numRead;

    while (++i)
    {
        // Request a single character
        bResult = ReadFile(
                    (HANDLE)pCntx->sock,
                    pCntx->InBuffer,
                    1,
                    &numRead,
                    &pCntx->ovIn
                );

        // It succeeded immediately, but do not process it
        // here, wait for the completion packet.
        if (bResult)
            return;

        err = GetLastError();

        // This is what we want to happen, it's not an error
        if (err == ERROR_IO_PENDING)
            return;

        // Handle recoverable error
        if ( err == ERROR_INVALID_USER_BUFFER ||
             err == ERROR_NOT_ENOUGH_QUOTA ||
             err == ERROR_NOT_ENOUGH_MEMORY )
        {
            if (i == 5) // I just picked a number
            {
                Sleep(50);  // Wait around and try later
                continue;
            }

            FatalError("IssueRead - System ran out of non-paged space");
        }

        break;
    }

    fprintf(stderr, "IssueRead - ReadFile failed.\n");
}

//
// Make sure we are running under the right versions
// of Windows NT (3.51, 4.0, or later)
//
void CheckOsVersion()
{
    OSVERSIONINFO   ver;
    BOOL            bResult;

    ver.dwOSVersionInfoSize = sizeof(OSVERSIONINFO);

    bResult = GetVersionEx((LPOSVERSIONINFO) &ver);

    if ( (!bResult) ||
         (ver.dwPlatformId != VER_PLATFORM_WIN32_NT) )
    {
        FatalError("ECHOSRV requires Windows NT 3.51 or later.");
    }

}

//
// Error handler
//
void FatalError(char *s)
{
    fprintf(stdout, "%s\n", s);
    exit(EXIT_FAILURE);
}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
8x8x8国产精品| 国产欧美一区二区在线| 日韩一级欧美一级| 专区另类欧美日韩| 精品在线观看免费| 欧美性受xxxx黑人xyx性爽| 久久午夜羞羞影院免费观看| 一区二区高清在线| 国产成人午夜片在线观看高清观看| 欧美综合视频在线观看| 国产精品久久久久久久久快鸭 | 久久er精品视频| 在线免费观看视频一区| 国产精品久久毛片av大全日韩| 视频精品一区二区| 欧美在线视频日韩| 亚洲免费毛片网站| 99精品久久99久久久久| 国产欧美精品日韩区二区麻豆天美| 亚洲国产日韩一级| 91福利在线观看| 中文字幕一区二区视频| 国产盗摄一区二区| 国产欧美日韩精品一区| 国产一区二区精品久久91| 日韩免费高清av| 日韩国产成人精品| 91麻豆精品国产自产在线| 午夜av一区二区三区| 欧美日韩亚洲综合在线 欧美亚洲特黄一级 | 国产精品无圣光一区二区| 久久成人av少妇免费| 日韩免费观看2025年上映的电影| 日本欧美加勒比视频| 4438x成人网最大色成网站| 亚洲大片一区二区三区| 精品视频免费看| 日韩在线观看一区二区| 538prom精品视频线放| 日本女人一区二区三区| 欧美高清性hdvideosex| 青青青爽久久午夜综合久久午夜| 日韩一二三区视频| 国产麻豆精品一区二区| 欧美激情一区二区三区蜜桃视频| 国产成人精品亚洲日本在线桃色 | 99视频在线精品| 亚洲欧美日韩小说| 欧美色图第一页| 裸体健美xxxx欧美裸体表演| 日韩免费在线观看| 国产精品自产自拍| 亚洲色图在线播放| 欧美日韩精品欧美日韩精品一综合| 午夜精品123| 精品处破学生在线二十三| 国产成人av一区二区三区在线 | 欧美亚洲国产一区二区三区| 午夜精品久久久久久久蜜桃app| 欧美另类高清zo欧美| 久久99久久99| 中文字幕五月欧美| 精品视频全国免费看| 国产精品一二三四| 亚洲黄一区二区三区| 日韩欧美中文字幕制服| 99久久er热在这里只有精品15| 亚洲午夜三级在线| 久久精品免视看| 欧美性大战久久| 久久se这里有精品| 亚洲最快最全在线视频| 久久综合中文字幕| 欧美性视频一区二区三区| 久久福利视频一区二区| 一区二区三区高清在线| 久久综合成人精品亚洲另类欧美 | 韩国欧美国产一区| 亚洲激情在线激情| 精品日本一线二线三线不卡| 91日韩精品一区| 精品一区二区三区免费视频| 一级女性全黄久久生活片免费| 精品国产一区二区亚洲人成毛片| 色婷婷综合久久久久中文| 极品美女销魂一区二区三区 | 久久成人麻豆午夜电影| 亚洲成人手机在线| 中文字幕一区二区在线观看| 精品成人在线观看| 欧美年轻男男videosbes| 99久久er热在这里只有精品66| 韩国v欧美v日本v亚洲v| 婷婷久久综合九色国产成人| 亚洲三级电影网站| 久久精品一区四区| 精品99一区二区| 欧美一级片免费看| 欧美电影在哪看比较好| 欧美午夜寂寞影院| 日本精品一区二区三区高清 | 欧美电影在哪看比较好| 欧美影院午夜播放| 色综合欧美在线| 成人av集中营| 成人av免费在线播放| 成人毛片视频在线观看| 国产mv日韩mv欧美| 国产成人日日夜夜| 福利一区在线观看| 国产精品亚洲第一| 国产成人精品亚洲日本在线桃色 | 亚洲欧洲日韩一区二区三区| 精品99一区二区三区| 26uuu亚洲| 国产日韩欧美亚洲| 国产精品午夜免费| 中文字幕人成不卡一区| 最新高清无码专区| 一区二区三区在线免费观看 | 国产一区二区不卡老阿姨| 狠狠色丁香婷婷综合久久片| 久久99国内精品| 丰满白嫩尤物一区二区| 99久久国产综合精品麻豆| 91蜜桃免费观看视频| 欧美羞羞免费网站| 欧美一区二区三区四区久久| 精品欧美一区二区三区精品久久 | eeuss影院一区二区三区 | 亚洲手机成人高清视频| 亚洲男人都懂的| 午夜精品久久久久久久99樱桃| 亚洲一区二区影院| 热久久国产精品| 国产成人精品免费视频网站| 91影院在线观看| 欧美日韩成人一区| 久久久夜色精品亚洲| 亚洲精品国产高清久久伦理二区| 亚洲国产乱码最新视频| 日本三级韩国三级欧美三级| 国产精品一二一区| 99r国产精品| 欧美一级日韩免费不卡| 中文字幕在线观看不卡视频| 香蕉成人伊视频在线观看| 国产一区二区三区久久久| 一本一道波多野结衣一区二区| 欧美精品免费视频| 欧美激情一区二区在线| 亚洲国产精品天堂| 国产高清亚洲一区| 欧美精品一级二级三级| 欧美激情一区二区三区在线| 偷窥国产亚洲免费视频| 不卡av电影在线播放| 日韩欧美综合一区| 亚洲制服欧美中文字幕中文字幕| 狠狠色丁香婷婷综合久久片| 欧美中文字幕一区二区三区 | 久久久高清一区二区三区| 亚洲女人小视频在线观看| 极品少妇一区二区三区精品视频| 在线观看国产精品网站| 久久女同互慰一区二区三区| 亚洲成人三级小说| 91麻豆免费观看| 国产色爱av资源综合区| 奇米四色…亚洲| 欧美视频在线播放| 国产精品久久久久9999吃药| 久久99最新地址| 欧美丰满少妇xxxbbb| 夜夜爽夜夜爽精品视频| 9色porny自拍视频一区二区| 精品国精品国产尤物美女| 日韩精品色哟哟| 欧美三级视频在线观看| 国产精品久久毛片a| 国产一区二区三区日韩| 欧美成va人片在线观看| 日韩精品一二三区| 欧美日本免费一区二区三区| 136国产福利精品导航| 风间由美一区二区av101| 26uuuu精品一区二区| 久久国产精品免费| 欧美一级日韩一级| 久久精品国产第一区二区三区| 欧美电影在哪看比较好| 五月综合激情日本mⅴ| 欧美三级欧美一级| 一级精品视频在线观看宜春院 | 国产精品天天摸av网| 国产精品亚洲第一区在线暖暖韩国 | 日韩欧美国产一二三区| 亚洲永久免费视频| 色狠狠综合天天综合综合| 国产精品无圣光一区二区|