ローカルソケットアドレスとソケットの作成後、あなたはバインド関数を呼び出すことができ、一緒にバインドする必要があります。
#include <sys/types.h>
#include <sys/socket.h>
int bind(int sockfd, const struct sockaddr *addr, socklen_t addrlen);
数sockfdソケットの長さに対応するパラメータ、ソケット記述子のソケットの機能に対応するソケットを作成するために使用されるaddrがローカルアドレスである、アドレスはaddrlenはれる構造、成功した場合に実行バインド機能は、そうでない場合、0を返す-1。
ネットワーク通信でサーバーとクライアントは、一般的には、ソケットアドレスを設定するには、次の5つのモードをバインド機能を使用することができます。
- あなたは特別なINADDR用ソケットのIPアドレスを設定した場合、サーバーのポート番号はソケットアドレスを受け入れて指定し、IPアドレスを指定しないと、サーバが機能バインドを呼び出し、任意のネットワークインタフェース接続からクライアントデバイスを受信する意思を表明し、これは、最も頻繁に使用されるサーバーをバインドする方法です。
- ローカルIPアドレスへのソケットのIPアドレスが、サーバは対応するIPアドレスから受信した、特定のネットワークデバイスを示す場合に認識サーバーソケットアドレス指定されたポート番号とIPアドレスが、サーバは、関数バインドを呼び出し顧客インタフェース端子。マシンが1つだけのネットワークインターフェースを有し、第1ケースは、それが何の違いではないが、このマシンは、ネットワーク・デバイス・インターフェースを複数有している場合、我々は、このように受信サーバーの範囲を制限することができます。
- クライアントは、一般的には、クライアントは、自身のポート番号指定したソケットアドレスを持っていないクライアントは、機能はTCPコネクションを接続呼び出したときにそれがないために、システムが自動的に選択されますソケットアドレスのポート番号を指定しますポート番号、および塗りつぶしに対応するエントリ内のローカルソケットアドレスとIPアドレスが、いくつかのケースでは、クライアントが特定のポート番号を使用する必要があります。
- クライアントのIPアドレスとポート番号を指定して、クライアントが指定したネットワークインタフェースと通信用のポートを示します。
- 指定したクライアントのIPアドレスは、クライアントが指定された通信ネットワーク・インターフェース・デバイスを示し、クライアントシステムが自動的に未使用のポート番号を選択します。一般的に、唯一のネットワーク装置を複数有する場合、ホストインターフェイスを使用しました。
C / S | IP | 港 | 説明 |
---|---|---|---|
サーバー | INADDR_ANY | ゼロ以外の値 | 認識サーバのポート番号を指定します。 |
サーバー | ローカルIPアドレス | ゼロ以外の値 | IPアドレスとポート番号が指定されたサーバーに受け入れ |
クライアント | INADDR_ANY | ゼロ以外の値 | クライアントの接続ポート番号を指定します。 |
クライアント | ローカルIPアドレス | ゼロ以外の値 | クライアントのIPアドレスとポート番号を指定します。 |
クライアント | ローカルIPアドレス | 0 | クライアントのIPアドレス |
クライアントを作成する場合、一般的に固定のクライアントのポート番号のような、いくつかの不具合の原因となりますので、特定のポートを使用しなければならない場合を除き、固定クライアントポートを使用しないでください。
- TIME_WAIT状態に最終的には、サーバーと:サーバがアクティブに近い操作を行います。再び、サーバーへのクライアントの接続先は、まだ正確に同じのため、以前の接続ソケットとの接続ので、しかし、理由はTIME_WAIT状態での以前の接続の同じクライアントのポート番号を使用して、姿を消したので、このされていない場合には現在の接続要求はエラーを機能リターンを接続するために、拒否されます。
- クライアントは、手動クローズ操作を実行します。最後にTIME_WAIT状態にクライアントは、クライアントプログラムの再び実装は、クライアントは消えていない、この固定クライアントのポート番号を結合して、しかし、理由はTIME_WAIT状態で以前の接続の作業を継続しますシステムがこのポート番号がまだ占有されていますので、この結合操作は失敗し、関数がバインドにエラーを返します。
[実施例2]ソケットバインドするバインド機能を使用して
アプリケーションのソケット・アドレス・コードは、最初の変数addrが空BZERO構造関数の値を使用して、ソケット関数を使用してソケットを作成し、そして、IPv4のADDRデータ構造の変数を定義し、彼らは、各コンポーネントの構造を提供し、そして最後に、先ほど作成したソケットに、この変数をバインドする関数を呼び出しています。
アプリケーション・コードの例は以下の通り:
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <unistd.h>
#include <stdio.h>
#include <string.h>
#define PORT 5555 //定义端口号
int main(int argc, char *argv[])
{
int sockfd; //定义套接口描述符
struct sockaddr_in addr; //定义 IPv4 套接口地址数据结构 addr
int addr_len = sizeof(struct sockaddr_in);
if(sockfd = socket(AF_INET, SOCK_STREAM,0))<0) //建议一个 socket
{
printf("创建套接字失败!\n");
return 1;
}
bzero(&addr, sizeof(struct sockaddr_in)); //清空表示地址的结构体变量
addr.sin_family = AF_INET; //设置 addr 的成员信息
addr.sin_port = htons(PORT);
addr.sin_addr.s_addr = htonl(INADDR_ANY); //IP地址设为本机IP
if(bind(sockfd, (struct sockaddr *)(&addr), sizeof(strut sockaddrr))<0)
{
printf("绑定端口失败!");
return 1;
}
return 0;
}
プログラムは出力しません。