TCP客戶 伺服器程式例項

2021-07-15 07:31:37 字數 3478 閱讀 4162

**:

1.概述

這章的tcp客戶/伺服器模型

2.tcp回射伺服器程式

1).main函式

#include      "

unp.h

"int main(int argc, char **argv)

close(connfd);

/*parent closes connected socket */}

}

2).str_echo函式

#include    "

unp.h

"void str_echo(int

sockfd)

3.tcp回射客戶程式1).main函式

#include    "

unp.h

"int main(int argc, char **argv)

2).str_cli函式

#include    "

unp.h

"void str_cli(file *fp, int

sockfd)

}

4.posix 訊號處理每個訊號都有乙個處理辦法(disposition),也稱為與此訊號關聯的行為(action)。我們通過呼叫函式sigaction來設定乙個訊號的處理辦法。

1).可以提供乙個函式,在訊號發生時隨即呼叫。這個函式稱為訊號處理函式(signal handler),而此行為便稱為捕獲(catching)訊號,有兩個訊號不能捕獲sigkill和sigstop,函式由訊號值這一單一引數來呼叫且無返回值,函式原型為

void handler(int signo);
訊號sigio,sigpoll,sigurg還要求捕獲它的程序有其它動作。

2).可以通過設定訊號的處理辦法為sig_ign來忽略它,但是sigkill和sigstop不能忽略。

3).可以設定訊號的處理辦法為sig_dfl來為它設定預設處理辦法

函式signal的函式原型層次複雜

void ( * signal (int signo, void ( * func)(int) ) )(int);
用typedef簡化函式原型

typedef void sigfunc(int); //

它說明訊號處理程式是帶有乙個整形引數且無返回值的函式

這樣signal的函式原型就變為

sigfunc * signal (int signo, sigfunc * func); //

此函式的第二個引數和返回值都是指向訊號處理函式的指標

5.處理sigchld訊號設定殭屍(zombie)狀態的目的就是維護子程序的資訊,以便父程序在稍後的某個時候取回。如果乙個程序終止,且該程序有子程式處於殭屍狀態,則所有殭屍子程序的父程序id均置為1(init程序),init程序將作為這些子程序的繼父,並負責清除他們(也就是說,init程序將wait它們,從而去除殭屍程序),有些unix系統給殭屍程序輸出的command列為(ps命令輸出)。

另外:

6.wait和waitpid函式

可以呼叫如下兩個函式處理已終止的子程序

#include pid_t wait (

int *statloc);

pid_t waitpid (pid_t pid,

int *statloc, int

options);

//返回值:成功返回程序id,出錯返回返回0或-1;

對於引數pid 想等待的程序id號。-1表示等待第乙個結束的子程序,options附加選項,常用的是wnohang,告知核心在沒有以終止子程序時不要阻塞

函式wait和waitpid均返回兩個值: 函式的返回值是終止子程序的程序id號,子程序的終止狀態(乙個整數)則是通過指標statloc返回的。

wait和waitpid的區別: wait 等待第乙個結束的子程序,如果沒有結束的子程序,wait將阻塞。waitpid 通過引數設定,可以在沒有子程序結束時waitpid不阻塞。

7.accept返回前連線終止

berkeley 的實現在核心中處理終止的連線。posix 規定返回乙個econnaborted 的 errno(詳見unp3)

8.服務程序終止

如果向乙個服務程序已終止的伺服器發起連線,伺服器將返回乙個rst 訊號

ps rst:(reset the connection)用於復位因某種原因引起出現的錯誤連線,也用來拒絕非法資料和請求

9.sigpipe訊號

10.伺服器主機崩潰

如果,客戶端和伺服器已經建立了連線的時候,此時伺服器崩潰(達到這一標準可以把伺服器的網線拔掉,這個時候,伺服器就不能傳送fin資料報了,和關機不一樣的)

11.伺服器主機崩潰後重啟

當客戶端和伺服器已經建立連線的時候,伺服器發生崩潰,重新啟動的時候,丟失了原來和客戶端的連線資訊,這個時候,當客戶端向伺服器傳送資料的時候(客戶端並不知道,伺服器已經忘記三次握手了),此時伺服器傳送rst資料報,就結束了客戶端的傳送

12.伺服器主機關機

unix系統關機時,init程序通常先給所有程序傳送sigterm訊號。等待5-20秒後給所有仍然在執行的程序傳送sigkill訊號,這麼做的目的是給程序一小段時間來清除和終止。

13.tcp程式例子小結

需要通訊的客戶/伺服器程式在通訊之前都要指定套接字對:本地ip位址,本地埠號,外地ip位址,外地埠。

客戶程式的本地ip位址和本地埠號通常是核心分配。服務程式的本地ip位址和埠號有bind函式指定。

14.資料格式

網路傳遞資料存在三個潛在問題:

(1)不同的實現以不同的格式儲存二進位制數,最常見的是大端位元組序和小端位元組序。

(2)不同的實現在儲存相同的c資料型別上可能存在差異,例如32位系統中的long 為32位,64位系統中的long為64位。

(3)不同的實現給結構打包的方式存在差異,取決於各種資料型別所用的位數以及機器的對齊限制,因此,穿越套接字傳送二進位制結構絕不明智。

解決上述問題的兩個常用方法:

(1)把所有的數值資料作為文字串來傳遞,前提是客戶和伺服器機器具有相同的字符集。

(2)顯式定義所支援資料型別的二進位制格式(位數,大端或小端位元組序),並以這樣的格式在客戶與伺服器之間傳遞所有資料。

TCP客戶 伺服器程式例項

server.cpp include include include include include include include include include include include include include define ip 127.0.0.1 define port 888...

tcp 客戶 伺服器程式示例

1 client 從標準輸入讀入一行文字,並寫給伺服器。2 伺服器從網路輸入讀入這行文字,並回射給客戶。3 客戶從網路輸入讀入這行回射的文字,顯示在標準輸出上 標準輸入 fgets tcp 客戶 write read tcp 伺服器 標準輸出 fputs tcp 客戶 read write tcp ...

TCP客戶 伺服器程式示例

1.tcp回射示例 伺服器 include include include include include include in.h define srv port 8888 define maxline 4096 void str echo int fd int main int argc,cha...