在完成第一步創(chuàng)建套接字,分配了一個(gè)Socket描述符后,服務(wù)端的第二步就是使用在這個(gè)描述符用Bind綁定
Bind()系統(tǒng)調(diào)用的主要用處:
1.服務(wù)器向系統(tǒng)注冊它的眾所周知的地址。面向連接和無連接的服務(wù)器在接受客戶的請求之前都必須做這一步。
2.客戶可為自己注冊一個(gè)特定的地址,以便服務(wù)器可以用這個(gè)有效的地址送回響應(yīng)。
函數(shù)功能:
將監(jiān)聽套接字綁定到本地地址和端口上。
頭文件:
#include <winsock2.h>
函數(shù)原型:
int bind(int sockfd, const struct sockaddr_in *addr, int addrlen);
返回值類型:
整型
返回值:
成功返回非負(fù)值,失敗返回-1,最常見的錯(cuò)誤一般是端口被占用。需要注意的是,在Linux系統(tǒng)中,1024以下的端口都需要root權(quán)限的程序才可以綁定
參數(shù)說明:
第一個(gè)參數(shù)sockfd為上一步創(chuàng)建socket時(shí)的返回值。
第二個(gè)參數(shù)addr 為 sockaddr 結(jié)構(gòu)體變量的指針。該類型的定義原型如下:
struct sockaddr_in { short sin_family; //協(xié)議族,與前面Socket函數(shù)中提到的一樣,我們這里使用AF_INET u_short sin_port; //端口號,需要 struct in_addr sin_addr; //IP地址,需要使用網(wǎng)絡(luò)序 char sin_zero[8]; //沒有實(shí)際意義,只是為了跟SOCKADDR結(jié)構(gòu)在內(nèi)存中對齊 };
第三個(gè)參數(shù)addrlen為addr 變量的大小,可由 sizeof() 計(jì)算得出。
調(diào)用bind函數(shù)整體代碼的參考代碼
struct sockaddr_in serv_addr //創(chuàng)建結(jié)構(gòu)體變量 servaddr.sin_family=AF_INET; //sin_family指代協(xié)議族和前面講述socket()的第一個(gè)參數(shù)的含義相同,取值也需跟socke函數(shù)第一個(gè)參數(shù)值一樣。 servaddr.sin_port=htons(2000); //sin_port存儲端口號(使用網(wǎng)絡(luò)字節(jié)順序,對于htons()函數(shù)我們還有單獨(dú)一章的說明,2000這個(gè)端口轉(zhuǎn)換為網(wǎng)絡(luò)字節(jié)序列。 理論上端口號的取值范圍為是0到65536,但0到1023的端口一般由系統(tǒng)分配給特定的服務(wù)程序,比如Web 服務(wù)的端口號為 80所以我們的程序要盡量在 1024~65536 之間分配端口號。 servaddr.sin_addr.s_addr=inet_addr("127.0.0.1"); //將iP地址127.0.0.1也就是本機(jī)地址轉(zhuǎn)換為十進(jìn)制 bind(sockfd,(sockaddr*)&servaddr,sizeof(servaddr)); // 將套接字綁定到本地地址和端口上。
C語言網(wǎng)提供由在職研發(fā)工程師或ACM藍(lán)橋杯競賽優(yōu)秀選手錄制的視頻教程,并配有習(xí)題和答疑,點(diǎn)擊了解:
一點(diǎn)編程也不會寫的:零基礎(chǔ)C語言學(xué)練課程
解決困擾你多年的C語言疑難雜癥特性的C語言進(jìn)階課程
從零到寫出一個(gè)爬蟲的Python編程課程
只會語法寫不出代碼?手把手帶你寫100個(gè)編程真題的編程百練課程
信息學(xué)奧賽或C++選手的 必學(xué)C++課程
藍(lán)橋杯ACM、信息學(xué)奧賽的必學(xué)課程:算法競賽課入門課程
手把手講解近五年真題的藍(lán)橋杯輔導(dǎo)課程