Linux Accept函數(shù)簡(jiǎn)單介紹
系統(tǒng)調(diào)用accept()會(huì)有點(diǎn)古怪的地方的!你可以想象發(fā)生這樣的事情:有人從很遠(yuǎn)的地方通過(guò)一個(gè)你在偵聽(listen())的端口連接(connect())到你的機(jī)器。它的連接將加入到等待接受(accept())的隊(duì)列中。你調(diào)用accept()告訴它你有空閑的連接。它將返回一個(gè)新的套接字文件描述符!這樣你就有兩個(gè)套接字了,原來(lái)的一個(gè)還在偵聽你的那個(gè)端口,新的在準(zhǔn)備發(fā)送(send())和接收(recv())數(shù)據(jù)。這就是Linux Accept函數(shù)的過(guò)程!
Linux Accept函數(shù)是這樣定義的:
#include<sys/socket.h>
intaccept(intsockfd,void*addr,int*addrlen);
sockfd相當(dāng)簡(jiǎn)單,是和listen()中一樣的套接字描述符。addr是個(gè)指向局部的數(shù)據(jù)結(jié)構(gòu)sockaddr_in的指針。這是要求接入的信息所要去的地方(你可以測(cè)定那個(gè)地址在那個(gè)端口呼叫你)。在它的地址傳遞給accept之前,addrlen是個(gè)局部的整形變量,設(shè)置為sizeof(structsockaddr_in)。accept將不會(huì)將多余的字節(jié)給addr。如果你放入的少些,那么它會(huì)通過(guò)改變addrlen的值反映出來(lái)。同樣,在錯(cuò)誤時(shí)返回-1,并設(shè)置全局錯(cuò)誤變量errno。
現(xiàn)在是你應(yīng)該熟悉的代碼片段。
- #include<string.h>
- #include<sys/socket.h>
- #include<sys/types.h>
- #defineMYPORT3490/*用戶接入端口*/
- #defineBACKLOG10/*多少等待連接控制*/
- main()
- {
- intsockfd,new_fd;/*listenonsock_fd,newconnectiononnew_fd*/
- structsockaddr_inmy_addr;/*地址信息*/
- structsockaddr_intheir_addr;/*connector 'saddressinformation*/
- intsin_size;
- sockfd=socket(AF_INET,SOCK_STREAM,0);/*錯(cuò)誤檢查*/
- my_addr.sin_family=AF_INET;/*hostbyteorder*/
- my_addr.sin_port=htons(MYPORT);/*short,networkbyteorder*/
- my_addr.sin_addr.s_addr=INADDR_ANY;/*auto-fillwithmyIP*/
- bzero(&(my_addr.sin_zero),;/*zerotherestofthestruct*/
- /*don 'tforgetyourerrorcheckingforthesecalls:*/
- bind(sockfd,(structsockaddr*)&my_addr,sizeof(structsockaddr));
- listen(sockfd,BACKLOG);
- sin_size=sizeof(structsockaddr_in);
- new_fd=accept(sockfd,&their_addr,&sin_size);
- .
- .
- .
Linux Accept函數(shù)注意事項(xiàng),在系統(tǒng)調(diào)用send()和recv()中你應(yīng)該使用新的套接字描述符new_fd。如果你只想讓一個(gè)連接進(jìn)來(lái),那么你可以使用close()去關(guān)閉原來(lái)的文件描述符sockfd來(lái)避免同一個(gè)端口更多的連接。
【編輯推薦】