LinuxネットワークプログラミングTCP通信プロセスの構築

3645 ワード

TCPカスタマーサービス端末の構築プロセス
1.tcp通信socket関数インタフェースの作成
int socket(int domain ,int type ,int protocol);
    :      AF_INET   IPV4  Internet protocols

    :        SOCK_STREAM     TCP

                    SOCK_DGRAM       DUP

    :       0

return value:new socket(新しいネットワークファイル記述子)の正常な戻りに失敗error-1の戻りに失敗しました
2.サーバ情報#includeサーバ情報構造ヘッダファイルの設定
linux端末環境でサーバ情報構造体を表示するコマンド:gedit/usr/include/linux/in.h
/* Structure describing an Internet (IP) socket address. */
構造体はネットワークのsocketアドレスを記述する
struct sockaddr_in {
	__kernel_sa_family_tsin_family;/*             */
    __be16sin_port;/*   */  /*    100     ,  1000           */
	struct in_addrsin_addr;/*  IP  */
  }

/*/ネットワークIPアドレス/
struct in_addr {
	           __be32s_addr;
};

------------------IPアドレス変換関数-----------
    #include 
    #include 
    #include 

   in_addr_t inet_addr(const char *cp);  //       IP       
   char *inet_ntoa(struct in_addr in); //    IP           

ipアドレスの一般的な形式は文字列で、整形コンピュータの識別を必要とします
---------------サイズ端の変換----------注意:ネットワーク通信はいずれも大端フォーマットで通信され、データの整合性を目的としている
#include
   uint16_t htons(uint16_t hostshort); //    -》    


   uint16_t ntohs(uint16_t netshort);//     -》     

3.ネットワークサーバへのリンク
NAME
   connect - initiate a connection on a socket

SYNOPSIS
   #include           /* See NOTES */

   #include 

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

パラメータ1:int sockfdリンクが必要なネットワーク記述子
パラメータ2:const strunct sockaddr*addrサーバのIPアドレス情報(構造体記述のsockeアドレス)
パラメータ3:socklen_t addrlenサーバIPアドレス情報の大きさ(構造体の大きさ)
戻り値:0成功-1失敗
4.データの読み書きを行うread/write socketネットワーク記述子は、通常のネットワーク記述子と同様に、読み書き操作を行ってもよい.もちろん、書き込まれた情報は別のIPホストに伝達され、読み出しはそのフィードバック情報を受け取って読み書き操作を利用して通信する.
1)ネットワーク通信記述子を読み取るときにデータがないとリードがブロックされる2)ネットワーク通信記述子への書き込みが絶えずデータを読み取る人がいない場合,書き込みがいっぱいになるとブロックされる3)通信が確立されると,ある一方のポートがリンクを切断し,我々のリード操作がブロックされない.
5.通信を閉じる
TCP通信におけるサーバ側の構築プロセス
1.tcp通信socketを作成通信sockeを作成ネットワーク記述子を取得するクライアント操作と同様
2.ローカルネットワークにおけるサーバの情報のバインド
  #include           /* See NOTES */

  #include 

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

パラメータ1:バインドが必要なサーバsocket
パラメータ2:サーバーのIPアドレス情報
パラメータ3:サーバのIPアドレス情報の大きさ
戻り値:成功0失敗-1
/* Address to accept any incoming messages.*/万はIPアドレスを使って、サーバーに自動的にローカルのネットカードのアドレスのIPアドレスの設計を傍受してバインドさせます0.0.0.0システムは自動的にローカルのIPを検出します
#defineINADDR_ANY((unsigned long int) 0x00000000)

3.リスニングモードに設定
サービス側をリスニングモードに設定し、カスタマーサービス側のリンク情報の到来を待って、その情報を受け入れる.
   #include           /* See NOTES */

   #include 

   int listen(int sockfd, int backlog);

パラメータ1:リスニングサービスsocketが必要
パラメータ2:最大リスニング数(同時に複数のリンクを受け入れることができます)
戻り値:成功0失敗-1
4.相手のリンク要求を受け入れる(クライアントがリンクされていない場合はacceptまたはクライアントがリンクされるまでブロックする)
NAME
   accept - accept a connection on a socket

SYNOPSIS
   #include           /* See NOTES */

   #include 

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

パラメータ1:リスニングモードサーバsocket
パラメータ2:相手のIPアドレス情報(ipアドレス情報を受け入れる構造体を定義する必要がある)
パラメータ3:相手の情報の保存に成功したサイズ
戻り値:正常accepted socket(クライアントネットワーク記述子の受信)失敗-1
このように私达は客服の端とサービスの端を构筑して、両者の间は3回の握手を経てネットの通信をプロセスすることができて、私达の注意に値するのは、3回の握手はconnectの中で発生します.