【文章內(nèi)容簡(jiǎn)介】
pe。/*socket類型 */ int ai_protocol。/*協(xié)議類型 */ size_t ai_addrlen。/*地址字節(jié)長(zhǎng)度 */ char *ai_canonname。/*主機(jī)名 */ struct sockaddr *ai_addr。/*socket結(jié)構(gòu)體 */ struct addrinfo *ai_next。/*下一個(gè)指針鏈表 */ } 名字地址轉(zhuǎn)化 ( 3) 名字地址轉(zhuǎn)化 ( 4) 示例 ? 閱讀并運(yùn)行示例 1022。 socket基礎(chǔ)編程 ( 1) socket編程的基本函數(shù)有 socket()、 bind()、 listen()、 accept()、send()、 sendto()、 recv()以及 recvfrom()等,其中根據(jù)客戶端還是服務(wù)端,或者根據(jù)使用 TCP協(xié)議還是 UDP協(xié)議,這些函數(shù)的調(diào)用流程都有所區(qū)別。 ? socket():該函數(shù)用于建立一個(gè) socket連接,可指定 socket類型等信息。在建立了 socket連接之后,可對(duì) sockaddr或 sockaddr_in結(jié)構(gòu)進(jìn)行初始化,以保存所建立的 socket地址信息。 ? bind():該函數(shù)是用于將本地 IP地址綁定到端口號(hào),若綁定其他IP地址則不能成功。另外,它主要用于 TCP的連接,而在 UDP的連接中則無(wú)必要。 ? listen():在服務(wù)端程序成功建立套接字和與地址進(jìn)行綁定之后,還需要準(zhǔn)備在該套接字上接收新的連接請(qǐng)求。此時(shí)調(diào)用 listen()函數(shù)來(lái)創(chuàng)建一個(gè)等待隊(duì)列,在其中存放未處理的客戶端連接請(qǐng)求。 socket基礎(chǔ)編程 ( 2) ? accept():服務(wù)端程序調(diào)用 listen()函數(shù)創(chuàng)建等待隊(duì)列之后,調(diào)用 accept()函數(shù)等待并接收客戶端的連接請(qǐng)求。它通常從由 bind()所創(chuàng)建的等待隊(duì)列中取出第一個(gè)未處理的連接請(qǐng)求。 ? connect():該函數(shù)在 TCP中是用于 bind()的之后的 client端,用于與服務(wù)器端建立連接,而在 UDP中由于沒(méi)有了 bind()函數(shù),因此用 connect()有點(diǎn)類似 bind()函數(shù)的作用。 ? send()和 recv():這兩個(gè)函數(shù)分別用于發(fā)送和接收數(shù)據(jù),可以用在 TCP中,也可以用在 UDP中。當(dāng)用在 UDP時(shí),可以在 connect()函數(shù)建立連接之后再用。 ? sendto()和 recvfrom():這兩個(gè)函數(shù)的作用與 send()和 recv()函數(shù)類似,也可以用在 TCP和 UDP中。當(dāng)用在 TCP時(shí),后面的幾個(gè)與地址有關(guān)參數(shù)不起作用,函數(shù)作用等同于 send()和 recv();當(dāng)用在 UDP時(shí),可以用在之前沒(méi)有使用 connect()的情況下,這兩個(gè)函數(shù)可以自動(dòng)尋找指定地址并進(jìn)行連接。 socket基礎(chǔ)編程 ( 3) 使用 TCP協(xié)議的流程圖 s o c k e t 服 務(wù) 器 端 c l o s e s e n d / s e n d t o r e c v / r e c v f r o m a c c e p t l i s t e n b i n d s o c k e t c l o s e r e c v / r e c v f r o m s e n d / s e n d t o c o n n e c t客 戶 端b i n d socket基礎(chǔ)編程 ( 4) 使用 UDP協(xié)議的流程圖 s o c k e t c l o s e s e n d r e c v a c c e p t l i s t e n s o c k e t c l o s e r e c v s e n d c o n n e c t r e c v f r o m