LoginSignup
0

More than 5 years have passed since last update.

macOS command-line-toolのTCP/IP socketでポート番号が指定できない

Last updated at Posted at 2017-11-24

問題となった挙動

 基本的なミスで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を使ったリモートコントロールに興味がある方は簡単にロジックを組めるフリーウェアを作りましたのでご利用ください。こちらで紹介しています。

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0