• <noscript id="e0iig"><kbd id="e0iig"></kbd></noscript>
  • <td id="e0iig"></td>
  • <option id="e0iig"></option>
  • <noscript id="e0iig"><source id="e0iig"></source></noscript>
  • 簡介

    概述

    ? 一般認為 Web 服務器程序是一個長時間運行的程序(即守護程序),它只在響應來自網絡的請求時才發送網絡消息。Web 客戶程序(如某瀏覽器),它向服務器進程發送通信請求。

    ? 大多數網絡應用是按照 客戶/服務器 來組織的。在設計網絡應用時,確定總是由客戶發送請求往往可以簡化協議和程序本身。
    在這里插入圖片描述

    實例

    • 客戶端源程序:

      #include <stdio.h>
      #include <stdlib.h>
      #include <sys/socket.h>
      #include <sys/types.h>
      #include <unistd.h>
      #include <string.h> 
      #include <netinet/in.h>
      #include <arpa/inet.h> 
      // 根據程序使用的函數包含相應的頭文件即可(頭文件比較多就不一一說明哪個函數和哪個頭文件對應)
      
      #define MAXLINE 4096 // 定義宏
      
      int main(int argc,char* argv[])
      {
      	int sockfd, n; // 定義兩個整形變量
      	char recvline[MAXLINE + 1]; // 定義一個字符串數組
      	struct sockaddr_in servaddr; // 定義一個網際套接字地址結構變量
      
      	if(argc < 2) // 參數不符合要求
      	{
      		perror("usage: a.out <IPaddress>\n");
      		exit(1);
      	}
      
      	if((sockfd = socket(AF_INET, SOCK_STREAM, 0)) < 0) // 表示創建失敗
      	{
      		perror("socket error\n");
      		exit(1);
      	}
      
      	bzero(&servaddr,sizeof(servaddr)); // 置零
      	servaddr.sin_family = AF_INET; // 指定ipv4協議
      	servaddr.sin_port = htons(13); // 指定13端口
      	
      	if(inet_pton(AF_INET,argv[1],&servaddr.sin_addr) <= 0) // 指定ip地址
      	{
      		perror("inet_pton error\n");
      		exit(1);
      	}
      
      	if(connect(sockfd, (struct sockaddr*)&servaddr, sizeof(servaddr)) < 0) // 連接失敗
      	{
      		perror("connect error\n");
      		exit(1);
      	}
      
      	while((n = read(sockfd,recvline,MAXLINE)) > 0)
      	{
      		recvline[n] = '\0';
      		if(fputs(recvline,stdout) == EOF) // 將指定字符串輸出到指定文件流中
      		{
      			perror("fputs error\n");
      			exit(1);
      		}
      	}
      
      	if(n < 0)
      	{
      		perror("read error\n");
      		exit(1);
      	}
      	exit(0);
      }
      

      程序說明:

      • 1 - 9

        包含程序中所需函數的所有頭文件

      • 11

        定義一個宏,名為 MAXLINE

      • 13

        這是 main 函數的標準定義方式,其形式參數就是命令行參數

      • 19 - 23

        本程序要求輸入兩個參數,如果不滿足要求,則退出

      • 25 - 29

        socket 函數用于創建一個網際套接字。其中參數指定了套接字類型。如果創建成功則返回套接字描述符,否則返回 -1。如果創建失敗,則退出

      • 31 - 39

        給網際套接字地址結構變量賦值。有關該類型具體信息,暫不贅述

      • 41 - 45

        將該套接字描述符和指定服務器進行連接,如果連接成功則返回 0,否則返回 -1。如果連接失敗,則退出

      • 47 - 61

        從服務器中讀取字符,并將其輸出到屏幕中。如果讀取失敗或輸出失敗,則退出

      • 62

        退出程序

    • 服務器端源程序

      #include <stdio.h>
      #include <stdlib.h>
      #include <sys/socket.h>
      #include <sys/types.h>
      #include <unistd.h>
      #include <string.h> 
      #include <netinet/in.h>
      #include <arpa/inet.h>
      #include <time.h> // 涉及到時間相關函數需要此頭文件
      
      #define MAXLINE 4096
      
      int main(int argc,char* argv[])
      {
          int sockfd,connfd;
          struct sockaddr_in servaddr;
          char buff[MAXLINE];
          time_t ticks; // 存放當前機器時間
      
          if((sockfd = socket(AF_INET, SOCK_STREAM, 0)) < 0) // 創建失敗返回-1
          {
              perror("socket error\n");
              exit(1);
          }
      
          bzero(&servaddr, sizeof(servaddr));
          servaddr.sin_family = AF_INET;
          servaddr.sin_port = htons(13);
          servaddr.sin_addr.s_addr = htonl(INADDR_ANY);
      
          if(bind(sockfd, (struct sockaddr*)&servaddr, sizeof(servaddr)) == -1) // 綁定失敗返回-1
          {
              perror("bind error\n");
              exit(1);
          }
      
          if(listen(sockfd, 6) == -1) // 監聽失敗返回-1
          {
              perror("listen error\n");
              exit(1);
          }
      
          for( ; ; )
          {
              if((connfd = accept(sockfd, NULL, NULL)) < 0)
              {
                  perror("accept error\n");
                  exit(1);
              }
      
              ticks = time(NULL); // 獲取當前機器時間
              snprintf(buff, sizeof(buff), "%.24s\n", ctime(&ticks));
              write(connfd, buff, strlen(buff));
              close(connfd);
          }
      
          return 0;
      }
      

      程序說明(此程序前 30 行代碼和客戶端源代碼差不多,就不再說明):

      • 31 - 35

        bind 函數用于將一個套接字描述符綁定到一個 服務器中(服務器通過 ip + port 表示)。如果綁定成功,則返回 0,否則返回 -1。如果返回 -1,則退出

      • 37 - 41

        listen 函數用于將套接字描述符轉變為監聽套接字描述符,這樣來自客戶的外來連接就可在該套接字上由內核接受。如果監聽成功,則返回 0,否則返回 -1。如果返回 -1,則退出

      • 43 - 55

        accept函數用于接受外來連接,如果接受失敗則返回 -1,否則返回 客戶端套接字描述符。如果失敗,則退出。同時獲取當前機器時間,并將其發送給客戶端。

    • 程序運行演示

      • 服務器端運行
        在這里插入圖片描述
      • 客戶端運行
        在這里插入圖片描述
    版權聲明:本文為YangLei253原創文章,遵循 CC 4.0 BY-SA 版權協議,轉載請附上原文出處鏈接和本聲明。
    本文鏈接:https://blog.csdn.net/YangLei253/article/details/90601748

    智能推薦

    MyRocks簡介

    title: MySQL · 特性分析 · MyRocks簡介 author: 濟天 RocksDB是facebook基于LevelDB實現的,目前為facebook內部大量業務提供服務。經過facebook大量工作,將RocksDB作為MySQL的一個存儲引擎移植到MySQL,稱之為MyRocks。 經過兩年的發展,MyRocks已經比較成熟(RC階段),現已進入了f...

    MapReduce簡介

    什么是MapReduce 定義:MapReduce是一種編程模型,用于高效地進行大規模數據集的離線并行計算,Map指的是計算工作,Reduce指的是聚合工作。 準則(Hadoop): 所有計算分解為map或者reduce任務實現 每個任務處理全部輸入數據中的一部分 主要根據輸入數據和輸出數據定義任務 任務依賴于自己的輸入數據,不需要與其它任務通信 基本步驟:以統計各個用戶總在線時間為例,原始日志文...

    ftrace 簡介

    2019獨角獸企業重金招聘Python工程師標準>>> 劉 明 ( [email protected]), 軟件工程師, 上海交通大學電子與通信工程系 簡介: Trace 對于軟件的維護和性能分析至關重要,ftrace 是當前 Linux 內核中一種新的 trace 工具。本文介紹 ftrace 的使用和實現原理,并將 ftrace 和 systemTap,...

    MyCat 簡介

    轉自:https://blog.csdn.net/wrs120/article/details/80417345 1.什么是MyCat 2.為什么使用MyCat 3.支持的數據庫 4.架構 5.分片  5.1垂直切片  5.2水平切片 6.配置文件詳解  6.1 rule.xml  6.2 schema.xml  6.3 server.xml 7....

    redux 簡介

    概述 Redux 本身是個極其簡單的狀態管理框架, 它的簡單體現在概念少, 流程明確. 但是, 正是因為簡單, 使用上沒有強制的約束, 所以如果用不好, 反而會讓狀態管理更加混亂. 我覺得, 用好 Redux, 首先必須了解其中的幾個基本概念, 不只是看看文檔, 了解它們的定義, 關鍵是理解其和整個狀態管理的關系. 其次, 要能將這些概念對應到具體的業務系統中, 通過這些概念來規劃業務系統的狀態管...

    猜你喜歡

    Hadoop簡介

    Hadoop的架構 在其核心,Hadoop主要有兩個層次,即: 加工/計算層(MapReduce) 存儲層(Hadoop分布式文件系統) 除了上面提到的兩個核心組件,Hadoop的框架還包括以下兩個模塊: Hadoop通用:這是Java庫和其他Hadoop組件所需的實用工具 Hadoop YARN :這是作業調度和集群資源管理的框架 Hadoop Streaming 是一個實用程序,它允許用戶使用...

    gstreamer簡介

    框架圖 當前GStreamer主要有兩個大的版本分支: 1)0.10.x系列。這個版本系列的歷史較久,相關資源比較豐富。但目前官方已經不再發展和支持該版本。該系列有中文版的用戶手冊。 2)1.x系列。2012年以來發布的版本系列,也是官方推薦的版本系列。只有英文的用戶手冊,但手冊的內容與0.10.x相差不大,盡管API已經不再兼容舊版本。以下的描述以1.x系列為準。1.x系列被設計為可以和0.10...

    spring簡介

    Spring框架概述 依賴注入和控制反轉 spring的模塊 Core Container模塊 Core container包括以下模塊: Spring-core Spring-Beans Spring-Context Spring-Context-support Spring-expression Spring-core、Spring-Beans模塊提供了框架最基礎的功能,包括IOC和依賴注入特...

    HTML中常用操作關于:頁面跳轉,空格

    1.頁面跳轉 2.空格的代替符...

    freemarker + ItextRender 根據模板生成PDF文件

    1. 制作模板 2. 獲取模板,并將所獲取的數據加載生成html文件 2. 生成PDF文件 其中由兩個地方需要注意,都是關于獲取文件路徑的問題,由于項目部署的時候是打包成jar包形式,所以在開發過程中時直接安照傳統的獲取方法沒有一點文件,但是當打包后部署,總是出錯。于是參考網上文章,先將文件讀出來到項目的臨時目錄下,然后再按正常方式加載該臨時文件; 還有一個問題至今沒有解決,就是關于生成PDF文件...

    精品国产乱码久久久久久蜜桃不卡