知ってるんだぞ、みんな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 件のコメント:
コメントを投稿
コメントありがとうございます。
スパムかもしれない、と私が思ったら、
申し訳ないですが勝手に削除することもあります。
注: コメントを投稿できるのは、このブログのメンバーだけです。