5.3. bind() ---在那個端口?
一旦你有一個套接字,你可能要將套接字和機器上的一定的端口關聯起來。(如果你想用listen()來偵聽一定端口的數據,這是必要一步---比如,開始玩多人網絡游戲告訴你要連接到192.168.5.10的3490端口) 使用的端口號是由內核相匹配傳入的數據包到某個進程的socket描述符。如果你只想用connect()(因為你是客戶端,不是服務器端),那麼這個步驟沒有必要。但是無論如何,請繼續讀下去。
下面是他的原型:
#include<sys/types.h>
#include<sys/socket.h>
int bind(intsockfd, struct sockaddr *my_addr, int addrlen);
sockfd是調用 socket() 返回的文件描述符。my_addr 是指向數據結構 struct sockaddr 的指針,它保存你的地址(即端口和 IP 地址) 信息。addlen是這個地址(struct socketaddr)的長度。
簡單得很不是嗎? 再看看例子:
struct addrinfohints, *res;
int sockfd;
// first, load upaddress structs with getaddrinfo():
memset(&hints,0, sizeof(hints));
hints.ai_family =AF_UNSPEC; // use IPv4 or IPv6, whichever
hints.ai_socktype= SOCK_STREAM; // TCP
hints.ai_flags =AI_PASSIVE; // fill in myIP for me
getaddrinfo(NULL, “3490”, &hints, &res);
// make a socket
sockfd =socket(res->ai_family, res->ai_socktype, res->ai_protocol);
// bind it to theport we passed in to getaddrinfo():
bind(sockfd,res->ai_addr, res->ai_addrlen);
通過使用AI_PASSIVE標志,我告訴程序綁定到運行它的主機的IP 。如果你想綁定到一個特定的本地IP地址,刪除AI_PASSIVE然後賦值給getaddrinfo()函數的第一個參數。
bind()如果返回-1表示出錯。
講解舊代碼部分省略…
摘自 xiaobin_HLJ80的專欄