2

BSDソケットを使用していて、ポート80での::connect接続に使用したいと思います。のマニュアルページには、有効なファイル記述子またはエラーのいずれかが返されることが示されています。example.com::socket-1

auto fd = ::socket(AF_INET, SOCK_STREAM, 0);

struct ::sockaddr_in addr;
::bzero(&addr, sizeof(addr));
addr.sin_family = family_;

struct ::hostent* hostent = ::gethostbyname(host.c_str());
::bcopy(hostent->h_addr, &addr.sin_addr.s_addr, hostent->h_length);
addr.sin_port = port;

auto err = ::connect(fd,
                     reinterpret_cast<struct ::sockaddr*>(&addr),
                     sizeof(addr));

fd == 0::socket成功しました(そうでない場合は返され-1ます)。ただし、err == -1errnoはに設定されており、これは不正なファイル記述子であるEBADFことを示しています。fd

ここで何が起こっているのでしょうか?::connect明らかに与えなかったのに、なぜ悪いファイル記述子を与えたと私に言うのですか?

4

2 に答える 2

2

実際に 0 を返してsocketいることを確認する必要がありますか? 標準のファイル記述子を閉じていない限り、それは非常に珍しいことです。他の呼び出しによって破損している場合に備えて、ソケット呼び出しの直後に確認してください。

于 2012-05-21T11:27:05.167 に答える
0

3 番目の引数を ::socket() 呼び出しに明示的に IPPROTO_TCP として渡してみてください。

auto fd = ::socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);

「0」の値は IPPROTO_IP であり、これは必要なものではありません。

別の推測: 設定してみてください

addr.sin_addr = htons(port);

利用できないものに接続している可能性があります (ポートは予想どおり 80 ではなく、0x5000 == 20480 です)。

3 回目の試行。BSD/MacOS、Linux、またはその他の POSIX システムを使用していますか? またはWinSock?Windows の場合は、WSAStartup 呼び出しを確認します。

于 2012-05-21T11:22:00.047 に答える