7 Linux下的socket演示程式

2021-09-26 06:45:24 字數 2332 閱讀 5277

和c語言教程一樣,我們從乙個簡單的「hello world!」程式切入 socket 程式設計。

本節演示了 linux 下的**,server.cpp 是伺服器端**,client.cpp 是客戶端**,要實現的功能是:客戶端從伺服器讀取乙個字串並列印出來。

伺服器端** server.cpp:

#include #include #include #include #include #include #include int main()
客戶端** client.cpp:

#include #include #include #include #include #include int main()
啟動乙個終端(shell),先編譯 server.cpp 並執行:

[admin@localhost ~]$ g++ server.cpp -o server

[admin@localhost ~]$ ./server

#等待請求的到來

正常情況下,程式執行到 accept() 函式就會被阻塞,等待客戶端發起請求。

接下再啟動乙個終端,編譯 client.cpp 並執行:

[admin@localhost ~]$ g++ client.cpp -o client

[admin@localhost ~]$ ./client

message form server: 

client 接收到從 server傳送過來的字串就執行結束了,同時,server 完成傳送字串的任務也執行結束了。大家可以通過兩個開啟的終端來觀察。

client 執行後,通過 connect() 函式向 server 發起請求,處於監聽狀態的 server 被啟用,執行 accept() 函式,接受客戶端的請求,然後執行 write() 函式向 client 傳回資料。client 接收到傳回的資料後,connect() 就執行結束了,然後使用 read() 將資料讀取出來。

server 只接受一次 client 請求,當 server 向 client 傳回資料後,程式就執行結束了。如果想再次接收到伺服器的資料,必須再次執行 server,所以這是乙個非常簡陋的 socket 程式,不能夠一直接受客戶端的請求。
1) 先說一下 server.cpp 中的**。

第 11 行通過 socket() 函式建立了乙個套接字,引數 af_inet 表示使用 ipv4 位址,sock_stream 表示使用面向連線的套接字,ipproto_tcp 表示使用 tcp 協議。在 linux 中,socket 也是一種檔案,有檔案描述符,可以使用 write() / read() 函式進行 i/o 操作,這一點已在《socket是什麼》中進行了講解。

第 19 行通過 bind() 函式將套接字 serv_sock 與特定的 ip 位址和埠繫結,ip 位址和埠都儲存在 sockaddr_in 結構體中。

socket() 函式確定了套接字的各種屬性,bind() 函式讓套接字與特定的ip位址和埠對應起來,這樣客戶端才能連線到該套接字

第 22 行讓套接字處於被動監聽狀態。所謂被動監聽,是指套接字一直處於「睡眠」中,直到客戶端發起請求才會被「喚醒」。

第 27 行的 accept() 函式用來接收客戶端的請求。程式一旦執行到 accept() 就會被阻塞(暫停執行),直到客戶端發起請求。

第 31 行的 write() 函式用來向套接字檔案中寫入資料,也就是向客戶端傳送資料。

和普通檔案一樣,socket 在使用完畢後也要用 close() 關閉。

2) 再說一下 client.cpp 中的**。client.cpp 中的**和 server.cpp 中有一些區別。

第 19 行**通過 connect() 向伺服器發起請求,伺服器的ip位址和埠號儲存在 sockaddr_in 結構體中。直到伺服器傳回資料後,connect() 才執行結束。

第 23 行**通過 read() 從套接字檔案中讀取資料。

綜上所述:

服務端應用socket的步驟為:

(1)使用socket函式建立套接字;

(2)使用bind函式,將套接字與ip、port繫結;

(3)使用listen函式啟動監聽;

(4)使用accept函式等待客戶端連線,獲取與客戶端通訊的套接字;

(5)使用客戶端套接字,呼叫read/write函式進行通訊;

客戶端應用socket的步驟為:

(1)使用socket函式建立套接字;

(2)使用connect函式連線指定ip、port的主機;

(3)使用端套接字,呼叫read/write函式進行通訊;

Linux學習 7 Linux系統下的程序管理

一.程序 二.程序檢視命令 三.程序優先順序 四.程序前後臺呼叫 五.程序資訊號 六.systemd守護程序 程序的定義 程序與執行緒的關係 程序狀態 程序檢視檔案 程序檢視命令 bsd 風格 unix風格 ps ax 顯示的程序資訊如下 ps aux顯示資訊如下 pgrep 程序過濾 pidof ...

7 Linux程式設計入門 執行緒操作

前言 linux下執行緒的建立 介紹在linux下執行緒的建立和基本的使用.linux下的執行緒是乙個非常複雜的問題,由 於我對執行緒的學習不時很好,我在這裡只是簡單的介紹執行緒的建立和基本的使用,關於線 程的高階使用 如執行緒的屬性,執行緒的互斥,執行緒的同步等等問題 可以參考我後面給出的 資料....

學習日記7 Linux命令1

10 00 開始學習 1.編寫長python 時的換行 例 print hello world 輸出結果均為 hello worldprint hello world 括號內的各單位可以直接換行print hello world print hello world print hello world...