摘要:對於服務器編程中最重要的一步等待並接受客戶的連接,那么這一步在編程中如何完成,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返回的套接字來完成與客戶的通信。