欧美一区二区三区老妇人-欧美做爰猛烈大尺度电-99久久夜色精品国产亚洲a-亚洲福利视频一区二区

LinuxSocket編程簡(jiǎn)介和實(shí)現(xiàn)-創(chuàng)新互聯(lián)

在 TCP/IP 協(xié)議中,"IP地址 + TCP或UDP端口號(hào)" 可以唯一標(biāo)識(shí)網(wǎng)絡(luò)通訊中的一個(gè)進(jìn)程,"IP地址+端口號(hào)" 就稱(chēng)為 socket。本文以一個(gè)簡(jiǎn)單的 TCP 協(xié)議為例,介紹如何創(chuàng)建基于 TCP 協(xié)議的網(wǎng)絡(luò)程序。

創(chuàng)新互聯(lián)建站是一家專(zhuān)注于網(wǎng)站建設(shè)、網(wǎng)站設(shè)計(jì)與策劃設(shè)計(jì),金水網(wǎng)站建設(shè)哪家好?創(chuàng)新互聯(lián)建站做網(wǎng)站,專(zhuān)注于網(wǎng)站建設(shè)十年,網(wǎng)設(shè)計(jì)領(lǐng)域的專(zhuān)業(yè)建站公司;建站業(yè)務(wù)涵蓋:金水等地區(qū)。金水做網(wǎng)站價(jià)格咨詢(xún):028-86922220

TCP 協(xié)議通訊流程

下圖描述了 TCP 協(xié)議的通訊流程(此圖來(lái)自互聯(lián)網(wǎng)):

下圖則描述 TCP 建立連接的過(guò)程(此圖來(lái)自互聯(lián)網(wǎng)):

服務(wù)器調(diào)用 socket()、bind()、listen() 函數(shù)完成初始化后,調(diào)用 accept() 阻塞等待,處于監(jiān)聽(tīng)端口的狀態(tài),客戶端調(diào)用 socket() 初始化后,調(diào)用 connect() 發(fā)出 SYN 段并阻塞等待服務(wù)器應(yīng)答,服務(wù)器應(yīng)答一個(gè)SYN-ACK 段,客戶端收到后從 connect() 返回,同時(shí)應(yīng)答一個(gè) ACK 段,服務(wù)器收到后從 accept() 返回。

TCP 連接建立后數(shù)據(jù)傳輸?shù)倪^(guò)程:

建立連接后,TCP 協(xié)議提供全雙工的通信服務(wù),但是一般的客戶端/服務(wù)器程序的流程是由客戶端主動(dòng)發(fā)起請(qǐng)求,服務(wù)器被動(dòng)處理請(qǐng)求,一問(wèn)一答的方式。因此,服務(wù)器從 accept() 返回后立刻調(diào)用 read(),讀 socket 就像讀管道一樣,如果沒(méi)有數(shù)據(jù)到達(dá)就阻塞等待,這時(shí)客戶端調(diào)用 write() 發(fā)送請(qǐng)求給服務(wù)器,服務(wù)器收到后從 read() 返回,對(duì)客戶端的請(qǐng)求進(jìn)行處理,在此期間客戶端調(diào)用 read() 阻塞等待服務(wù)器的應(yīng)答,服務(wù)器調(diào)用 write() 將處理結(jié)果發(fā)回給客戶端,再次調(diào)用 read() 阻塞等待下一條請(qǐng)求,客戶端收到后從 read() 返回,發(fā)送下一條請(qǐng)求,如此循環(huán)下去。

下圖描述了關(guān)閉 TCP 連接的過(guò)程:

如果客戶端沒(méi)有更多的請(qǐng)求了,就調(diào)用 close() 關(guān)閉連接,就像寫(xiě)端關(guān)閉的管道一樣,服務(wù)器的 read() 返回 0,這樣服務(wù)器就知道客戶端關(guān)閉了連接,也調(diào)用 close() 關(guān)閉連接。注意,任何一方調(diào)用 close() 后,連接的兩個(gè)傳輸方向都關(guān)閉,不能再發(fā)送數(shù)據(jù)了。如果一方調(diào)用 shutdown() 則連接處于半關(guān)閉狀態(tài),仍可接收對(duì)方發(fā)來(lái)的數(shù)據(jù)。

在學(xué)習(xí) socket 編程時(shí)要注意應(yīng)用程序和 TCP 協(xié)議層是如何交互的:

  1. 應(yīng)用程序調(diào)用某個(gè) socket 函數(shù)時(shí) TCP 協(xié)議層完成什么動(dòng)作,比如調(diào)用 connect() 會(huì)發(fā)出 SYN 段
  2. 應(yīng)用程序如何知道 TCP 協(xié)議層的狀態(tài)變化,比如從某個(gè)阻塞的 socket 函數(shù)返回就表明 TCP 協(xié)議收到了某些段,再比如 read() 返回 0 就表明收到了 FIN 段

下面通過(guò)一個(gè)簡(jiǎn)單的 TCP 網(wǎng)絡(luò)程序來(lái)理解相關(guān)概念。程序分為服務(wù)器端和客戶端兩部分,它們之間通過(guò) socket 進(jìn)行通信。

服務(wù)器端程序

下面是一個(gè)非常簡(jiǎn)單的服務(wù)器端程序,它從客戶端讀字符,然后將每個(gè)字符轉(zhuǎn)換為大寫(xiě)并回送給客戶端:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <netinet/in.h>

#define MAXLINE 80
#define SERV_PORT 8000

int main(void)
{
  struct sockaddr_in servaddr, cliaddr;
  socklen_t cliaddr_len;
  int listenfd, connfd;
  char buf[MAXLINE];
  char str[INET_ADDRSTRLEN];
  int i, n;

  // socket() 打開(kāi)一個(gè)網(wǎng)絡(luò)通訊端口,如果成功的話,
  // 就像 open() 一樣返回一個(gè)文件描述符,
  // 應(yīng)用程序可以像讀寫(xiě)文件一樣用 read/write 在網(wǎng)絡(luò)上收發(fā)數(shù)據(jù)。
  listenfd = socket(AF_INET, SOCK_STREAM, 0);

  bzero(&servaddr, sizeof(servaddr));
  servaddr.sin_family = AF_INET;
  servaddr.sin_addr.s_addr = htonl(INADDR_ANY);
  servaddr.sin_port = htons(SERV_PORT);
  
  // bind() 的作用是將參數(shù) listenfd 和 servaddr 綁定在一起,
  // 使 listenfd 這個(gè)用于網(wǎng)絡(luò)通訊的文件描述符監(jiān)聽(tīng) servaddr 所描述的地址和端口號(hào)。
  bind(listenfd, (struct sockaddr *)&servaddr, sizeof(servaddr));

  // listen() 聲明 listenfd 處于監(jiān)聽(tīng)狀態(tài),
  // 并且最多允許有 20 個(gè)客戶端處于連接待狀態(tài),如果接收到更多的連接請(qǐng)求就忽略。
  listen(listenfd, 20);

  printf("Accepting connections ...\n");
  while (1)
  {
    cliaddr_len = sizeof(cliaddr);
    // 典型的服務(wù)器程序可以同時(shí)服務(wù)于多個(gè)客戶端,
    // 當(dāng)有客戶端發(fā)起連接時(shí),服務(wù)器調(diào)用的 accept() 返回并接受這個(gè)連接,
    // 如果有大量的客戶端發(fā)起連接而服務(wù)器來(lái)不及處理,尚未 accept 的客戶端就處于連接等待狀態(tài)。
    connfd = accept(listenfd, (struct sockaddr *)&cliaddr, &cliaddr_len);
   
    n = read(connfd, buf, MAXLINE);
    printf("received from %s at PORT %d\n",
        inet_ntop(AF_INET, &cliaddr.sin_addr, str, sizeof(str)),
        ntohs(cliaddr.sin_port));
  
    for (i = 0; i < n; i++)
    {
      buf[i] = toupper(buf[i]);
    }
      
    write(connfd, buf, n);
    close(connfd);
  }
}

新聞標(biāo)題:LinuxSocket編程簡(jiǎn)介和實(shí)現(xiàn)-創(chuàng)新互聯(lián)
文章來(lái)源:http://chinadenli.net/article12/jjedc.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站內(nèi)鏈App開(kāi)發(fā)、關(guān)鍵詞優(yōu)化、網(wǎng)頁(yè)設(shè)計(jì)公司網(wǎng)站設(shè)計(jì)、響應(yīng)式網(wǎng)站

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)

營(yíng)銷(xiāo)型網(wǎng)站建設(shè)
激情五月激情婷婷丁香| 国产精品一区二区三区日韩av| 黄色日韩欧美在线观看| 国产精品不卡免费视频| 日本一区二区三区黄色| 99久久免费看国产精品| 黑丝国产精品一区二区| 日韩中文字幕视频在线高清版| 欧美丰满人妻少妇精品| 厕所偷拍一区二区三区视频| 亚洲国产成人久久99精品| 99久久人妻精品免费一区| 欧美日韩国产免费看黄片| 成人精品亚洲欧美日韩| 久久精品视频就在久久| 99一级特黄色性生活片| 字幕日本欧美一区二区| 欧美尤物在线观看西比尔| 亚洲精品一区三区三区| 国产精品偷拍视频一区| 美女黄色三级深夜福利| 欧美国产日韩在线综合| 亚洲一区二区亚洲日本| 青青操日老女人的穴穴| 免费特黄欧美亚洲黄片| 中字幕一区二区三区久久蜜桃| 老司机精品视频免费入口| 中文字幕区自拍偷拍区| 高清不卡一卡二卡区在线| 日韩黄色大片免费在线| 精品少妇一区二区三区四区| 日韩在线视频精品中文字幕| 国产精品免费视频久久| 偷拍洗澡一区二区三区| 日韩免费国产91在线| 久久国产人妻一区二区免费| 国产日韩欧美国产欧美日韩| 日本午夜免费福利视频| 亚洲内射人妻一区二区| 久久久精品日韩欧美丰满| 色哟哟哟在线观看视频|