簡單的Linux下的socket程式

2021-08-03 11:51:38 字數 2175 閱讀 1121

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

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

伺服器端** server.cpp:

#include

#include

#include

#include

#include

#include

#include

intmain

()

客戶端** client.cpp:

#include

#include

#include

#include

#include

#include

intmain

()

先編譯 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: hello world!

[admin@localhost ~]$

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

需要注意的是:

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

2) 上面的原始檔字尾為.cpp,是c++**,所以要用g++命令來編譯。

c++和c語言的乙個重要區別是:在c語言中,變數必須在函式的開頭定義;而在c++中,變數可以在函式的任何地方定義,使用更加靈活。這裡之所以使用c++**,是不希望在函式開頭堆砌過多變數。
1) 先說一下 server.cpp 中的**。

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

第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() 從套接字檔案中讀取資料。

本文**:

Linux下經常使用的C C 開源Socket庫

1.linux socket programming in c 2.ace ace採用ace os適配層遮蔽各種不同的 複雜繁瑣的作業系統api。ace是乙個大型的中介軟體產品,20萬行左右,過於巨集大,一堆的設計模式,架構了一層又一層。它龐大 複雜。適合大型專案。開源 免費。不依賴第三方庫。使用的...

linux下安裝gd庫並且支援socket

gd 2.0.33.tar.gz jpegsrc.v6b.tar.gz libpng 1.2.7.tar.tar zlib 1.2.2.tar.gz freetype 2.1.9.tar.gz php 4.3.9.tar.gz 二 安裝 1.安裝zlib tar zxvf zlib 1.2.2.ta...

Linux下的簡單命令

一 程序相關 1 顯示所有執行中的程序 ps aux less 2 殺死程序 pkill 程序名 killall 程序名 kill 9 pidof 程序名關鍵字 3 linux 檢視指定程序和關閉程序 比如 ps ef grep writer 查詢所有有關writer的程序,顯示如下 9942代表p...