一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務器之家 - 編程語言 - C/C++ - c語言socket多線程編程限制客戶端連接數

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

2021-01-11 15:20C語言教程網 C/C++

這篇文章主要介紹了c語言socket多線程編程,可以限制客戶端連接數,大家參考使用吧

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

 

復制代碼 代碼如下:


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

 

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


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

for(int i=0;i<MAXCLIENTS; i++)
{
    CloseHandle(threads[i]);       //創建的每個子線程的HANDLE都會被保存在HANDLE數組中,這個函數用于關閉各個handle所對應的線程空間
}

 

服務器端程序

主線程代碼如下:

 

復制代碼 代碼如下:


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

 

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)       //判斷是否已經超出最大連接數了
        {
            threads[existingClientCount++]=CreateThread(NULL, 0, ProcessClientRequests, &clientsocket, 0, NULL);  //啟動新線程,并且將socket傳入
        }
        else
        {
            char* msg="Exceeded Max incoming requests, will refused this connect!\r\n";
            send(clientsocket, msg, strlen(msg)+sizeof(char), NULL);       //發送拒絕連接消息給客戶端
            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);
}

 

子線程函數定義

 

復制代碼 代碼如下:


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

 

    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;
}

 

 


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

延伸 · 閱讀

精彩推薦
  • C/C++C語言實現電腦關機程序

    C語言實現電腦關機程序

    這篇文章主要為大家詳細介紹了C語言實現電腦關機程序,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下...

    xiaocaidayong8482021-08-20
  • C/C++c++ 單線程實現同時監聽多個端口

    c++ 單線程實現同時監聽多個端口

    這篇文章主要介紹了c++ 單線程實現同時監聽多個端口的方法,幫助大家更好的理解和學習使用c++,感興趣的朋友可以了解下...

    源之緣11542021-10-27
  • C/C++學習C++編程的必備軟件

    學習C++編程的必備軟件

    本文給大家分享的是作者在學習使用C++進行編程的時候所用到的一些常用的軟件,這里推薦給大家...

    謝恩銘10102021-05-08
  • C/C++C++之重載 重定義與重寫用法詳解

    C++之重載 重定義與重寫用法詳解

    這篇文章主要介紹了C++之重載 重定義與重寫用法詳解,本篇文章通過簡要的案例,講解了該項技術的了解與使用,以下就是詳細內容,需要的朋友可以參考下...

    青山的青6062022-01-04
  • C/C++詳解c語言中的 strcpy和strncpy字符串函數使用

    詳解c語言中的 strcpy和strncpy字符串函數使用

    strcpy 和strcnpy函數是字符串復制函數。接下來通過本文給大家介紹c語言中的strcpy和strncpy字符串函數使用,感興趣的朋友跟隨小編要求看看吧...

    spring-go5642021-07-02
  • C/C++深入理解goto語句的替代實現方式分析

    深入理解goto語句的替代實現方式分析

    本篇文章是對goto語句的替代實現方式進行了詳細的分析介紹,需要的朋友參考下...

    C語言教程網7342020-12-03
  • C/C++C/C++經典實例之模擬計算器示例代碼

    C/C++經典實例之模擬計算器示例代碼

    最近在看到的一個需求,本以為比較簡單,但花了不少時間,所以下面這篇文章主要給大家介紹了關于C/C++經典實例之模擬計算器的相關資料,文中通過示...

    jia150610152021-06-07
  • C/C++C語言中炫酷的文件操作實例詳解

    C語言中炫酷的文件操作實例詳解

    內存中的數據都是暫時的,當程序結束時,它們都將丟失,為了永久性的保存大量的數據,C語言提供了對文件的操作,這篇文章主要給大家介紹了關于C語言中文件...

    針眼_6702022-01-24
主站蜘蛛池模板: 日本网络视频www色高清免费 | 亚洲日本aⅴ片在线观看香蕉 | 男人的j伸到女人的屁股眼 男人吃奶动态图 | 44444色视频在线观看 | 日日操综合 | 妹妹你插的我好爽 | 色综合伊人色综合网亚洲欧洲 | 色综合网天天综合色中文男男 | 国产码一区二区三区 | 国产v日韩v欧美v精品专区 | 亚洲第一天堂无码专区 | 女bbbbxxxx视频 | 国产精品男人的天堂 | 欧美骚熟 | 成人伊在线影院 | 日本中文字幕在线视频 | 欧美色综合高清免费 | 国产成人亚洲综合91精品555 | 摸咪网在线影院在线观看 | 国产人成激情视频在线观看 | 91在线老师啪国自产 | 好大好硬好深好爽想要之黄蓉 | 精品久久久久久久久免费影院 | 欧美日韩国产一区二区三区不卡 | 免费特黄一级欧美大片在线看 | 操比网| 亚洲国产在线午夜视频无 | 6080欧美一区二区三区四区 | 免费一看一级毛片人 | 糖心在线观看网 | 午夜精品网站 | 99视频精品免费99在线 | 男人的天堂在线观看视频不卡 | 天天综合网天天做天天受 | 亚飞与亚基国语1080p在线观看 | 青青青国产精品国产精品美女 | 男人天堂网av | 12345国产精品高清在线 | 性欧洲女人18 | 婷婷综合久久中文字幕 | 小小水蜜桃免费影院 |