娛樂城
Linux下的過程間通訊:套接字以及旌旗元寶娛樂城燈號 - 財神娛樂城_捕魚達人_電子遊戲

Linux下的過程間通訊:套接字以及旌旗元寶娛樂城燈號

進修在 Linux 中過程是若何與其余過程進行同步的。

本篇是 Linux 下過程間通訊(IPC)系列的第三篇同時也是最初一篇文章。第一篇文章聚焦在經由過程同享存儲(文件以及同享內存段)來進行 IPC,第二篇文章則經由過程管道(無名的或者者定名的)及新聞行列步隊來到達雷同的目的。這篇文章將眼光從高處(套接字)然后到低處(旌旗燈號)來存眷 IPC。代碼示例將使勁地空虛上面的詮釋細節。

套接字

正如管道有兩品種型(定名以及無名)同樣,套接字也有兩品種型。IPC 套接字(即 Unix 套接字)賦予過程在雷同裝備(主機)上基于通道的通訊本領;而收集套接字賦予過程運轉在不同主機的本領,是以也帶來了收集通訊的本領。收集套接字必要底層協定的支撐,例如 TCP(傳輸節制協定)或者 UDP(用戶數據報協定)。
與之相反,IPC 套接字依靠于內地體系內核的支撐來進行通訊;分外的,IPC 通訊使用一個內地的文件作為套接字地址。絕管這兩種套接字的完成有所不同,但在實質上,IPC 套接字以及收集套接字的 API 是一致的。接上去的例子將包括收集套接字的內容,但示例服務器以及客戶端法式可以在雷同的機械上運轉,由于服務器使用了 localhost(127.0.0.1)這個收集地址,該地址透露表現的是內地機械上的內地機械地址。
套接字以流的情勢(上面將會接頭到)被設置為雙向的,而且其節制遵守 C/S(客戶端/服務器端)模式:客戶端經由過程測驗考試毗鄰一個服務器來初始化對話,而服務器端將測驗考試接收該毗鄰。倘使萬事順遂,來自客戶真個哀求以及來自服務器真個相應將經由過程管道進行傳輸,直到個中恣意一方封閉該通道,從而斷開這個毗鄰。
一個迭代服務器(只實用于真錢麻將app開發)將一向以及毗鄰它的客戶端打交道:從最最先服務第一個客戶端,然后到這個毗鄰封閉,然后服務第二個客戶端,輪回來去。這類方式的一個錯誤謬誤是處置一個特定的客戶端可能會掛起,使得其余的客戶端一向在前面守候。臨盆級其它服務器將是并發的,平日使用了多過程或者者多線程的夾雜。例如,我臺式機上的 Nginx 收集服務器有一個 4 個工人worker的過程池,它們可以并發地處置客戶真個哀求。鄙人面的代碼示例中,咱們將使用迭代服務器,使得咱們將要處置的成績堅持在一個很小的范圍,偏財運2020偏財運八字只存眷根本的 API,而不往關切并發的成績。
最初,跟著種種 POSIX 改進的浮現,套接字 API 跟著時間的推移而產生了顯著的轉變。當前針對服務器端以及客戶真個示例代碼特地寫的比較簡略,然則它偏重夸大了基于流的套接字中毗鄰的兩邊。上面是對于流節制的一個總結,個中服務器端在一個終端中開啟,而客戶端在另一個不同的終端中開啟:

  • 服務器端守候客戶真個毗鄰,關于給定的一個勝利毗鄰,它就讀取來自客戶真個數據。
  • 為了夸大是兩邊的會話,服務器端會對接受自客戶真個數據做歸應。這些數據都是 ASCII 字符代碼,它們構成了一些書的題目。
  • 客戶端將書的題目寫給服務器真個過程,并從服務器真個歸應中讀取到雷同的題目。然后客戶端以及服務器端都在屏幕上打印出題目。上面是服務器真個輸入,客戶真個輸入也以及它齊全同樣:
  1. Listening on port 9876 for clients...
  2. War and Peace
  3. Pride and Prejudice
  4. The Sound and the Fury

示例 1. 使用套接字的客戶端法式

  1. #include <string.h>
  2. #include <stdio.h>
  3. #include <stdlib.h>
  4. #include <unistd.h>
  5. #include <sys/types.h>
  6. #include <sys/socket.h>
  7. #include <netinet/tcp.h>
  8. #include <arpa/inet.h>
  9. #include "sock.h"
  10.  
  11. void rep六合彩即時ort(const char* msg, int terminate) {
  12. perror(msg);
  13. if (terminate) exit(-1); /* failure */
  14. }
  15.  
  16. int main() {
  17. int fd = socket(AF_INET, /* network versus AF_LOCAL */
  18. SOCK_STREAM, /* reliable, bidirectional: TCP */
  19. 0); /* system picks underlying protocol */
  20. if (fd < 0) report("socket", 1); /* terminate */
  21. /* bind the server's local address in memory */
  22. struct sockaddr_in saddr;
  23. memset(&saddr, 0, sizeof(saddr)); /* clear the bytes */
  24. saddr.sin_family = AF_INET; /* versus AF_LOCAL */
  25. saddr.sin_addr.s_addr = htonl(INADDR_ANY); /* host-to-network endian */
  26. saddr.sin_port = htons(PortNumber); /* for listening */
  27. if (bind(fd, (struct sockaddr *) &saddr, sizeof(saddr)) < 0)
  28. report("bind", 1); /* terminate */
  29. /* listen to the socket */
  30. if (listen(fd, MaxConnects) < 0) /* listen for clients, up to MaxConnects */
  31. report("listen", 1); /* terminate */
  32.  
  33. fprintf(stderr, "Listening on port %i for clients...\n", PortNumber);
  34. /* a server traditio撲克牌妞妞作弊nally listens indefinitely */
  35. while (1) {
  36. struct sockaddr_in caddr; /* client address */
  37. int len = sizeof(caddr); /* address length could change */
  38. int client_fd = accept(fd, (struct sockaddr*) &caddr, &len); /* accept blocks */
  39. if (client_fd < 0) {
  40. report("accept", 0); /* don't terminated, though there's a problem */
  41. continue;
  42. }
  43.  
  44. /* read from client */
  45. int i;
  46. for (i = 0; i < ConversationLen; i++) {
  47. char buffer[BuffSize + 1];
  48. memset(buffer, '\0', sizeof(buffer));
  49. int count = read(client_fd, buffer, sizeof(buffer));
  50. if (count > 0) {
  51. puts(buffer);
  52. write(client_fd, buffer, sizeof(buffer)); /* echo as confirmation */
  53. }線上麻將朋友
  54. }
  55. close(client_fd); /* break connection */
  56. } /* while(1) */
  57. return 0;
  58. }

【免責聲明】本站內容轉載自互聯網,其相關談吐僅代表作者小我私家概念盡非權勢巨子,不代表本站態度。如您發明內容存在版權成績,請提交相關鏈接至郵箱:,咱們將實時予以處置。

六合彩玩法规则