Linux Accept函數(shù)簡單介紹
系統(tǒng)調(diào)用accept()會有點古怪的地方的!你可以想象發(fā)生這樣的事情:有人從很遠(yuǎn)的地方通過一個你在偵聽(listen())的端口連接(connect())到你的機(jī)器。它的連接將加入到等待接受(accept())的隊列中。你調(diào)用accept()告訴它你有空閑的連接。它將返回一個新的套接字文件描述符!這樣你就有兩個套接字了,原來的一個還在偵聽你的那個端口,新的在準(zhǔn)備發(fā)送(send())和接收(recv())數(shù)據(jù)。這就是Linux Accept函數(shù)的過程!
Linux Accept函數(shù)是這樣定義的:
#include<sys/socket.h>
intaccept(intsockfd,void*addr,int*addrlen);
sockfd相當(dāng)簡單,是和listen()中一樣的套接字描述符。addr是個指向局部的數(shù)據(jù)結(jié)構(gòu)sockaddr_in的指針。這是要求接入的信息所要去的地方(你可以測定那個地址在那個端口呼叫你)。在它的地址傳遞給accept之前,addrlen是個局部的整形變量,設(shè)置為sizeof(structsockaddr_in)。accept將不會將多余的字節(jié)給addr。如果你放入的少些,那么它會通過改變addrlen的值反映出來。同樣,在錯誤時返回-1,并設(shè)置全局錯誤變量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);/*錯誤檢查*/
- 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ù)注意事項,在系統(tǒng)調(diào)用send()和recv()中你應(yīng)該使用新的套接字描述符new_fd。如果你只想讓一個連接進(jìn)來,那么你可以使用close()去關(guān)閉原來的文件描述符sockfd來避免同一個端口更多的連接。
【編輯推薦】