无法从远程主机连接到linux tcp套接字应用程序

时间:2012-05-17 19:26:01

标签: linux sockets tcp gnu

我编写了一个使用GNU C套接字库中的TCP套接字的应用程序。它只是基于侦听传入请求的套接字。我能够在localhost上使用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;

谢谢, 亚历

1 个答案:

答案 0 :(得分:1)

为了接受连接,您实际上必须在该TCP套接字上调用accept(2)。如上所述,代码只准备套接字以便在网络上监听。

此外,由于您将该套接字标记为非阻塞,因此您可能希望将其包装在某种select(2)循环中。