「TCP / IPネットワークプログラミング」の研究ノート

1.WindowsソケットLinuxでプログラムと同じことを考えていますが、詳細は多少異なっている
Windows環境下で(1)ソケットプログラムは、のWinsock.dllまたはWS2_32.DLLは、事前にロードする必要があります依存しています。DLLをロードするための2つの方法があり、参照してください。DLLダイナミックリンクライブラリの読み込み
、Linuxは通常のファイルとソケットファイルを区別しない、およびWindows(2)Linuxは、Windowsは、「ファイルハンドル」という概念を使用しながら、「ファイルディスクリプタ」の概念を使用しています区別;
(3)、Linuxのソケット()関数の下ではint型の値を返し、およびWindowsは、ソケットタイプ、すなわちハンドルです。
送信および受信機能は、(4)LinuxでWindows用のrecv()/センド()を使用して、読み書きする()/書き込み()関数をお読みください。
(5)閉じたソケット、Windowsがclosesocket()関数を使用しながら、クローズ()関数を使用してLinux。

標準入力、標準出力と標準エラーファイル記述子に2を割り当て
、ファイルディスクリプタオブジェクト
 0標準出力
 1出力スタンダード
 2標準エラー
 
システム提供(DLL)での依存ダイナミックリンクライブラリをプログラミング3.WinSock(Windowsのソケット)、2つのバージョンがあります:  
以前のDLLは、サイズが28キロバイト、対応するヘッダファイルwinsock1.hで、WSOCK32.DLLあり、
最新のDLLがWS2_32.DLLで、サイズが69キロバイト、対応するヘッダファイルwinsock2.hあります。
コンパイル時にロードされた使用の#pragmaコマンドを、:
 の#pragmaコメント(libに、「WS2_32.LIB」)
WinSockの最初のステップをプログラミングするには、負荷WS2_32.DLLにある、バージョン番号を初期化するために、WSAStartupの()関数を呼び出して、使用する指示
WSADATA WSADATA; 
WSAStartupの(MAKEWORD(22)、&WSADATA)。

 

4.ソケットプログラミング

(1)ソケット()関数は、ソケット作成し使用
するために、バインド()関数のソケットが特定のIPアドレスとポートとアップバインドされているIPアドレスとポートデータを介して唯一の方法フロー使用(2)処理ソケット
(3)接続を確立する接続()関数を使用して
(4)sockaddr構造体を
考えることができる、のsockaddrユニバーサル構造で、IPアドレスとポート番号の種々のタイプを格納するために使用することができ、構造IPv4アドレスSOCKADDR_IN保存するように設計されている
と、付加SOCKADDR_IN6にIPv6アドレスを保存します
(5)使用聞く()関数は、受動的なリスニング状態にソケットを可能に
(6)()関数は、クライアントの要求に応答する準備ができ受け入れる
(7)受け入れ()クライアントと通信するための新しいソケットを返し、addrに保存されたクライアントのIPアドレスとポート番号
(8)は(聞く)のみ()同意するまで、リスニング状態にソケット、本当にコードの後ろに()、クライアント要求を受信聞いていませんが、実行していきます聞かせて
、(コードが実行することはできません後)の実行をブロックします)(受け入れ(9)新しい要求が来るまで。
(10)TCPサーバ機能の呼び出しシーケンス:ソケット() - >バインド() - )(受け入れ> - - >)(聞く- >リード()/書き込み()> [閉じる]()
(11)TCPクライアント機能の呼び出しシーケンス:ソケット() - >(接続 ) - >)(読み取り/書き込み() - >クローズ()

特許5.Ack =配列番号+ + 1送信バイト数
 
6。
 (1)クローズ()/ closesocket()関数手段完全に切断され、すなわち、送信されていないデータを呼び出したり、データを受信する
 他を保持しながらシャットダウン()関数は、一つだけのデータ伝送チャネルをオフにすることができる使用(2)
int型のシャットダウン(int型靴下、int型 HOWTO)。  // Linuxの
int型のシャットダウン(SOCKET s、int型の HOWTO)。  // Windowsの

切断ソケットへの必要性のための靴下、HOWTOは道オフになっています

Linuxでの値は、次のHOWTO:
  • SHUT_RD:入力ストリームを切断します。ソケットは、(データを受信した入力バッファも消去されている場合でも)データを受信することができない、関連する関数を入力すると呼ばれることができません。
  • SHUT_WR:出力ストリームを外します。次いで、宛先ホストに送ら、そこに送信されていない場合、ソケットがデータを送信するが、データ出力バッファができません。
  • SHUT_RDWR:I / Oストリーム中にOFF。ここで別のパラメータにSHUT_RD、SHUT_WRへのパラメータの呼び出しは、)(2回シャットダウンに対応します。
HOWTOは、Windowsでの次の値があります。
  • SD_RECEIVE:すなわち切断閉じる受信動作、入力ストリーム。
  • SD_SEND:すなわち切断閉じる送信動作、出力ストリーム。
  • SD_BOTH:同時閉じる受信と送信の操作。
シャットダウンは、()あなたが近い()/ closesocketを(呼び出すまで、)(、代わりにソケットのソケット遺跡をどんなに何回シャットダウン通話を接続を閉じますが)近い()/ closesocketを(呼び出す)ソケットをクローズとき、またはシャットダウンを呼び出す()出力ストリームを閉じ、他のFINパケットに送信されます。FINパケットデータ転送が完了すると、コンピュータは、上のデータ送信が存在しないであろう知ってFINパケットを受信し
 (3)の場合に、クローズ()/ closesocket()すぐにかかわらず、出力バッファのデフォルトでネットワークにFINパケットを送信します。任意のデータが、データ転送出力バッファシャットダウン())が手段は、(クローズを呼び出し、FINパケットの再送が完了するのを待機する/ closesocket()は、出力データ・バッファ、およびコールシャットダウン(失われるあります)しません。
 
7. RECV()は0 FINパケットを受信するユニークな機会を返すとき
 
8.ネットワークバイトオーダー
異なる方法、およびCPU(リトルエンディアンのインテル・ファミリのメインCPU)を保存するために解析されたデータ、エラーを解析したデータは、リトルエンディアンとビッグエンディアンのシステム通信システムを発生します。ネットワークバイト順(ネットワークバイト順) -したがって、データを送信する前に、統一された、にデータをフォーマットします。ユニファイドネットワークバイトオーダーはビッグエンディアンです。
 
9.
pingのドメインは、ドメイン名に対応するIPアドレスを表示することができ
、コンピュータに登録されているデフォルトのDNSサーバーのアドレスを表示するには、nslookupコマンドを
 
10.
 (1)を通過して、ドメイン名の文字列形式のIPアドレスを取得するには、以下の機能
書式#include <netdb.h>
 のstructたhostent *のgethostbyname(のconst  のchar *ホスト名)。

 HOSTNET構造ポインタを返す成功、NULLポインタを返すために失敗

 
構造体HOSTNET 
{ 
  CHAR * h_name。
  文字 ** h_aliases。
  int型h_addrtype;
  int型h_lenght;
  文字 ** h_addr_list。
}

 IPアドレス取得ドメイン関連の情報を用いて、(2)のgethostbyaddr()関数

#include <netdb.h>
 構造体 HOSTNET *のgethostbyaddr(CONST  チャー * ADDR、のsocklen_t LEN、INT fanily)。

 戻るHOSTNET本体構造変数のアドレス値の成功、失敗はNULLポインタを返します

 ADDR:in_addr形式構造体ポインタがIPアドレス情報が含まれ
 たlenが:最初の引数に送信されるアドレス情報のバイト数、IPv4の場合4、IPv6の場合6。
 ファミリー:グループ転送アドレス情報、IPv4の場合AF_INET、IPv6はAF_INET6であります
 (3)バイト順変換関数
符号なしの短い htons(符号なしショート
 符号なしの短い ntohs(符号なしショート
 符号なしの長い htonl(符号なしロング)。
 符号なしの長い ntohl(符号なしロング)。

 (4) ネットワークバイト順に文字列情報を変換する整数

#include <ARPA / inet.h> 
 in_addr_tのinet_addr(CONST  文字 * 文字列);

  戻り値成功した場合に、32ビットビッグエンディアン整数値、障害INADDR_NONE

 (5)INET_ATON()ネットワークバイト順にIPアドレスビット列32と戻り整数変換が、使用頻度の高い、構造in_addr形式の関数を使用しているであろう
 
#include <ARPA / inet.h>
 INT INET_ATON(CONST  文字 * 文字列構造体 * ADDR in_addr形式)。

  戻り値1(真)に成功し、リターン0(偽)が失敗した場合

 (6)INET_NTOA()関数は、文字列に、ネットワークバイト順IPアドレスを整数に変換することができます
#include <アルパ/ inet.h>
  CHAR * INET_NTOA(構造体 in_addr形式ADR)。

  文字列値のアドレス、失敗すると-1の移行に成功を返します。

        コピー機能INET_NTOA呼び出しは再び、以前に保存された情報の文字列がある場合は上書きされるかもしれない、ので、他のメモリ空間にすぐに完了列情報の後に関数を呼び出す必要があります
 
 (7)初期化メソッドのネットワークアドレス情報:
 
構造体のaddrのsockaddr_in。
char * serv_ip = " 211.217.168.13 " CHAR * serv_port " 9190 " 
memset(&ADDR、0はsizeof (ADDR))。
addr.sin_family = AF_INET; 
addr.sin_addr.s_addr = のinet_addr(serv_ip)。
addr.sin_port = htons(ATOI(serv_port))。

 IPアドレスを使用してINADDR_ANY一定の配信サーバは、コンピュータは、サーバのIPアドレスが自動的に実行され得ることができます

 addr.sin_addr.s_addr = htonl(INADDR_ANY)。
11.ソケットオプション
getsockopt(int型の靴下、int型のレベル、int型の OPTNAME、無効 *はoptval、socklen_tを* optlen); 
setsockopt(int型の靴下、int型のレベル、int型の OPTNAME、CONST  無効 *はoptval、socklen_tをoptlen)
  • SO_SNDBUF:利用可能なオプションのためのバッファサイズを入力します。
  •  SO_RCVBUF:出力バッファサイズ関連オプション
  •  SO_REUSEADDR:このオプションは、新しいソケットの状態でTIME_WAITソケットのポート番号を再割り当てするためにTRUEに設定することができます
 TCP_NODELAYは、Nagleアルゴリズムを無効にするには1に設定しました
 
12.マルチプロセス
  (1)フォーク関数を呼び出してプロセスを作成
する#include <unistd.h> 
 pid_tフォーク(ボイド)。

 親プロセス:fork関数は、子プロセスIDを返します。

 子プロセス:フォーク機能0を返します
(2)を防止するため、子プロセスへの戻り値に、子プロセスの終了パラメータ値またはreturn文を作成するために、親プロセスを渡されるべきゾンビの
 破壊ゾンビ1:ウェイト機能を使用して
書式#include <unistd.h> 
pid_t待機(int型 * statloc)。

 - >リターン子プロセスIDを正常に終了し、返すために失敗-1

 戻り値は、メモリ空間を節約するために、子のダイはstatloc言及するとき、渡された次のマクロによって単離されなければなら
  •  戻り値「真」真の正規の子プロセスの終了WIFEXITED
  •  WEXITSTATUSは、子プロセスの戻り値を返します
 ゾンビ2を破壊する:使用して機能をwaitpidの
書式#include <sysの/ wait.h> 
 pid_t waitpidの(pid_t pidを、int型 * statloc、int型のオプション)。

 - >リターン子プロセスIDを正常に終了し、返すために失敗-1

 IDを待っているPIDの目標子プロセスの終了は、パス-1場合は、すべての子プロセスの終了を待つことができます

 同じ意味している(3)statlocパラメータstatlocとウェイト機能
 (4)オプションは、一定のWNOHANG sysを届ける/ wait.hには、子プロセスの終了は、グループ状態トーナメントに入らないない場合でも、宣言が、関数の戻り0と終了
 (5)信号及び信号機能
#include <signal.hに>
  ボイド(*信号(INT信号、ボイド(* FUNC)(ボイド)))(INT)。

 - >呼び出し、関数の戻りポインタが前に登録したときに信号を生成するために

 (6)信号処理機能はsigactionを使用
書式#include <signal.hに>
  int型 sugacyion(int型 SIGNO、constの 構造体は、sigaction *行為、構造体は、sigaction * oldact)。

 - 成功時には> 0を返し、失敗した場合は-1

 同じポートの複数のソケットに対応し、フォーク機能を介してソケットのファイル記述子をコピーした後、のみソケット記述子はソケット破壊するために、終端されている
 
プロセス間通信を13
 :機能パイプラインを作成します
する#include <unistd.h>
  int型パイプ(int型 filedesが[ 2 ])。

 - 成功時には> 0を返し、失敗した場合は-1

 filedesが[0]:これは、パイプラインのファイル記述子を介して、すなわち出口パイプデータを受信するために使用される
 filedseを[1]:パイプラインファイル記述子を介して送信データに使用され、即ち入口管
 
14.I / O多重化
 (1)のためにFD_SETマクロ変数といえば:
FD_ZERO(FD_SET * fdset)
 FD_SET(int型 FD、FD_SET * fdset)
 FD_CLR(int型 FD、FD_SET * fdset)
 FD_ISSET(FINT FD、d_set * fdset)

(2)機能を選択します。

#include <SYS / 選択 .H> 
 の#include <SYS / TIME.H>
  INT  選択INT maxfd、FD_SET * readset、FD_SET * writeset、FD_SET * exceptset、CONST  構造体体timeval *タイムアウト)。

 

I / O機能の15 Aの複数

 (1)MSG_OOB緊急メッセージを受信すると、システムは、メッセージを話すSIGURGを生成し、登録されたシグナルハンドラを呼び出します
 (2)SIGURG信号処理、及びgeipid関数呼び出しこの関数は、プロセスIDを返すとき、信号を処理する方法を指定する必要があります
 ファイルディスクリプタを制御するための(3)fcntlの機能
 
fcntl(recv_sock、F_SETOWN、GETPID())。

 上記「ソケットの所有者(F_SETOWN)と呼ばれているの意味は、プロセスのID、ファイルディスクリプタrecv_sock GETPID関数の戻り値を指すように変更します

 緊急メッセージは、メッセージ処理を監督することを意味する(+1オフセット)次の位置へ(4)緊急緊急メッセージ・ポインタ、限定されるものではない緊急メッセージ送信フォーム
 (5)RECVコール転送機能オプション一方MSG_PEEK 、読み込むべきデータがない場合でもために、読み取りデータ入力バッファが削除されない場合でも、このオプションはMSG_DONTWAITと協力して、多くの場合で、ブロックされた状態、セットMSG_PEEKオプションおよびコールrecv関数を入力していないことを確認することです関数呼び出し非ブロッキングは、読み出すべきデータの有無を検証する方法を

おすすめ

転載: www.cnblogs.com/chenweilin/p/11816095.html