問題となった挙動
基本的なミスで1日もロスしてしまいました。次のようなコード(抜粋)をxcode commando line toolで作成し、xcodeで実行してもポート番号が付与されないという現象です。
// serverTest
# include <iostream>
# include <netinet/in.h>
# include <sys/socket.h>
using namespace std;
main(){
memset(&addr, 0, sizeof(addr));
addr.sin_family = AF_INET;
unsigned short port = 8081 ;
addr.sin_port = htons(port);
addr.sin_addr.s_addr = INADDR_ANY ;
addr.sin_len = sizeof(addr);
bind(sock,(struct sockaddr*)&addr, sizeof(addr)) ;
;
(以下略)
}
実行してターミナルでポートを調べてみると
$ sudo lsof -i -P | grep LISTEN
severTest 6059 (中略) TCP *:53479 (LISTEN)
となり、実行しなおすたびに、ポート番号が変わります。このポートに対してパケットを送れば反応するので、あたかもポート番号に0を付与したような振る舞いです。
このコードをターミナルでg++でコンパイルして実行すると、ポート番号は正しく8081となります。
原因
using namespace stdをコメントアウトすると正常に動作しました。
どうやらこの状態ではstd::bindが実行されており、期待しているsocketのbindが呼ばれていなかったようです。
確かに上記のコードで、
if(bind(sock,(struct sockaddr*)&addr, sizeof(addr)) < 0 ){
;
};
などとすると、コンパイルエラー
Invalid operands to binary expression ('__bind<int &, sockaddr *, unsigned long>' and 'int')
が発生するのでsocketのbindとは異なる関数になっています。
バージョン情報
macOS 10.13.1 (High Sierra)
Xcode Version 9.1
Raspberry piを使ったリモートコントロールに興味がある方は簡単にロジックを組めるフリーウェアを作りましたのでご利用ください。こちらで紹介しています。