• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            隨筆 - 47, 文章 - 10, 評論 - 8, 引用 - 0
            數據加載中……

            學習Linux上C編程練習

            程序沒什么東西,比較簡單,就是想把看的一些東西都用上。客戶端程序還要修改,連接超時沒設置。

            服務器:
            ??1/**
            ??2*?sock編程測試,多線程,server端
            ??3**/

            ??4#include?<stdio.h>
            ??5#include?<stdlib.h>
            ??6#include?<unistd.h>
            ??7#include?<string.h>
            ??8#include?<sys/socket.h>
            ??9#include?<arpa/inet.h>
            ?10#include?<netinet/in.h>
            ?11#include?<pthread.h>
            ?12
            ?13#define?MAX_LENGTH?1024?//?緩沖區最大長度
            ?14#define?MAX_THREAD?2?//?定義允許的最大線程數
            ?15#define?MAX_LISTEN?20?//?定義最大允許監聽連接數
            ?16
            ?17pthread_mutex_t?p_lock;
            ?18char?buf[MAX_LENGTH];
            ?19char?data[MAX_LENGTH];
            ?20int?thread_count?=?0;?//當前線程數量
            ?21/**
            ?22*?線程處理函數
            ?23*?向來源信息發送數據
            ?24**/

            ?25void?*deal(void?*arg)
            ?26{
            ?27????int?c_fd?=?*((int?*)arg);
            ?28????char?buf_s[MAX_LENGTH];
            ?29????snprintf(buf_s,MAX_LENGTH,"thread?id?is?:?%u\n",pthread_self());
            ?30????pthread_mutex_lock(&p_lock);
            ?31????if(write(c_fd,buf_s,strlen(buf_s))?<?0)
            ?32????{
            ?33????????printf("write?sock(%u)?error,thread?id?is?:",c_fd,pthread_self());
            ?34????}

            ?35????sleep(5);
            ?36????thread_count--;
            ?37????pthread_mutex_unlock(&p_lock);
            ?38}

            ?39
            ?40int?main(int?argc,char*?argv[])
            ?41{
            ?42????int?port;?//?監聽的端口
            ?43????int?sock_fd;?//sock描述符
            ?44????int?i,*connect_fd;
            ?45????pthread_t?thread_id;
            ?46????struct?sockaddr_in?server;
            ?47????struct?sockaddr_in?client;
            ?48????socklen_t?len;
            ?49????/**
            ?50????*?參數個數不正確
            ?51????**/

            ?52????if(?argc?!=?2?)
            ?53????{
            ?54????????printf("\nUsage:%s?[port]\n",argv[0]);
            ?55????????exit(1);
            ?56????}

            ?57????port?=?atoi(argv[1]);
            ?58????
            ?59????if((sock_fd?=?socket(AF_INET,SOCK_STREAM,0))?<?0)
            ?60????{
            ?61????????printf("create?sock?error.\n");
            ?62????????exit(1);
            ?63????}

            ?64????//?開始填充server數據0
            ?65????memset(&server,0,sizeof(server));
            ?66????server.sin_family?=?AF_INET;
            ?67????server.sin_addr.s_addr?=?htonl(INADDR_ANY);
            ?68????server.sin_port?=?htons(port);
            ?69????if(bind(sock_fd,(struct?sockaddr?*)&server,sizeof(server))?<?0)
            ?70????{
            ?71????????printf("bind?sock?error.\n");
            ?72????????exit(1);
            ?73????}

            ?74????if(listen(sock_fd,MAX_LISTEN)?<?0)
            ?75????{
            ?76????????printf("listen?sock?error.\n");
            ?77????????exit(1);
            ?78????}

            ?79????printf("\n?starting?listen\n");
            ?80????while(1)
            ?81????{
            ?82????????len?=?sizeof(client);
            ?83????????connect_fd?=?new?int;
            ?84????????if((*connect_fd?=?accept(sock_fd,(struct?sockaddr?*)&client,&len))?<?0)
            ?85????????{
            ?86????????????printf("accept?sock?error.\n");
            ?87????????????exit(1);
            ?88????????}

            ?89????????printf("\n?connect?from?%s,?port?%d.\n",inet_ntop(AF_INET,&client.sin_addr,buf,MAX_LENGTH),ntohs(client.sin_port));
            ?90????????//?創建線程去處理這個連接
            ?91????????pthread_mutex_lock(&p_lock);
            ?92????????//?檢測線程數量,如果達到最大線程數量的話,3秒內如果無法繼續創建新線程,則放棄當前連接
            ?93????????for(i=0;i<3;i++)
            ?94????????{
            ?95????????????printf("thread_count?:?%d\n",thread_count);
            ?96????????????if(thread_count?<?MAX_THREAD)
            ?97????????????????break;
            ?98????????????else
            ?99????????????{
            100????????????????printf("第?%d?次檢測數量已滿\n",i+1);
            101????????????????sleep(1);
            102????????????}

            103????????}

            104????????if(thread_count?>=?MAX_THREAD)
            105????????{
            106????????????printf("give?up?connect,?ID?%d\n",*connect_fd);
            107????????????pthread_mutex_unlock(&p_lock);
            108????????????continue;
            109????????}

            110????????if(pthread_create(&thread_id,NULL,deal,connect_fd)?!=?0)
            111????????{
            112????????????printf("thread?create?error.\n");
            113????????????exit(1);
            114????????}

            115????????printf("create?thread?%u\n",thread_id);
            116????????thread_count++;
            117????????pthread_mutex_unlock(&p_lock);
            118????}

            119}

            120

            客戶端:
            ?1/**
            ?2*?sock編程測試,多線程,client端
            ?3**/

            ?4#include?<stdio.h>
            ?5#include?<stdlib.h>
            ?6#include?<string.h>
            ?7#include?<unistd.h>
            ?8#include?<errno.h>
            ?9#include?<sys/socket.h>
            10#include?<arpa/inet.h>
            11#include?<netinet/in.h>
            12
            13#define?MAX_LENGTH?1024
            14char?buf[MAX_LENGTH];
            15
            16int?main(int?argc,char*?argv[])
            17{
            18????//?檢查參數
            19????int?sock_fd,port,n;
            20????struct?sockaddr_in?server;
            21????if(argc?!=?3)
            22????{
            23????????printf("Usage:%s?[ip]?[port]\n",argv[0]);
            24????????exit(1);
            25????}

            26????port?=?atoi(argv[2]);
            27????if((sock_fd?=?socket(AF_INET,SOCK_STREAM,0))?<?0)
            28????{
            29????????printf("sock?error.\n");
            30????????exit(1);
            31????}

            32????bzero(&server,sizeof(server));
            33????server.sin_family?=?AF_INET;
            34????server.sin_port?=?htons(port);
            35????if(inet_pton(AF_INET,argv[1],&server.sin_addr)?<=?0)
            36????{
            37????????printf("set?address?error.\n");
            38????????exit(1);
            39????}

            40????if(connect(sock_fd,(struct?sockaddr?*)&server,sizeof(server))?<?0)
            41????{
            42????????printf("connect?error:%s\n",strerror(errno));
            43????????exit(1);
            44????}

            45????if((n?=?read(sock_fd,buf,MAX_LENGTH))?>?0)
            46????{
            47????????printf("receive?data?:?%s\n",buf);
            48????}

            49????else
            50????{
            51????????printf("read?data?error\n");
            52????????exit(1);
            53????}

            54????close(sock_fd);
            55}

            56

            posted on 2006-09-21 15:22 編程之道 閱讀(595) 評論(0)  編輯 收藏 引用 所屬分類: C/C++

            久久亚洲日韩看片无码| 久久精品成人欧美大片| 国产精品乱码久久久久久软件 | 无码人妻少妇久久中文字幕| 久久久WWW成人免费毛片| 久久SE精品一区二区| 国内精品久久久久影院日本| 久久精品免费网站网| 中文精品久久久久人妻不卡| 中文字幕亚洲综合久久2| 99精品久久精品一区二区| 狠狠久久综合| 国产韩国精品一区二区三区久久| 久久99精品久久久久久水蜜桃| 无码人妻少妇久久中文字幕蜜桃 | 天天久久狠狠色综合| 久久综合视频网| 久久久久亚洲av毛片大| 精品久久久久久中文字幕| 狠狠综合久久综合88亚洲| 久久一区二区三区免费| 久久精品国产影库免费看| 色综合久久久久久久久五月| 人妻丰满?V无码久久不卡| 国内精品久久久久久久亚洲| …久久精品99久久香蕉国产| 欧美噜噜久久久XXX| 久久婷婷五月综合成人D啪| 无码人妻少妇久久中文字幕| 日本加勒比久久精品| 国产呻吟久久久久久久92| 亚洲国产精品久久久久网站| 久久久久中文字幕| 亚洲成色999久久网站| 日韩亚洲欧美久久久www综合网 | 欧美精品丝袜久久久中文字幕 | 精品久久久无码中文字幕天天| 久久99国产精品尤物| 久久久久亚洲AV无码麻豆| 亚洲人成精品久久久久| 日韩精品久久无码中文字幕|