第2章ネットワーククライアント

3123 ワード

一、socketを理解する
socketは、前述したようにプロセス間の通信に用いられ、オペレーティングシステムのI/Oの延長に相当する.
二、socketを創立する
実際のsocketオブジェクトを確立してから、リモートサーバに接続します.
SOcketオブジェクトを作成するときに、通信タイプとプロトコル・ファミリーが含まれます.通信タイプには、IPv 4、IPv 6、IPX/SPX(Netware)、AFP(Appleファイル共有)があります.通常AF_を使用INET、すなわちIPv 4.プロトコルファミリーは、一般的にTCP通信のSOCK_を含むSTREAMとUDP通信のSOCK_DGRAM.オブジェクトを接続するときは、リモートホスト名またはIPアドレスとポート番号を含むメタグループを指定する必要があります.ポート番号が分からない場合は、socketライブラリのgetservbyname関数で、socket.getservbyname(servicename[,protocolname])、サービス名およびプロトコル名(tcp,udp).
SOcketライブラリで作成します.次のようになります.
s=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
s.connect(('www.baidu.com',80))

SOcket通信を利用する場合はsocketオブジェクトを使用してもよいし、ファイルオブジェクトを使用してもよい.SOcketオブジェクトを使用する場合:データを読み書きする場合、プロトコルが詳細に制御できる場合、バイナリプロトコルを使用して固定サイズのデータを転送する場合、データタイムアウトに特別な処理が必要な場合、または簡単な読み書きだけでなくUDPプログラムを作成する場合.ファイルクラスオブジェクトは一般的に線形プロトコル向けに使用され、TCPのみに使用されます.
ソケットモジュールの4つの異常:
一般的なI/Oと通信問題に関するsocket.error;クエリーアドレス情報に関するsocket.gaierror;他のアドレスエラーに関連するsocket.herror;1つのsocketがsettimeout()を呼び出すと、処理タイムアウトに関連するsocket.timeout
多くのオペレーティングシステムでは、ネットワーク上でデータを送信する呼び出しは、リモート・サーバが情報を受信する前に返されるため、sendallが正常に呼び出したが、サーバが情報を受信できない場合があります.書き込み操作を終了してshutdown関数を呼び出すことで解決します.
三、まとめ
TCPクライアント疑似コードを作成するには:
cs=socket()
cs.connect()
comm_loop:
    cs.send()/cs.recv()
cs.close()

UDPクライアント擬似コードの作成
ss=socket()
ss.bind()
inf_loop:
    cs=ss.recvfrom()/ss.sendto()
ss.close()

socketオブジェクトメソッド:
関数#カンスウ#
説明
サーバ側ソケット
s.bind()
バインドアドレス(ホスト名、ポート番号)からソケットへ、ホスト名はネイティブでなければなりません.空で、すべてのアドレスを表します.
s.listen()
TCPリスニングを開始します.パラメータは一般的に5です.
s.accept()
TCPクライアント接続を受動的に受け入れ、(ブロック式)接続待ち、パラメータはsocketオブジェクトと(host,port)メタグループである.
クライアントソケット
s.connect()
アクティブ初期化TCPサーバ接続、パラメータは(host,port)
s.connect_ex()
エラーが発生した場合、例外を放出するのではなく、エラーコードを返します.
共通のソケット
s.recv()
データを受け入れ、パラメータはbuflen
s.send()
TCPデータを送信し、パラメータはdata
s.sendall()
TCPデータの完全な送信
s.recvfrom()
UDPデータを受け取り、受け取った結果はdataと送信者アドレス
s.sendto()
UDPデータを送信します.パラメータはdataとaddrです.
s.getpeername()
現在のソケットの遠位端のアドレスに接続し、
s.getsockname()
現在のソケットのアドレス
s.setsockopt()
ソケットを指定するパラメータの設定
s.close()
クローズソケット
モジュール向けソケット関数
s.setblocking()
ソケットのブロックと非ブロックモードを設定します(0|1)
s.settimeout()
ブロックソケット操作のタイムアウト時間の設定
s.gettimeout()
ブロックソケット操作のタイムアウト時間を得る
ファイル向けソケット関数
s.fileno()
ソケットのファイル記述子
s.makefile()
ソケットに関連付けられたファイルオブジェクトを作成
sendall()はsend()関数をループ呼び出し、すべてのデータが送信されるまでループします.エラーが発生すると異常が発生しますが、どれだけのデータが送信されるかはできません.ファイル記述子は、現在のプロセスで開いているファイルに対応する整数表現です.例えば、標準入力のファイル記述子は0、標準出力は1、標準エラーは2であり、他の開いているファイルは3,4の順である.fileno()は、ファイルオブジェクトに関連付けられたファイル記述子を取得します.ファイル記述子を直接使用すると、ファイルオブジェクトを迂回する方法があります.一般的にos、socket、pipeなどの下位層の操作に用いられる.カーネルはファイル記述子を使用してファイルにアクセスします.ファイル記述子は形式的に非負の整数です.実際には、カーネルが各プロセスに対して維持されているプロセスに対してファイルのレコードテーブルを開くインデックス値です.プログラムが既存のファイルを開くか、新しいファイルを作成すると、カーネルはプロセスにファイル記述子を返します.いくつかの設計の最下位のプログラムは、ファイル記述子の周りに展開されます.ファイル記述子は、ファイルのオープンモード、ファイルの場所タイプ、ファイルの初期タイプなどの関連情報を含むファイルオブジェクトに関連し、これらの情報をファイルのコンテキストと呼ぶ.