socket-accept


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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM