Linuxネットワークプログラミング - 基礎

1.基本

(1)ソケット

INTソケット(INTドメイン、int型、int型のプロトコル)。

 ドメイン:このようなアドレスフォーマットなどの通信機能を決定します

AF(アドレスファミリ)アドレスファミリ
AF_INET IPv4インターネットドメイン
AF_INET6 IPv6インターネットドメイン
AF_UNIX UNIXドメイン
AF_UNSPEC未指定

 タイプ:ソケットタイプを定義するには、主に特徴付け輸送層を設けました

SOCK_STREAM整然とした、信頼性の高い、双方向バイトストリーム指向の
固定長、整然とした、コネクション型パケット送信SOCK_SEQPACKET 
SOCK_DGRAM固定長、コネクションレス及び信頼性の低いパケット    
予め定義されたトランスポートを使用することなく、即ちSOCK_RAM IPパケットインタフェースプロトコル層、層
    

 プロトコル:通常0、デフォルトのプロトコル所定のドメインとソケットタイプに応じて選択を示します。

 

それは、APIのファイルIOの一部を使用できるように、ソケットのfdを返します

近く
DUP dup2のの
ポーリング
選択
書き込み
読み取り

 ソケットは双方向である、あなたは、入力/出力を無効にすることができます

int型のシャットダウン(int型数sockfd、int型どのように)
どのように:
    SHUT_RD 
    SHUT_WR 
    SHUT_RDWR

 

(2)エンディアン

  伝送ネットワーク機器の異なる方法、異なるバイト順序、すべてのデバイスがパケットヘッダ情報を理解することができるようにするために、国立成功大学のエンディアンを調和させる必要性、

  統一されたコンテンツは、ルーティング装置は、その送信先アドレス、送信元アドレス、宛先ポート番号、ソースポート番号を読み出すコンテンツです。

uint32_t htonl(UINT32)。
uint16_t htons(uint16の)。
uint32_t ntohl(UINT32)。
uint16_t ntohs(uint16の)。

constのchar *のinet_ntop(int型ドメイン、CONSTのvoid * addrに、するchar * strの、soklen_tサイズ)。
int型はinet_pton(int型ドメイン、のconstのchar * strの、ボイド* addrに);

  

(3)アドレス形式

  異なる通信ドメインは、ソケットAPI、構造体のsockaddr統一されたインタフェース型の使用を統一するために、異なるアドレスフォーマットを定義します。

  IPv4のドメイン、構造体のsockaddr_inアドレス形式

 

インターネットクライアント2. [サーバー

(1)バインドアドレス

int型バインド(int型靴下、constの構造体のsockaddr * addrに、socklen_tをLEN)。

 IPがINADDR_ANYに設定されている場合、特定のネットワークアダプタが結合して、そのソケットは、ソケットは、すべてのネットワークアダプタのパケットを受け入れることができますので、バインドを呼び出します。

 クライアントの場合、特定のネットワークカードへのバインドを使用すると、自動的にネットワークカードをバインドランダム、接続するか、聞いて呼び出すと、結合されていない場合、無意味です。

 ソケットのアドレスがバインドされ得るのgetsockname使用してください。

int型のgetsockname(int型数sockfd、sockaddr構造体の* addrの、のsocklen_t * LEN);

 接続を確立するために相手のアドレスを取得getpeername使用

int型getpeername(int型数sockfd、sockaddr構造体の* addrの、のsocklen_t * LEN);

(2)接続を確立します

 あなたはソケット(SOCK_STREAM、SOCK_SEQPACKET)接続に直面している場合は、接続を確立するために接続する呼び出すことができます

int型(int型の数sockfd、constのsockaddr構造体の* addrに、socklen_tをLEN)を接続します。

 ケースは、治療を必要とするかもしれないような接続は、失敗することがあります。

 

 また、効果なしで使用できるソケットコネクタを接続します。

    パケットの送信先アドレスは、データが送信された後、アドレスを指定する必要がないように、アドレスを接続するように設定されています。

    データのみの宛先を受け入れます。

 

 使用を宣言するために接続指向のソケットは、接続を受け入れるように聞きます

int型(int型の数sockfd、int型のバックログ)聞きます。

 待機ソケットを返した後、彼らは接続を受け入れることを始め、接続要求がキューを聞くために保存されます、

 そして、受け入れキューを使用した接続要求を受け入れます。

int型(int型の数sockfd、sockaddr構造体の* addrの、のsocklen_t * LEN)を受け入れます。

 元のサーバー数sockfd 3つのソケット、ソケットを受け入れに関し、ソケット・サーバ・プロセスは、クライアント接続が値を返すクライアントソケットを受け入れます。

 生のソケットとソケットは、ドメインを入力する必要がありますし、クライアントが接続を確立するために、同じです。

 ADDR:情報を受信するためのクライアントソケット、あなたが気にしない場合は、NULLを指定できます

 lenは:送信伝送パラメータaddrのサイズ 

 

 聞くキューが空の場合、受け入れ呼び出し、ブロックされます、あなたが非ブロックモードを使用する場合、それはすぐに戻ります-1、errnoがEAGAINまたはEWOULDBLOCKに設定されています。

 あなたは、ブロッキング私達accpetを処理するために選択投票を使用することができます。

 

3.データ送信/受信

 ソケットのfdを使用して、データの受け入れ、送信を書き込み、読み込みを使用することが可能です。

 あなたはより多くの機能が必要な場合は、送信、RECVを使用することができます

ssize_tの(送信int型の数sockfd、CONST  無効 * bufは、size_tのnbytesは、int型のフラグ);

  送信を使用する場合は、数sockfdは、ターゲットアドレス、接続のつまり使用することを決定している必要があります。

 設定データ送信機能のフラグ

経路データにMSG_DONTROUTEにローカルネットワークを行い
ノンブロッキングMSG_DONTWAIT 
MSG_OOBバンドデータを

 あなたが成功したリターンを送信する場合、それは相手がデータを受信したことを意味するものではありませんが、データが正常にネットワークに指示を送りました。

 そして、同様のはsendtoを送信

ssize_tのはsendto(int型数sockfd、CONST void *型のsocklen_t deslen bufは、size_tのnbytesは、int型のフラグ、のconst sockaddr構造体の*のdesaddr、);

 送信する際にはsendtoを使用すると、宛先アドレスを指定することができます

 他の送信API:送信バッファを指定する複数のデータを可能にsendmsg、およびwritev非常に類似しています。

 

 RECVと同様の読みができますが、フラグを指定することができます

sszie_tのrecv(int型数sockfd、無効* bufは、size_tのnバイトは、フラグをint型);
MSG_OOB受け入れバンドデータ
MSG_PEEKは、メッセージの内容を表示しますが、パケットを奪うしない
パケットが切り捨てられている場合でもMSG_TRUNC、パケットの実際の長さを返すように要求された
すべてのデータが利用可能になるまで待機MSG_WAITALL(SOCK_STREAMのみ)

 MSG_WAITALLは:SOCK_STREAMの場合、データはMSG_WAITALLが完了受諾データを確実に使用して要求未満であってもよい受け取りました。データグラムソケットに基づいて一度読んで全体のメッセージが返されるためSOCK_DGRAMとSOCK_SEQPACKETためMSG_WAITALLは、任意の効果を持っていませんでした。

 送信の場合、送信者通話停止端、送信側のプロトコルに従って、またはデフォルトで無効データを受信し終わったら、次に、RECV 0を返します。

 あなたが送信者を見つけるしたい場合は、のrecvfrom呼び出すことができます

 recvfromは、一般的にはrecvまたはのrecvfromと、コネクションレスのソケットに使用します

 recvmsgは(READVと同様に)複数のバッファにデータを受け入れます

 

4.ソケットオプション

 二つのソケットインタフェース制御動作、設定オプション、表示オプション

int型のsetsockopt(int型数sockfd、int型のレベル、int型のオプション、CONST void *型のval、socklen_tをLEN)。
int型のgetsockopt(int型数sockfd、int型のレベル、int型のオプション、CONST void *型のval、のsocklen_t * LEN);

 同じアドレスに結合するTCPは、時間の期間内に許可されていない、ポート多重化を使用することが解決することができます

int型の再利用= 1; 
setsockopt(数sockfd、SOL_SOCKET、SO_REUSEADDR、&リユース、はsizeof(INT))。

 

バンドデータ

 いくつかの通信プロトコルオプション機能は、データが送信バッファに正常であったとしても、データ伝送に高い優先順位を可能にします。

 TCPは、この機能、サポートバンドデータバイトの転送をサポートしています。UDPはサポートされていません。

 

おすすめ

転載: www.cnblogs.com/yangxinrui/p/11324489.html