2017/02/23

[esp8266][rtos]getaddrinfo()してconnect()

知ってるんだぞ、みんな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 件のコメント:

コメントを投稿

コメントありがとうございます。
スパムかもしれない、と私が思ったら、
申し訳ないですが勝手に削除することもあります。