---
title: "TCPサ?バ?を??したソケット通信"
url: "https://maker.wiznet.io/teddy/projects/TCP/"
markdown_url: "https://maker.wiznet.io/teddy/projects/TCP/md"
type: "UCC: User Created Content"
author: "teddy"
author_url: "https://maker.wiznet.io/teddy/"
original_author: "teddy"
original_url: "https://depfields.com/tcp-server/"
published: "2022-03-02"
language: "ja"
likes: 0
views: 418
comments: 0
source: "WIZnet Makers (https://maker.wiznet.io/)"
---

# TCPサ?バ?を??したソケット通信

> TCPサ?バ?を??したソケット通信

Original author: teddy (source: https://depfields.com/tcp-server/)

## Article

マイコンをイ?サネット??にしてpingが通った?態でネットワ?クに?加しただけでは何の意味もありませんが、上位のトランスポ?ト層に**TCPやUDPといったプロトコルを搭載**することによって**サ?バ?とクライアント間で通信ができる**ようになります。 ソケット通信は前回解?したOSI?照モデルのトランスポ?ト層に?するTCPプロトコルにしたがった通信手段です。**W5500コントロ?ラ**を搭載したマイコンでTCPソケット通信を?現するためには??した**TCP/IPプロトコルスタックをレジスタで操作**します。操作自?はメ?カ?がドライバを提供しているので容易に行われます。 **TCPサ?バ?を構築**してソケット通信の??が整えば、任意のタイミングでシリアル通信のような**デ?タのやりとり**ができるようになります。

## TCPソケット通信とは

![](https://depfields.com/wp-content/uploads/2020/05/instructor.jpg)

*めかのとろ*

インタ?ネット情報には無?の解?記事が存在するためにここでは詳細の解?は割愛しますが、簡潔にまとめますと**ソケット通信**はサ?バ?とクライアントが互いに確認しながら通信を行う**TCPプロトコル**に基づいた方式です。互いにやりとりすることから**ハンドシェイク方式**とも呼ばれます。

![](https://depfields.com/wp-content/uploads/2020/05/instructor.jpg)

*めかのとろ*

ソケット通信は電話による?話に似ていて?話の出入り口である受話器、耳、口に相?するものを**ソケット**と呼びます。相手が?答して初めて?話(通信)が成立し、途中で相手やこちらで切?すると?話も終了します。また、相手が接?中(受話器を上げたままの?態)のときは、こちらからの接?要求に?答しません。

![](https://depfields.com/wp-content/uploads/2020/05/instructor.jpg)

*めかのとろ*

**トランスポ?ト層**に?するプロトコルには他に**UDP**がありますが、これはサ?バ?がクライアントに確認せずに一方的に情報を?える方式です。動?などのストリ?ミングで?容に多少の不備があっても問題がない多量の情報を送るのに適しています。

![](https://depfields.com/wp-content/uploads/2020/05/instructor.jpg)

*めかのとろ*

下?は**ソケット通信**で標準的な**バ?クレ?ソケット（BSD unixに??されたネットワ?ク用API）**に基づいた通信のフロ?チャ?トです。サ?バ?、クライアントともにあらかじめソケットを作成しておき、クライアント側から必要時に接?要求をだして、サ?バ?が?答して通信を確立します。一度確立すると、どちら側から切?しないかぎり、**任意のタイミングで送受信できる**のが**ソケット通信の特?**です。

![](https://depfields.com/wp-content/uploads/2021/12/TCP_socket.png)

*TCPソケット通信*

## TCPサ?バ?の??

![](https://depfields.com/wp-content/uploads/2020/05/instructor.jpg)

*めかのとろ*

**ドライバsoket.c**では標準インタ?フェ?スのBSDソケットに準じた??をまとめていますがここではドライバ?に定義された??の一部のみを使用したソケット通信のサンプルを紹介しています。

![](https://depfields.com/wp-content/uploads/2020/05/instructor.jpg)

*めかのとろ*

サンプルプログラムでは**TCPサ?バ?**をサンプリングタイム5msで?行する**?用タスクprvTask_Tcpに構成**しています。

![](https://depfields.com/wp-content/uploads/2020/05/instructor.jpg)

*めかのとろ*

ドライバのソケット標準??を使用して一般的なTCPサ?バ?を作成することもできますが、ここではサンプリングタイム?にモニタ?した**ソケット?態に?じた?理**を**ドライバのレジスタ操作??**を使って?行します。

### ソケットレジスタブロックの設定

![](https://depfields.com/wp-content/uploads/2021/12/TCP_server.png)

*TCPサ?バ?タスクサンプル*

①　ソケット?態のモニタ? **state = getSn_SR(SN)；**

![](https://depfields.com/wp-content/uploads/2020/05/instructor.jpg)

*めかのとろ*

ソケットの?態は主に 「**SOCK_CLOSED**」ソケット閉鎖 「**SOCK_LISTEN**」ソケット待機 「**SOCK_ESTABLISHED**」ソケット確立 「**SOCK_CLOSING**」ソケット閉鎖中 の4種類があり、これらの?態をソケット番?SNに?じてgetSn_SR(SN)??でソケットのレジスタ値を?み?みます。

②　ソケット生成 **srcSocket = socket(SN,Sn_MR_TCP, PORT, SF_IO_NONBLOCK)；**

![](https://depfields.com/wp-content/uploads/2020/05/instructor.jpg)

*めかのとろ*

プログラム起動直後のソケットは「**SOCK_CLOSED**」ですのでまずソケットをsocket()??で生成します。

![](https://depfields.com/wp-content/uploads/2020/05/instructor.jpg)

*めかのとろ*

??の第1引?は**ソケット番?SN**で、SNは自作??をまとめたヘッダファイルnet_conf.hで1に定義しています。

![](https://depfields.com/wp-content/uploads/2020/05/instructor.jpg)

*めかのとろ*

第2引?はプロトコルは設定で**TCPプロトコルを指定**しています。第3引?は**PORT番?を指定**し、第4引?では**non-blockを指定**し、ノンブロッキングソケットとしています。

③　STABE_LISTENに遷移 **LISTEN(SN)；**

![](https://depfields.com/wp-content/uploads/2020/05/instructor.jpg)

*めかのとろ*

ソケットが作成されるとlisten(SN)??を?行し、**SOCK_LISTEN?態に遷移してクライアントからの接?待ち?態で待機**します。

![](https://depfields.com/wp-content/uploads/2020/05/instructor.jpg)

*めかのとろ*

ソケットの?態がSOCK_LISTENの待機時にクライアントのタ?ミナルから**IPアドレスおよびポ?トを指定**して**接?の要求**をし、**接?が確立するとSOCK_ESTABLISHED**になります。接?が確立しクライアントのタ?ミナルにサ?バ?のIPアドレスが表示されると任意のタイミングで送受信ができるようになります。

④　デ?タ送受信 **len=recv(SN, (uint8_t*)rcvbuffer, sizeof(rcvbuffer));**

![](https://depfields.com/wp-content/uploads/2020/05/instructor.jpg)

*めかのとろ*

**デ?タ受信にはrecv??を使用**します。第1引?はソケット番?、第2引?は受信バッファのポインタ、第3引?はデ?タ長を指定します。**デ?タを受信するとデ?タ長を返します**。

**send(SN, (uint8_t*)sendbuffer, sizeof(sendvbuffer));**

![](https://depfields.com/wp-content/uploads/2020/05/instructor.jpg)

*めかのとろ*

**デ?タ送信にはsend??を使用**します。第1引?はソケット番?、第2引?は送信バッファのポインタ、第3引?はデ?タ長を指定します。

![](https://depfields.com/wp-content/uploads/2020/05/instructor.jpg)

*めかのとろ*

通信用バッファメモリである送信TXおよび受信RXバッファはそれぞれ16Kバイトのブロックで構成されています。

⑤　ソケット制御?? **setSn_CR(SN,Sn_CR_CLOSE);**

![](https://depfields.com/wp-content/uploads/2020/05/instructor.jpg)

*めかのとろ*

**setSn_CR??**はsocket.c?に定義されている??で**ソケットを制御**するものです。第1引?はソケット番?、第2引?はソケットの?態を指定します。Sn_CR_CLOSEを指定するとソケットを閉鎖(close)します。

![](https://depfields.com/wp-content/uploads/2020/05/instructor.jpg)

*めかのとろ*

その他ソケットの”OPEN”, ”LISTEN”, “CONNECT”, “DISCON”, “SEND”, “SEND_MAC”, “SEND_KEEP”, “RECV”等があります。詳細はドライバの**ソケット定義ファイルsocket.cを確認**してください。

![](https://depfields.com/wp-content/uploads/2021/12/Soket_W5500.png)

*TCPサ?バ?の動作フロ?*

![](https://depfields.com/wp-content/uploads/2020/05/instructor.jpg)

*めかのとろ*

TCPサ?バ?のソケット?態遷移をまとめると上?のようになります。W5500ではソケット?態は他にもありますが、とりあえず**主な4つの?態をコントロ?ル**しておけば機能します。

### ソケット通信のイメ?ジ

![](https://depfields.com/wp-content/uploads/2020/05/instructor.jpg)

*めかのとろ*

ソケット通信の?態を電話による?話に例えると下?のようなイメ?ジなります。この通信?態を想定しながら?際にソケット通信を?施して動作を確認してみます。

![](https://depfields.com/wp-content/uploads/2021/12/TCP_socket_telephone.png)

*ソケット通信における接?イメ?ジ*

## ?際のソケット通信

![](https://depfields.com/wp-content/uploads/2020/05/instructor.jpg)

*めかのとろ*

**クライアント**では**タ?ミナルソフトを使用**します。ここでもTera Termを使用しています。これに限らず慣れたツ?ルを使用してください。

![](https://depfields.com/wp-content/uploads/2020/05/instructor.jpg)

*めかのとろ*

起動後、TCPソケット通信ですので**サ?バ?に登?したIPアドレスおよびポ?ト番?を入力**し”OK”を押します。

① 接?要求

![](https://depfields.com/wp-content/uploads/2021/12/TCP_open.png)

![](https://depfields.com/wp-content/uploads/2020/05/instructor.jpg)

*めかのとろ*

?面左上にサ?バ?のIPアドレスが表示されると設定ポ?トが開いてクライアントとサ?バ?が接?したことになります。

② ソケット接?確立中

![](https://depfields.com/wp-content/uploads/2021/12/TCP_open2.png)

![](https://depfields.com/wp-content/uploads/2020/05/instructor.jpg)

*めかのとろ*

TCPサ?バ?に?してコマンドを?えて通信できるかを確認します。通信テスト用の**?答メッセ?ジを返す?理**、**ソケットの閉鎖(close)**および**接?切?(disconnect)**するコマンドをまとめたファイルを作成して?行しています。

![](https://depfields.com/wp-content/uploads/2021/12/cmd_string_tcp.png)

*コマンド?理(通信テスト用)*

![](https://depfields.com/wp-content/uploads/2020/05/instructor.jpg)

*めかのとろ*

まず文字列”ABC”を入力します。受信バッファに格納された文字列が”ABC”で一致すると”Matched![?](https://s.w.org/images/core/emoji/13.1.0/svg/203c.svg)”と?答します。?答は**send??**を使用しています。

![](https://depfields.com/wp-content/uploads/2021/12/TCP_rxtx.png)

![](https://depfields.com/wp-content/uploads/2020/05/instructor.jpg)

*めかのとろ*

文字列”abc”を入力すると”ABC”と一致しませんので”Error”と?答します。

![](https://depfields.com/wp-content/uploads/2021/12/TCP_rxtx2.png)

![](https://depfields.com/wp-content/uploads/2020/05/instructor.jpg)

*めかのとろ*

ソケットが接?確立しているところで**新たに別の接?**を試みます。

![](https://depfields.com/wp-content/uploads/2021/12/TCP_reopen.png)

![](https://depfields.com/wp-content/uploads/2020/05/instructor.jpg)

*めかのとろ*

すでにポ?トが開いているために**接?が拒否**されました。電話では相手の受話器が上がっていて話し中の?態です。

![](https://depfields.com/wp-content/uploads/2021/12/TCP_reopen_ng.png)

③ ソケットclose

![](https://depfields.com/wp-content/uploads/2020/05/instructor.jpg)

*めかのとろ*

ソケットを閉じるためにコマンド”scls”を入力すると”socket close”メ?セ?ジを返してCRレジスタにSn_CR_CLOSEを送信してから**ソケットを閉鎖(close)**します。結果、未接?となります。

![](https://depfields.com/wp-content/uploads/2021/12/TCP_scls.png)

④ 接?要求+ソケット接?確立

![](https://depfields.com/wp-content/uploads/2020/05/instructor.jpg)

*めかのとろ*

また新たに接?を試みると今度はソケットが閉じているため再びポ?トが開き接?できます。

![](https://depfields.com/wp-content/uploads/2020/05/instructor.jpg)

*めかのとろ*

最後に接?自?を遮?するため、コマンド”srst”を入力します。CRレジスタにSn_CR_DISCONを送信し、**切??理(disconnect)を?行**します。

![](https://depfields.com/wp-content/uploads/2021/12/TCP_srst.png)

⑤ 接?切?

![](https://depfields.com/wp-content/uploads/2020/05/instructor.jpg)

*めかのとろ*

?面左上が未接?となり**接?が遮?**されたことが確認できます。

![](https://depfields.com/wp-content/uploads/2021/12/TCP_srst2.png)

![](https://depfields.com/wp-content/uploads/2020/05/instructor.jpg)

*めかのとろ*

以上、テスト用コマンドを入力してソケット通信の?子を確認しました。?際のソケット通信ではプログラミング次第でコマンドをさらに多?化してコマンドにより??な?理を?施させることになります。

![](https://depfields.com/wp-content/uploads/2020/05/instructor.jpg)

*めかのとろ*

**TCPソケット通信**はサ?バ?とクライアント間で**リアルタイムでデ?タをやりとり**できることが特?ですので組み?み機器にTCPサ?バ?を搭載しておけば**IoT**としてリアルタイムでインタ?ネットを介してデ?タの**リモ?ト管理**ができるようになります。

---

Source: https://maker.wiznet.io/teddy/projects/TCP/
