Unix-system-calls-bind

提供:Dev Guides
移動先:案内検索

[top]#

[[File:]]

[[File:]]

|Web |This Site

  • 初心者向けのUnix *
  • 高度なUnix *

選択した読書

Copyright©2014 by finddevguides

  Home     References     Discussion Forums     About TP  

bind()-Unix、Linuxシステムコール

[[File:]] image :http://www.finddevguides.com/images/next.gif [next] image:http://www.finddevguides.com/add- this.gif [AddThisソーシャルブックマークボタン]

広告

NAME

bind-名前をソケットにバインドします

概要

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

説明

*bind* ()は、ソケット_sockfd_にローカルアドレス_my_addr_を与えます。 _my_addr_は_addrlen_バイト長です。 従来、これは\(lqソケットへの名前の割り当て。\(rq *socket* (2)で作成されたソケットは、名前空間(アドレスファミリ)に存在しますが、名前は割り当てられていません。

通常、 SOCK_STREAM ソケットが接続を受信する前に、 bind ()を使用してローカルアドレスを割り当てる必要があります( accept (2)を参照)。

名前バインディングで使用される規則は、アドレスファミリによって異なります。 詳細については、セクション7のマニュアルエントリを参照してください。 AF_INET については ip (7)を、 AF_INET6 については ipv6 (7)を、 AF_UNIX については unix (7)を、 AF_APPLETALK については ddp (7)を、を参照AF_PACKET *は *packet (7)、 AF_X25x25 (7)、 AF_NETLINKnetlink (7)を参照してください。

_my_addr_引数に渡される実際の構造は、アドレスファミリによって異なります。 _sockaddr_構造は次のように定義されます:

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

この構造体の唯一の目的は、_my_addr_で渡された構造体ポインターをキャストして、コンパイラの警告を回避することです。 次の例は、Unix( AF_UNIX )ドメインでソケットをバインドするときにこれがどのように行われるかを示しています。

#include <sys/socket.h> #include <sys/un.h> #include <stdlib.h> #include <stdlio.h> #define MY_SOCK_PATH "/somepath" int main(int argc, char *argv[]) { int sfd; struct sockaddr_un addr; sfd = socket(AF_UNIX, SOCK_STREAM, 0); if (sfd == -1) { perror("socket"); exit(EXIT_FAILURE); } memset(&addr, 0, sizeof(struct sockaddr_un)); /*Clear structure*/ addr.sun_family = AF_UNIX; strncpy(addr.sun_path, MY_SOCK_PATH, sizeof(addr.sun_path) - 1); if (bind(sfd, (struct sockaddr *) &addr, sizeof(struct sockaddr_un)) == -1) { perror("bind"); exit(EXIT_FAILURE); } ... }

返り値

成功すると、ゼロが返されます。 エラーの場合、-1が返され、_errno_が適切に設定されます。

エラー

エラーコード

説明

*EACCES*

アドレスは保護されており、ユーザーはスーパーユーザーではありません。

*EADDRINUSE*

指定されたアドレスはすでに使用されています。

*EBADF*

_sockfd_は有効な記述子ではありません。

*EINVAL*

ソケットはすでにアドレスにバインドされています。

*ENOTSOCK*

_sockfd_は、ソケットではなくファイルの記述子です。

次のエラーは、UNIXドメイン( AF_UNIX )ソケットに固有のものです。

*EACCES*

パスプレフィックスのコンポーネントに対する検索許可が拒否されました。 ( path_resolution (2)も参照してください。)

*EADDRNOTAVAIL*

存在しないインターフェイスが要求されたか、要求されたアドレスがローカルではありませんでした。

*EFAULT*

_my_addr_は、ユーザーのアクセス可能なアドレス空間の外側を指します。

*EINVAL*

_addrlen_が間違っているか、ソケットが AF_UNIX ファミリーにありませんでした。

*ELOOP*

_my_addr_の解決中に検出されたシンボリックリンクが多すぎます。

*ENAMETOOLONG*

_my_addr_が長すぎます。

*ENOENT*

ファイルが存在しません。

*ENOMEM*

カーネルメモリが不足していました。

*ENOTDIR*

パスプレフィックスのコンポーネントはディレクトリではありません。

*EROFS*

ソケットiノードは、読み取り専用ファイルシステムに常駐します。

BUGS

透過プロキシオプションは説明されていません。

準拠

SVr4、4.4BSD( bind ()関数は4.2BSDで初めて登場しました)。

NOTE

*bind* ()の3番目の引数は、実際には_int_です(これは4.x BSDとlibc4およびlibc5が持っているものです)。 POSIXの混乱により、現在_socklen_t_が生じ、これもglibcで使用されています。 *accept* (2)も参照してください。

関連項目

[[File:]] image :http://www.finddevguides.com/images/next.gif [next] [[File:]]

広告

  
Advertisements