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.