c語言socket多線程編程限制用戶端串連數

來源:互聯網
上載者:User

      這篇文章主要介紹了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!rn";            send(clientsocket, msg, strlen(msg)+sizeof(char), NULL);       //發送拒絕串連訊息給用戶端            printf("***SYS***    REFUSED.n");            closesocket(clientsocket);                                     //釋放資源            break;        }    }     printf("Maximize clients occurred for d%.rn", MAXCLIENTS);     WaitForMultipleObjects(MAXCLIENTS, threads, TRUE, INFINITE);           //等待所有子線程,直到完成為止     closesocket(s);    for(int i=0;i<MAXCLIENTS; i++)    {        CloseHandle(threads[i]);                                           //清理線程資源    }     WSACleanup();     printf("Cleared all.rn");     getchar();     exit(0);}   子線程函數定義  代碼如下:DWORD WINAPI ProcessClientRequests(LPVOID lpParam){    SOCKET* clientsocket=(SOCKET*)lpParam;  //這裡需要強制轉換,注意:指標類型的     char* msg="Hello, my client.rn";    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.rn";            send(*clientsocket, msg_bye, strlen(msg_bye)+sizeof(char), NULL);            break;        }        printf("***Client***    %sn", buffer);    }     closesocket(*clientsocket);     return 0;}  
相關文章

Beyond APAC's No.1 Cloud

19.6% IaaS Market Share in Asia Pacific - Gartner IT Service report, 2018

Learn more >

Apsara Conference 2019

The Rise of Data Intelligence, September 25th - 27th, Hangzhou, China

Learn more >

Alibaba Cloud Free Trial

Learn and experience the power of Alibaba Cloud with a free trial worth $300-1200 USD

Learn more >

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。