知ってるんだぞ、みんなESP8266をArduinoとして使っていることを。
でも、私はRTOS SDK版で使うのだ。
昨日の、getaddrinfo()をESP8266 RTOS版で書くと、こういう感じ。
クライアントとしてconnect()したかったので、見つかった順にconnect()する処理も一緒に。
01: struct addrinfo hints;
02: struct addrinfo *ainfo;
03:
04: //IPアドレス取得
05: memset(&hints, 0, sizeof(hints));
06: hints.ai_socktype = SOCK_STREAM;
07: hints.ai_family = AF_INET;
08:
09: int ret = getaddrinfo(M_NODE_ADDR, M_NODE_PORT, &hints, &ainfo);
10: if (!ret) {
11: struct addrinfo *rp;
12: for (rp = ainfo; rp != NULL; rp = rp->ai_next) {
13: mFd = socket(rp->ai_family, rp->ai_socktype, rp->ai_protocol);
14: if (mFd == -1) {
15: printf("fail: sock\n");
16: goto ERR_EXIT;
17: }
18:
19: struct sockaddr_in *in = (struct sockaddr_in *)rp->ai_addr;
20: printf("addr : %s\n", inet_ntoa(in->sin_addr));
21: ret = connect(mFd, rp->ai_addr, rp->ai_addrlen);
22: if (!ret) {
23: //接続OK
24: printf("connected\n");
25: break;
26: }
27: }
28: freeaddrinfo(ainfo);
29: if (rp == NULL) {
30: goto ERR_EXIT;
31: }
32: } else {
33: goto ERR_EXIT;
34: }
35:
36: ERR_EXIT:
37: ...
M_NODE_ADDRに接続先の文字列が M_NODE_PORTに接続したいポート番号の文字列が入っている。
最初、IPアドレスを見つける目的だけだったのでポート番号のところをNULLにしていて、connect()しても接続に失敗するのでかなり悩んでいた。
「サービス名」と書かれていたので、"http"みたいな名前の分かる文字列じゃないとだめかと思ったけど、"18333"みたいにポート番号を文字列にするだけでも良かったのだった。
どのincludeが役に立っているか分からないけど、たぶんこれらだろう。
#include "lwip/sockets.h"
#include "lwip/netdb.h"
機種依存部をヘッダファイルなどに限定できると、Linuxでも同じコードが使えるので実験が楽になるのだ。
0 件のコメント:
コメントを投稿
コメントありがとうございます。
スパムかもしれない、と私が思ったら、
申し訳ないですが勝手に削除することもあります。
注: コメントを投稿できるのは、このブログのメンバーだけです。