0

GNUCソケットライブラリのTCPソケットを使用するアプリを作成しました。基本的には、着信要求をソケットでリッスンします。ローカルホストでtelnetを使用してソケットに接続できますが、別のマシンから接続しようとしても応答がありません。Fedora 13を実行していてファイアウォールを無効にしていますが、それでも機能しません。

ソケットコードは、他の組織によって作成され、すでに機能するはずのライブラリにカプセル化されていますが、その要点は次のとおりです。

...
fd_ = ::socket(AF_INET, SOCK_STREAM, 0);
if (fd_ < 0)
{
   perror("socket");
   return -1;
}

int val = 1;
int rc = setsockopt(fd_, SOL_SOCKET, SO_REUSEADDR, &val, sizeof(val));

if (rc < 0)
{
   perror("sesockopt");
   close();
   return -1;
}

rc = setsockopt(fd_, IPPROTO_TCP, TCP_NODELAY, &val, sizeof(val));

if (rc < 0)
{
   perror("sesockopt");
   close();
   return -1;
}

const int flags = ::fcntl(fd_, F_GETFL, 0);
::fcntl(fd_, F_SETFL, flags | O_NONBLOCK);


rc = ::bind(fd_, addr, addr.size_);

if (rc < 0)
{
   perror("bind");
   close();
   return -1;
}

rc = ::listen(fd_, 10);

if (rc < 0)
{
   perror("bind");
   close();
   return -1;
}

return 0;

ありがとう、アレックス

4

1 に答える 1

1

In order to accept connections you actually have to call accept(2) on that TCP socket. As given, the code only prepares the socket for listening on the network.

Also, since you are marking that socket as non-blocking, you'd probably want to wrap it in some sort of select(2) loop.

于 2012-05-17T20:12:20.623 に答える