最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

c語言socket多線程編程限制客戶端連接數(shù)

 更新時(shí)間:2013年12月05日 10:25:48   作者:  
這篇文章主要介紹了c語言socket多線程編程,可以限制客戶端連接數(shù),大家參考使用吧

先上一些多線程需要使用的函數(shù)定義:

復(fù)制代碼 代碼如下:

DWORD WINAPI ProcessClientRequests(LPVOID lpParam)  //新線程將會(huì)執(zhí)行的函數(shù)定義
{
      return 0;
}

HANDLE handler=CreateThread(NULL, 0, ProcessClientRequests, &clientsocket, 0, NULL);   //這里比較簡單,&clientsocket是個(gè)指針,是從主線程傳入新線程的參數(shù)


WaitForMultipleObjects(MAXCLIENTS, threads, TRUE, INFINITE);  //用來阻塞主線程,直到所有創(chuàng)建的子線程都完成任務(wù)為止,才繼續(xù)執(zhí)行后面的代碼

for(int i=0;i<MAXCLIENTS; i++)
{
    CloseHandle(threads[i]);       //創(chuàng)建的每個(gè)子線程的HANDLE都會(huì)被保存在HANDLE數(shù)組中,這個(gè)函數(shù)用于關(guān)閉各個(gè)handle所對應(yīng)的線程空間
}

服務(wù)器端程序

主線程代碼如下:

復(fù)制代碼 代碼如下:

#define MAXCLIENTS 3           //宏定義,最多3個(gè)客戶端連接

int main()
{
    WSADATA wsaData;
    WSAStartup(MAKEWORD(2, 2), &wsaData);
    HANDLE threads[MAXCLIENTS];

    SOCKET s=socket(PF_INET, SOCK_STREAM, IPPROTO_TCP);

    sockaddr_in sockaddr;
    sockaddr.sin_family=PF_INET;
    sockaddr.sin_addr.S_un.S_addr=inet_addr("127.0.0.1");
    sockaddr.sin_port=htons(9000);
    bind(s, (SOCKADDR*)&sockaddr, sizeof(SOCKADDR));

    listen(s, 1);

    printf("listening on port [%d].\n", 9000);

    int existingClientCount=0;
    while(TRUE)
    {
        SOCKADDR clientAddr;
        int size=sizeof(SOCKADDR);

        SOCKET clientsocket;
        clientsocket=accept(s, &clientAddr, &size);
        printf("***SYS***    New client touched.\n");

        if(existingClientCount<MAXCLIENTS)       //判斷是否已經(jīng)超出最大連接數(shù)了
        {
            threads[existingClientCount++]=CreateThread(NULL, 0, ProcessClientRequests, &clientsocket, 0, NULL);  //啟動(dòng)新線程,并且將socket傳入
        }
        else
        {
            char* msg="Exceeded Max incoming requests, will refused this connect!\r\n";
            send(clientsocket, msg, strlen(msg)+sizeof(char), NULL);       //發(fā)送拒絕連接消息給客戶端
            printf("***SYS***    REFUSED.\n");
            closesocket(clientsocket);                                     //釋放資源
            break;
        }
    }

    printf("Maximize clients occurred for d%.\r\n", MAXCLIENTS);

    WaitForMultipleObjects(MAXCLIENTS, threads, TRUE, INFINITE);           //等待所有子線程,直到完成為止

    closesocket(s);
    for(int i=0;i<MAXCLIENTS; i++)
    {
        CloseHandle(threads[i]);                                           //清理線程資源
    }

    WSACleanup();

    printf("Cleared all.\r\n");

    getchar();

    exit(0);
}

子線程函數(shù)定義

復(fù)制代碼 代碼如下:

DWORD WINAPI ProcessClientRequests(LPVOID lpParam)
{
    SOCKET* clientsocket=(SOCKET*)lpParam;  //這里需要強(qiáng)制轉(zhuǎn)換,注意:指針類型的

    char* msg="Hello, my client.\r\n";
    send(*clientsocket, msg, strlen(msg)+sizeof(char), NULL);
    printf("***SYS***    HELLO.\n");

    while(TRUE)
    {
        char buffer[MAXBYTE]={0};
        recv(*clientsocket, buffer, MAXBYTE, NULL);
        if(strcmp(buffer, "exit")==0)
        {
            char* msg_bye="Bye.\r\n";
            send(*clientsocket, msg_bye, strlen(msg_bye)+sizeof(char), NULL);
            break;
        }
        printf("***Client***    %s\n", buffer);
    }

    closesocket(*clientsocket);

    return 0;
}



相關(guān)文章

  • C語言項(xiàng)目小學(xué)生數(shù)學(xué)考試系統(tǒng)參考

    C語言項(xiàng)目小學(xué)生數(shù)學(xué)考試系統(tǒng)參考

    今天小編就為大家分享一篇關(guān)于C語言項(xiàng)目小學(xué)生數(shù)學(xué)考試系統(tǒng)參考,小編覺得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來看看吧
    2019-02-02
  • Qt spdlog日志模塊的使用詳解

    Qt spdlog日志模塊的使用詳解

    在Qt應(yīng)用程序開發(fā)中,良好的日志系統(tǒng)至關(guān)重要,本文將介紹如何使用spdlog 1.5.0創(chuàng)建滿足以下要求的日志系統(tǒng),感興趣的朋友一起看看吧
    2025-04-04
  • opencv實(shí)現(xiàn)矩形檢測

    opencv實(shí)現(xiàn)矩形檢測

    這篇文章主要為大家詳細(xì)介紹了opencv實(shí)現(xiàn)矩形檢測,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2020-07-07
  • C語言轉(zhuǎn)義字符實(shí)例詳解

    C語言轉(zhuǎn)義字符實(shí)例詳解

    這里主要介紹了C語言的轉(zhuǎn)義字符的知識,并附有示例代碼,以便理解,希望對學(xué)習(xí) C語言的同學(xué)有所幫助
    2016-07-07
  • OpenGL通過中點(diǎn)法繪制直線和圓

    OpenGL通過中點(diǎn)法繪制直線和圓

    這篇文章主要為大家詳細(xì)介紹了OpenGL通過中點(diǎn)法繪制直線和圓,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2020-02-02
  • C++類成員函數(shù)后面加const問題

    C++類成員函數(shù)后面加const問題

    這篇文章主要介紹了C++類成員函數(shù)后面加const問題,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-11-11
  • C語言報(bào)錯(cuò):Buffer Overflow的原因和解決辦法

    C語言報(bào)錯(cuò):Buffer Overflow的原因和解決辦法

    Buffer Overflow是C語言中常見且危險(xiǎn)的內(nèi)存錯(cuò)誤之一,它通常在程序試圖向緩沖區(qū)(如數(shù)組或內(nèi)存塊)寫入超過其容量的數(shù)據(jù)時(shí)發(fā)生,本文將詳細(xì)介紹Buffer Overflow的產(chǎn)生原因,提供多種解決方案,需要的朋友可以參考下
    2024-07-07
  • C語言編程函數(shù)指針入門精講教程

    C語言編程函數(shù)指針入門精講教程

    大家在C語言的學(xué)習(xí)中一定會(huì)接觸指針這樣一個(gè)東西,而指針也是新手路上一定要消滅的boss,如果以后還要學(xué)習(xí)Java的同學(xué)更是要注重指針的學(xué)習(xí),希望能夠有所幫助
    2021-10-10
  • C語言用棧和隊(duì)列實(shí)現(xiàn)的回文檢測功能示例

    C語言用棧和隊(duì)列實(shí)現(xiàn)的回文檢測功能示例

    這篇文章主要介紹了C語言用棧和隊(duì)列實(shí)現(xiàn)的回文檢測功能,結(jié)合具體實(shí)例形式分析了C語言棧和隊(duì)列的定義及使用棧和隊(duì)列進(jìn)行回文檢測的操作技巧,需要的朋友可以參考下
    2017-06-06
  • C++利用ImGUI繪制D3D外部菜單

    C++利用ImGUI繪制D3D外部菜單

    ImGUI 它是與平臺(tái)無關(guān)的C++輕量級跨平臺(tái)圖形界面庫,沒有任何第三方依賴,可以將ImGUI的源碼直接加到項(xiàng)目中使用。本文將利用ImGUI繪制D3D外部菜單,需要的可以參考一下
    2022-09-09

最新評論

友谊县| 凤山市| 玛曲县| 平舆县| 措勤县| 郸城县| 图木舒克市| 靖边县| 当雄县| 溧水县| 东乡县| 乌鲁木齐县| 辰溪县| 五华县| 宜州市| 南部县| 彰化市| 定结县| 崇信县| 韶关市| 宜宾市| 湖州市| 砚山县| 德钦县| 蒙自县| 休宁县| 西和县| 汉川市| 丹阳市| 华蓥市| 姜堰市| 成安县| 日喀则市| 田阳县| 克山县| 彝良县| 建宁县| 平远县| 荔波县| 云南省| 和静县|