【问题标题】:connect() does not return连接()不返回
【发布时间】:2013-11-26 11:58:26
【问题描述】:

我只想连接到服务器并获得响应。我的程序是用c++写的,代码可以看这里:

if((interpreterSocket = socket(AF_INET, SOCK_STREAM, 0)) < 0)
{
    return SOCKETERR;
}

fcntl(interpreterSocket, F_SETFD, FD_CLOEXEC);
setsockopt(interpreterSocket, SOL_SOCKET, SO_REUSEADDR, (char *) &flag, sizeof(flag));
setsockopt(interpreterSocket, IPPROTO_TCP, TCP_NODELAY, (char *) &flag, sizeof(flag));
setsockopt(interpreterSocket, SOL_SOCKET, SO_REUSEADDR , (char *) &flag, sizeof(flag));

address.sin_family = AF_INET;
address.sin_addr.s_addr = inet_addr(INTERPRETERADDR); 
address.sin_port = htons(INTERPRETERPORT);
adlen = sizeof(address);

if((rc = connect(interpreterSocket, (struct sockaddr *) &address, adlen)) < 0)
{
     close(interpreterSocket);
     return SOCKETERR;
}

问题是当我运行这个程序时有时它会出现一些问题,所以我必须终止这个进程。之后,当我运行程序时,连接函数没有返回,程序在 if 行停止。我认为这个问题主要与没有以正确方式关闭的套接字有关。

我应该提到我在 CentOS 中运行这个程序。

提前致谢。

编辑

我还有一个问题,导致程序在 connect() 函数处停止,这是服务器上的一些路由问题。

【问题讨论】:

  • 你为什么要设置SO_REUSEADDR两次?
  • connect永远不会返回,还是需要很长时间?
  • 你正在使用阻塞套接字,所以连接阻塞直到它连接到服务器。
  • @Blood 但不是永远,它迟早会超时。 (超时取决于平台,例如在 Windows 上是(或至少曾经是)45 秒)。
  • @Joachim Pileborg:你说得对,但我需要很长时间才能再次连接。

标签: c++ linux sockets


【解决方案1】:

您正在使用阻塞套接字,因此连接会阻塞,直到它连接到服务器或超时通过。要将套接字设置为非阻塞,您应该使用ioctlsocket 函数,完全使用 FIONBIO 命令作为第二个参数。

注意当你设置sockets为非阻塞时,你应该开始使用select函数来读写socket。

编辑

对不起,我忘了那是关于 Linux 的。通过使用fcntl 在套接字文件描述符上设置 O_NONBLOCK 标志,可以在套接字上执行非阻塞 I/O。

【讨论】:

  • 已编辑。请检查一下
猜你喜欢
  • 1970-01-01
  • 2015-10-05
  • 2011-04-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-07-22
  • 2013-02-18
相关资源
最近更新 更多