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.
