TCPSocket - TCPソケット

TCPSocket - TCPソケット

TCP/IPストリーム型ソケットで通信します。

EthernetNetIf をインポートして使用する。

初期化

TCPSocket name;

name:任意の名前

ソケットへのアドレスの割り当て

ret = name.bind(host);

host:割り当てるアドレス・ポート (Host)
ret:エラーコード (TCPSocketErr)

接続要求の待ち行列の作成

ret = name.listen();

ret:エラーコード (TCPSocketErr)

接続要求の受付

ret = name.accept(host, sock);

host:接続元の情報が返る (&Host)
sock:接続されたソケットが返る (TCPSocket **sock)
ret:エラーコード (TCPSocketErr)

accept後、もとのソケット(name)はlisten状態に戻り、新しい接続のため待機する。
受け付けた接続はacceptで得られたソケット(sock)で通信する。

接続要求

ret = name.connect(host);

host:接続先のアドレス・ポート (Host)
ret:エラーコード (TCPSocketErr)

送信

ret = name.send(buf, len);

buf:送信データのポインター (char *)
len:送信するバイト数 (int)
ret:送信したバイト数 (int)

受信

ret = name.recv(buf, len);

buf:受信データバッファのポインター (char *)
len:受信データバッファのバイト数 (int)
ret:受信したバイト数 (int)

コールバックの設定

name.setOnEvent(fptr)

fptr: コールバック処理関数のポインタ (void (*pMethod)(TCPSocketEvent))

TCPサーバ

#include "mbed.h"
#include "EtnernetNetIf.h"
#include "TCPSocket.h"

EtnernetNetIf eth;
TCPSocket listensock;
TCPSocket *sock;

void onTCPSocketEvent (e) {
    switch (e) {
    case TCPSOCKET_CONNECTED: // 接続完了
        break;

    case TCPSOCKET_WRITEABLE: // 送信可能(送信完了)
        break;

    case TCPSOCKET_READABLE: // 受信データあり
        {
            char buf[100];
            int i;

            i = sock->recv(buf, sizeof(buf));
            buf[i] = 0;
            printf("%s\r\n", buf);
        }
        break;

    case TCPSOCKET_DISCONNECTED:
    case TCPSOCKET_CONTIMEOUT:
    case TCPSOCKET_CONRST:
    case TCPSOCKET_CONABRT:
    case TCPSOCKET_ERROR:
        sock->close();
        break;
    }
}

void onTCPListenSocketEvent (e) {
    if (e == TCPSOCKET_ACCEPT) { // 接続要求
        Host client;

        if (listensock.accept(client, &sock) != TCPSOCKET_OK) {
            break;
        }

        printf("Connected from %d.%d.%d.%d\r\n", (unsigned char)client->getIp()[0], (unsigned char)client->getIp()[1], (unsigned char)client->getIp()[2], (unsigned char)client->getIp()[3]);

        sock->setOnEvent(&onTCPSocketEvent);
    }
}

int main () {
    Host local(IpAddr(192,168,0,10), 1234);

    if (eth.setup()) {
        return -1;
    }

    listensock.setOnEvent(&onTCPListenSocketEvent);
    if (listensock.bind(local) != TCPSOCKET_OK) {
        return -1;
    }
    if (listensock.listen() != TCPSOCKET_OK) {
        return -1;
    }

    while (1) {
        Net::poll();
    }
}

※上記のコードでは同時に複数の接続を受けることを考慮していない。 accept のたびに、新しい sock ポインタを格納する変数を生成すべき。(クラスを作ってそちらで処理するといい)

TCPクライアント

#include "mbed.h"
#include "EtnernetNetIf.h"
#include "TCPSocket.h"

EtnernetNetIf eth;
TCPSocket sock;

void onTCPSocketEvent (TCPSocketEvent e) {
    switch (e) {
    case TCPSOCKET_CONNECTED: // 接続完了
        sock.send("Hello World!", 12); // 送信
        break;

    case TCPSOCKET_WRITEABLE: // 送信可能(送信完了)
        sock.close();
        break;

    case TCPSOCKET_READABLE: // 受信データあり
        break;

    case TCPSOCKET_DISCONNECTED:
    case TCPSOCKET_CONTIMEOUT:
    case TCPSOCKET_CONRST:
    case TCPSOCKET_CONABRT:
    case TCPSOCKET_ERROR:
        sock.close();
        break;
    }
}

int main () {
    Host server(IpAddr(192,168,0,10), 1234);

    if (eth.setup()) {
        return -1;
    }

    sock.setOnEvent(&onTCPSocketEvent);

    if (sock.connect(server) != TCPSOCKET_OK) {
        return -1;
    }

    while (1) {
        Net::poll();
    }
}

詳細 戻る


Please log in to post comments.