0

我编写了一个使用 GNU C 套接字库中的 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

为了接受连接,您实际上必须调用accept(2)该 TCP 套接字。如给定的那样,代码仅准备用于侦听网络的套接字。

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

于 2012-05-17T20:12:20.623 回答