久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 3785|回復: 0
打印 上一主題 下一主題
收起左側

網絡程序設計期末考試復習提綱

[復制鏈接]
跳轉到指定樓層
樓主
ID:108615 發表于 2016-3-14 16:03 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
簡答題
1.采用阻塞I/O模型時,套接字函數read()的返回值有哪幾種?分別對應什么情況?
  
返回值n
  
  
對應情況
  
  無數據
  
  阻塞
  
  n >= len
  
  讀取len個字節
  
  0 < n < len
  
  讀取n個字節
  
  n = 0
  
  讀通道關閉
  
  n = -1 且 ERRON = EINTR
  
  讀中斷引起錯誤
  
  n = -1 且 ERRON = ECONNREST
  
  網絡連接有問題
  

2.為什么客戶機通常不需要綁定自己的端口號?
當客戶機請求連接時,系統會自動為它選擇一個未用的端口號,并且用本地的IP地址設置嵌套字地址的相應項。

3.close()函數和shutdown()函數有何差別?
①shutdown操作連接通道,其他進程不能再使用已被關閉的通道;close操作描述符,其他進程仍然可以使用該socket描述符
②close關閉應用程序與socket的接口,調用close之后進程不能再讀寫這個socket;shudown可以只關閉一個通道,另一個通道仍然可以操作

4.僵尸進程有什么危害?清除僵尸進程的方法有哪些?(至少4種)
僵尸進程雖然對其他進程幾乎沒有什么影響,不占用CPU時間,消耗的內存也幾乎可以忽略不計,但Linux系統中進程數目是有限的,在一些特殊的情況下,如果存在太多的僵尸進程,會影響到新進程的產生。
清除方法:
①忽略SIGCHLD信號,系統將清除子進程的進程表項,這種方法依賴于Linux版本的實現
②調用函數wait()或waitpid()等待子進程。這種方法沒有兼容性問題,但主程序進入等待循環后不能做任何事情
③捕獲SIGCHLD信號,在相應的處理函數中調用wait()或waitpid()對子進程進行處理
④調用fork()兩次,使子進程成為孤兒進程,由init進程管理

5.Linux系統默認的I/O模型是什么?請給出兩種將阻塞式模型轉換為非阻塞式模型的方法
默認的I/O模型是阻塞式I/O模型
方法一:fcntl
int flags = fcntl(sockfd, F_GETF, 0);
flags |= O_NONBLOCK;
fcntl(sockfd, F_SETF, flags);
方法二:ioctl
int on = 1;
Ioctl(sockfd, FIONBIO, &on);

6.函數fork()與exec()的差別
①fork()是執行一個新的任務,exec()執行另一個程序
②fork()的子進程共享正文,exec()將改變子進程的正文
③fork()在創建完進程后立即返回,exec執行時函數不返回,只有錯誤時才返回

7.創建一個守護進程有哪些步驟
①調用fork(),父進程退出,子進程繼續運行
②調用setsid()創建新的session
③忽略信號SIGHUP,再次調用fork(),父進程(session的頭進程)退出
④調用chdir("/"),使進程不使用任何目錄
⑤調用unmask(0),使進程對任何內容都有寫權限
⑥關閉所有打開的文件描述符,為標準輸入、標準輸出、標準錯誤輸出打開新的文件描述符0、1、2

8.列舉出不少于5項的進程間通信方式
①管道②信號量③消息隊列④消息郵箱⑤共享內存⑥內存映像文件⑦Unix域Socket

9.請給出利用Socket接口實現面向連接的網絡編程模型
                   在51黑附件中

10.網絡編程時,為什么要考慮字節順序問題
不同機器表示數據的字節順序是不同的:
Intel處理器:低字節在前,高字節在后,稱為小端存儲
Motorola處理器:高字節在前,低字節在后,稱為大端存儲

11.在使用UDP套接字時也可以使用connnect()函數,連接UDP套接字有哪些特點?
使得在無連接的UDP通信中,發送時不必帶目的地址,接收時不必帶源地址

12.服務器經常使用說明綁定方式,為什么
常使用綁定任意地址方式(INADDR_ANY)
這樣服務器可以接收發送到服務器的任意IP地址的數據

13.試比較pipe和Unix域套接字的差異
Pipe是單工通信,Unix域套接字是雙工通信





編程題
1.請給出實現一個守護進程的程序代碼
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <time.h>
#include <sys/types.h>
#include <sys/param.h>
#include <sys/stat.h>

void init_daemon(void)
{
   int pid, i;
   /*
       步驟一:調用fork(),父進程退出,子進程繼續
    */
   if(pid = fork())
       exit(0);    //父進程直接退出
   else if(pid < 0)
       exit(1);    //fork()失敗退出
   /*
       步驟二:調用setsid()創建新的會話
    */
   //第一子進程
   setsid();   //第一子進程成為新的會話組組長,并與控制臺終端分離
   /*
       步驟三:再次調用fork(),會話組組長退出
    */
   if(pid = fork())
       exit(0);    //是第一子進程,退出
   else if(pid < 0)
       exit(1);    //fork()失敗退出

   //第二子進程(孫進程),不再是會話組組長
   for(i = 0; i < NOFILE; i++)
       close(i);   //關閉打開的文件描述符
   /*
       步驟四:釋放掛載的文件系統
    */
   chdir("\n");    //改變當前目錄到系統目錄下,釋放掛載的文件系統
   /*
       步驟五:提升進程權限
    */
   umask(0);       //使守護進程擁有高權限
}

int main()
{
   FILE *fp;
   time_t t;
   init_daemon();

   while(1)
    {
       sleep(3);
       if((fp = fopen("test.log", "a")) >= 0)
       {
           t = time(0);
           fprintf(fp, "daemon process logged at: %s \n",asctime(localtime(&t)));
            fclose(fp);
       }
    }
   return 0;
}

2.編程產生2個進程:子進程1和子進程2,然后利用管道,將字符串“abcde”從子進程1傳到子進程2
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>

int main()
{
   int fd[2], pid;
   if(pipe(fd) == -1)
       perror("pipe()");

   if((pid = fork()) == -1)
       perror("fork()");
   else if(pid > 0)
    {
       close(fd[0]);
       if(write(fd[1], "abcde", 5) == -1)
           perror("write()");
       printf("this is parent process!\n");
    }
   else if(pid == 0)
    {
       close(fd[1]);
       char buf[6];
       if(read(fd[0], buf, 5) == -1)
           perror("read()");
       buf[6] = 0;
       printf("this is son process, parent says: %s\n", buf);
    }

   sleep(3);
}

3.使用UDP套接字完成如下服務器和客戶機的編程工作,客戶機發送一個整數,UDP循環服務器將這個整數加上100,結果返回給客戶機
服務器:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>

#define    SERVERPORT      3000
#define    BUFFERSIZE      10

int main(int argc, char** argv)
{
   int sockfd;
   if((sockfd = socket(AF_INET, SOCK_DGRAM, 0)) == -1)
       perror("socket()");

   struct sockaddr_in srvaddr, clientaddr;
   srvaddr.sin_family = AF_INET;
   srvaddr.sin_port = htons(SERVERPORT);
   srvaddr.sin_addr.s_addr = htonl(INADDR_ANY);

   if(bind(sockfd, (struct sockaddr*)&srvaddr, sizeof(srvaddr)) == -1)
       perror("bind()");

   char buf[BUFFERSIZE];
   socklen_t clientaddr_len = sizeof(clientaddr);
    while(1)
    {
       recvfrom(sockfd, buf, BUFFERSIZE, 0, (struct sockaddr*)&clientaddr,&clientaddr_len);
       sprintf(buf, "%d", atoi(buf) + 100);
       sendto(sockfd, buf, BUFFERSIZE, 0, (struct sockaddr*)&clientaddr,clientaddr_len);
    }
    return0;
}

客戶端:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>

#define    SERVERPORT      3000
#define    SERVERADDR      "127.0.0.1"
#define    BUFFERSIZE      10

int main(int argc, char** argv)
{
   int sockfd;
   if((sockfd = socket(AF_INET, SOCK_DGRAM, 0)) == -1)
       perror("socket()");

   struct sockaddr_in srvaddr;
   srvaddr.sin_family = AF_INET;
   srvaddr.sin_port = htons(SERVERPORT);
   if(inet_aton(SERVERADDR, &srvaddr.sin_addr) == -1)
       perror("inet_aton()");

   char buf[BUFFERSIZE];
   sprintf(buf, "%s", argv[1]);
   socklen_t srvaddr_len = sizeof(srvaddr);
   sendto(sockfd, buf, sizeof(buf), BUFFERSIZE, (structsockaddr*)&srvaddr, sizeof(srvaddr));
   recvfrom(sockfd, buf, sizeof(buf), 0, NULL, NULL);

   printf("%d\n",atoi(buf));
}

4.采用預創建10個子進程的方式,編程實現一個TCP并發服務器
                               服務器:
  1. #include <string.h>
  2. #include <sys/socket.h>
  3. #include <sys/types.h>
  4. #include <netinet/in.h>
  5. #include <stdio.h>
  6. #include <errno.h>
  7. #include <signal.h>

  8. #define  SERVER_PORT 8080
  9. #define  BACKLOG           5
  10. #define  CLDNUM           10

  11. void theEnd(int n)                //根據實際進程數清除子進程
  12. {
  13.   int i;
  14.   for(i=0; i< n; i ++)
  15.   if(pid[i]>0)
  16.       kill(pid[i],SIGTERM);

  17.   while(wait(NULL)>0);
  18. }

  19. int pid[CLDNUM];
  20. int i;

  21. int main()
  22. {
  23.   int listenfd,connfd;
  24.   struct sockaddr_in servaddr;
  25.   char cmd[10];
  26.   int nErr=0;
  27.   int buf_recv[1024];
  28.   int buf_send[1024];
  29.    
  30.   listenfd=socket(AF_INET,SOCK_STREAM,0);
  31.   if(listenfd<0)
  32.           fprintf(stderr,"Socket error");
  33.   
  34.   bzero(&servaddr,sizeof(servaddr));
  35.   servaddr.sin_family=AF_INET;
  36.   servaddr.sin_addr.s_addr=htonl(INADDR_ANY);
  37.   servaddr.sin_port=htons(SERVER_PORT);
  38.   
  39.   int n=1;
  40.   setsockopt( listenfd,SOL_SOCKET,SO_REUSEADDR,&n,sizeof(n));        
  41.   if(bind(listenfd,(struct sockaddr*)&servaddr,sizeof(servaddr))<0)
  42.         fprintf(stderr,"Bind error");

  43.   if(listen(listenfd,BACKLOG)<0)
  44.         fprintf(stderr,"Listen error");

  45.   for(i=0; i < CLDNUM; i ++)
  46.   {
  47.     if((pid[i]=fork())==0)
  48.     {
  49.       for(;;)                        //預創建的子進程
  50.             {
  51.               connfd=accept(listenfd,NULL,NULL);
  52.         ......
  53.         nbytes=read_all(connfd,buf_recv,256);
  54.         process(......);  //數據處理
  55.         nbytes=write_all(connfd,buf_send,256);
  56.         ......
  57.       }  
  58.     }
  59.     else if(pid[i]<0)
  60.     {
  61.       nErr=i+1;                //從第i+1個進程開始,創建失敗
  62.       break;  
  63.     }
  64.   }

  65.   if(nErr!=CLDNUM)        //創建子進程組失敗
  66.   {
  67.     theEnd(nErr);
  68.     exit(1);
  69.   }        
  70.   int m=1;
  71.   while(m)                        //鍵盤輸入,"theEnd",要求進程結束
  72.   {
  73.     gets(cmd);
  74.     m=strcmp(cmd,"theEnd");
  75.   }
  76.   theEnd(nErr);
  77.   exit(0);
  78. }
復制代碼



5.編程產生子進程,孫進程,并使進程按“孫-子-父”的順序結束
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <unistd.h>

  4. int main()
  5. {
  6.     int son_pid, frandson_pid;

  7.     if((son_pid = fork()) == 0)
  8.     {   //子進程
  9.         if((frandson_pid = fork()) == 0)
  10.         {   //孫進程
  11.             printf("this is frandson process!\n");
  12.             exit(0);
  13.         }
  14.         else
  15.         {   //子進程
  16.             printf("this is son process!\n");
  17.             wait();
  18.             printf("frandson process exit!\n");
  19.             exit(0);
  20.         }
  21.     }
  22.     else
  23.     {   //父進程
  24.         printf("this is father process!\n");
  25.         wait();
  26.         printf("son process exit!\n");
  27.         sleep(3);
  28.     }
  29.     return 0;
  30. }
復制代碼


整理的網絡程序設計提綱.rar

46.41 KB, 下載次數: 2, 下載積分: 黑幣 -5

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 欧美一二区 | 欧美一级毛片久久99精品蜜桃 | 亚洲色图第一页 | 日韩成人免费视频 | 日韩中文字幕 | 久久久中文| 久久精品国产免费高清 | 日韩中文一区二区三区 | 国产成人jvid在线播放 | 国产yw851.c免费观看网站 | 91精品中文字幕一区二区三区 | 国产精品免费看 | 综合久久亚洲 | 欧美国产一区二区 | 久久精品国产一区二区电影 | 婷婷五月色综合香五月 | 国产精品免费大片 | 国产日韩一区二区 | 国产免费看 | 99免费在线观看视频 | 夜色www国产精品资源站 | 亚洲一区中文字幕 | 一区二视频| 国产精品96久久久久久 | 成人精品国产一区二区4080 | 紧缚调教一区二区三区视频 | 久久一及片 | 久久精品国产精品青草 | 久久9999久久| 五月婷婷激情网 | 国产小视频在线 | 国产精品视频在线播放 | 高清一区二区三区 | 国产精品成人av | 日韩一区二区三区在线观看 | 在线中文字幕第一页 | 91精品国产91综合久久蜜臀 | 特黄毛片| 精品国产一区二区三区成人影院 | 九九免费视频 | 2019天天操|