accept 從監聽佇列中取出連線

2021-08-20 19:27:05 字數 2550 閱讀 1500

今天在《linux高效能伺服器程式設計》中看到:accept()函式是從監聽佇列中取出連線,於是自己使用書上的方法驗證了一下,**如下:

//accept_abnor_data.cpp

#include

#include

#include

#include

#include

#include

#include

#include

#include

int main(int argc, char * argv)

const

char * ip = argv[1];

int port = atoi(argv[2]);

struct sockaddr_in address;

bzero(&address, sizeof(address));

address.sin_family = af_inet;

inet_pton(af_inet, ip, &address.sin_addr);

address.sin_port = htons(port);

int sock = socket(pf_inet, sock_stream, 0);

assert(sock >= 0);

int ret = bind(sock, (struct sockaddr *)&address, sizeof(address));

assert(ret != -1);

ret = listen(sock, 5);

assert(ret != -1);

sleep(20); //睡眠20s

struct sockaddr_in client;

socklen_t client_addrlength = sizeof(client);

int connfd = accept(sock, (struct sockaddr *)&client, &client_addrlength); //accept()是從監聽佇列中取出連線,不論連線狀態如何

if (connfd < 0)

else

return

0;}

修改makefile結果如下:

.phony

:clean all

cc=gcc

gflags=-wall -g

bin=accept_abnor_data

all:

$(bin)

%.0:%.c

$(cc) $(

gflags) -c $< -o $@

clean:

rm -f *.o $(

bin)

開啟終端(1),執行下列命令:

make

./accept_abnor_data 192.168.1.104

12345

開啟另乙個終端(2),使用telnet命令進行登入:

telnet

192.168.1.104

12345

結果如下:

再開啟乙個終端終端,檢視埠狀態:

netstat -nt | grep 12345
檢視到網路狀態如下:

終端(1)中的./accept_abnor_data 192.168.1.104 12345命令執行20後,即睡眠結束,終端(1)上會列印出:

終端(2)上會列印出:

以上是客戶端正常退出的結果,下面我們來看一下客戶端異常退出的情況:

操作與上面不同的是,我們在終端使用telnet遠端登入時(測試是在本地進行的),登入成功後,鍵入ctrl+],強制退出到telnet命令介面,再鍵入quit命令,結果如下:

客戶端已經退出,此時的埠狀態為:

客戶端和伺服器端埠狀態分別為:fin_wait2 、close_wait

此時,你能以為伺服器端不會接受客戶端的本次連線了,可等到伺服器端睡眠20s後,仍能接受客戶端的請求,並列印客戶端的ip和埠號:

由此可見,accept()函式只是從監聽佇列中取出連線,並不關心連線處於何種狀態,更不關心任何網路狀況的變化,只要監聽佇列中有請求連線,伺服器端就可以進行連線。

注:測試是在本地進行的,本地ip為192.168.1.104

參考:

《高效能伺服器程式設計》

從JDBC中取出資料

首先要建立連線,為了在第二次鏈結的時候,不用重新建立connection 浪費,所以在建立連線的時候,先判斷當前物件的conn是否為null,是才進行建立,否則直接使用已有。private static connection conn null public connection getconnec...

從Cygwin中取出MinGW for GCC

cygwin內含mingw,於是就把原有的mingw解除安裝了。但是由於某種原因 原因在最後介紹 gcc在windows命令列下就不起作用了 執行後並不產生編譯結果 即使path設定正確。採用掩蔽dll的方法。將gcc放置於乙個新建的資料夾,並執行,會出現缺失dll,逐個加上這些dll後能執行通過,...

從矩陣中取出子矩陣

探索乙個簡單的演算法,從矩陣中取出乙個小矩陣應該怎樣實現。具體什麼意思呢,比方說我們現在有乙個int型的陣列,將其用矩陣的形式寫出來就會長這個樣子 int arr 用類似矩陣的形狀寫出來如下 int arr 以上是乙個5x5的矩陣形狀,我們如果要在這裡面取乙個子矩陣,要求就是必須子矩陣的寬高都是小於...