您好,登錄后才能下訂單哦!
小編給大家分享一下C語言中bind()函數怎么用,相信大部分人都還不怎么了解,因此分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后大有收獲,下面讓我們一起去了解一下吧!
在建立套接字文件描述符成功后,需要對套接字進行地址和端口的綁定,才能進行數據的接收和發送操作。
bind()函數將長度為addlen的struct sockadd類型的參數my_addr與sockfd綁定在一起,將sockfd綁定到某個端口上,如果使用connect()函數則沒有綁定的必要。綁定的函數原型如下:
#include<sys/types.h> #include<sys/socket.h> int bind(int sockfd, const struct sockaddr *my_addr, socklen_t addrlen);
bind()函數有3個參數。
第1個參數sockfd是用socket()函數創建的文件描述符。
第2個參數my_addr是指向一個結構為sockaddr參數的指針,sockaddr中包含了地址、端口和IP地址的信息。在進行地址綁定的時候,需要弦將地址結構中的IP地址、端口、類型等結構struct sockaddr中的域進行設置之后才能進行綁定,這樣進行綁定后才能將套接字文件描述符與地址等接合在一起。
第3個參數addrlen是my_addr結構的長度,可以設置成sizeof(struct sockaddr)。使用sizeof(struct sockaddr)來設置套接字的類型和其對已ing的結構。
bind()函數的返回值為0時表示綁定成功,-1表示綁定失敗,errno的錯誤值如表1所示。
表1 bind的errno值及含義
值 | 含義 | 備注 |
---|---|---|
EADDRINUSE | 給定地址已經使用 | |
EBADF | sockfd不合法 | |
EINVAL | sockfd已經綁定到其他地址 | |
ENOTSOCK | sockfd是一個文件描述符,不是socket描述符 | |
EACCES | 地址被保護,用戶的權限不足 | |
EADDRNOTAVAIL | 接口不存在或者綁定地址不是本地 | UNIX協議族,AF_UNIX |
EFAULT | my_addr指針超出用戶空間 | UNIX協議族,AF_UNIX |
EINVAL | 地址長度錯誤,或者socket不是AF_UNIX族 | UNIX協議族,AF_UNIX |
ELOOP | 解析my_addr時符號鏈接過多 | UNIX協議族,AF_UNIX |
ENAMETOOLONG | my_addr過長 | UNIX協議族,AF_UNIX |
ENOENT | 文件不存在 | UNIX協議族,AF_UNIX |
ENOMEN | 內存內核不足 | UNIX協議族,AF_UNIX |
ENOTDIR | 不是目錄 | UNIX協議族,AF_UNIX |
EROFS | socket節點應該在制度文件系統上 | UNIX協議族,AF_UNIX |
先建立一個UNIX族的流類型套接字,然后將套接字地址和套接字文件描述符進行綁定。
#define MY_SOCK_PATH "/somepath" int main(int argc, char *argv[]) { int sfd; struct sockaddr_un addr; //AF_UNIX對應的結構 sfd = socket(AF_UNIX, SOCK_STREAM, 0); //初始化一個AF_UNIX族的流類型socket if (sfd == -1) { //檢查是否正常初始化socket perror("socket"); exit(EXIT_FAILURE); } memset(&addr, 0, sizeof(struct sockaddr_un));//將變量addr置0 addr.sun_family = AF_UNIX; //協議族為AF_UNIX strncpy(addr.sun_path, MY_SOCK_PATH, sizeof(addr.sun_path)-1); //復制路徑到地址結構 perror("bind"); exit(EXIT_FAILURE); } ... //數據接收發送及處理過程 close(sfd); //關閉套接字文件描述符 }
使用結構struct sockaddr_in綁定一個AF_INET族的流協議,先將結構struct sockaddr_in的sin_family設置為AF_INET,然后設置端口,接著設置一個IP地址,最后進行綁定。
#define MYPORT 3490 int main(int argc, char *argv[]) { int sockfd; //套接字文件描述符變量 struct sockaddr_in my_addr; //以太網套接字地址結構 sockfd = socket(AF_INET, SOCK_STREAM, 0); //初始化socket if (sockfd == -1) { peeror("socket"); //檢查是否正常初始化socket exit(EXIT_FAILURE); } my_addr.sin_family = AF_INET; //地址結構的協議族 my_addr.sin_port = htons(MYPORT); //地址結構的端口地址,網絡字節序 my_addr.sin_addr.s_addr = inet_addr("192.168.1.150"); //IP,將字符串的IP地址轉化為網絡字節序 bzero(&(my_addr.sin_zero), 8); //將my_addr.sin_zero置為0 if (bind(sockfd, (struct sockaddr *) &my_addr, sizeof(struct sockaddr)) == -1) { // 判斷是否綁定成功 perror("bind"); exit(EXIT_FAILURE); } ... //接收和發送數據,進行數據處理 close(sockfd); //關閉套接字文件描述符 }
以上是“C語言中bind()函數怎么用”這篇文章的所有內容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內容對大家有所幫助,如果還想學習更多知識,歡迎關注億速云行業資訊頻道!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。