• <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++

            国产精品久久网| 久久久国产精品网站| 久久成人小视频| 亚洲AV无码1区2区久久| 狠狠色丁香久久综合婷婷| 青青久久精品国产免费看| 亚洲国产精品无码久久久不卡| 1000部精品久久久久久久久| 欧美国产成人久久精品| 久久夜色精品国产欧美乱| 91久久精品国产免费直播| 亚洲∧v久久久无码精品| 久久影院久久香蕉国产线看观看| 亚洲精品无码久久久久sm| 久久九色综合九色99伊人| 久久久久久夜精品精品免费啦| 精品国产一区二区三区久久蜜臀| 日韩精品久久久肉伦网站 | 亚洲AV无码久久精品狠狠爱浪潮| 成人久久综合网| AV无码久久久久不卡蜜桃| 精品乱码久久久久久夜夜嗨 | 久久精品国产亚洲77777| 亚洲精品国产综合久久一线| 热久久国产精品| 久久精品国产秦先生| 国产精品久久久久久| 久久久一本精品99久久精品88| 久久久这里只有精品加勒比| 久久综合一区二区无码| 久久精品亚洲男人的天堂| 日本一区精品久久久久影院| 精品久久8x国产免费观看| 久久精品国产清自在天天线| 亚洲精品tv久久久久| 一本久久综合亚洲鲁鲁五月天| 色综合久久88色综合天天 | 久久久久99这里有精品10 | 亚洲午夜精品久久久久久人妖| 国产精品久久自在自线观看| 人妻精品久久无码专区精东影业|