溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

C語言中bind()函數(shù)怎么用

發(fā)布時間:2021-08-23 10:03:54 來源:億速云 閱讀:486 作者:小新 欄目:開發(fā)技術

小編給大家分享一下C語言中bind()函數(shù)怎么用,相信大部分人都還不怎么了解,因此分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后大有收獲,下面讓我們一起去了解一下吧!

bind()函數(shù)介紹

       在建立套接字文件描述符成功后,需要對套接字進行地址和端口的綁定,才能進行數(shù)據(jù)的接收和發(fā)送操作。

函數(shù)原型

       bind()函數(shù)將長度為addlen的struct sockadd類型的參數(shù)my_addr與sockfd綁定在一起,將sockfd綁定到某個端口上,如果使用connect()函數(shù)則沒有綁定的必要。綁定的函數(shù)原型如下:

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

bind()函數(shù)有3個參數(shù)。

  • 第1個參數(shù)sockfd是用socket()函數(shù)創(chuàng)建的文件描述符。

  • 第2個參數(shù)my_addr是指向一個結(jié)構為sockaddr參數(shù)的指針,sockaddr中包含了地址、端口和IP地址的信息。在進行地址綁定的時候,需要弦將地址結(jié)構中的IP地址、端口、類型等結(jié)構struct sockaddr中的域進行設置之后才能進行綁定,這樣進行綁定后才能將套接字文件描述符與地址等接合在一起。

  • 第3個參數(shù)addrlen是my_addr結(jié)構的長度,可以設置成sizeof(struct sockaddr)。使用sizeof(struct sockaddr)來設置套接字的類型和其對已ing的結(jié)構。
    bind()函數(shù)的返回值為0時表示綁定成功,-1表示綁定失敗,errno的錯誤值如表1所示。

表1 bind的errno值及含義

含義備注
EADDRINUSE給定地址已經(jīng)使用
EBADFsockfd不合法
EINVALsockfd已經(jīng)綁定到其他地址
ENOTSOCKsockfd是一個文件描述符,不是socket描述符
EACCES地址被保護,用戶的權限不足
EADDRNOTAVAIL接口不存在或者綁定地址不是本地UNIX協(xié)議族,AF_UNIX
EFAULTmy_addr指針超出用戶空間UNIX協(xié)議族,AF_UNIX
EINVAL地址長度錯誤,或者socket不是AF_UNIX族UNIX協(xié)議族,AF_UNIX
ELOOP解析my_addr時符號鏈接過多UNIX協(xié)議族,AF_UNIX
ENAMETOOLONGmy_addr過長UNIX協(xié)議族,AF_UNIX
ENOENT文件不存在UNIX協(xié)議族,AF_UNIX
ENOMEN內(nèi)存內(nèi)核不足UNIX協(xié)議族,AF_UNIX
ENOTDIR不是目錄UNIX協(xié)議族,AF_UNIX
EROFSsocket節(jié)點應該在制度文件系統(tǒng)上UNIX協(xié)議族,AF_UNIX

示例1

先建立一個UNIX族的流類型套接字,然后將套接字地址和套接字文件描述符進行綁定。

#define MY_SOCK_PATH "/somepath"
int main(int argc, char *argv[])
{
    int sfd;
    struct sockaddr_un addr; //AF_UNIX對應的結(jié)構
    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; //協(xié)議族為AF_UNIX
    strncpy(addr.sun_path, MY_SOCK_PATH, sizeof(addr.sun_path)-1); //復制路徑到地址結(jié)構
    perror("bind");
    exit(EXIT_FAILURE);
    }
    ... //數(shù)據(jù)接收發(fā)送及處理過程
    close(sfd); //關閉套接字文件描述符
}

示例2

使用結(jié)構struct sockaddr_in綁定一個AF_INET族的流協(xié)議,先將結(jié)構struct sockaddr_in的sin_family設置為AF_INET,然后設置端口,接著設置一個IP地址,最后進行綁定。

#define MYPORT 3490
int main(int argc, char *argv[])
{
    int sockfd; //套接字文件描述符變量
    struct sockaddr_in my_addr; //以太網(wǎng)套接字地址結(jié)構

    sockfd = socket(AF_INET, SOCK_STREAM, 0); //初始化socket
    if (sockfd == -1) {
    peeror("socket"); //檢查是否正常初始化socket
    exit(EXIT_FAILURE);
    }
    my_addr.sin_family = AF_INET; //地址結(jié)構的協(xié)議族
    my_addr.sin_port = htons(MYPORT); //地址結(jié)構的端口地址,網(wǎng)絡字節(jié)序
    my_addr.sin_addr.s_addr = inet_addr("192.168.1.150"); //IP,將字符串的IP地址轉(zhuǎn)化為網(wǎng)絡字節(jié)序
    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);
    }
    ... //接收和發(fā)送數(shù)據(jù),進行數(shù)據(jù)處理
    close(sockfd); //關閉套接字文件描述符
}

以上是“C語言中bind()函數(shù)怎么用”這篇文章的所有內(nèi)容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內(nèi)容對大家有所幫助,如果還想學習更多知識,歡迎關注億速云行業(yè)資訊頻道!

向AI問一下細節(jié)

免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權內(nèi)容。

AI