• <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无码电影| 四虎影视久久久免费观看| 一本久道久久综合狠狠躁AV| 久久99国内精品自在现线| 久久99精品久久久久久秒播| 无码日韩人妻精品久久蜜桃| 久久久久人妻精品一区三寸蜜桃| 久久久久亚洲AV无码专区首JN | 久久亚洲国产成人影院网站| 久久人人爽人人爽人人片AV麻烦| 久久综合丝袜日本网| 久久精品国产清自在天天线| 久久久久久亚洲精品无码| 97r久久精品国产99国产精| 久久婷婷五月综合97色直播| 久久av高潮av无码av喷吹| 丁香五月网久久综合| 性做久久久久久久| 久久综合久久综合亚洲| 久久婷婷人人澡人人| 日本福利片国产午夜久久| 日本欧美久久久久免费播放网| 亚洲中文字幕伊人久久无码| 精品综合久久久久久88小说 | 久久艹国产| 精品多毛少妇人妻AV免费久久| 国产精品久久99| 麻豆亚洲AV永久无码精品久久| 狠狠色狠狠色综合久久| 久久久亚洲裙底偷窥综合| 久久99久国产麻精品66| 少妇无套内谢久久久久| 国产精品中文久久久久久久| 久久亚洲精品无码aⅴ大香| 伊人久久一区二区三区无码| 国产精品久久久久a影院| 久久久久久久久久久| 久久婷婷五月综合国产尤物app| 亚洲国产精品高清久久久| 欧美黑人激情性久久|