婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av

主頁 > 知識庫 > Linux進程間通信——使用流套接字

Linux進程間通信——使用流套接字

熱門標簽:昆明電銷機器人價格 怎么用百度地圖標注坐標 春運地圖標注app 地圖標注人員分布 上海機器人外呼系統哪家好 江西全自動外呼系統報價 益陽400電話申請辦理流程 400的電話一般從哪里辦理 梧州防封電銷卡

前面說到的進程間的通信,所通信的進程都是在同一臺計算機上的,而使用socket進行通信的進程可以是同一臺計算機的進程,也是可以是通過網絡連接起來的不同計算機上的進程。通常我們使用socket進行網絡編程,這里將會簡單地講述如何使用socket進行簡單的網絡編程。

一、什么是socket

socket,即套接字是一種通信機制,憑借這種機制,客戶/服務器(即要進行通信的進程)系統的開發工作既可以在本地單機上進行,也可以跨網絡進行。也就是說它可以讓不在同一臺計算機但通過網絡連接計算機上的進程進行通信。也因為這樣,套接字明確地將客戶端和服務器區分開來。

二、套接字的屬性

套接字的特性由3個屬性確定,它們分別是:域、類型和協議。

1、套接字的域

它指定套接字通信中使用的網絡介質,最常見的套接字域是AF_INET,它指的是Internet網絡。當客戶使用套接字進行跨網絡的連接時,它就需要用到服務器計算機的IP地址和端口來指定一臺聯網機器上的某個特定服務,所以在使用socket作為通信的終點,服務器應用程序必須在開始通信之前綁定一個端口,服務器在指定的端口等待客戶的連接。另一個域AF_UNIX表示UNIX文件系統,它就是文件輸入/輸出,而它的地址就是文件名。

2、套接字類型

因特網提供了兩種通信機制:流(stream)和數據報(datagram),因而套接字的類型也就分為流套接字和數據報套接字。這里主要講流套接字。

流套接字由類型SOCK_STREAM指定,它們是在AF_INET域中通過TCP/IP連接實現,同時也是AF_UNIX中常用的套接字類型。流套接字提供的是一個有序、可靠、雙向字節流的連接,因此發送的數據可以確保不會丟失、重復或亂序到達,而且它還有一定的出錯后重新發送的機制。

與流套接字相對的是由類型SOCK_DGRAM指定的數據報套接字,它不需要建立連接和維持一個連接,它們在AF_INET中通常是通過UDP/IP協議實現的。它對可以發送的數據的長度有限制,數據報作為一個單獨的網絡消息被傳輸,它可能會丟失、復制或錯亂到達,UDP不是一個可靠的協議,但是它的速度比較高,因為它并一需要總是要建立和維持一個連接。

3、套接字協議

只要底層的傳輸機制允許不止一個協議來提供要求的套接字類型,我們就可以為套接字選擇一個特定的協議。通常只需要使用默認值。

三、套接字地址

每個套接字都有其自己的地址格式,對于AF_UNIX域套接字來說,它的地址由結構sockaddr_un來描述,該結構定義在頭文件sys/un.h中,它的定義如下:

struct sockaddr_un{ 
  sa_family_t sun_family;//AF_UNIX,它是一個短整型 
  char    sum_path[];//路徑名 
}; 

對于AF_INET域套接字來說,它的地址結構由sockaddr_in來描述,它至少包括以下幾個成員:

struct sockaddr_in{ 
  short int      sin_family;//AF_INET 
  unsigned short int  sin_port;//端口號 
  struct in_addr    sin_addr;//IP地址 
}; 

而in_addr被定義為:

struct in_addr{ 
  unsigned long int s_addr; 
}; 

四、基于流套接字的客戶/服務器的工作流程

使用socket進行進程通信的進程采用的客戶/服務器系統是如何工作的呢?

1、服務器端

首先服務器應用程序用系統調用socket來創建一個套接安,它是系統分配給該服務器進程的類似文件描述符的資源,它不能與其他的進程共享。

接下來,服務器進程會給套接字起個名字,我們使用系統調用bind來給套接字命名。然后服務器進程就開始等待客戶連接到這個套接字。

然后,系統調用listen來創建一個隊列并將其用于存放來自客戶的進入連接。

最后,服務器通過系統調用accept來接受客戶的連接。它會創建一個與原有的命名套接不同的新套接字,這個套接字只用于與這個特定客戶端進行通信,而命名套接字(即原先的套接字)則被保留下來繼續處理來自其他客戶的連接。

2、客戶端

基于socket的客戶端比服務器端簡單,同樣,客戶應用程序首先調用socket來創建一個未命名的套接字,然后將服務器的命名套接字作為一個地址來調用connect與服務器建立連接。

一旦連接建立,我們就可以像使用底層的文件描述符那樣用套接字來實現雙向數據的通信。

五、流式socket的接口及作用

socket的接口函數聲明在頭文件sys/types.h和sys/socket.h中。

1、創建套接字——socket系統調用

該函數用來創建一個套接字,并返回一個描述符,該描述符可以用來訪問該套接字,它的原型如下:

int socket(int domain, int type, int protocol); 

函數中的三個參數分別對應前面所說的三個套接字屬性。protocol參數設置為0表示使用默認協議。

2、命名(綁定)套接字——bind系統調用

該函數把通過socket調用創建的套接字命名,從而讓它可以被其他進程使用。對于AF_UNIX,調用該函數后套接字就會關聯到一個文件系統路徑名,對于AF_INET,則會關聯到一個IP端口號。函數原型如下:

int bind( int socket, const struct sockaddr *address, size_t address_len); 

成功時返回0,失敗時返回-1;

3、創建套接字隊列(監聽)——listen系統調用

該函數用來創建一個隊列來保存未處理的請求。成功時返回0,失敗時返回-1,其原型如下:

int listen(int socket, int backlog); 

backlog用于指定隊列的長度,等待處理的進入連接的個數最多不能超過這個數字,否則往后的連接將被拒絕,導致客戶的連接請求失敗。調用后,程序一直會監聽這個IP端口,如果有連接請求,就把它加入到這個隊列中。

4、接受連接——accept系統調用

該系統調用用來等待客戶建立對該套接字的連接。accept系統調用只有當客戶程序試圖連接到由socket參數指定的套接字上時才返回,也就是說,如果套接字隊列中沒有未處理的連接,accept將阻塞直到有客戶建立連接為止。accept函數將創建一個新套接字來與該客戶進行通信,并且返回新套接字的描述符,新套接字的類型和服務器監聽套接字類型是一樣的。它的原型如下:

int accept(int socket, struct sockaddr *address, size_t *address_len); 

address為連接客戶端的地址,參數address_len指定客戶結構的長度,如果客戶地址的長度超過這個值,它將會截斷。

5、請求連接——connect系統調用

該系統調用用來讓客戶程序通過在一個未命名套接字和服務器監聽套接字之間建立連接的方法來連接到服務器。它的原型如下:

int connect(int socket, const struct sockaddr *address, size_t address_len); 

參數socket指定的套接字連接到參數addres指定的服務器套接字。成功時返回0,失敗時返回-1.

6、關閉socket——close系統調用

該系統調用用來終止服務器和客戶上的套接字連接,我們應該總是在連接的兩端(服務器和客戶)關閉套接字。

六、進程使用流式socket進行通信

下面用多個客戶程序和一個服務器程序來展示進程間如何利用套接字進行通信。

sockserver.c是一個服務器程序,它首先創建套接字,然后綁定一個端口再監聽套接字,忽略子進程的停止消息等,然后它進入循環,一直循環檢查是否有客戶連接到服務器,如果有,則調用fork創建一個子進程來處理請求。利用read系統調用來讀取客戶端發來的信息,利用write系統調用來向客戶端發送信息。這個服務器的工作非常簡單,就是把客戶發過來的字符+1,再發送回給客戶。

sockclient.c是一個客戶程序,它同樣要先創建套接,然后連接到指定IP端口服務器,如果連接成功,就用write來發送信息給服務器,再用read獲取服務器處理后的信息,再輸出。

服務器sockserver.c的源代碼如下:

#include unistd.h> 
#include sys/types.h> 
#include sys/socket.h> 
#include netinet/in.h> 
#include signal.h> 
#include stdio.h> 
#include stdlib.h> 

int main() 
{ 
  int server_sockfd = -1; 
  int client_sockfd = -1; 
  int client_len = 0; 
  struct sockaddr_in server_addr; 
  struct sockaddr_in client_addr; 
  //創建流套接字 
  server_sockfd = socket(AF_INET, SOCK_STREAM, 0); 
  //設置服務器接收的連接地址和監聽的端口 
  server_addr.sin_family = AF_INET;//指定網絡套接字 
  server_addr.sin_addr.s_addr = htonl(INADDR_ANY);//接受所有IP地址的連接 
  server_addr.sin_port = htons(9736);//綁定到9736端口 
  //綁定(命名)套接字 
  bind(server_sockfd, (struct sockaddr*)server_addr, sizeof(server_addr)); 
  //創建套接字隊列,監聽套接字 
  listen(server_sockfd, 5); 
  //忽略子進程停止或退出信號 
  signal(SIGCHLD, SIG_IGN); 

  while(1) 
  { 
    char ch = '\0'; 
    client_len = sizeof(client_addr); 
    printf("Server waiting\n"); 
    //接受連接,創建新的套接字 
    client_sockfd = accept(server_sockfd, (struct sockaddr*)client_addr, client_len); 

    if(fork() == 0) 
    { 
      //子進程中,讀取客戶端發過來的信息,處理信息,再發送給客戶端 
      read(client_sockfd, ch, 1); 
      sleep(5); 
      ch++; 
      write(client_sockfd, ch, 1); 
      close(client_sockfd); 
      exit(0); 
    } 
    else 
    { 
      //父進程中,關閉套接字 
      close(client_sockfd); 
    } 
  } 
} 

客戶sockclient.c的源代碼如下:

#include unistd.h> 
#include sys/types.h> 
#include sys/socket.h> 
#include netinet/in.h> 
#include arpa/inet.h> 
#include stdio.h> 
#include stdlib.h> 

int main() 
{ 
  int sockfd = -1; 
  int len = 0; 
  struct sockaddr_in address; 
  int result; 
  char ch = 'A'; 
  //創建流套接字 
  sockfd = socket(AF_INET, SOCK_STREAM, 0); 
  //設置要連接的服務器的信息 
  address.sin_family = AF_INET;//使用網絡套接字 
  address.sin_addr.s_addr = inet_addr("127.0.0.1");//服務器地址 
  address.sin_port = htons(9736);//服務器所監聽的端口 
  len = sizeof(address); 
  //連接到服務器 
  result = connect(sockfd, (struct sockaddr*)address, len); 

  if(result == -1) 
  { 
    perror("ops:client\n"); 
    exit(1); 
  } 
  //發送請求給服務器 
  write(sockfd, ch, 1); 
  //從服務器獲取數據 
  read(sockfd, ch, 1); 
  printf("char form server = %c\n", ch); 
  close(sockfd); 
  exit(0); 
} 

運行結果如下:

在本例子中,我們啟動了一個服務器程序和三個客戶程序,從運行的結果來看,客戶端發送給服務器程序的所有請求都得到了處理,即把A變成了B。對于服務器和客戶程序之間使用的read和write系統調用跟使用命名管道時阻塞的read、write系統調用一樣。例如客戶程序調用read時,如果服務器程序沒有向指定的客戶程序的socket中寫入信息,則read調用會一直阻塞。

七、流式套接字給我印象

給我的感覺是流式套接字很像命名管道,但是它卻可以使不在同一臺計算機而通過網絡連接的不同計算機上的進程進行通信,功能真是非常的強大。

以上就是本文的全部內容,希望本文的內容對大家的學習或者工作能帶來一定的幫助,同時也希望多多支持腳本之家!

您可能感興趣的文章:
  • Linux消息隊列實現進程間通信實例詳解
  • 詳解Linux進程間通信——使用信號量
  • 關于進程間通信的Linux小程序
  • PHP下操作Linux消息隊列完成進程間通信的方法
  • 淺談Linux進程間通信方式及優缺點

標簽:九江 懷化 新疆 亳州 惠州 河南 北京 贛州

巨人網絡通訊聲明:本文標題《Linux進程間通信——使用流套接字》,本文關鍵詞  Linux,進程,間,通信,使用,;如發現本文內容存在版權問題,煩請提供相關信息告之我們,我們將及時溝通與處理。本站內容系統采集于網絡,涉及言論、版權與本站無關。
  • 相關文章
  • 下面列出與本文章《Linux進程間通信——使用流套接字》相關的同類信息!
  • 本頁收集關于Linux進程間通信——使用流套接字的相關信息資訊供網民參考!
  • 推薦文章
    婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av
    国产精品你懂的在线欣赏| 亚洲aaa精品| 国产在线不卡一区| 欧美国产日本韩| 欧美视频一区二区三区| 奇米色一区二区三区四区| 亚洲精品大片www| 日韩免费视频一区二区| 色哟哟精品一区| 国产精品一色哟哟哟| 亚洲国产三级在线| 一区二区久久久久久| 久久久久9999亚洲精品| 日韩一级成人av| 欧美天天综合网| 成人教育av在线| 国产在线一区观看| 狠狠狠色丁香婷婷综合久久五月| 一区二区三区日韩精品视频| 一区二区三区四区中文字幕| 亚洲精品国产视频| 国产精品美女视频| 国产婷婷色一区二区三区| 精品久久久久av影院| 在线不卡的av| 欧美肥大bbwbbw高潮| 欧美一区二区私人影院日本| 欧美伦理视频网站| 日韩一区二区三区视频在线| 在线综合+亚洲+欧美中文字幕| 欧美日韩视频在线第一区 | 肉肉av福利一精品导航| 亚洲1区2区3区视频| 亚洲一区二区在线免费看| 五月天欧美精品| 亚洲成人av资源| 欧美96一区二区免费视频| 韩国毛片一区二区三区| 99久精品国产| 制服丝袜激情欧洲亚洲| 国产区在线观看成人精品| 亚洲欧洲综合另类在线| 亚洲一区二区三区视频在线播放| 舔着乳尖日韩一区| 国产iv一区二区三区| 色噜噜狠狠一区二区三区果冻| 欧美另类变人与禽xxxxx| 欧美一级国产精品| 国产精品国产三级国产| 亚洲一区二区三区四区在线免费观看 | 韩国视频一区二区| av成人免费在线| 欧美日韩高清一区二区不卡| 日韩亚洲国产中文字幕欧美| 中文字幕欧美日韩一区| 亚洲一二三四久久| 蜜桃久久av一区| 国产成人av自拍| 欧美区视频在线观看| 国产女主播在线一区二区| 无码av免费一区二区三区试看 | 777午夜精品免费视频| 欧美激情一二三区| 日韩二区三区四区| 色哟哟在线观看一区二区三区| 日韩精品一区二区三区蜜臀| 一区二区三区蜜桃| 成人精品视频一区| 欧美精品一区二区精品网| 午夜影视日本亚洲欧洲精品| eeuss影院一区二区三区| 久久婷婷国产综合精品青草| 日日夜夜免费精品视频| 日本高清视频一区二区| 国产精品二区一区二区aⅴ污介绍| 麻豆成人久久精品二区三区红 | 国产一区亚洲一区| 欧美在线观看视频一区二区| 欧美激情一区二区| 丰满放荡岳乱妇91ww| 2021国产精品久久精品| 看国产成人h片视频| 337p亚洲精品色噜噜| 亚洲一区在线播放| 欧美专区日韩专区| 伊人性伊人情综合网| 99久久国产综合精品女不卡| 欧美激情综合五月色丁香小说| 国产乱对白刺激视频不卡| 欧美成人一区二区三区| 免费国产亚洲视频| 91精品国产麻豆国产自产在线| 五月综合激情日本mⅴ| 欧美一区欧美二区| 久久99久久99精品免视看婷婷| 欧美一级夜夜爽| 国产在线不卡一区| 国产目拍亚洲精品99久久精品| 丁香亚洲综合激情啪啪综合| 国产精品人人做人人爽人人添| 成人黄页毛片网站| 亚洲精选视频在线| 欧美精品自拍偷拍动漫精品| 日韩精品五月天| www激情久久| 不卡的电视剧免费网站有什么| 亚洲欧美综合色| 欧美日韩国产精品成人| 韩国成人在线视频| 欧美日韩视频第一区| 国产成人精品亚洲777人妖| 久久看人人爽人人| 欧美一区日本一区韩国一区| 国产成人免费网站| 色妞www精品视频| 麻豆精品视频在线观看视频| 欧美午夜在线一二页| 91精品蜜臀在线一区尤物| 一区二区三区高清在线| 9191成人精品久久| 色婷婷精品久久二区二区蜜臂av | 国产精品18久久久久| 亚洲高清不卡在线观看| 亚洲欧美中日韩| 日本一区二区三区在线观看| 日韩精品一区二区三区视频在线观看 | 日韩极品在线观看| 亚洲综合色成人| 亚洲天堂a在线| 亚洲欧洲美洲综合色网| 国产精品成人免费在线| 国产精品情趣视频| 国产精品高清亚洲| 日韩一区在线免费观看| 欧美精品一区二区三区蜜桃视频| 精品美女被调教视频大全网站| 欧美一区二区三区免费| 精品日韩成人av| 久久蜜桃av一区二区天堂 | 2020国产精品自拍| 久久精品视频一区二区三区| 26uuu精品一区二区| 久久久噜噜噜久久人人看| 91免费在线播放| 欧美亚洲国产一区在线观看网站| 日本精品一区二区三区四区的功能| 91天堂素人约啪| 欧美日精品一区视频| 欧美日韩国产综合一区二区三区| 777欧美精品| 久久中文字幕电影| 国产精品久久久久久久久免费桃花| 国产精品全国免费观看高清| 亚洲精品国产a| 日本系列欧美系列| 国产在线日韩欧美| 成人av网址在线| 欧美色网站导航| 91精品啪在线观看国产60岁| 欧美本精品男人aⅴ天堂| 久久精品夜色噜噜亚洲aⅴ| 中文字幕免费不卡| 亚洲猫色日本管| 奇米精品一区二区三区四区| 国产成人免费视频网站| av亚洲产国偷v产偷v自拍| 91黄色激情网站| 欧美电影免费观看高清完整版在线观看 | 不卡的电影网站| 欧美日韩亚洲综合在线 | 99精品1区2区| 7777精品伊人久久久大香线蕉 | 国产老妇另类xxxxx| 成人av在线一区二区| 欧美日本在线看| 欧美国产精品一区二区三区| 伊人夜夜躁av伊人久久| 国产一区二区三区四区在线观看| 色综合久久久久久久| 欧美精品久久久久久久多人混战 | 一区二区三区在线免费视频| 美国精品在线观看| 色哟哟一区二区在线观看| 精品对白一区国产伦| 亚洲午夜在线电影| 国产成人av电影在线播放| 欧美日韩亚洲综合| √…a在线天堂一区| 久久99精品国产麻豆婷婷| 色欧美片视频在线观看| 国产目拍亚洲精品99久久精品| 偷拍一区二区三区四区| www.成人网.com| 久久免费看少妇高潮| 蜜桃av一区二区三区电影| 在线看国产一区二区| 国产精品视频免费| 久久成人久久鬼色| 3d成人动漫网站| 亚洲国产日韩av|