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.
