無(wú)連接的socket的客戶端和服務(wù)端以及面向連接的socket的服務(wù)端通過(guò)調(diào)用bind函數(shù)來(lái)配置本地信息,。使用bind函數(shù)時(shí),,通過(guò)將my_addr.sin_port置為0,函數(shù)會(huì)自動(dòng)為你選擇一個(gè)未占用的端口來(lái)使用,。 總之:
1.需要在建立連接前就知道端口的話,需要 bind 2.需要通過(guò)指定的端口來(lái)通訊的話,,需要 bind 具體到上面那兩個(gè)程序,,本來(lái)用的是TCP,客戶端就不用綁定端口了,,綁定之后只能運(yùn)行一個(gè)client的程序?qū)儆谧约喝藶樵O(shè)定的障礙,,而從服務(wù)器那邊得到的客戶機(jī)連接端口號(hào)(是系統(tǒng)自動(dòng)分配的)與這邊客戶機(jī)綁定的端口號(hào)根本是不相關(guān)的,所以客戶端綁定也就失去了意義,。 首先,服務(wù)器和客戶端都可以bind,,bind并不是服務(wù)器的專(zhuān)利,。
客戶端進(jìn)程bind端口:由進(jìn)程選擇一個(gè)端口去連服務(wù)器,(如果默認(rèn)情況下,,調(diào)用bind函數(shù)時(shí),,內(nèi)核指定的端口是同一個(gè),那么調(diào)用多個(gè)調(diào)用了bind()的client程序,,會(huì)出現(xiàn)端口被占用的錯(cuò)誤)注意這里的端口是客戶端的端口,。如果不分配就表示交給內(nèi)核去選擇一個(gè)可用端口。
客戶端進(jìn)程bind IP地址:相當(dāng)于為發(fā)送出去的IP數(shù)據(jù)報(bào)分配了源IP地址,,但交給進(jìn)程分配IP地址的時(shí)候(就是這樣寫(xiě)明了bind IP地址的時(shí)候)這個(gè)IP地址必須是主機(jī)的一個(gè)接口,,不能分配一個(gè)不存在的IP。如果不分配就表示由內(nèi)核根據(jù)所用的輸出接口來(lái)選擇源IP地址,。
一般情況下客戶端是不用調(diào)用bind函數(shù)的,,一切都交給內(nèi)核搞定,YES,!
服務(wù)端進(jìn)程bind端口:基本是必須要做的事情,,比如一個(gè)服務(wù)器啟動(dòng)時(shí)(比如freebsd),它會(huì)一個(gè)一個(gè)的捆綁眾所周知的端口來(lái)提供服務(wù),,同樣,,如果bind了一個(gè)端口就表示我這個(gè)服務(wù)器會(huì)在這個(gè)端口提供一些“特殊服務(wù)”,。
服務(wù)端進(jìn)程bind IP地址:目的是限制了服務(wù)端進(jìn)程創(chuàng)建的socket只接受那些目的地為此IP地址的客戶鏈接,一般一個(gè)服務(wù)器程序里都有
servaddr.sin_addr.s_addr = htonl(INADDR_ANY); // 只是針對(duì)IP4,,IP6代碼不太一樣 這樣一句話,,意思就是:我不指定客戶端的IP,隨便連,,來(lái)者不拒,! 總之只要你bind時(shí)候沒(méi)有指定哪一項(xiàng)(置為0),內(nèi)核會(huì)幫你選擇,。
注意:只能對(duì)一個(gè)socket描述符綁定一次,,不能綁定多次,除非前面已經(jīng)將該描述符close了,。反過(guò)來(lái)一個(gè)端口也只能被綁定到同一個(gè)socket描述符上,,除非他們使用的不同的協(xié)議。
|
|