socket初接觸 多使用者伺服器簡單互動(下)

2021-07-11 09:34:23 字數 2623 閱讀 6031

在寫主**之前,先看下面這個**段:

#define err_exit(m) \

do \

while(0)

這裡插個段子,在查斜槓(/)和反斜槓(\)的時候,發現了一系列對某mi..的吐槽,(在路徑表示層級上)全世界都是用/,而它是用的\,這到也不是它非要與眾不同,而是因為dos系統源自cp/m系統(微機史上開篇的乙個系統),這個系統不支援目錄結構(導致dos剛剛出來的時候也不支援目錄結構),而同時/被用來表示命令行引數(相當與linux中的 - 和 –),之後公升級了,支援目錄結構之後,再用/就會導致很多衝突,要找乙個最接近的符號來表示目錄層級切換,看來看去也就「\」這兄弟最適合了。

如果說要改?40多年前改還行,而這已經成了歷史性的問題,當初能改的時候沒改,現在再改也沒什麼意義了,mi其實已經做了很多友好的設定,你可以根據自己的喜好去更改使用/。

繼續看上面的**段:

#include

//用來將上乙個函式發生的錯誤的原因輸出到標準輸出

void perror(const

char* s);

//引數s所指的字串會先列印出,後面再加上錯誤原因字串

//這個錯誤原因字串根據全域性變數errno決定,當你每次呼叫函式出錯的時候,這個函式已經更改了errno的值。

//perror這個函式總而言之就是當你呼叫某個函式出錯時將函式的名字(char* s)和對應的errno錯誤資訊一起輸出

關於exit,終結程式,跳回作業系統。只用exit(0)代表程式的正常退出,其餘的引數都表示程式異常退出。(它被定義於stdio.h中)

最後一點就是關於do {} while(0);在**中的效果,這裡while(0)保證只執行上面的程式一次,並且是先do,所以必然會執行一次判斷,之後退出這個函式。在一些c函式庫或者linux核心原始碼中經常能看見do {} while(0); 的使用.

終於到了我們的主函式了,首先先是我們的server.c,**見下:

void do_service(int conn)

fputs(recvbuf,stdout); //向標準輸出列印讀到的recvbuf

write(conn,recvbuf,sizeof(recvbuf)); //向客戶端回射,說明server已經接收到你的資訊了

}}int main(void)

else

close(conn); //fork返回給父程序的是pid在正真系統中的唯一值,在父程序中和conn無關,直接關閉

}return

0;}

到這裡服務端就寫完了,**中寫了很多的注釋,不清楚的可以仔細看看,還有一些標頭檔案要加在開頭,講完之後在下面附上原始碼。

下面就開始寫client.c了,**如下:

int main()

; char recvbuf[1024] = ;

int n;

//從鍵盤上讀數進來

while(fgets(sendbuf,sizeof(sendbuf),stdin) != null)

fputs(recvbuf,stdout);

//清空一次資料

memset(sendbuf,0,sizeof(sendbuf));

memset(recvbuf,0,sizeof(recvbuf));

}close(sock); //上面那個迴圈都跳出來了那還sock個毛線,跳出的時候close

return

0;}

總結:相對於server端,client端只需要建立乙個用於connect(連線)的socket,然後struct 目標server的位址(ip+port),使用connect函式進行乙個連線,之後使用write函式向sock傳送資料,傳送完了那就是server端的事情了,這裡我們可以看出來,伺服器那端fputs之後,就將接收到的資訊再次回射給client了,這時候client端繼續read函式,接收成功的話fputs,接下愛mnemset清空資料,繼續下一次while( 1 )迴圈。

直到直到…..break

其他情況比如exit都是重試,下一次迴圈

這裡注意:

當我們呼叫socket建立乙個socket時,返回的socket描述字它存在於協議族(address family,af_***)空間中,但沒有乙個具體的位址。如果想要給它賦值乙個位址,就必須呼叫bind()函式,否則就當呼叫connect()、listen()時系統會自動隨機分配乙個埠

之後將這兩個.c檔案編譯成可執行檔案,執行即可進行通訊,下面是執行圖:

linux git伺服器搭建,多使用者協作

1 安裝git 2 建立使用者 user add m username m不會在home目錄下建立使用者目錄 user add m username1 user add m username2 2 建立使用者組git groupadd git 建立git使用者組,方便統一管理許可權 4 將使用者加入...

jupyterhub單伺服器多使用者模式安裝

首先安裝python3以上版本。執行以下命令 增加使用者用於登入 useradd hanks passwd hanks yum install git pip install git 執行以下命令生成配置檔案 jupyterhub generate config 修改配置檔案 增加白名單及管理員使用...

winServer伺服器設定多使用者同時遠端訪問!

1 按win r鍵,在彈出的面板中輸入gpedit.msc,進入到 本地組策略編輯器 2 依次選擇計算機配置 管理模板 windows元件 遠端桌面服務 遠端桌面會話主機 連線,雙擊選擇 將遠端桌面服務使用者限制到單獨的遠端桌面服務會話 3 在 將遠端桌面服務使用者限制到單獨的遠端桌面服務會話 面板...