LinuxのC言語の下のソケットネットワークプログラミング

サーバーと私はすでにあまりにもPythonのソケットプログラミングの資料に記載されている関連するソケットのソケットを確立するための詳細な手順についての知識は、我々が見ることができるかの原因とブログのコンテンツソケット接続ソケットプログラミングの起源、 C関連のAPIはので、ここで、C言語のAPIの相関に基づく、以下の特定の実装で書かれたネットワークソケットプログラミングのコンテンツを組み込んでデバッグします。記事のリンク: http://www.cnblogs.com/uestc-mm/p/7296083.html

サーバーServer.cプログラム内容:

#includeは<sys / types.h>に
する#includeは<sys / socket.h>に
する#include <netinetの/ における .H> 
の#include <ARPA / inet.h> 
の#include <netdb.h> 
する#include <stdio.hの> 
書式#include <ERRNO.H> 
書式#include <stdlib.h>に含ま
する#include < 文字列の.h> 
書式#include <unistd.h>
 / * ******************** ************************************************** ************************************************* 
1 、int型ソケット(int型の家族、int型、int型のプロトコル)
ファミリ:
    指定使用的协议簇:AF_INET(IPv4)のAF_INET6(IPv6)のAF_LOCAL(UNIXプロトコル)AF_ROUTE(ルーティングソケット)AF_KEY(秘密鍵ソケット)AF_INET(IPv4)のAF_INET6(IPv6)のAF_LOCAL(UNIXのプロトコル)AF_ROUTE(ルーティングソケット)AF_KEY(秘密鍵ソケット) 
タイプ:
    使用して、ソケットタイプを指定:SOCK_STREAM(バイトストリームソケット)SOCK_DGRAM 
プロトコル:
    ソケットはソケットタイプがオリジナルでない場合は、このパラメータが0である
バインド(int型の数sockfd、MYADDRになsockaddrを構造体をint型、2 * 、INT addrlenは)
数sockfd:
    ソケット関数が返すソケットディスクリプタ
MYADDR:
    ローカルIPアドレス構造体ポインタへのポインタである
myaddrlenは:
    構造長が
のsockaddrをストラクト{ 
    unsigned short型sa_familyに等;通信プロトコルファミリの//タイプAF_xx 
    チャーsa_data [14]。 14のバイト・プロトコル・アドレス@、ソケットは、IPアドレスとポート番号を含む
}; 
構造体は、{SOCKADDR_IN 
    ショートsin_familyはint型、通信プロトコル群の//型
    のunsigned short int型のsin_portは; //ポート番号
    sin_addr in_addr形式構造体; // IPアドレス
    符号なしチャーsi_zero [8]; // 0は、同じ長さおよび構造のsockaddrを維持するために充填されています
}。
。3、接続int型(int型数sockfd、constの構造体のsockaddr * serv_addr、のsocklen_t addrlenは)
数sockfd:
    ソケット関数が返すAソケット記述子
serv_addr:
    サーバのIPアドレスの構造体ポインタ
addrlenは:
    構造体ポインタの長さ
4は、(int型数sockfd、聞くINT INTをバックログ)
数sockfd:
    ソケットのソケット関数が結合バインド文字説明
:バックログを
    複数のクライアント要求をサーバに、この値の影響を受けるときに接続の最大数をクライアントに接続することができる設定します。デフォルト値20がある
5、INT受け入れ(int型数sockfd、構造体cliaddrのsockaddrを*、*のsocklen_t addrlenは)。
数sockfd:
    後のソケット機能待機ソケット記述子
cliaddr:
    クライアントソケットインタフェースアドレス構造
addrlenは:
    クライアントアドレス構造長
6 、送信(intは数sockfd、CONST void *型MSG、int型lenは、int型のフラグ)int型
7、int型のRECVを(intは数sockfd、無効* bufは、int型lenは、unsigned int型のフラグ)が
数sockfd:
    ソケット関数ソケットディスクリプタ
MSG:
    ポインタデータが送信される
。BUF 
    受信したデータをバッファ記憶
lenの:
    データの長さを、フラグが0に設定されている
***************** ************************************************** ************************************************** *** * / 
int型のmain(int型 ARGC、CHAR * ARGV [])
{ 
    int型FD、new_fd、struct_len、NUMBYTES、I;
     ストラクトSERVER_ADDR SOCKADDR_IN、
     ストラクトのsockaddr_in CLIENT_ADDRと、
     チャーBUFF [BUFSIZ]; 

    server_addr.sin_family = AF_INET; 
    SERVER_ADDR .sin_port = htons(8000); 
    server_addr.sin_addr.s_addr = INADDR_ANY。
    BZERO( &(server_addr.sin_zero)、8 )。
    struct_len = はsizeof構造体のsockaddr_in)。

    FD =ソケット(AF_INET、SOCK_STREAM、0 );
    一方、(バインド(FD、(構造体のsockaddr *)&SERVER_ADDR、struct_len)== - 1 )。
    printf(" バインド成功\ nは!" );
    一方、((FD、聞く10)== - 1 )。
    printf(" リスニング.... \ N "); 
    printf("Waittingを受け入れるための準備ができました... \ N " ); 
    new_fd =受け入れる(FD、(構造体のsockaddr *)&CLIENT_ADDR、&struct_len)。
    printf(" クライアントを取得する\ n " ); 
    NUMBYTES =センド(new_fd、" 私のサーバーへようこそ\ N "210 ); 
    一方、((NUMBYTES = RECV(new_fd、バフ、BUFSIZ、0))> 0 
    { 
        バフ[NUMBYTES] = ' \ 0 ' 
        printf("%S \ n " バフ);
             場合(送信(new_fd、バフ、NUMBYTES、0)< 0 
            {   
                perrorは(" 書き込み)、  
                 リターン 1 ;   
            }   
    } 
    近い(new_fd); 
    近い(FD); 
    戻り 0 ; 
}

 クライアントclient.cを番組コンテンツ:

書式#include <stdio.hに> 
する#include <stdlib.h>に含ま
する#include <ERRNO.H> 
書式#include < 文字列の.h> 
の#include <netdb.h> 
書式#include <SYS / types.h>に
する#include <netinetの/  .H> 
の#includeは<sys / socket.h>に
する#include <ARPA / inet.h> int型のmain(int型 ARGC、CHAR * ARGV [])
{ int型の数sockfd、NUMBYTES。
    チャーBUF [BUFSIZ]。
    構造体のsockaddr_in their_addr。
    printf(" ブレイク!" );
    


    一方、((数sockfd =ソケット(AF_INET、SOCK_STREAM、0))== - 1 )。
    printf(" 我々は〜数sockfdを取得\ N " ); 
    their_addr.sin_family = AF_INET; 
    their_addr.sin_port = htons(8000 )。
    their_addr.sin_addr.s_addr =のinet_addr(" 127.0.0.1 " )。
    BZERO( &(their_addr.sin_zero)、8 )。
    
    しばらく(CONNECT(数sockfd、(構造体のsockaddr *)&their_addr、はsizeof構造体のsockaddr))== - 1)。
    printf(" サーバー〜乾杯を取得します\ nは!" ); 
    NUMBYTES = RECV(数sockfd、BUF、BUFSIZ、0); // 接收服务器端信息   
    BUF [NUMBYTES] = ' \ 0 ' ;  
    printf(" %sの" 、BUF)。
    一方、1 
    { 
        のprintf(" Entersomeもの:" )。
        scanf関数(" %sの" 、BUF)。
        NUMBYTES =センド(数sockfd、BUF、strlenを(BUF)、0 ); 
            NUMBYTES = RECV(数sockfd、BUF、BUFSIZ、0);  
        BUF [NUMBYTES] = ' \ 0 ' ; 
        printf(" 受信された:%S \ n " 、BUF)。  
    } 
    近く(数sockfd)。
    リターン 0 ; 
}

 

 使用GCCコンパイラのクライアントとサーバーのプログラムがコンパイルされ、解釈されます。

GCC - OマスターServer.c 
のgcc -o奴隷いるclient.c

 

おすすめ

転載: www.cnblogs.com/dinghailong128/p/12310247.html