socket bind

SOCKET socket( int af, int type, int protocol );   應用程序調用socket函數來創建一個能夠進行網絡通信的套接字。   第一個參數指定應用程序使用的通信協議的協議族,對於TCP/IP協議族,該參數置AF_INET;   第二個參數指定要創建的套接字類型,流套接字類型爲SOCK_STREAM、數據報套接字類型爲SOCK_DGRAM;   第三個參數指定應用程序所使用的通信協議。   該函數如果調用成功就返回新創建的套接字的描述符,如果失敗就返回INVALID_SOCKET。套接字描述符是一個整數類型的值。每個進程的進程空間裏都有一個套接字描述符表,該表中存放着套接字描述符和套接字數據結構的對應關係。該表中有一個字段存放新創建的套接字的描述符,另一個字段存放套接字數據結構的地址,因此根據套接字描述符就可以找到其對應的套接字數據結構。每個進程在自己的進程空間裏都有一個套接字描述符表但是套接字數據結構都是在操作系統的內核緩衝裏。   下面是一個創建流套接字的例子: struct protoent *ppe; ppe=getprotobyname("tcp"); SOCKET ListenSocket=socket(PF_INET,SOCK_STREAM,ppe->p_proto);
1、使用UDP編程時,端口採用自動分配,初始值爲1001,運行程序,bind函數報“無權限創建/修改 socket配置”,但是切換到root用戶下,又可以順利的bind。後來嘗試其他端口,發現到1024就可以順利綁定。查資料得知"小於1024的端口號不能被沒有超級用戶權限的進程使用。如果下層網絡沒有分配端口號,則分配一個大於1024的端口號。"。平時看資料只知道1024以上的端口爲用戶使用,1-1023則爲系統保留。卻不清楚是以這種方式來表現,看來只有通過實踐才能加深理解啊!
在套接口中,一個套接字只是用戶程序與內核交互信息的樞紐,它自身沒有太多的信息,也沒有網絡協議地址和端口號等信息,在進行網絡通信的時候,必須把一個套接字與一個地址相關聯,這個過程就是地址綁定的過程。許多時候內核會我們自動綁定一個地址,然而有時用戶可能需要自己來完成這個綁定的過程,以滿足實際應用的需要,最典型的情況是一個服務器進程需要綁定一個衆所周知的地址或端口以等待客戶來連接。這個事由bind的函數完成。
#include<sys/socket.h>
int bind(int sockfd, struct sockaddr* addr, socklen_t addrlen)
返回:0──成功, -1──失敗
參數sockfd 指定地址與哪個套接字綁定,這是一個由之前的socket函數調用返回的套接字。調用bind的函數之後,該套接字與一個相應的地址關聯,發送到這個地址的數據可以通過這個套接字來讀取與使用。 參數addr 指定地址。這是一個地址結構,並且是一個已經經過填寫的有效的地址結構。調用bind之後這個地址與參數sockfd指定的套接字關聯,從而實現上面所說的效果。 參數addrlen 正如大多數socket接口一樣,內核不關心地址結構,當它複製或傳遞地址給驅動的時候,它依據這個值來確定需要複製多少數據。這已經成爲socket接口中最常見的參數之一了。

bind函數並不是總是需要調用的,只有用戶進程想與一個具體的地址或端口相關聯的時候才需要調用這個函數。如果用戶進程沒有這個需要,那麼程序可以依賴內核的自動的選址機制來完成自動地址選擇,而不需要調用bind的函數,同時也避免不必要的複雜度。在一般情況下,對於服務器進程問題需要調用bind函數,對於客戶進程則不需要調用bind函數。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章