ソケットの作成と接続

「すべてソケット」!

主な原則は、ソケットのソケット接続を作成することで、データを送受信します。

 

ソケットサーバーとクライアントは、プロセスの実現には二つの部分に分かれています。

サーバー側:

  どのようにそれが動作:ソケットを作成するソケット関数を呼び出し、構造体宣言エンティティのsockaddr_in構造体;ソケット番号呼び出しの後にエンティティをバインドすると、バインドに、関数呼び出しがパッシブリスニングにソケットセットを作成します(いわゆるパッシブモニタリング、ある聞きますクライアントは「スリープ」状態にソケットを要求すると、クライアントの要求を受信した場合にのみ、ソケットがされる要求に応答する「ウェイクアップ」という意味)が存在しない場合、その呼監視するための機能ポートを受け入れます。クライアントから送信されたメッセージを受信すると、ソケットは、クライアントのIP +ポートバインディングソケット番号、2つのプロセス間の接続を確立するには、この時間に返されます。ドキュメントの操作は、読み取り/書き込みなど(関わらず、Linuxと一般的なファイルでソケットファイルの、ため)ことができます。トランシーバー関数呼び出しの終了後に運転を終了します。

注:()を受け入れるまで実行を継続しますだけで、リスニング状態にソケットを聞かせて本当にクライアントの要求を受信しない、聞いて()のコードの後ろに()を聞きます。受け入れる()(コードを実行することはできません後)新しい要求が来るまで、実行をブロックします。

クライアント:

  どのようにそれが動作:ソケットを作成するソケット関数を呼び出し、次にIPソケット番号とサーバ+ポートバインディング、そしてあなたは、ファイルの読み取り/書き込みと同じように操作することができ、作業の終了後にソケットを閉じるには、Close関数を呼び出します。

関数の説明:

INTソケット(INT AF、int型、INTプロトコル)。

すなわち、一般にAF_INETとAF_INET6使用するIPアドレス・タイプ、グループアドレス(アドレスファミリー)、AF 1。AFは、「アドレスファミリー」速記で、INETは「Inetnet」速記です。AF_INETアドレスは例えば127.0.0.1はIPv4を示し、AF_INET6 IPv6アドレス、例えば1030 :: C9B4として:FF12:48AA: 1A2B。
私たちは頻繁にチュートリアルの後半で使用される、それは特別なIPアドレス、ローカルアドレス表現で、127.0.0.1を覚えておく必要があります。
2.データ伝送の種類、及び一般的に使用されるSOCK_STREAM SOCK_DGRAM
3プロトコルは、一般IPPROTO_TCPとIPPTOTO_UDP、それぞれ、TCPトランスポート・プロトコルとUDPトランスポートプロトコルを使用する、伝送プロトコルを表します。

 

int型のバインド(int型靴下、構造体のsockaddr * addrは、のsocklen_t addrlenは)。 

(int型靴下、構造体のsockaddr * serv_addr、のsocklen_t addrlenは)接続INT。 

ソケットファイルディスクリプタ1.靴下

2. addrがポインタ変数のsockaddr構造体であります

sizeofによって可変ADDRサイズとして導出3 addrlenはは、()が算出されます

 

int型(int型の靴下、int型バックログ)を聞きます。 

1.靴下は、ソケットの監視状態に入るために必要とされます

リクエストキューの最大の長さのため2.バックログ。

 

int型受け入れる(int型の靴下、構造体のsockaddr * addrは、のsocklen_tは* addrlenは)

クライアントと通信するための新しいソケットを返す)(受け入れます

1.靴下は、サーバー側のソケットであります

クライアントのIPアドレスとポート番号の保存2. ADDR

3. addrlenははADDRのバイト長であります

区別に注意してください。リアとクライアントの通信は、ソケットの新世代を使用する場合は、代わりに元のサーバーのソケット。

 

サンプルコード:

サーバー側:

書式#include <stdio.hに>

書式#include <stdlib.h>に含ま

書式#include <string.hの>

書式#include <errno.hを>

書式#include <SYS / types.h>に

書式#include <sysの/ socket.h>に

書式#include <netinetの/ in.h>

書式#include <unistd.h>

 

#define MAXLINE 4096

 

INTメイン(int型ARGC、チャー** ARGV){

    int型listenfd、connfd。

    servaddrのsockaddr_in構造体。

    チャーバフ[4096]。

    int型のn;

 

    (==)(listenfd =ソケット(AF_INET、SOCK_STREAM、0)-1)であれば{

        printf( "ソケットエラーを作成する:%S(エラー番号:%d)は\ n" は、はstrerror(errnoに)、errnoに)。

        0を返します。

    }

 

    memset(&servaddr、0、はsizeof(servaddr))。

    servaddr.sin_family = AF_INET;

    servaddr.sin_addr.s_addr = htonl(INADDR_ANY)。

    servaddr.sin_port = htons(6666)。

 

    IF(バインド(listenfd、(構造体のsockaddr *)&servaddr、はsizeof(servaddr))== -1){

        printf( "バインドソケットエラー:%S(エラー番号:%d)は\ n" は、はstrerror(errnoに)、errnoに)。

        0を返します。

    }

 

    (聴く(listenfd、10)== -1)の場合{

        printf( "ソケットエラーを聞く:%sの(エラー番号:%d)は\ n" は、はstrerror(errnoに)、errnoに);

        0を返します。

    }

 

    printf( "======クライアントの要求を待って====== \ N");

    一方、(1){

        IF((connfd =受け入れる(listenfd、(いるsockaddr *)NULL、NULL))== -1){

            printf( "ソケットエラーを受け入れる:%S(エラー番号:%のD)" はstrerror(errnoに)、errnoに)。

            継続する;

        }

        N = RECV(connfd、バフ、MAXLINE、0);

        バフ[N] = '\ 0'。

        printf( "クライアントからのrecv MSG:%sの\ n" は、バフ)。

        クローズ(connfd)。

    }

    クローズ(listenfd)。

    0を返します。

}

 

クライアント:

書式#include <stdio.hに>

書式#include <stdlib.h>に含ま

書式#include <string.hの>

書式#include <errno.hを>

書式#include <SYS / types.h>に

書式#include <sysの/ socket.h>に

書式#include <netinetの/ in.h>

書式#include <ARPA / inet.h>

書式#include <unistd.h>

#define MAXLINE 4096

 

INTメイン(int型ARGC、チャー** ARGV){

    int型は数sockfd、N。

    チャーrecvline [4096]、sendline [4096]。

    servaddrのsockaddr_in構造体。

 

    もし(のargc!= 2){

        printf( "用法:./client <IPアドレス> \ N");

        0を返します。

    }

 

    IF((数sockfd =ソケット(AF_INET、SOCK_STREAM、0))<0){

        printf( "ソケットエラーを作成する:%S(エラー番号:%d)は\ n" は、はstrerror(errnoに)、errnoに)。

        0を返します。

    }

 

    memset(&servaddr、0、はsizeof(servaddr))。

    servaddr.sin_family = AF_INET;

    servaddr.sin_port = htons(6666)。

    IF(はinet_pton(AF_INET、ARGV [1]、&servaddr.sin_addr)<= 0){

        printf( "%sの誤差はinet_pton \ n" は、ARGV [1])。

        0を返します。

    }

 

    IF(CONNECT(数sockfd、(いるsockaddr *)&servaddr、はsizeof(servaddr))<0){

        printf( "接続エラー:%S(エラー番号:%d)は\ n" は、はstrerror(errnoに)、errnoに)。

        0を返します。

    }

 

    printf( "サーバーへ送信MSGます:\ n");

    関数fgets(sendline、4096、STDIN)。

    IF(送信(数sockfd、sendline、strlenを(sendline)、0)<0){

        printf( "送信MSGエラー:%S(エラー番号:%d)は\ n" は、はstrerror(errnoに)、errnoに)。

        0を返します。

    }

    近く(数sockfd)。

    0を返します。

}

 

メイクファイル:

すべて:サーバークライアント

サーバー:server.o

    G ++ -g -oサーバserver.o

お客様:client.o

    G ++ -g -o client.o顧客

server.o:server.cpp

    G ++ -g -c server.cpp

client.o:client.cpp

    G ++ -g -c client.cpp

クリーン:すべて

    すべてのRM

makeコマンドの後、サーバーとクライアントの2つの実行可能ファイルを生成します。それぞれ二つの端末ウィンドウは、./server実行コマンド、コマンド実行./client 127.0.0.1を開き、ポート6666は、コマンド実行./serverに接続されたマシンの最初の実行を表します。./client 127.0.0.1コマンドを実行した後、あなたは、あなたがクライアントからのrecv MSG」のターミナル・サーバ・ウィンドウの出力を見ることができ、クライアントのクライアントが終了し、コンテンツサーバに言うと、「こんにちは」入力するように指示されていますこんにちは。 "

 

TCPプロトコルの通信対話プロセス:

 

 

 

 

 

 

注意:

ネットワーク層「IPアドレス+ポートは、」プロセスを一意に識別することができます。

「IPアドレス+ポート+プロトコルは、」プロセス間通信を完了するという意味から通信、契約の//目的は、理由も異なっていてもよく使用されるプロトコルの異なる方法で格納されているポート番号です。

おすすめ

転載: www.cnblogs.com/ruigelwang/p/12528323.html