亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

socket編程之bind()函數(shù)使用示例詳解

 更新時(shí)間:2022年10月13日 15:43:09   作者:蟬沐風(fēng)  
這篇文章主要為大家介紹了socket編程之bind()函數(shù)使用示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪

正文

當(dāng)你創(chuàng)建了socket之后,你會(huì)想要把這個(gè)socket和你本機(jī)上的某個(gè)端口號(hào)(port)進(jìn)行關(guān)聯(lián)。

端口號(hào)是內(nèi)核用來確認(rèn)將收到的數(shù)據(jù)包交給哪個(gè)具體進(jìn)程的socket descriptor的依據(jù)。

通常在寫服務(wù)端程序的時(shí)候我們才需要進(jìn)行關(guān)聯(lián),客戶端程序不需要我們手動(dòng)綁定端口,直接connect()就好了。

端口號(hào)具體是怎么綁定

#include <sys/types.h>
#include <sys/socket.h>
int bind(int sockfd, struct sockaddr *my_addr, int addrlen);

sockfdsocket()返回的一個(gè)socket file descriptor;my_addr是一個(gè)指向包含了你的端口號(hào)和IP地址信息的struct sockaddr指針;addrlen是以字節(jié)為單位的地址長度。

接下來,我們給出一個(gè)例子,它將socket和我本機(jī)的3490端口進(jìn)行綁定:

struct addrinfo hints, *res;
int sockfd;
// first, load up address structs with getaddrinfo():
memset(&hints, 0, sizeof hints);
hints.ai_family = AF_UNSPEC;  // use IPv4 or IPv6, whichever
hints.ai_socktype = SOCK_STREAM;
hints.ai_flags = AI_PASSIVE;     // fill in my IP for me
getaddrinfo(NULL, "3490", &hints, &res);
// make a socket:
sockfd = socket(res->ai_family, res->ai_socktype, res->ai_protocol);
// bind it to the port we passed in to getaddrinfo():
bind(sockfd, res->ai_addr, res->ai_addrlen);

通過使用AI_PASSIVE標(biāo)識(shí),程序會(huì)自動(dòng)綁定它所在的程序的IP。如果你想精確綁定到本機(jī)的某一個(gè)IP地址,你就不能用AI_PASSIVE了,而且你還得把getaddrinfo()的第一個(gè)參數(shù)從NULL改為你想綁定的那個(gè)IP地址。

bind()和其他系統(tǒng)調(diào)用一樣,發(fā)生錯(cuò)誤的時(shí)候返回-1,并且會(huì)設(shè)置全局變量errno的值。

很多老代碼都會(huì)在調(diào)用bind()之前手動(dòng)封裝 struct sockaddr_in 。當(dāng)然,這里綁定的肯定是IPv4的地址,如果你想使用IPv6,你照樣可以手動(dòng)封裝struct sockaddr_in6 ,但是極力不推薦你這么做。你還是應(yīng)該老老實(shí)實(shí)用 getaddrinfo() ,這樣更優(yōu)雅、更簡單。

老代碼

// !!! THIS IS THE OLD WAY !!!
int sockfd;
struct sockaddr_in my_addr;
sockfd = socket(PF_INET, SOCK_STREAM, 0);
my_addr.sin_family = AF_INET;
my_addr.sin_port = htons(MYPORT);     // short, network byte order
my_addr.sin_addr.s_addr = inet_addr("10.12.110.57");
memset(my_addr.sin_zero, '\0', sizeof my_addr.sin_zero);
bind(sockfd, (struct sockaddr *)&my_addr, sizeof my_addr);

上面這個(gè)代碼中,你依然可以把my_addr.sin_addr.s_addr設(shè)置為 INADDR_ANY ,它的作用上文提到的AI_PASSIVE一樣,都會(huì)讓代碼自動(dòng)綁定到本機(jī)IP。 INADDR_ANY 的IPv6版本是一個(gè)全局變量,叫in6addr_any,這個(gè)變量會(huì)被指定給你的 struct sockaddr_in6sin6_addr字段。

你也可以使用IN6ADDR_ANY_INIT這個(gè)宏來初始化變量

調(diào)用bind()時(shí)有一件事需要你特別注意:不要使用1024以下的端口號(hào),因?yàn)檫@些端口號(hào)是被保留使用的,除非你是超級(jí)管理員。除了1024以下的,1025~65535之間的隨便用(其他程序占用的除外)。

有時(shí)候,你明明重新運(yùn)行了你的服務(wù)端程序,但是bind()報(bào)錯(cuò)了,提示你“Address already in use”。這是為什么?理論上重啟之后端口就會(huì)被釋放啊!好吧,這是因?yàn)橛幸恍┻B接到socket的連接還懸在內(nèi)核中,就是它們占用了這個(gè)端口號(hào)。

端口被占用的問題解決

你可以等一分鐘左右讓它們自行消失,或者在你的代碼加這么幾行:

int yes=1;
//char yes='1'; // Solaris people use this
// lose the pesky "Address already in use" error message
if (setsockopt(listener,SOL_SOCKET,SO_REUSEADDR,&yes,sizeof yes) == -1) {
    perror("setsockopt");
    exit(1);
} 

這樣就不會(huì)再出現(xiàn)端口被占用的問題了。

以上就是socket編程之bind()函數(shù)使用示例詳解的詳細(xì)內(nèi)容,更多關(guān)于socket編程bind函數(shù)的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • C++中move的使用及說明

    C++中move的使用及說明

    這篇文章主要介紹了C++中move的使用及說明,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-08-08
  • C語言運(yùn)用函數(shù)的遞歸實(shí)現(xiàn)漢諾塔

    C語言運(yùn)用函數(shù)的遞歸實(shí)現(xiàn)漢諾塔

    遞歸(recursive)函數(shù)是“自己調(diào)用自己”的函數(shù),無論是采用直接或間接調(diào)用方式。間接遞歸意味著函數(shù)調(diào)用另一個(gè)函數(shù)(然后可能又調(diào)用第三個(gè)函數(shù)等),最后又調(diào)用第一個(gè)函數(shù)。因?yàn)楹瘮?shù)不可以一直不停地調(diào)用自己,所以遞歸函數(shù)一定具備結(jié)束條件
    2022-07-07
  • Visual Studio 2019配置qt開發(fā)環(huán)境的搭建過程

    Visual Studio 2019配置qt開發(fā)環(huán)境的搭建過程

    這篇文章主要介紹了Visual Studio 2019配置qt開發(fā)環(huán)境的搭建過程,本文圖文并茂給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-03-03
  • C++ Primer中&、*符號(hào)的多重定義與int *p和int* p的區(qū)別講解

    C++ Primer中&、*符號(hào)的多重定義與int *p和int* p的區(qū)別講解

    今天小編就為大家分享一篇關(guān)于C++Primer中&、*符號(hào)的多重定義與int *p和int* p的區(qū)別講解,小編覺得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來看看吧
    2019-04-04
  • C++二分法在數(shù)組中查找關(guān)鍵字的方法

    C++二分法在數(shù)組中查找關(guān)鍵字的方法

    這篇文章主要介紹了C++二分法在數(shù)組中查找關(guān)鍵字的方法,涉及C++數(shù)組查找算法的相關(guān)技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下
    2015-09-09
  • 聊聊C語言中sizeof運(yùn)算符的一個(gè)陷阱

    聊聊C語言中sizeof運(yùn)算符的一個(gè)陷阱

    在C語言中,sizeof()是一個(gè)判斷數(shù)據(jù)類型或者表達(dá)式長度的運(yùn)算符,下面這篇文章主要給大家介紹了關(guān)于C語言中sizeof運(yùn)算符的一個(gè)陷阱的相關(guān)資料,文中通過實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2022-11-11
  • 如何用C++求兩個(gè)數(shù)的最大公約數(shù)和最小公倍數(shù)

    如何用C++求兩個(gè)數(shù)的最大公約數(shù)和最小公倍數(shù)

    最大公約數(shù)是指兩個(gè)或多個(gè)整數(shù)共有約數(shù)中,最大的一個(gè)約數(shù),常用的方法是歐幾里得算法,也叫輾轉(zhuǎn)相除法,下面這篇文章主要給大家介紹了關(guān)于如何用C++求兩個(gè)數(shù)的最大公約數(shù)和最小公倍數(shù)的相關(guān)資料,需要的朋友可以參考下
    2023-01-01
  • C語言實(shí)現(xiàn)簡易網(wǎng)絡(luò)聊天室

    C語言實(shí)現(xiàn)簡易網(wǎng)絡(luò)聊天室

    這篇文章主要為大家詳細(xì)介紹了C語言實(shí)現(xiàn)簡易網(wǎng)絡(luò)聊天室,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-06-06
  • 詳解C++編程中數(shù)組的基本用法

    詳解C++編程中數(shù)組的基本用法

    這篇文章主要介紹了C++編程中數(shù)組的基本用法,包括數(shù)組的初始化等基本知識(shí),需要的朋友可以參考下
    2016-01-01
  • C++ STL 內(nèi) std::{bind/tuple/function} 簡單實(shí)現(xiàn)

    C++ STL 內(nèi) std::{bind/tuple/function} 簡單實(shí)現(xiàn)

    這篇文章主要介紹了C++ STL 內(nèi) std::{bind/tuple/function} 簡單實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-02-02

最新評(píng)論