この文書では、ソケットとバイトオーダーの概念だけでなく、いくつかの一般的な構造と機能を含め、Linuxのソケットプログラミングの基本を説明しています。
この記事は、網易クラウド教室の学習プロセスに記録され、教師はかなり良いですが、私は見物人をお勧めします。
LinuxのネットワークプログラミングのLinuxネットワークプログラミング|観光人工知能
1.コンセプト
1.1ソケット(ソケット)
ソケット(ソケット)は、アプリケーション・プロセスは、ネットワーク通信用のTCP / UDPネットワークプロトコルのような手段を提供する与える、定義はセットのインターフェースとデータ構造を呼び出す含ま通信メカニズムです。
Linuxのネットワークは、対応するファイル記述子を提供するために、ソケットインタフェース、ソケットの両方の特殊なIO経由のプログラミング。完全なソケットは、関連する記述を有する五重呼ば(プロトコル、ローカルアドレス、ローカルポート、リモートアドレス、リモートポート)、各ソケットは、オペレーティングシステムによって割り当てられた一意のローカルソケットを有しています。
1.2エンディアン
ビッグエンディアンバイト順とリトルエンディアンへのネットワーク・プロトコル、すなわちビッグエンディアンバイト順を使用してネットワーク。
内部ネットワークバイト順とデータ変換に異なるマシンの一連のバイト。
2エンディアン変換関数を使用しました
uint32_t htonl(のuint32_t hostlong)。 |
32ビット整数は、ネットワークバイト順のバイト配列にホストによって変換します |
uint16_t htons(uint16_tのhostshort)。 |
16ビット整数は、ネットワークバイト順のバイト配列にホストによって変換します |
uint32_t ntohl(のuint32_t netlong)。 |
ホストバイトシーケンスにスイッチによるネットワークバイト順で32ビット整数 |
uint16_t ntohs(uint16_t netshort)。 |
16ビット整数は、ネットワークバイト順のバイト配列にホストによって変換します |
3データ構造
3.1一般的なアドレス構造は、(一般的に使用されていないが、カーネルが使用され、このようなデータ構造をキャストする必要があります)
書式#include <sysの/ socket.h>に
いるsockaddr {
符号なしshort sa_familyに。
チャーsa_data [14]。
}。
sa_data:それはデータと混合一緒にいるの内側に、アドレスの数、リモートコンピュータとソケットのポート番号が含まれています。
sa_familyに:一般的な使用のIPv4 AF_INET。
関数は、アドレス構造に渡されるときに通過する構造いるsockaddrへのポインタ*に変換し、必要。
3.2インターネットアドレスの構造
構造体in_addr形式{
in_addr_t s_addr // IPv4アドレス
}。
構造体scokaddr_in {
sin_familyはshort int型; //インターネットアドレスファミリAF_INET(ホストバイトオーダー)など
符号なしshort int型のsin_portは; //ポート番号、16ビット(ネットワークバイト順)
構造体in_addr形式sin_addr; //インターネットアドレス、32ビットのIPv4アドレス(ネットワークバイト順)
unsigned char型のsin_zero [8]; // 0(そのフォーマットのパディングビット)を追加
}。
アドレスと同等の一般的な構造のインターネットアドレス構造データ型、一般に、より便利に利用sockaddr_in構造体に、互いに変換することができます。
4.基本的な機能
ソケットの作成4.1
書式#include <sysの/ socket.h>に
int型のソケット(int型ドメイン、int型、int型protocal)
戻り値:成功を返すファイルディスクリプタ、エラーリターン-1。
成功したリターンがカーネルソケット記述子ファイルの記述テーブルを作成した場合、カーネルにソケットを作成します。
パラメータ:
ドメイン:AF_INET IPv4インターネットドメイン、AF_INET6 IPv6インターネットドメイン、AF_UNIX UNIXドメイン、AF_UNSPECが指定されていません。
プロトコル:一般0、デフォルトのプロトコルとソケットのタイプを選択するために指定されたフィールドとして表現
タイプ:SOCK_STREAMのストリームソケット、TCPプロトコルを使用した、信頼性の高い、接続指向のトラフィックフローを提供する、TCPシーケンス及びデータ伝送の精度を保証します。
SOCK_DGRAMのデータグラムソケットは、コネクションレスサービスは、データは、独立したパケットを介して転送される乱れており、データグラムプロトコルUDPプロトコルを使用して、信頼性の高い、エラーフリーを保証するものではありません定義します。このようなIP ICMPなどSOCK_RAW rawソケットは、低レベルのプロトコルに又は主に新しいネットワークプロトコルをテストするための直接アクセスを可能にする、などが挙げられます。SOCK_SEQPACKET固定長、整然とした、信頼性の高いコネクション型のメッセージ配信。
4.2.IPv4アドレスファミリとアドレスの文字との間の伝達関数
書式#include <ARP / inet.h>
機能:ネットワークバイトオーダー変換サイト小数
constのchar * inet_ntop(int型ドメイン、のconst void *型のrestrict_addr、CHAR * restrict_str、のsocklen_tサイズ)。
機能:小数点はネットワークバイトオーダーに変換され、
constのchar *はinet_pton(int型ドメイン、CONST void *型STRを制限し、CHAR * ADDRを制限します)。
パラメータ:
ドメイン:インターネットアドレスファミリなどAF_INETなど
ADDR:インターネットアドレス、32ビットのIPv4アドレス(ネットワークバイト順)
STR:文字列のアドレス(ドット付き10進数)のポインタ
サイズ:アドレス文字列のサイズ
4.3塗りつぶしIPv4アドレスファミリの構造ケース
罪のsockaddr_in構造体; //は、構造のsockaddr_inを定義します
チャーBUF [16]。
memsetの(&罪、0、はsizeof(罪));
sin.sin_family = AF_INET; //は、インターネットアドレスファミリを記入
sin.sin_port = htons((ショート)3001); //塗りつぶしのポート番号(ネットワークバイト順)
//填写sin_addr
if (inet_pton(AF_INET, "192.168.2.1", &sin.sin_addr.s_addr) <=0)
{
//错误处理
}
printf("%s\n", inet_ntop(AF_INET, &sin.sin_addr.s_addr, buf, sizeof(buf)));