socket編程之bind()函數



名稱

bind()

把名字和套接字相關聯

使用格式

#include <sys/types.h>

#include <sys/socket.h>

int bind( int sockfd, const struct sockaddr * addr, socklen_t * addrlen);

功能描述

當用socket()函數創建套接字以后,套接字在名稱空間(網絡地址族)中存在,但沒有任何地址給它賦值。bind()把用addr指定的地址賦值給用文件描述符代表的套接字sockfdaddrlen指定了以addr所指向的地址結構體的字節長度。一般來說,該操作稱為“給套接字命名”。

通常,在一個SOCK_STREAM套接字接收連接之前,必須通過bind()函數用本地地址為套接字命名。

備注:

調用bind()函數之后,為socket()函數創建的套接字關聯一個相應地址,發送到這個地址的數據可以通過該套接字讀取與使用。

備注:

bind()函數並不是總是需要調用的,只有用戶進程想與一個具體的地址或端口相關聯的時候才需要調用這個函數。如果用戶進程沒有這個需要,那么程序可以依賴內核的自動的選址機制來完成自動地址選擇,而不需要調用bind()函數,同時也避免不必要的復雜度。在一般情況下,對於服務器進程問題需要調用bind()函數,對於客戶進程則不需要調用bind()函數。

套接字的命名規則在不同的網絡協議族中有所不同。對於AF_INET參看ip(),對於AF_INET6參看ipv6(),對於AF_INET6參看unix(),對於AF_APPLETALK參看ddp(),對於AF_APPLETALK參看packet(),對於AF_X25參看x25(),對於AF_NETLINK參看netlink()。

傳送給參數addr的實際結構依賴於網絡協議族。sockaddr結構定義為如下格式:

struct sockaddr {
    sa_family_t     sa_family;
    char            sa_data[14];
}

該結構的唯一目的是強制結構指針在addr參數中傳送,以避免編譯過程出現warning。參看如下實例。

返回值

成功,返回0;出錯,返回-1,相應地設定全局變量errno。

錯誤

EACCESS

地址空間受保護,用戶不具有超級用戶的權限。

EADDRINUSE

給定的地址正被使用。

實例:

下面的實例演示了如何在UNIX域中綁定流套接字,並接收連接。

#include <sys/socket.h>
#include <sys/un.h>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>

#define MY_SOCK_PATH "/somepath"
#define LISTEN_BACKLOG 50

#define handle_error(msg) \
    do { perror(msg); exit(EXIT_FAILURE); } while (0)

int
main(int argc, char *argv[])
{
    int sfd, cfd;
    struct sockaddr_un my_addr, peer_addr;
    socklen_t peer_addr_size;

   sfd = socket(AF_UNIX, SOCK_STREAM, 0);
    if (sfd == -1)
        handle_error("socket");

   memset(&my_addr, 0, sizeof(struct sockaddr_un));
                        /* Clear structure */
    my_addr.sun_family = AF_UNIX;
    strncpy(my_addr.sun_path, MY_SOCK_PATH,
            sizeof(my_addr.sun_path) - 1);

   if (bind(sfd, (struct sockaddr *) &my_addr,
            sizeof(struct sockaddr_un)) == -1)
        handle_error("bind");

   if (listen(sfd, LISTEN_BACKLOG) == -1)
        handle_error("listen");

   /* Now we can accept incoming connections one
       at a time using accept(2) */

   peer_addr_size = sizeof(struct sockaddr_un);
    cfd = accept(sfd, (struct sockaddr *) &peer_addr,
                 &peer_addr_size);
    if (cfd == -1)
        handle_error("accept");

   /* Code to deal with incoming connection(s)... */

   /* When no longer required, the socket pathname, MY_SOCK_PATH
       should be deleted using unlink(2) or remove(3) */
}

原文地址:http://linux.die.net/man/2/bind



免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM