まず、カリキュラムの設計目標とタスク
目的:クライアント/サーバー・プログラムを達成するために、ネットワークプログラミングのLinux、マスター描画方法の基本的な方法ソケットに慣れること。
タスク:シンプルなプロトコルTCPクライアント/サーバアプローチに基づいて実施することができる簡単なプログラムを書きます。
第二に、理論とアルゴリズムの主なアイデアは、関与します
TCPプロトコル、ソケット、ネットワークプログラミング
第三に、特定の設計やアイデアの開発
二つのプログラム、クライアント、サーバーを書く、二つのプログラムのソケット接続を確立し、相互にデータを送信します。
第四に、コード
クライアント:
書式#include <stdio.hに> する#include <stdlib.h>に含ま する#include < 文字列の.h> 書式#include <unistd.h> 書式#include <SYS / types.h>に する#include <sysの/ socket.h>に する#include <netinetの/ で .H> の#include <ARPA / inet.h> の#defineポート8888 INT メイン() { // 一、创建套接字ソケットINT数sockfd =ソケット(AF_INET、SOCK_STREAM、0 ); もし( -数sockfd == 1 ) { perrorは(" ソケットが失敗" 出口( - 1 ); } // 第二に、通信アドレス準備 構造体;のsockaddr_in ADDR addr.sin_family = AF_INET; // 指定されたプロトコル・ファミリ、およびソケット()は一致パラメータ addr.sin_port = htons(ポート); // セット通信するために使用されるネットワークポート番号 INET_ATON(" 192.168.1.129 "、&addr.sin_addrを); // ストア通信ネットワークIPアドレス // 第三に、接続サーバ のint CONは=(数sockfd、(接続構造体のsockaddr *)&ADDR、はsizeof (ADDRを)); IF(CON == - 1 ) { perrorは(" 接続に失敗しました" ); 出口( - 1。); } のprintf(" 接続成功\ N-!" ); // サーバとの4、交換データ のchar bufが[ 100 ] = { 0 }; char型 * STR = " こんにちはサーバー。" ; (、(STR)strlenを、数sockfd STRを送る0 ); RECV(数sockfd、BUF、はsizeof(BUF)、0 ); のprintf(" サーバーからの情報を受け取る:%S \ N- 」、BUF) ; // 5、接続閉じる 閉じる(数sockfd)を、 戻り 0 ; }
サーバー:
書式#include <stdio.hに> する#include <stdlib.h>に含ま する#include < 文字列の.h> 書式#include <unistd.h> 書式#include <SYS / types.h>に する#include <sysの/ socket.h>に する#include <netinetの/ で .H> の#include <ARPA / inet.h> の#defineポート8888 INT )(主 { // 一、创建套接字INT数sockfd =ソケット(AF_INET、SOCK_STREAM、0 ); もし( -数sockfd == 1 ) { perrorは(" ソケットが失敗" )。 出口( - 1 ); } // 第二に、通信アドレス準備 構造体;のsockaddr_in ADDR addr.sin_family = AF_INET; addr.sin_port = htons(ポート); INET_ATON(" 192.168.1.129 "、&addr.sin_addr); // 3つ、ソケット・バインディングと通信アドレスは、 int型のビンは、バインド(数sockfd、(= 構造体のsockaddr *)&ADDR、はsizeof (ADDR))を、 IF(ビン== - 1 ) { perrorは(" バインドに失敗しました" )。 終了( - 1 ); } // 4つのリスニングポート ビン=聞く(数sockfd、100 ); IF(ビン== - 1。 ) { perrorは(" 失敗リスン" ); 出口( - 1。); } のprintf(" スタートポートをリスニング%D ... \ N- " 、ポート); // 5、接続要求処理 構造体のsockaddr_in fromaddr; のsocklen_tさlen = はsizeof (fromaddr); int型clientfd =(数sockfd、(受け入れ構造体のsockaddr *)&fromaddr、&LEN); IF(clientfd == - 1 ) { perrorは(" 失敗アクセプト" ); 出口( - 1 ); } のprintf(" %Sは、N- \接続されています" 、INET_NTOA(fromaddr.sin_addr)); // 6、クライアント・データ処理 チャー BUF [ 100 ] = { 0 }; RECV(clientfd、BUF、はsizeof(BUF)、0 ); のprintf("クライアント:%S \ N- "BUF); のchar * STR = " こんにちはクライアント」; (clientfd、STR、strlenを(STR)を送信し、0 ); // 7は、接続閉じる 閉じる(clientfd)を、 閉じる(数sockfd ); 戻り0 ; }
第五に、プログラムの業績は、スクリーンショットを表示します
VIテクノロジーの概要
1. TCPベースのネットワークプログラミング:
接続に基づいて、相互作用の間に、接続を維持するために、サーバーとクライアントは、切断されていません。、正確性、完全性と連続性を確保するために、すべての誤ったデータ、データの検証、データを再送信
欠点は、リソースの消費量が比較的大きいことです。
2.プログラミングの手順:
サーバー:
①ソケットを作成します(ソケット)のソケット()
②メールアドレスを用意
③ソケットにバインドし、メールアドレスのバインディングを(作成)
④リスニングポート)(聞きます
⑤(私達accpetを接続するためのクライアントのために待っています)
⑥通信相手)は()(読み取り/書き込みデータを受信します
)()(/ RECVを送信
ソケットをクローズ⑦
クライアント:
①ソケットを作成します(ソケット)のソケット()
②メールアドレスを用意
③接続サーバ接続()
④)(データの読み出し/受信)(書き込み
)()(/ RECVを送信
ソケットをクローズ⑤
詳細3. API
(1)ソケット()関数
int型のソケット(ドメイン、タイプ、プロトコル)
ドメイン:
AF_UNIX / AF_LOCAL / AF_FILE:ローカル通信
AF_INET:ネットワーク通信のIPv4
AF_INET6:ネットワーク通信のIPv6
注意:AF場合はPFとしての効果に
タイプ、通信の種類を選択し、含みます:
SOCK_STREAM:TCP
SOCK_DGRAM:UDP
通信プロトコルを指定しますが、プロトコルが指定された2つのパラメータの前に完了しているので、今大部分が放棄され、0にする必要がありますプロトコル、
(2)結合()関数
int型バインド(int型数sockfd、sockaddr構造体の* addrに、サイズ)
数sockfd:ソケット記述子をバインドするには
サイズ:によって占め二番目のパラメータメモリ空間
ADDR:3つのデータ構造のsockaddr構造体、sockaddr_un、sockaddr_in構造体に関し、
sockaddrは、主に関数パラメータのために、データ・ストレージのための責任を負いません
sockaddr_un、ときに、ローカル通信用のアドレスを用いてローカル通信の存在下、(SYS / un.h)
ネットワーク通信の存在、ネットワーク通信は、アドレスデータを格納するための責任があるのsockaddr_in、
構造体のsockaddr_in
{
一貫した//パラメータはプロトコルスイートを指定し、ソケット(); sin_familyは
sin_portは、通信ネットワークに使用する//ポート番号
sin_addr; IPアドレスが格納されたネットワーク通信//
}
(3)聞く()関数
int型(int型数sockfd、int型バックログ)聞きます
数sockfd:ソケット数sockfdパラメータは、パッシブモードを特定し、それは、接続要求を受け入れることができるように
バックログ:すなわち許可保留中の接続要求の数まで、最大長に接続された保留中のリクエストキューを表すが存在します。保留中の接続要求がサーバーの値に達した場合は、サーバーを接続する接続することにより、クライアント()操作は-1を返しますエラーとしてECONNREFUSED
(4)私達accpet()関数
int型私達accpet(数sockfd、sockaddr構造体の* addrの、のsocklen_t * addrlenは)
通信接続のための新しいソケットを作成中に、削除保留中の接続要求の接続要求キューに対応するソケット記述子から特定数sockfdパラメータ、戻りソケット
接続要求の発信元を出力するためのaddrlenはaddrのとアドレス情報
戻り値:新しく作成されたとクライアントの通信障害-1用ソケットディスクリプタ、エラー
(5)RECV()関数
int型のrecv(int型数sockfd、bufが、LEN、フラグ)
障害物の課金データ:フラグ、通常は0であります
O_NONBLOCK:ブロックされていない、何もデータが受信されない場合、エラーメッセージ、リターン
戻り値:
> 0、データ・バイトの数は、実際に受信します
-1エラー、エラー
0他端、通信遮断
(6)送信()関数
int型の送信(int型の数sockfd、bufが、LEN、フラグ)
フラグ:通常の送信をブロックし、0であります
O_NONBLOCK:ブロックされていない、何もデータが受信されない場合、エラーメッセージ、リターン
(7)接続()関数
int型接続(int型の数sockfd、ADDR、addr_len)
参照パラメータバインド()