摘要:對於伺服器編程中最重要的一步等待並接受客戶的串連,那麼這一步在編程中如何完成,accept函數就是完成這一步的。它從核心中取出已經建立的客戶串連,然後把這個已經建立的串連返回給使用者程式,此時使用者程式就可以與自己的客戶進行點到點的通訊了。
accept函數等待並接受客戶請求:
#include<sys/socket.h>
int accept(int sockfd, struct sockaddr* addr, socklen_t* len)
返回:非負描述字——成功, -1——失敗
accept預設會阻塞進程,直到有一個客戶串連建立後返回,它返回的是一個新可用的通訊端,這個通訊端是串連通訊端。此時我們需要區分兩種通訊端,一種通訊端正如accept的參數sockfd,它是監聽通訊端,在調用listen函數之後,一個通訊端會從主動串連的通訊端變身為一個監聽通訊端;而accept返回是一個串連通訊端,它代表著一個網路已經存在的點點串連。自然要問的是:為什麼要有兩種通訊端?原因很簡單,如果使用一個描述字的話,那麼它的功能太多,使得使用很不直觀,同時在核心確實產生了一個這樣的新的描述字。
-
參數sockfd
-
參數sockfd就是上面解釋中的監聽通訊端,這個通訊端用來監聽一個連接埠,當有一個客戶與伺服器串連時,它使用這個一個連接埠號碼,而此時這個連接埠號碼正與這個通訊端關聯。當然客戶不知道通訊端這些細節,它只知道一個地址和一個連接埠號碼。
-
參數addr
-
這是一個結果參數,它用來接受一個傳回值,這傳回值指定用戶端的地址,當然這個地址是通過某個地址結構來描述的,使用者應該知道這一個什麼樣的地址結構。如果對客戶的地址不感興趣,那麼可以把這個值設定為NULL。
-
參數len
-
如同大家所認為的,它也是結果的參數,用來接受上述addr的結構的大小的,它指明addr結構所佔有的位元組個數。同樣的,它也可以被設定為NULL。
如果accept成功返回,則伺服器與客戶已經正確建立串連了,此時伺服器通過accept返回的通訊端來完成與客戶的通訊。