关于Socket通信客户端是否需要绑定端口号
參見(jiàn)http://blog.chinaunix.net/uid-23193900-id-3199173.html
無(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)使用。
Bind()函數(shù)在成功被調(diào)用時(shí)返回0;出現(xiàn)錯(cuò)誤時(shí)返回"-1"并將errno置為相應(yīng)的錯(cuò)誤號(hào)。需要注意的是,在調(diào)用bind函數(shù)時(shí)一般不要將端口號(hào)置為小于1024的值,因?yàn)?到1024是保留端口號(hào),你可以選擇大于1024中的任何一個(gè)沒(méi)有被占用的端口號(hào)。
?有連接的socket客戶端通過(guò)調(diào)用Connect函數(shù)在socket數(shù)據(jù)結(jié)構(gòu)中保存本地和遠(yuǎn)端信息,無(wú)須調(diào)用bind(),因?yàn)檫@種情況下只需知道目的機(jī)器的IP地址,而客戶通過(guò)哪個(gè)端口與服務(wù)器建立連接并不需要關(guān)心,socket執(zhí)行體為你的程序自動(dòng)選擇一個(gè)未被占用的端口,并通知你的程序數(shù)據(jù)什么時(shí)候打開(kāi)端口。(當(dāng)然也有特殊情況,linux系統(tǒng)中rlogin命令應(yīng)當(dāng)調(diào)用bind函數(shù)綁定一個(gè)未用的保留端口號(hào),還有當(dāng)客戶端需要用指定的網(wǎng)絡(luò)設(shè)備接口和端口號(hào)進(jìn)行通信等等)
總之:
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ù)器的專利。
客戶端進(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ì)幫你選擇。
總結(jié)
以上是生活随笔為你收集整理的关于Socket通信客户端是否需要绑定端口号的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 大龄女,211学校毕业,现找工作迷茫中?
- 下一篇: return与exit()